diff --git a/Channel-Backend/src/services/chat.service.ts b/Channel-Backend/src/services/chat.service.ts index fcb39f2..eb56f05 100644 --- a/Channel-Backend/src/services/chat.service.ts +++ b/Channel-Backend/src/services/chat.service.ts @@ -12,9 +12,9 @@ export interface CitationItem { export class ChatService { private extractionService = new ExtractionService(); - private gatewayUrl = process.env.LLM_GATEWAY_URL || 'https://llm-devs.tech4biz.org/v1'; - private apiKey = process.env.LLM_API_KEY || 'sk-TM-gxAudDVRTY-kq7_enEA'; - private modelId = process.env.LLM_MODEL_ID || 'deepseek-chat'; + private gatewayUrl = process.env.LLM_GATEWAY_URL; + private apiKey = process.env.LLM_API_KEY; + private modelId = process.env.LLM_MODEL_ID; /** * Process a user chat prompt with RBAC-scoped, unified RAG retrieval across Assets, Showcase Reels, Ecosystem Offerings, and Legal Documents. @@ -358,14 +358,14 @@ export class ChatService { if (keyTerms.length > 0) { catalogAssets.forEach(a => { const fullText = (a.title + ' ' + (a.description || '') + ' ' + (a.tags || []).join(' ') + ' ' + (a.verticals || []).map(v => v.name).join(' ') + ' ' + (a.techStacks || []).map(t => t.name).join(' ')).toLowerCase(); - + let matchCount = 0; keyTerms.forEach(kt => { if (fullText.includes(kt)) matchCount++; }); if (matchCount >= 1) { - const isRecommended = partnerGroup + const isRecommended = partnerGroup ? a.assetGroups.some(g => g.name.trim().toLowerCase() === partnerGroup) : false; @@ -419,7 +419,7 @@ export class ChatService { location: `Segment ${chunk.chunkIndex + 1}`, }; - const isRecommended = partnerGroup + const isRecommended = partnerGroup ? chunk.asset.assetGroups.some(g => g.name.trim().toLowerCase() === partnerGroup) : false; @@ -450,8 +450,8 @@ export class ChatService { }); } - const contextBlock = contextLines.length > 0 - ? contextLines.join('\n---\n') + const contextBlock = contextLines.length > 0 + ? contextLines.join('\n---\n') : 'No specific catalog or showcase snippets needed for this query.'; const portalGuideContext = isClient ? ` @@ -612,35 +612,35 @@ Portal Navigation Guidelines: } // Strict Citation Filtering: Only include Verified Knowledge Source citations if user explicitly attached entities or asked for asset/resource recommendations - const isGeneralHelpQuery = promptLower.includes('password') || - promptLower.includes('theme') || - promptLower.includes('appearance') || - promptLower.includes('profile') || - promptLower.includes('how to log') || - promptLower.includes('how to sign') || - promptLower.includes('help'); + const isGeneralHelpQuery = promptLower.includes('password') || + promptLower.includes('theme') || + promptLower.includes('appearance') || + promptLower.includes('profile') || + promptLower.includes('how to log') || + promptLower.includes('how to sign') || + promptLower.includes('help'); - const hasAssetKeywords = promptLower.includes('asset') || - promptLower.includes('recommend') || - promptLower.includes('find') || - promptLower.includes('search') || - promptLower.includes('show') || - promptLower.includes('list') || - promptLower.includes('what are') || - promptLower.includes('is there') || - promptLower.includes('are there') || - promptLower.includes('showcase') || - promptLower.includes('agreement') || - promptLower.includes('legal') || - promptLower.includes('document') || - promptLower.includes('video') || - promptLower.includes('reel') || - promptLower.includes('offering') || - promptLower.includes('which are') || - promptLower.includes('tell me more'); + const hasAssetKeywords = promptLower.includes('asset') || + promptLower.includes('recommend') || + promptLower.includes('find') || + promptLower.includes('search') || + promptLower.includes('show') || + promptLower.includes('list') || + promptLower.includes('what are') || + promptLower.includes('is there') || + promptLower.includes('are there') || + promptLower.includes('showcase') || + promptLower.includes('agreement') || + promptLower.includes('legal') || + promptLower.includes('document') || + promptLower.includes('video') || + promptLower.includes('reel') || + promptLower.includes('offering') || + promptLower.includes('which are') || + promptLower.includes('tell me more'); - const finalCitations = (hasAttachedEntities || (hasAssetKeywords && !isGeneralHelpQuery)) - ? Array.from(citationsMap.values()) + const finalCitations = (hasAttachedEntities || (hasAssetKeywords && !isGeneralHelpQuery)) + ? Array.from(citationsMap.values()) : []; const botMessage = await prisma.chatMessage.create({