1// llmTenantContext.js - Redis-based per-tenant LLM isolation
2const Redis = require('ioredis');
3const redisConfig = require('../config/redis');
4const redis = new Redis(redisConfig);
7 * Get LLM history for tenant document.
8 * Returns last 10 history entries.
9 * @param {number} tenantId - Tenant ID
10 * @param {string} docId - Document ID
11 * @returns {Promise<Array>} Array of history entries (most recent first)
13async function getTenantHistory(tenantId, docId) {
14 return await redis.lrange(`llm:history:${tenantId}:${docId}`, 0, 9);
18 * Add entry to tenant LLM history.
19 * Maintains rolling history of last 10 entries.
20 * @param {number} tenantId - Tenant ID
21 * @param {string} docId - Document ID
22 * @param {string} delta - History entry to add
23 * @returns {Promise<void>}
25async function addTenantHistory(tenantId, docId, delta) {
26 await redis.lpush(`llm:history:${tenantId}:${docId}`, delta);
27 await redis.ltrim(`llm:history:${tenantId}:${docId}`, 0, 9);
31 * Get LLM summary for tenant document.
32 * @param {number} tenantId - Tenant ID
33 * @param {string} docId - Document ID
34 * @returns {Promise<string|null>} Cached summary or null
36async function getTenantSummary(tenantId, docId) {
37 return await redis.get(`llm:summary:${tenantId}:${docId}`);
41 * Set LLM summary for tenant document.
42 * Cached with 7-day TTL.
43 * @param {number} tenantId - Tenant ID
44 * @param {string} docId - Document ID
45 * @param {string} summary - LLM-generated summary
46 * @returns {Promise<void>}
48async function setTenantSummary(tenantId, docId, summary) {
49 await redis.set(`llm:summary:${tenantId}:${docId}`, summary, 'EX', 604800);