chat-flow-ardymalihi 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +266 -0
- package/dist/adapters/db/InMemorySessionRepository.js +15 -0
- package/dist/adapters/db/RedisSessionRepository.js +41 -0
- package/dist/adapters/intent/IntentMatcher.d.ts +25 -0
- package/dist/adapters/intent/IntentMatcher.d.ts.map +1 -0
- package/dist/adapters/intent/IntentMatcher.js +89 -0
- package/dist/adapters/intent/IntentMatcher.js.map +1 -0
- package/dist/adapters/intent/IntentService.d.ts +27 -0
- package/dist/adapters/intent/IntentService.d.ts.map +1 -0
- package/dist/adapters/intent/IntentService.js +59 -0
- package/dist/adapters/intent/IntentService.js.map +1 -0
- package/dist/adapters/intent/MockIntentAdapter.js +29 -0
- package/dist/adapters/llm/GeminiLLMAdapter.d.ts +10 -0
- package/dist/adapters/llm/GeminiLLMAdapter.d.ts.map +1 -0
- package/dist/adapters/llm/GeminiLLMAdapter.js +102 -0
- package/dist/adapters/llm/GeminiLLMAdapter.js.map +1 -0
- package/dist/adapters/llm/MockLLMAdapter.d.ts +5 -0
- package/dist/adapters/llm/MockLLMAdapter.d.ts.map +1 -0
- package/dist/adapters/llm/MockLLMAdapter.js +31 -0
- package/dist/adapters/llm/MockLLMAdapter.js.map +1 -0
- package/dist/adapters/memory/InMemorySessionRepository.js +15 -0
- package/dist/adapters/redis/RedisSessionRepository.js +41 -0
- package/dist/adapters/repository/InMemoryRepository.d.ts +15 -0
- package/dist/adapters/repository/InMemoryRepository.d.ts.map +1 -0
- package/dist/adapters/repository/InMemoryRepository.js +41 -0
- package/dist/adapters/repository/InMemoryRepository.js.map +1 -0
- package/dist/adapters/repository/IntentRepository.d.ts +15 -0
- package/dist/adapters/repository/IntentRepository.d.ts.map +1 -0
- package/dist/adapters/repository/IntentRepository.js +28 -0
- package/dist/adapters/repository/IntentRepository.js.map +1 -0
- package/dist/adapters/repository/RedisRepository.d.ts +16 -0
- package/dist/adapters/repository/RedisRepository.d.ts.map +1 -0
- package/dist/adapters/repository/RedisRepository.js +87 -0
- package/dist/adapters/repository/RedisRepository.js.map +1 -0
- package/dist/adapters/workflow/MockWorkflowAdapter.d.ts +5 -0
- package/dist/adapters/workflow/MockWorkflowAdapter.d.ts.map +1 -0
- package/dist/adapters/workflow/MockWorkflowAdapter.js +162 -0
- package/dist/adapters/workflow/MockWorkflowAdapter.js.map +1 -0
- package/dist/application/ConversationSession.d.ts +23 -0
- package/dist/application/ConversationSession.d.ts.map +1 -0
- package/dist/application/ConversationSession.js +83 -0
- package/dist/application/ConversationSession.js.map +1 -0
- package/dist/application/Message.d.ts +11 -0
- package/dist/application/Message.d.ts.map +1 -0
- package/dist/application/Message.js +30 -0
- package/dist/application/Message.js.map +1 -0
- package/dist/application/Orchestrator.d.ts +18 -0
- package/dist/application/Orchestrator.d.ts.map +1 -0
- package/dist/application/Orchestrator.js +80 -0
- package/dist/application/Orchestrator.js.map +1 -0
- package/dist/application/SessionState.js +2 -0
- package/dist/application/usecases/CreateSession.js +20 -0
- package/dist/application/usecases/HandleUserMessage.js +69 -0
- package/dist/config/ChatFlowConfig.d.ts +59 -0
- package/dist/config/ChatFlowConfig.d.ts.map +1 -0
- package/dist/config/ChatFlowConfig.js +49 -0
- package/dist/config/ChatFlowConfig.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/entities/ConversationSession.d.ts +23 -0
- package/dist/core/entities/ConversationSession.d.ts.map +1 -0
- package/dist/core/entities/ConversationSession.js +83 -0
- package/dist/core/entities/ConversationSession.js.map +1 -0
- package/dist/core/entities/Message.d.ts +11 -0
- package/dist/core/entities/Message.d.ts.map +1 -0
- package/dist/core/entities/Message.js +30 -0
- package/dist/core/entities/Message.js.map +1 -0
- package/dist/core/errors/ChatFlowError.d.ts +71 -0
- package/dist/core/errors/ChatFlowError.d.ts.map +1 -0
- package/dist/core/errors/ChatFlowError.js +108 -0
- package/dist/core/errors/ChatFlowError.js.map +1 -0
- package/dist/core/errors/index.d.ts +2 -0
- package/dist/core/errors/index.d.ts.map +1 -0
- package/dist/core/errors/index.js +15 -0
- package/dist/core/errors/index.js.map +1 -0
- package/dist/db/InMemoryRepository.d.ts +15 -0
- package/dist/db/InMemoryRepository.d.ts.map +1 -0
- package/dist/db/InMemoryRepository.js +41 -0
- package/dist/db/InMemoryRepository.js.map +1 -0
- package/dist/db/RedisRepository.d.ts +16 -0
- package/dist/db/RedisRepository.d.ts.map +1 -0
- package/dist/db/RedisRepository.js +87 -0
- package/dist/db/RedisRepository.js.map +1 -0
- package/dist/demo/cli-demo.d.ts +2 -0
- package/dist/demo/cli-demo.d.ts.map +1 -0
- package/dist/demo/cli-demo.js +142 -0
- package/dist/demo/cli-demo.js.map +1 -0
- package/dist/demo/console-chat.d.ts +2 -0
- package/dist/demo/console-chat.d.ts.map +1 -0
- package/dist/demo/console-chat.js +144 -0
- package/dist/demo/console-chat.js.map +1 -0
- package/dist/domain/conversation/ConversationSession.js +82 -0
- package/dist/domain/conversation/Message.js +33 -0
- package/dist/domain/conversation/SessionState.js +10 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/intent/IntentService.d.ts +17 -0
- package/dist/intent/IntentService.d.ts.map +1 -0
- package/dist/intent/IntentService.js +51 -0
- package/dist/intent/IntentService.js.map +1 -0
- package/dist/intent/MockIntentService.d.ts +6 -0
- package/dist/intent/MockIntentService.d.ts.map +1 -0
- package/dist/intent/MockIntentService.js +30 -0
- package/dist/intent/MockIntentService.js.map +1 -0
- package/dist/interfaces.d.ts +108 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/interfaces.js +18 -0
- package/dist/interfaces.js.map +1 -0
- package/dist/llm/GeminiLLMAdapter.d.ts +10 -0
- package/dist/llm/GeminiLLMAdapter.d.ts.map +1 -0
- package/dist/llm/GeminiLLMAdapter.js +102 -0
- package/dist/llm/GeminiLLMAdapter.js.map +1 -0
- package/dist/llm/MockLLMAdapter.d.ts +5 -0
- package/dist/llm/MockLLMAdapter.d.ts.map +1 -0
- package/dist/llm/MockLLMAdapter.js +31 -0
- package/dist/llm/MockLLMAdapter.js.map +1 -0
- package/dist/orchestrator/Orchestrator.d.ts +18 -0
- package/dist/orchestrator/Orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/Orchestrator.js +80 -0
- package/dist/orchestrator/Orchestrator.js.map +1 -0
- package/dist/ports/IIntentRepository.d.ts +27 -0
- package/dist/ports/IIntentRepository.d.ts.map +1 -0
- package/dist/ports/IIntentRepository.js +3 -0
- package/dist/ports/IIntentRepository.js.map +1 -0
- package/dist/ports/IntentPort.js +2 -0
- package/dist/ports/LLMPort.js +2 -0
- package/dist/ports/SessionRepository.js +2 -0
- package/dist/ports/WorkflowPort.js +2 -0
- package/dist/scripts/debug-redis.d.ts +2 -0
- package/dist/scripts/debug-redis.d.ts.map +1 -0
- package/dist/scripts/debug-redis.js +55 -0
- package/dist/scripts/debug-redis.js.map +1 -0
- package/dist/scripts/verify_memory_intents.d.ts +2 -0
- package/dist/scripts/verify_memory_intents.d.ts.map +1 -0
- package/dist/scripts/verify_memory_intents.js +45 -0
- package/dist/scripts/verify_memory_intents.js.map +1 -0
- package/dist/scripts/verify_redis_intents.d.ts +2 -0
- package/dist/scripts/verify_redis_intents.d.ts.map +1 -0
- package/dist/scripts/verify_redis_intents.js +50 -0
- package/dist/scripts/verify_redis_intents.js.map +1 -0
- package/dist/verify_memory_intents.js +44 -0
- package/dist/verify_redis_intents.js +49 -0
- package/dist/workflow/MockWorkflowAdapter.d.ts +5 -0
- package/dist/workflow/MockWorkflowAdapter.d.ts.map +1 -0
- package/dist/workflow/MockWorkflowAdapter.js +162 -0
- package/dist/workflow/MockWorkflowAdapter.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiLLMAdapter.d.ts","sourceRoot":"","sources":["../../src/llm/GeminiLLMAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAQ,MAAM,eAAe,CAAC;AAExE,qBAAa,gBAAiB,YAAW,WAAW;IAChD,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,cAAc,CAAM;gBAEhB,MAAM,EAAE,MAAM;IAKpB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAqGhF,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAIzD"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeminiLLMAdapter = void 0;
|
|
4
|
+
const generative_ai_1 = require("@google/generative-ai");
|
|
5
|
+
const interfaces_1 = require("../interfaces");
|
|
6
|
+
class GeminiLLMAdapter {
|
|
7
|
+
constructor(apiKey) {
|
|
8
|
+
this.genAI = new generative_ai_1.GoogleGenerativeAI(apiKey);
|
|
9
|
+
this.model = this.genAI.getGenerativeModel({ model: 'gemini-2.0-flash-lite' });
|
|
10
|
+
}
|
|
11
|
+
async generateResponse(systemPrompt, history) {
|
|
12
|
+
// 1. Convert History to Gemini Format
|
|
13
|
+
// Note: Gemini API treats 'user' and 'model' roles.
|
|
14
|
+
// We prepend the sensitive system prompt via the chat history or handle it if the SDK supports systemInstruction (newer versions do).
|
|
15
|
+
// For simplicity with strictly message history:
|
|
16
|
+
// 1. Convert History to Gemini Format
|
|
17
|
+
// Note: Gemini API treats 'user' and 'model' roles.
|
|
18
|
+
// We prepend the sensitive system prompt via the chat history or handle it if the SDK supports systemInstruction (newer versions do).
|
|
19
|
+
// For simplicity with strictly message history:
|
|
20
|
+
const validHistory = [];
|
|
21
|
+
let systemContext = "";
|
|
22
|
+
for (const msg of history) {
|
|
23
|
+
if (msg.role === interfaces_1.Role.SYSTEM) {
|
|
24
|
+
// Collect system messages to prepend to the next user message or context
|
|
25
|
+
systemContext += `${msg.content}\n`;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const role = msg.role === interfaces_1.Role.USER ? 'user' : 'model';
|
|
29
|
+
validHistory.push({
|
|
30
|
+
role,
|
|
31
|
+
parts: [{ text: msg.content }]
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// 2. Start Chat (or use generateContent with history context)
|
|
35
|
+
// Using startChat allows maintain context if we needed state, but we are stateless here mostly.
|
|
36
|
+
// However, we want to inject the "system prompt".
|
|
37
|
+
// We'll prepend it as a user message or use the systemInstruction property if available in the specific model/version usage.
|
|
38
|
+
// A common pattern for models without explicit system role in message list is to prepend to first user message or separate config.
|
|
39
|
+
// Let's use the simple chat approach.
|
|
40
|
+
const chat = this.model.startChat({
|
|
41
|
+
history: validHistory,
|
|
42
|
+
// systemInstruction: systemPrompt // Available in newer models/SDKs
|
|
43
|
+
});
|
|
44
|
+
// But wait, 'startChat' requires the history TO NOT include the *last* user message if we are about to send it via sendMessage.
|
|
45
|
+
// "history" here is the *past* messages.
|
|
46
|
+
// The *current* message (last one) should be sent via sendMessage.
|
|
47
|
+
// Let's re-slice.
|
|
48
|
+
const pastHistory = validHistory.slice(0, -1);
|
|
49
|
+
const lastMessage = validHistory[validHistory.length - 1];
|
|
50
|
+
// If for some reason history is empty (shouldn't happen in this flow as user just spoke), handle it.
|
|
51
|
+
const msgToSend = lastMessage ? lastMessage.parts[0].text : 'Hello';
|
|
52
|
+
// Prepend system prompt AND any collected systemContext to the context.
|
|
53
|
+
// Easiest hack: Prepend a "User" message with "Instructions: ..." at the very start of history.
|
|
54
|
+
const fullSystemInstruction = `[System Instructions]: ${systemPrompt}\n\n[Context]: ${systemContext}`;
|
|
55
|
+
if (pastHistory.length === 0) {
|
|
56
|
+
// No history, so this is the first message. Combine system prompt.
|
|
57
|
+
// Actually, we can't modify msgToSend easily if we want strict separation, but let's just prepend instruction to the first message of the session.
|
|
58
|
+
// However, since we are re-instantiating chat every request (stateless adapter), we can just craft the history.
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Inject system prompt into the first message of pastHistory
|
|
62
|
+
pastHistory[0].parts[0].text = `${fullSystemInstruction}\n\n${pastHistory[0].parts[0].text}`;
|
|
63
|
+
}
|
|
64
|
+
// Note: If pastHistory is empty, we must inject into msgToSend.
|
|
65
|
+
let finalMsgToSend = msgToSend;
|
|
66
|
+
if (pastHistory.length === 0) {
|
|
67
|
+
finalMsgToSend = `${fullSystemInstruction}\n\n${msgToSend}`;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const chatSession = this.model.startChat({
|
|
71
|
+
history: pastHistory,
|
|
72
|
+
});
|
|
73
|
+
const result = await chatSession.sendMessage(finalMsgToSend);
|
|
74
|
+
const response = await result.response;
|
|
75
|
+
const text = response.text();
|
|
76
|
+
return {
|
|
77
|
+
content: text,
|
|
78
|
+
usage: {
|
|
79
|
+
// Gemini doesn't always return token info easily in simple response, defaulting
|
|
80
|
+
promptTokens: 0,
|
|
81
|
+
completionTokens: 0
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
console.error('Gemini API Error:', error);
|
|
87
|
+
return {
|
|
88
|
+
content: "I'm sorry, I'm having trouble connecting to my brain right now.",
|
|
89
|
+
usage: {
|
|
90
|
+
promptTokens: 0,
|
|
91
|
+
completionTokens: 0
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async generateContent(prompt) {
|
|
97
|
+
const response = await this.model.generateContent(prompt);
|
|
98
|
+
return response.response.text();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.GeminiLLMAdapter = GeminiLLMAdapter;
|
|
102
|
+
//# sourceMappingURL=GeminiLLMAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiLLMAdapter.js","sourceRoot":"","sources":["../../src/llm/GeminiLLMAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockLLMAdapter.d.ts","sourceRoot":"","sources":["../../src/llm/MockLLMAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAElE,qBAAa,cAAe,YAAW,WAAW;IACxC,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;CAwBzF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MockLLMAdapter = void 0;
|
|
4
|
+
class MockLLMAdapter {
|
|
5
|
+
async generateResponse(systemPrompt, history) {
|
|
6
|
+
const lastMsg = history[history.length - 1].content.toLowerCase();
|
|
7
|
+
let content = "I can help with that.";
|
|
8
|
+
// Basic mock logic to respond to workflow data
|
|
9
|
+
if (lastMsg.includes('system info: workflow detected')) {
|
|
10
|
+
if (lastMsg.includes('booking_confirmed')) {
|
|
11
|
+
content = "You are all set! I have booked flight AC123 for you. Reference: SKY-999-XYZ. Safe travels!";
|
|
12
|
+
}
|
|
13
|
+
else if (lastMsg.includes('found_flights')) {
|
|
14
|
+
content = "I found a couple of flights to Paris. There is one at 10:00 AM ($500) and another at 2:00 PM ($450). Do you prefer the morning or afternoon one?";
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
content = "I have checked the system and have the information you need.";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
// Default generic chat
|
|
22
|
+
content = `This is a mock AI response to: "${lastMsg}".`;
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
content,
|
|
26
|
+
usage: { promptTokens: 10, completionTokens: 10 }
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.MockLLMAdapter = MockLLMAdapter;
|
|
31
|
+
//# sourceMappingURL=MockLLMAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockLLMAdapter.js","sourceRoot":"","sources":["../../src/llm/MockLLMAdapter.ts"],"names":[],"mappings":";;;AAEA,MAAa,cAAc;IACvB,KAAK,CAAC,gBAAgB,CAAC,YAAoB,EAAE,OAAkB;QAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAElE,IAAI,OAAO,GAAG,uBAAuB,CAAC;QAEtC,+CAA+C;QAC/C,IAAI,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,CAAC;YACrD,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACxC,OAAO,GAAG,4FAA4F,CAAC;YAC3G,CAAC;iBAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC3C,OAAO,GAAG,kJAAkJ,CAAC;YACjK,CAAC;iBAAM,CAAC;gBACJ,OAAO,GAAG,8DAA8D,CAAC;YAC7E,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,uBAAuB;YACvB,OAAO,GAAG,mCAAmC,OAAO,IAAI,CAAC;QAC7D,CAAC;QAED,OAAO;YACH,OAAO;YACP,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE;SACpD,CAAC;IACN,CAAC;CACJ;AAzBD,wCAyBC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ConversationSession } from '../core/entities/ConversationSession';
|
|
2
|
+
import { Message } from '../core/entities/Message';
|
|
3
|
+
import { IRepository, ILLMAdapter, IIntentService, IWorkflowAdapter, IOrchestrator } from '../interfaces';
|
|
4
|
+
import { ChatFlowConfig } from '../config';
|
|
5
|
+
export declare class Orchestrator implements IOrchestrator {
|
|
6
|
+
private repo;
|
|
7
|
+
private llm;
|
|
8
|
+
private intent;
|
|
9
|
+
private workflow;
|
|
10
|
+
private readonly config;
|
|
11
|
+
constructor(repo: IRepository, llm: ILLMAdapter, intent: IIntentService, workflow: IWorkflowAdapter, config?: Partial<ChatFlowConfig>);
|
|
12
|
+
createSession(sessionId: string, mode: 'TEXT' | 'VOICE', agentPrompt: string): Promise<ConversationSession>;
|
|
13
|
+
handleMessage(sessionId: string, content: string): Promise<{
|
|
14
|
+
messages: Message[];
|
|
15
|
+
metadata?: any;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=Orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/Orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EACH,WAAW,EACX,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,aAAa,EAEhB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,cAAc,EAAkB,MAAM,WAAW,CAAC;AAE3D,qBAAa,YAAa,YAAW,aAAa;IAI1C,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IANpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAG5B,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,gBAAgB,EAClC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAK9B,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAW3G,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;CA6D5G"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Orchestrator = void 0;
|
|
4
|
+
const ConversationSession_1 = require("../core/entities/ConversationSession");
|
|
5
|
+
const Message_1 = require("../core/entities/Message");
|
|
6
|
+
const interfaces_1 = require("../interfaces");
|
|
7
|
+
const errors_1 = require("../core/errors");
|
|
8
|
+
const config_1 = require("../config");
|
|
9
|
+
class Orchestrator {
|
|
10
|
+
constructor(repo, llm, intent, workflow, config) {
|
|
11
|
+
this.repo = repo;
|
|
12
|
+
this.llm = llm;
|
|
13
|
+
this.intent = intent;
|
|
14
|
+
this.workflow = workflow;
|
|
15
|
+
this.config = config ? { ...config_1.DEFAULT_CONFIG, ...config } : config_1.DEFAULT_CONFIG;
|
|
16
|
+
}
|
|
17
|
+
async createSession(sessionId, mode, agentPrompt) {
|
|
18
|
+
const session = new ConversationSession_1.ConversationSession({
|
|
19
|
+
sessionId,
|
|
20
|
+
mode,
|
|
21
|
+
agentPrompt
|
|
22
|
+
});
|
|
23
|
+
await this.repo.saveSession(session);
|
|
24
|
+
return session;
|
|
25
|
+
}
|
|
26
|
+
async handleMessage(sessionId, content) {
|
|
27
|
+
// 1. Load Session
|
|
28
|
+
const session = await this.repo.findSessionById(sessionId);
|
|
29
|
+
if (!session) {
|
|
30
|
+
throw new errors_1.SessionNotFoundError(sessionId);
|
|
31
|
+
}
|
|
32
|
+
// 2. Append User Message
|
|
33
|
+
const userMessage = Message_1.Message.user(content);
|
|
34
|
+
session.addMessage(userMessage);
|
|
35
|
+
const newMessages = [];
|
|
36
|
+
// 3. Detect Intent
|
|
37
|
+
console.log(`[Orchestrator] Requesting Intent classification for: "${content.substring(0, 50)}..."`);
|
|
38
|
+
const intentResult = await this.intent.detectIntent(session.getHistory(), session.agentPrompt);
|
|
39
|
+
if (intentResult.intentName && intentResult.confidence >= this.config.intent.confidenceThreshold) {
|
|
40
|
+
console.log(`[Orchestrator] DECISION: Execute Workflow '${intentResult.intentName}' (Confidence ${intentResult.confidence} >= ${this.config.intent.confidenceThreshold})`);
|
|
41
|
+
const workflowResult = await this.workflow.executeWorkflow(intentResult.intentName, intentResult.payload);
|
|
42
|
+
// 5. Inject Workflow Result
|
|
43
|
+
const workflowContextMessage = new Message_1.Message({
|
|
44
|
+
role: interfaces_1.Role.SYSTEM,
|
|
45
|
+
content: `[System Info: Workflow detected '${intentResult.intentName}'. Execution Result: ${JSON.stringify(workflowResult.data)}. Use this to answer the user.]`,
|
|
46
|
+
timestamp: new Date()
|
|
47
|
+
});
|
|
48
|
+
// Transient history
|
|
49
|
+
const transientHistory = [...session.getHistory(), workflowContextMessage];
|
|
50
|
+
const llmResponse = await this.llm.generateResponse(session.agentPrompt, transientHistory);
|
|
51
|
+
const assistantMsg = Message_1.Message.assistant(llmResponse.content);
|
|
52
|
+
session.addMessage(assistantMsg);
|
|
53
|
+
newMessages.push(assistantMsg);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
if (intentResult.intentName) {
|
|
57
|
+
console.log(`[Orchestrator] DECISION: Skip Workflow '${intentResult.intentName}' (Confidence ${intentResult.confidence} < ${this.config.intent.confidenceThreshold}). Proceeding with Standard LLM.`);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.log(`[Orchestrator] DECISION: No Intent Detected. Proceeding with Standard LLM.`);
|
|
61
|
+
}
|
|
62
|
+
const llmResponse = await this.llm.generateResponse(session.agentPrompt, session.getHistory());
|
|
63
|
+
const assistantMsg = Message_1.Message.assistant(llmResponse.content);
|
|
64
|
+
session.addMessage(assistantMsg);
|
|
65
|
+
newMessages.push(assistantMsg);
|
|
66
|
+
}
|
|
67
|
+
// 6. Save
|
|
68
|
+
await this.repo.saveSession(session);
|
|
69
|
+
return {
|
|
70
|
+
messages: newMessages,
|
|
71
|
+
metadata: {
|
|
72
|
+
intent: intentResult.intentName,
|
|
73
|
+
confidence: intentResult.confidence,
|
|
74
|
+
workflowExecuted: (intentResult.intentName && intentResult.confidence >= this.config.intent.confidenceThreshold) ? intentResult.intentName : null
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.Orchestrator = Orchestrator;
|
|
80
|
+
//# sourceMappingURL=Orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Orchestrator.js","sourceRoot":"","sources":["../../src/orchestrator/Orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Intent } from '../interfaces';
|
|
2
|
+
/**
|
|
3
|
+
* Repository interface for intent persistence
|
|
4
|
+
*/
|
|
5
|
+
export interface IIntentRepository {
|
|
6
|
+
/**
|
|
7
|
+
* Save a single intent
|
|
8
|
+
*/
|
|
9
|
+
saveIntent(intent: Intent): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Upsert multiple intents
|
|
12
|
+
*/
|
|
13
|
+
upsertIntents(intents: Intent[]): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Find an intent by name
|
|
16
|
+
*/
|
|
17
|
+
findIntentByName(name: string): Promise<Intent | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Get all intents
|
|
20
|
+
*/
|
|
21
|
+
getAllIntents(): Promise<Intent[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Delete an intent by name
|
|
24
|
+
*/
|
|
25
|
+
deleteIntent(name: string): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=IIntentRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IIntentRepository.d.ts","sourceRoot":"","sources":["../../src/ports/IIntentRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEvD;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEnC;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IIntentRepository.js","sourceRoot":"","sources":["../../src/ports/IIntentRepository.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-redis.d.ts","sourceRoot":"","sources":["../../src/scripts/debug-redis.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
require("dotenv/config");
|
|
7
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
8
|
+
async function debugRedis() {
|
|
9
|
+
const redis = new ioredis_1.default(process.env.REDIS_URL || 'redis://localhost:6379');
|
|
10
|
+
console.log('--- Debug Redis ---');
|
|
11
|
+
// 1. Check Keys
|
|
12
|
+
const keys = await redis.keys('intent:*');
|
|
13
|
+
console.log(`\nFound ${keys.length} intent keys:`);
|
|
14
|
+
keys.forEach(k => console.log(` - ${k}`));
|
|
15
|
+
if (keys.length > 0) {
|
|
16
|
+
const sample = await redis.call('JSON.GET', keys[0]);
|
|
17
|
+
console.log(`\nSample Intent (${keys[0]}):`, typeof sample === 'string' ? sample.substring(0, 100) + '...' : sample);
|
|
18
|
+
}
|
|
19
|
+
// 2. Check Index
|
|
20
|
+
try {
|
|
21
|
+
const indices = await redis.call('FT._LIST');
|
|
22
|
+
console.log('\nIndices:', indices);
|
|
23
|
+
const info = await redis.call('FT.INFO', 'idx:intents');
|
|
24
|
+
// ioredis returns array for info
|
|
25
|
+
console.log('\nIndex Info (First 10 lines):');
|
|
26
|
+
console.log(JSON.stringify(info).substring(0, 200));
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
console.error('\nIndex Error:', err.message);
|
|
30
|
+
}
|
|
31
|
+
// 3. Test Search (if keys exist)
|
|
32
|
+
if (keys.length > 0) {
|
|
33
|
+
try {
|
|
34
|
+
// Check if embedding exists on sample
|
|
35
|
+
const sampleJson = await redis.call('JSON.GET', keys[0]);
|
|
36
|
+
const sample = JSON.parse(sampleJson);
|
|
37
|
+
if (!sample.embedding || sample.embedding.length === 0) {
|
|
38
|
+
console.error('\n[CRITICAL] Sample intent has NO EMBEDDING!');
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
console.log(`\nSample Embedding Length: ${sample.embedding.length}`);
|
|
42
|
+
// Try a search with this embedding (should match itself)
|
|
43
|
+
const blob = Buffer.from(new Float32Array(sample.embedding).buffer);
|
|
44
|
+
const res = await redis.call('FT.SEARCH', 'idx:intents', `*=>[KNN 5 @embedding $blob AS score]`, 'PARAMS', '2', 'blob', blob, 'SORTBY', 'score', 'DIALECT', '2');
|
|
45
|
+
console.log('\nTest Self-Search Result:', JSON.stringify(res));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
console.error('Test Search Failed:', err);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
redis.disconnect();
|
|
53
|
+
}
|
|
54
|
+
debugRedis();
|
|
55
|
+
//# sourceMappingURL=debug-redis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-redis.js","sourceRoot":"","sources":["../../src/scripts/debug-redis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify_memory_intents.d.ts","sourceRoot":"","sources":["../../src/scripts/verify_memory_intents.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const InMemoryRepository_1 = require("../adapters/repository/InMemoryRepository");
|
|
4
|
+
async function runMemoryVerification() {
|
|
5
|
+
console.log('--- InMemoryRepository Intent Verification ---');
|
|
6
|
+
const repo = new InMemoryRepository_1.InMemoryRepository();
|
|
7
|
+
// 1. Create an Intent
|
|
8
|
+
const testIntent = {
|
|
9
|
+
name: 'TEST_INTENT',
|
|
10
|
+
description: 'A test intent',
|
|
11
|
+
required_fields: [],
|
|
12
|
+
optional_fields: []
|
|
13
|
+
};
|
|
14
|
+
console.log(`\n1. Creating Intent: ${testIntent.name}`);
|
|
15
|
+
await repo.saveIntent(testIntent);
|
|
16
|
+
console.log('Intent saved.');
|
|
17
|
+
// 2. Retrieve Intent
|
|
18
|
+
const retrieved = await repo.findIntentByName('TEST_INTENT');
|
|
19
|
+
if (retrieved && retrieved.name === 'TEST_INTENT') {
|
|
20
|
+
console.log('[PASS] findIntentByName successful');
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
console.error('[FAIL] findIntentByName failed');
|
|
24
|
+
}
|
|
25
|
+
// 3. Search Mock
|
|
26
|
+
const searchResults = await repo.searchIntents([], 5);
|
|
27
|
+
console.log(`\n3. Search results (mock): ${searchResults.length} found`);
|
|
28
|
+
if (searchResults.length > 0 && searchResults[0].name === 'TEST_INTENT') {
|
|
29
|
+
console.log('[PASS] searchIntents (mock) successful');
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
console.error('[FAIL] searchIntents failed');
|
|
33
|
+
}
|
|
34
|
+
// 4. Cleanup
|
|
35
|
+
await repo.deleteIntent('TEST_INTENT');
|
|
36
|
+
const deleted = await repo.findIntentByName('TEST_INTENT');
|
|
37
|
+
if (!deleted) {
|
|
38
|
+
console.log('[PASS] deleteIntent successful');
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
console.error('[FAIL] deleteIntent failed');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
runMemoryVerification().catch(console.error);
|
|
45
|
+
//# sourceMappingURL=verify_memory_intents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify_memory_intents.js","sourceRoot":"","sources":["../../src/scripts/verify_memory_intents.ts"],"names":[],"mappings":";;AAAA,kFAA+E;AAG/E,KAAK,UAAU,qBAAqB;IAChC,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAE9D,MAAM,IAAI,GAAG,IAAI,uCAAkB,EAAE,CAAC;IAEtC,sBAAsB;IACtB,MAAM,UAAU,GAAW;QACvB,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,eAAe;QAC5B,eAAe,EAAE,EAAE;QACnB,eAAe,EAAE,EAAE;KACtB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,yBAAyB,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAE7B,qBAAqB;IACrB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAC7D,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,iBAAiB;IACjB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,+BAA+B,aAAa,CAAC,MAAM,QAAQ,CAAC,CAAC;IACzE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,aAAa;IACb,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;AACL,CAAC;AAED,qBAAqB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify_redis_intents.d.ts","sourceRoot":"","sources":["../../src/scripts/verify_redis_intents.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require("dotenv/config");
|
|
4
|
+
const RedisRepository_1 = require("../adapters/repository/RedisRepository");
|
|
5
|
+
const IntentService_1 = require("../intent/IntentService");
|
|
6
|
+
const GeminiLLMAdapter_1 = require("../adapters/llm/GeminiLLMAdapter");
|
|
7
|
+
async function runVerification() {
|
|
8
|
+
console.log('--- Redis Intent Verification ---');
|
|
9
|
+
const redisUrl = process.env.REDIS_URL;
|
|
10
|
+
const apiKey = process.env.GOOGLE_AI_API_KEY;
|
|
11
|
+
if (!redisUrl || !apiKey) {
|
|
12
|
+
console.error('REDIS_URL or GOOGLE_AI_API_KEY missing.');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
console.log(`Connecting to Redis at ${redisUrl}`);
|
|
16
|
+
const redisRepo = new RedisRepository_1.RedisRepository(redisUrl);
|
|
17
|
+
console.log('Initializing adapters...');
|
|
18
|
+
const gemini = new GeminiLLMAdapter_1.GeminiLLMAdapter(apiKey);
|
|
19
|
+
const intentService = new IntentService_1.IntentService(gemini, redisRepo);
|
|
20
|
+
// 1. Create an Intent
|
|
21
|
+
const testIntent = {
|
|
22
|
+
name: 'BOOK_FLIGHT',
|
|
23
|
+
description: 'User wants to book a flight ticket',
|
|
24
|
+
required_fields: [
|
|
25
|
+
{ name: 'destination', type: 'string' },
|
|
26
|
+
{ name: 'date', type: 'string' }
|
|
27
|
+
],
|
|
28
|
+
optional_fields: [
|
|
29
|
+
{ name: 'airline', type: 'string' }
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
console.log(`\n1. Creating Intent: ${testIntent.name}`);
|
|
33
|
+
await intentService.upsertIntents([testIntent]);
|
|
34
|
+
console.log('Intent saved.');
|
|
35
|
+
// 2. Search Intent (Vector Search)
|
|
36
|
+
const query = "I need to fly to Tokyo next Monday";
|
|
37
|
+
console.log(`\n2. Searching for intent with query: "${query}"`);
|
|
38
|
+
// Using matchIntents which uses vector search + LLM
|
|
39
|
+
const matches = await intentService.matchIntents(query, 70);
|
|
40
|
+
console.log('Matches found:', JSON.stringify(matches, null, 2));
|
|
41
|
+
if (matches.length > 0 && matches[0].intent.name === 'BOOK_FLIGHT') {
|
|
42
|
+
console.log('\n[PASS] Vector search and matching successful!');
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
console.error('\n[FAIL] Could not match intent.');
|
|
46
|
+
}
|
|
47
|
+
await redisRepo.disconnect();
|
|
48
|
+
}
|
|
49
|
+
runVerification().catch(err => console.error(err));
|
|
50
|
+
//# sourceMappingURL=verify_redis_intents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify_redis_intents.js","sourceRoot":"","sources":["../../src/scripts/verify_redis_intents.ts"],"names":[],"mappings":";;AAAA,yBAAuB;AACvB,4EAAyE;AACzE,2DAAwD;AACxD,uEAAoE;AAGpE,KAAK,UAAU,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAE7C,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,iCAAe,CAAC,QAAQ,CAAC,CAAC;IAEhD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,mCAAgB,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAE3D,sBAAsB;IACtB,MAAM,UAAU,GAAW;QACvB,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,oCAAoC;QACjD,eAAe,EAAE;YACb,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE;YACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;SACnC;QACD,eAAe,EAAE;YACb,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;SACtC;KACJ,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,yBAAyB,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAE7B,mCAAmC;IACnC,MAAM,KAAK,GAAG,oCAAoC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,0CAA0C,KAAK,GAAG,CAAC,CAAC;IAEhE,oDAAoD;IACpD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE5D,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEhE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;AACjC,CAAC;AAED,eAAe,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const InMemoryRepository_1 = require("./db/InMemoryRepository");
|
|
4
|
+
async function runMemoryVerification() {
|
|
5
|
+
console.log('--- InMemoryRepository Intent Verification ---');
|
|
6
|
+
const repo = new InMemoryRepository_1.InMemoryRepository();
|
|
7
|
+
// 1. Create an Intent
|
|
8
|
+
const testIntent = {
|
|
9
|
+
name: 'TEST_INTENT',
|
|
10
|
+
description: 'A test intent',
|
|
11
|
+
required_fields: [],
|
|
12
|
+
optional_fields: []
|
|
13
|
+
};
|
|
14
|
+
console.log(`\n1. Creating Intent: ${testIntent.name}`);
|
|
15
|
+
await repo.saveIntent(testIntent);
|
|
16
|
+
console.log('Intent saved.');
|
|
17
|
+
// 2. Retrieve Intent
|
|
18
|
+
const retrieved = await repo.findIntentByName('TEST_INTENT');
|
|
19
|
+
if (retrieved && retrieved.name === 'TEST_INTENT') {
|
|
20
|
+
console.log('[PASS] findIntentByName successful');
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
console.error('[FAIL] findIntentByName failed');
|
|
24
|
+
}
|
|
25
|
+
// 3. Search Mock
|
|
26
|
+
const searchResults = await repo.searchIntents([], 5);
|
|
27
|
+
console.log(`\n3. Search results (mock): ${searchResults.length} found`);
|
|
28
|
+
if (searchResults.length > 0 && searchResults[0].name === 'TEST_INTENT') {
|
|
29
|
+
console.log('[PASS] searchIntents (mock) successful');
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
console.error('[FAIL] searchIntents failed');
|
|
33
|
+
}
|
|
34
|
+
// 4. Cleanup
|
|
35
|
+
await repo.deleteIntent('TEST_INTENT');
|
|
36
|
+
const deleted = await repo.findIntentByName('TEST_INTENT');
|
|
37
|
+
if (!deleted) {
|
|
38
|
+
console.log('[PASS] deleteIntent successful');
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
console.error('[FAIL] deleteIntent failed');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
runMemoryVerification().catch(console.error);
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require("dotenv/config");
|
|
4
|
+
const RedisRepository_1 = require("./db/RedisRepository");
|
|
5
|
+
const IntentService_1 = require("./intent/IntentService");
|
|
6
|
+
const GeminiLLMAdapter_1 = require("./llm/GeminiLLMAdapter");
|
|
7
|
+
async function runVerification() {
|
|
8
|
+
console.log('--- Redis Intent Verification ---');
|
|
9
|
+
const redisUrl = process.env.REDIS_URL;
|
|
10
|
+
const apiKey = process.env.GOOGLE_AI_API_KEY;
|
|
11
|
+
if (!redisUrl || !apiKey) {
|
|
12
|
+
console.error('REDIS_URL or GOOGLE_AI_API_KEY missing.');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
console.log(`Connecting to Redis at ${redisUrl}`);
|
|
16
|
+
const redisRepo = new RedisRepository_1.RedisRepository(redisUrl);
|
|
17
|
+
console.log('Initializing adapters...');
|
|
18
|
+
const gemini = new GeminiLLMAdapter_1.GeminiLLMAdapter(apiKey);
|
|
19
|
+
const intentService = new IntentService_1.IntentService(gemini, redisRepo);
|
|
20
|
+
// 1. Create an Intent
|
|
21
|
+
const testIntent = {
|
|
22
|
+
name: 'BOOK_FLIGHT',
|
|
23
|
+
description: 'User wants to book a flight ticket',
|
|
24
|
+
required_fields: [
|
|
25
|
+
{ name: 'destination', type: 'string' },
|
|
26
|
+
{ name: 'date', type: 'string' }
|
|
27
|
+
],
|
|
28
|
+
optional_fields: [
|
|
29
|
+
{ name: 'airline', type: 'string' }
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
console.log(`\n1. Creating Intent: ${testIntent.name}`);
|
|
33
|
+
await intentService.upsertIntents([testIntent]);
|
|
34
|
+
console.log('Intent saved.');
|
|
35
|
+
// 2. Search Intent (Vector Search)
|
|
36
|
+
const query = "I need to fly to Tokyo next Monday";
|
|
37
|
+
console.log(`\n2. Searching for intent with query: "${query}"`);
|
|
38
|
+
// Using matchIntents which uses vector search + LLM
|
|
39
|
+
const matches = await intentService.matchIntents(query, 70);
|
|
40
|
+
console.log('Matches found:', JSON.stringify(matches, null, 2));
|
|
41
|
+
if (matches.length > 0 && matches[0].intent.name === 'BOOK_FLIGHT') {
|
|
42
|
+
console.log('\n[PASS] Vector search and matching successful!');
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
console.error('\n[FAIL] Could not match intent.');
|
|
46
|
+
}
|
|
47
|
+
await redisRepo.disconnect();
|
|
48
|
+
}
|
|
49
|
+
runVerification().catch(err => console.error(err));
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { IWorkflowAdapter, WorkflowResult } from '../interfaces';
|
|
2
|
+
export declare class MockWorkflowAdapter implements IWorkflowAdapter {
|
|
3
|
+
executeWorkflow(intentName: string, payload: any): Promise<WorkflowResult>;
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=MockWorkflowAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockWorkflowAdapter.d.ts","sourceRoot":"","sources":["../../src/workflow/MockWorkflowAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAuDjE,qBAAa,mBAAoB,YAAW,gBAAgB;IAClD,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC;CAsInF"}
|