@falai/agent 0.9.0-alpha-1 ā 0.9.0
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/README.md +34 -22
- package/dist/cjs/src/core/Agent.d.ts +77 -59
- package/dist/cjs/src/core/Agent.d.ts.map +1 -1
- package/dist/cjs/src/core/Agent.js +284 -1060
- package/dist/cjs/src/core/Agent.js.map +1 -1
- package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -1
- package/dist/cjs/src/core/PersistenceManager.js +48 -25
- package/dist/cjs/src/core/PersistenceManager.js.map +1 -1
- package/dist/cjs/src/core/PromptComposer.d.ts +1 -1
- package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -1
- package/dist/cjs/src/core/PromptComposer.js.map +1 -1
- package/dist/cjs/src/core/ResponseEngine.d.ts +13 -12
- package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/src/core/ResponseEngine.js +4 -4
- package/dist/cjs/src/core/ResponseEngine.js.map +1 -1
- package/dist/cjs/src/core/ResponseModal.d.ts +205 -0
- package/dist/cjs/src/core/ResponseModal.d.ts.map +1 -0
- package/dist/cjs/src/core/ResponseModal.js +1328 -0
- package/dist/cjs/src/core/ResponseModal.js.map +1 -0
- package/dist/cjs/src/core/ResponsePipeline.d.ts +66 -38
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/cjs/src/core/ResponsePipeline.js +72 -4
- package/dist/cjs/src/core/ResponsePipeline.js.map +1 -1
- package/dist/cjs/src/core/Route.d.ts +24 -5
- package/dist/cjs/src/core/Route.d.ts.map +1 -1
- package/dist/cjs/src/core/Route.js +45 -1
- package/dist/cjs/src/core/Route.js.map +1 -1
- package/dist/cjs/src/core/RoutingEngine.d.ts +31 -6
- package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -1
- package/dist/cjs/src/core/RoutingEngine.js +113 -9
- package/dist/cjs/src/core/RoutingEngine.js.map +1 -1
- package/dist/cjs/src/core/SessionManager.d.ts +14 -4
- package/dist/cjs/src/core/SessionManager.d.ts.map +1 -1
- package/dist/cjs/src/core/SessionManager.js +25 -5
- package/dist/cjs/src/core/SessionManager.js.map +1 -1
- package/dist/cjs/src/core/Step.d.ts +10 -10
- package/dist/cjs/src/core/Step.d.ts.map +1 -1
- package/dist/cjs/src/core/Step.js.map +1 -1
- package/dist/cjs/src/core/ToolExecutor.d.ts +4 -2
- package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -1
- package/dist/cjs/src/core/ToolExecutor.js +13 -3
- package/dist/cjs/src/core/ToolExecutor.js.map +1 -1
- package/dist/cjs/src/index.d.ts +3 -1
- package/dist/cjs/src/index.d.ts.map +1 -1
- package/dist/cjs/src/index.js +7 -1
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/types/agent.d.ts +42 -21
- package/dist/cjs/src/types/agent.d.ts.map +1 -1
- package/dist/cjs/src/types/agent.js.map +1 -1
- package/dist/cjs/src/types/ai.d.ts +1 -1
- package/dist/cjs/src/types/ai.d.ts.map +1 -1
- package/dist/cjs/src/types/index.d.ts +1 -1
- package/dist/cjs/src/types/index.d.ts.map +1 -1
- package/dist/cjs/src/types/index.js.map +1 -1
- package/dist/cjs/src/types/persistence.d.ts +0 -1
- package/dist/cjs/src/types/persistence.d.ts.map +1 -1
- package/dist/cjs/src/types/route.d.ts +22 -16
- package/dist/cjs/src/types/route.d.ts.map +1 -1
- package/dist/cjs/src/types/session.d.ts +6 -11
- package/dist/cjs/src/types/session.d.ts.map +1 -1
- package/dist/cjs/src/types/tool.d.ts +12 -6
- package/dist/cjs/src/types/tool.d.ts.map +1 -1
- package/dist/cjs/src/utils/clone.d.ts.map +1 -1
- package/dist/cjs/src/utils/clone.js +0 -4
- package/dist/cjs/src/utils/clone.js.map +1 -1
- package/dist/cjs/src/utils/history.d.ts +30 -1
- package/dist/cjs/src/utils/history.d.ts.map +1 -1
- package/dist/cjs/src/utils/history.js +169 -23
- package/dist/cjs/src/utils/history.js.map +1 -1
- package/dist/cjs/src/utils/index.d.ts +1 -1
- package/dist/cjs/src/utils/index.d.ts.map +1 -1
- package/dist/cjs/src/utils/index.js +5 -1
- package/dist/cjs/src/utils/index.js.map +1 -1
- package/dist/cjs/src/utils/session.d.ts +2 -2
- package/dist/cjs/src/utils/session.d.ts.map +1 -1
- package/dist/cjs/src/utils/session.js +6 -26
- package/dist/cjs/src/utils/session.js.map +1 -1
- package/dist/src/core/Agent.d.ts +77 -59
- package/dist/src/core/Agent.d.ts.map +1 -1
- package/dist/src/core/Agent.js +285 -1061
- package/dist/src/core/Agent.js.map +1 -1
- package/dist/src/core/PersistenceManager.d.ts.map +1 -1
- package/dist/src/core/PersistenceManager.js +48 -25
- package/dist/src/core/PersistenceManager.js.map +1 -1
- package/dist/src/core/PromptComposer.d.ts +1 -1
- package/dist/src/core/PromptComposer.d.ts.map +1 -1
- package/dist/src/core/PromptComposer.js.map +1 -1
- package/dist/src/core/ResponseEngine.d.ts +13 -12
- package/dist/src/core/ResponseEngine.d.ts.map +1 -1
- package/dist/src/core/ResponseEngine.js +4 -4
- package/dist/src/core/ResponseEngine.js.map +1 -1
- package/dist/src/core/ResponseModal.d.ts +205 -0
- package/dist/src/core/ResponseModal.d.ts.map +1 -0
- package/dist/src/core/ResponseModal.js +1323 -0
- package/dist/src/core/ResponseModal.js.map +1 -0
- package/dist/src/core/ResponsePipeline.d.ts +66 -38
- package/dist/src/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/src/core/ResponsePipeline.js +72 -4
- package/dist/src/core/ResponsePipeline.js.map +1 -1
- package/dist/src/core/Route.d.ts +24 -5
- package/dist/src/core/Route.d.ts.map +1 -1
- package/dist/src/core/Route.js +45 -1
- package/dist/src/core/Route.js.map +1 -1
- package/dist/src/core/RoutingEngine.d.ts +31 -6
- package/dist/src/core/RoutingEngine.d.ts.map +1 -1
- package/dist/src/core/RoutingEngine.js +113 -9
- package/dist/src/core/RoutingEngine.js.map +1 -1
- package/dist/src/core/SessionManager.d.ts +14 -4
- package/dist/src/core/SessionManager.d.ts.map +1 -1
- package/dist/src/core/SessionManager.js +25 -5
- package/dist/src/core/SessionManager.js.map +1 -1
- package/dist/src/core/Step.d.ts +10 -10
- package/dist/src/core/Step.d.ts.map +1 -1
- package/dist/src/core/Step.js.map +1 -1
- package/dist/src/core/ToolExecutor.d.ts +4 -2
- package/dist/src/core/ToolExecutor.d.ts.map +1 -1
- package/dist/src/core/ToolExecutor.js +13 -3
- package/dist/src/core/ToolExecutor.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/types/agent.d.ts +42 -21
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js.map +1 -1
- package/dist/src/types/ai.d.ts +1 -1
- package/dist/src/types/ai.d.ts.map +1 -1
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/persistence.d.ts +0 -1
- package/dist/src/types/persistence.d.ts.map +1 -1
- package/dist/src/types/route.d.ts +22 -16
- package/dist/src/types/route.d.ts.map +1 -1
- package/dist/src/types/session.d.ts +6 -11
- package/dist/src/types/session.d.ts.map +1 -1
- package/dist/src/types/tool.d.ts +12 -6
- package/dist/src/types/tool.d.ts.map +1 -1
- package/dist/src/utils/clone.d.ts.map +1 -1
- package/dist/src/utils/clone.js +0 -4
- package/dist/src/utils/clone.js.map +1 -1
- package/dist/src/utils/history.d.ts +30 -1
- package/dist/src/utils/history.d.ts.map +1 -1
- package/dist/src/utils/history.js +165 -23
- package/dist/src/utils/history.js.map +1 -1
- package/dist/src/utils/index.d.ts +1 -1
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +1 -1
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/session.d.ts +2 -2
- package/dist/src/utils/session.d.ts.map +1 -1
- package/dist/src/utils/session.js +6 -26
- package/dist/src/utils/session.js.map +1 -1
- package/docs/README.md +5 -4
- package/docs/api/README.md +195 -4
- package/docs/api/overview.md +232 -13
- package/docs/core/agent/README.md +162 -17
- package/docs/core/agent/context-management.md +39 -15
- package/docs/core/agent/session-management.md +49 -16
- package/docs/core/ai-integration/prompt-composition.md +38 -14
- package/docs/core/ai-integration/response-processing.md +28 -17
- package/docs/core/conversation-flows/data-collection.md +103 -25
- package/docs/core/conversation-flows/route-dsl.md +45 -22
- package/docs/core/conversation-flows/routes.md +74 -18
- package/docs/core/conversation-flows/step-transitions.md +3 -3
- package/docs/core/conversation-flows/steps.md +39 -15
- package/docs/core/routing/intelligent-routing.md +18 -9
- package/docs/core/tools/tool-definition.md +8 -8
- package/docs/core/tools/tool-execution.md +26 -26
- package/docs/core/tools/tool-scoping.md +5 -5
- package/docs/guides/getting-started/README.md +54 -32
- package/docs/guides/migration/README.md +72 -0
- package/docs/guides/migration/response-modal-refactor.md +518 -0
- package/examples/advanced-patterns/knowledge-based-agent.ts +37 -28
- package/examples/advanced-patterns/persistent-onboarding.ts +70 -41
- package/examples/advanced-patterns/route-lifecycle-hooks.ts +28 -2
- package/examples/advanced-patterns/streaming-responses.ts +197 -119
- package/examples/ai-providers/anthropic-integration.ts +40 -33
- package/examples/ai-providers/openai-integration.ts +25 -25
- package/examples/conversation-flows/completion-transitions.ts +36 -32
- package/examples/core-concepts/basic-agent.ts +76 -78
- package/examples/core-concepts/modern-streaming-api.ts +309 -0
- package/examples/core-concepts/schema-driven-extraction.ts +20 -16
- package/examples/core-concepts/session-management.ts +65 -53
- package/examples/integrations/database-integration.ts +49 -34
- package/examples/integrations/healthcare-integration.ts +96 -91
- package/examples/integrations/search-integration.ts +79 -82
- package/examples/integrations/server-session-management.ts +25 -17
- package/examples/persistence/database-persistence.ts +61 -45
- package/examples/persistence/memory-sessions.ts +52 -63
- package/examples/persistence/redis-persistence.ts +81 -95
- package/examples/tools/basic-tools.ts +73 -62
- package/examples/tools/data-enrichment-tools.ts +52 -44
- package/package.json +1 -1
- package/src/core/Agent.ts +396 -1499
- package/src/core/PersistenceManager.ts +51 -27
- package/src/core/PromptComposer.ts +1 -1
- package/src/core/ResponseEngine.ts +21 -19
- package/src/core/ResponseModal.ts +1722 -0
- package/src/core/ResponsePipeline.ts +175 -60
- package/src/core/Route.ts +58 -6
- package/src/core/RoutingEngine.ts +174 -27
- package/src/core/SessionManager.ts +32 -8
- package/src/core/Step.ts +20 -12
- package/src/core/ToolExecutor.ts +19 -5
- package/src/index.ts +11 -0
- package/src/types/agent.ts +47 -23
- package/src/types/ai.ts +1 -1
- package/src/types/index.ts +2 -0
- package/src/types/persistence.ts +0 -1
- package/src/types/route.ts +22 -16
- package/src/types/session.ts +6 -12
- package/src/types/tool.ts +15 -9
- package/src/utils/clone.ts +6 -8
- package/src/utils/history.ts +190 -27
- package/src/utils/index.ts +4 -0
- package/src/utils/session.ts +6 -31
|
@@ -38,7 +38,7 @@ interface SupportContext {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
// Support tools
|
|
41
|
-
const createTicket: Tool<unknown, [], string
|
|
41
|
+
const createTicket: Tool<unknown, SupportTicketData, [], string> = {
|
|
42
42
|
id: "create_support_ticket",
|
|
43
43
|
description: "Create a new support ticket",
|
|
44
44
|
parameters: {
|
|
@@ -62,38 +62,46 @@ const createTicket: Tool<unknown, [], string, SupportTicketData> = {
|
|
|
62
62
|
},
|
|
63
63
|
};
|
|
64
64
|
|
|
65
|
+
// Define support ticket schema
|
|
66
|
+
const supportTicketSchema = {
|
|
67
|
+
type: "object",
|
|
68
|
+
properties: {
|
|
69
|
+
issue: { type: "string" },
|
|
70
|
+
category: {
|
|
71
|
+
type: "string",
|
|
72
|
+
enum: ["technical", "billing", "account", "general"],
|
|
73
|
+
},
|
|
74
|
+
priority: { type: "string", enum: ["low", "medium", "high"] },
|
|
75
|
+
status: { type: "string", enum: ["open", "in_progress", "resolved"] },
|
|
76
|
+
ticketId: { type: "string" },
|
|
77
|
+
assignedAgent: { type: "string" },
|
|
78
|
+
},
|
|
79
|
+
required: ["issue"],
|
|
80
|
+
};
|
|
81
|
+
|
|
65
82
|
// Create agent with memory persistence
|
|
66
|
-
const agent = new Agent({
|
|
83
|
+
const agent = new Agent<unknown, SupportTicketData>({
|
|
67
84
|
name: "SupportBot",
|
|
68
85
|
description: "A support agent with memory-based session management",
|
|
69
86
|
provider: new GeminiProvider({
|
|
70
87
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
71
88
|
model: "models/gemini-2.5-flash",
|
|
72
89
|
}),
|
|
90
|
+
// NEW: Agent-level schema
|
|
91
|
+
schema: supportTicketSchema,
|
|
73
92
|
persistence: {
|
|
74
93
|
adapter: new MemoryAdapter(),
|
|
75
94
|
},
|
|
76
95
|
});
|
|
77
96
|
|
|
78
97
|
// Create support route with sequential steps
|
|
79
|
-
const supportRoute = agent.createRoute
|
|
98
|
+
const supportRoute = agent.createRoute({
|
|
80
99
|
title: "Customer Support",
|
|
81
100
|
description: "Handle customer support requests with session persistence",
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
category: {
|
|
87
|
-
type: "string",
|
|
88
|
-
enum: ["technical", "billing", "account", "general"],
|
|
89
|
-
},
|
|
90
|
-
priority: { type: "string", enum: ["low", "medium", "high"] },
|
|
91
|
-
status: { type: "string", enum: ["open", "in_progress", "resolved"] },
|
|
92
|
-
ticketId: { type: "string" },
|
|
93
|
-
assignedAgent: { type: "string" },
|
|
94
|
-
},
|
|
95
|
-
required: ["issue"],
|
|
96
|
-
},
|
|
101
|
+
// NEW: Required fields for route completion
|
|
102
|
+
requiredFields: ["issue"],
|
|
103
|
+
// NEW: Optional fields that enhance the experience
|
|
104
|
+
optionalFields: ["category", "priority", "status", "ticketId", "assignedAgent"],
|
|
97
105
|
// Sequential steps for support ticket creation
|
|
98
106
|
steps: [
|
|
99
107
|
{
|
|
@@ -138,7 +146,7 @@ async function demonstrateSessionBasics() {
|
|
|
138
146
|
|
|
139
147
|
// Create agent with specific sessionId
|
|
140
148
|
const sessionId = "session-user-123";
|
|
141
|
-
const sessionAgent = new Agent<SupportContext>({
|
|
149
|
+
const sessionAgent = new Agent<SupportContext, SupportTicketData>({
|
|
142
150
|
name: "Support Assistant",
|
|
143
151
|
description: "Help users with technical issues",
|
|
144
152
|
provider: new GeminiProvider({
|
|
@@ -150,6 +158,8 @@ async function demonstrateSessionBasics() {
|
|
|
150
158
|
userName: "Alice",
|
|
151
159
|
userTier: "premium",
|
|
152
160
|
},
|
|
161
|
+
// NEW: Agent-level schema
|
|
162
|
+
schema: supportTicketSchema,
|
|
153
163
|
persistence: {
|
|
154
164
|
adapter: new MemoryAdapter(),
|
|
155
165
|
autoSave: true,
|
|
@@ -158,33 +168,22 @@ async function demonstrateSessionBasics() {
|
|
|
158
168
|
});
|
|
159
169
|
|
|
160
170
|
// Create the same route on the new agent
|
|
161
|
-
sessionAgent.createRoute
|
|
171
|
+
sessionAgent.createRoute({
|
|
162
172
|
title: "Customer Support",
|
|
163
173
|
description: "Handle customer support requests with session persistence",
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
category: {
|
|
169
|
-
type: "string",
|
|
170
|
-
enum: ["technical", "billing", "account", "general"],
|
|
171
|
-
},
|
|
172
|
-
priority: { type: "string", enum: ["low", "medium", "high"] },
|
|
173
|
-
status: { type: "string", enum: ["open", "in_progress", "resolved"] },
|
|
174
|
-
ticketId: { type: "string" },
|
|
175
|
-
assignedAgent: { type: "string" },
|
|
176
|
-
},
|
|
177
|
-
required: ["issue"],
|
|
178
|
-
},
|
|
174
|
+
// NEW: Required fields for route completion
|
|
175
|
+
requiredFields: ["issue"],
|
|
176
|
+
// NEW: Optional fields that enhance the experience
|
|
177
|
+
optionalFields: ["category", "priority", "status", "ticketId", "assignedAgent"],
|
|
179
178
|
});
|
|
180
179
|
|
|
181
180
|
console.log("Session ready:", sessionAgent.session.id);
|
|
182
181
|
|
|
183
182
|
// Use the session in conversation
|
|
184
183
|
console.log("\nUser: I can't access my account");
|
|
185
|
-
|
|
184
|
+
|
|
186
185
|
await sessionAgent.session.addMessage("user", "I can't access my account", "Alice");
|
|
187
|
-
|
|
186
|
+
|
|
188
187
|
const response1 = await sessionAgent.respond({
|
|
189
188
|
history: sessionAgent.session.getHistory(),
|
|
190
189
|
});
|
|
@@ -192,9 +191,9 @@ async function demonstrateSessionBasics() {
|
|
|
192
191
|
console.log("Bot:", response1.message);
|
|
193
192
|
console.log(
|
|
194
193
|
"Session data:",
|
|
195
|
-
JSON.stringify(sessionAgent.session.getData
|
|
194
|
+
JSON.stringify(sessionAgent.session.getData(), null, 2)
|
|
196
195
|
);
|
|
197
|
-
|
|
196
|
+
|
|
198
197
|
await sessionAgent.session.addMessage("assistant", response1.message);
|
|
199
198
|
|
|
200
199
|
// Continue the conversation with the returned session
|
|
@@ -331,8 +330,7 @@ async function demonstrateMultiUserSessions() {
|
|
|
331
330
|
|
|
332
331
|
console.log(` Session ID: ${response.session?.id}`);
|
|
333
332
|
console.log(
|
|
334
|
-
` Issue recorded: ${
|
|
335
|
-
(response.session?.data as Partial<SupportTicketData>)?.issue
|
|
333
|
+
` Issue recorded: ${(response.session?.data as Partial<SupportTicketData>)?.issue
|
|
336
334
|
}`
|
|
337
335
|
);
|
|
338
336
|
}
|
|
@@ -362,8 +360,8 @@ async function demonstrateSessionLifecycle() {
|
|
|
362
360
|
// 1. Create agent with session
|
|
363
361
|
console.log("1. š Creating new session");
|
|
364
362
|
const sessionId = `lifecycle-demo-${Date.now()}`;
|
|
365
|
-
|
|
366
|
-
const lifecycleAgent = new Agent<SupportContext>({
|
|
363
|
+
|
|
364
|
+
const lifecycleAgent = new Agent<SupportContext, SupportTicketData>({
|
|
367
365
|
name: "Support Assistant",
|
|
368
366
|
provider: new GeminiProvider({
|
|
369
367
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
@@ -374,6 +372,8 @@ async function demonstrateSessionLifecycle() {
|
|
|
374
372
|
userName: "Demo",
|
|
375
373
|
userTier: "standard",
|
|
376
374
|
},
|
|
375
|
+
// NEW: Agent-level schema
|
|
376
|
+
schema: supportTicketSchema,
|
|
377
377
|
persistence: {
|
|
378
378
|
adapter: new MemoryAdapter(),
|
|
379
379
|
autoSave: true,
|
|
@@ -382,39 +382,28 @@ async function demonstrateSessionLifecycle() {
|
|
|
382
382
|
});
|
|
383
383
|
|
|
384
384
|
// Create the same route on the lifecycle agent
|
|
385
|
-
lifecycleAgent.createRoute
|
|
385
|
+
lifecycleAgent.createRoute({
|
|
386
386
|
title: "Customer Support",
|
|
387
387
|
description: "Handle customer support requests with session persistence",
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
category: {
|
|
393
|
-
type: "string",
|
|
394
|
-
enum: ["technical", "billing", "account", "general"],
|
|
395
|
-
},
|
|
396
|
-
priority: { type: "string", enum: ["low", "medium", "high"] },
|
|
397
|
-
status: { type: "string", enum: ["open", "in_progress", "resolved"] },
|
|
398
|
-
ticketId: { type: "string" },
|
|
399
|
-
assignedAgent: { type: "string" },
|
|
400
|
-
},
|
|
401
|
-
required: ["issue"],
|
|
402
|
-
},
|
|
388
|
+
// NEW: Required fields for route completion
|
|
389
|
+
requiredFields: ["issue"],
|
|
390
|
+
// NEW: Optional fields that enhance the experience
|
|
391
|
+
optionalFields: ["category", "priority", "status", "ticketId", "assignedAgent"],
|
|
403
392
|
});
|
|
404
393
|
|
|
405
394
|
console.log(` Created session: ${lifecycleAgent.session.id}`);
|
|
406
395
|
|
|
407
396
|
// 2. Use session in conversation
|
|
408
397
|
console.log("\n2. š¬ Using session in conversation");
|
|
409
|
-
|
|
398
|
+
|
|
410
399
|
await lifecycleAgent.session.addMessage("user", "I need help with something", "Demo");
|
|
411
|
-
|
|
400
|
+
|
|
412
401
|
const response1 = await lifecycleAgent.respond({
|
|
413
402
|
history: lifecycleAgent.session.getHistory(),
|
|
414
403
|
});
|
|
415
404
|
|
|
416
|
-
console.log(` Session data: ${JSON.stringify(lifecycleAgent.session.getData
|
|
417
|
-
|
|
405
|
+
console.log(` Session data: ${JSON.stringify(lifecycleAgent.session.getData())}`);
|
|
406
|
+
|
|
418
407
|
await lifecycleAgent.session.addMessage("assistant", response1.message);
|
|
419
408
|
|
|
420
409
|
// 3. Complete the session
|
|
@@ -64,8 +64,20 @@ async function example() {
|
|
|
64
64
|
|
|
65
65
|
const userId = "user_123";
|
|
66
66
|
|
|
67
|
+
// Define support ticket schema
|
|
68
|
+
const supportTicketSchema = {
|
|
69
|
+
type: "object",
|
|
70
|
+
properties: {
|
|
71
|
+
issue: { type: "string" },
|
|
72
|
+
category: { type: "string", enum: ["technical", "billing", "account", "other"] },
|
|
73
|
+
priority: { type: "string", enum: ["low", "medium", "high"] },
|
|
74
|
+
description: { type: "string" },
|
|
75
|
+
},
|
|
76
|
+
required: ["issue", "category", "priority", "description"],
|
|
77
|
+
};
|
|
78
|
+
|
|
67
79
|
// Create agent with Redis persistence
|
|
68
|
-
const agent = new Agent<ChatContext>({
|
|
80
|
+
const agent = new Agent<ChatContext, SupportTicketData>({
|
|
69
81
|
name: "Support Assistant",
|
|
70
82
|
description: "Fast, real-time support assistant",
|
|
71
83
|
goal: "Help users resolve issues quickly",
|
|
@@ -78,6 +90,8 @@ async function example() {
|
|
|
78
90
|
userName: "Alice",
|
|
79
91
|
chatType: "support",
|
|
80
92
|
},
|
|
93
|
+
// NEW: Agent-level schema
|
|
94
|
+
schema: supportTicketSchema,
|
|
81
95
|
// ⨠Redis adapter with custom options
|
|
82
96
|
persistence: {
|
|
83
97
|
adapter: new RedisAdapter<ChatContext>({
|
|
@@ -92,7 +106,7 @@ async function example() {
|
|
|
92
106
|
});
|
|
93
107
|
|
|
94
108
|
// Create support ticket route with data collecting
|
|
95
|
-
const ticketRoute = agent.createRoute
|
|
109
|
+
const ticketRoute = agent.createRoute({
|
|
96
110
|
title: "Create Support Ticket",
|
|
97
111
|
description: "Help user create and track support tickets",
|
|
98
112
|
conditions: [
|
|
@@ -100,31 +114,10 @@ async function example() {
|
|
|
100
114
|
"User wants to report a problem",
|
|
101
115
|
"User mentions support, help, or issue",
|
|
102
116
|
],
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
type: "string",
|
|
108
|
-
description: "Brief summary of the issue",
|
|
109
|
-
},
|
|
110
|
-
category: {
|
|
111
|
-
type: "string",
|
|
112
|
-
enum: ["technical", "billing", "account", "other"],
|
|
113
|
-
description: "Issue category",
|
|
114
|
-
},
|
|
115
|
-
priority: {
|
|
116
|
-
type: "string",
|
|
117
|
-
enum: ["low", "medium", "high"],
|
|
118
|
-
default: "medium",
|
|
119
|
-
description: "Issue priority",
|
|
120
|
-
},
|
|
121
|
-
description: {
|
|
122
|
-
type: "string",
|
|
123
|
-
description: "Detailed description of the issue",
|
|
124
|
-
},
|
|
125
|
-
},
|
|
126
|
-
required: ["issue", "category", "description"],
|
|
127
|
-
},
|
|
117
|
+
// NEW: Required fields for route completion
|
|
118
|
+
requiredFields: ["issue", "category", "description"],
|
|
119
|
+
// NEW: Optional fields that enhance the experience
|
|
120
|
+
optionalFields: ["priority"],
|
|
128
121
|
});
|
|
129
122
|
|
|
130
123
|
// Step flow
|
|
@@ -156,9 +149,9 @@ async function example() {
|
|
|
156
149
|
console.log("⨠Session ready:", agent.session.id);
|
|
157
150
|
|
|
158
151
|
// Set initial data
|
|
159
|
-
await agent.session.setData
|
|
152
|
+
await agent.session.setData({ priority: "medium" });
|
|
160
153
|
|
|
161
|
-
console.log("š Initial data:", agent.session.getData
|
|
154
|
+
console.log("š Initial data:", agent.session.getData());
|
|
162
155
|
|
|
163
156
|
// Turn 1: User provides issue
|
|
164
157
|
console.log("\n--- Turn 1 ---");
|
|
@@ -177,11 +170,11 @@ async function example() {
|
|
|
177
170
|
console.log("š¤ Agent:", response1.message);
|
|
178
171
|
|
|
179
172
|
await agent.session.addMessage("assistant", response1.message);
|
|
180
|
-
console.log("š Collected data:", agent.session.getData
|
|
173
|
+
console.log("š Collected data:", agent.session.getData());
|
|
181
174
|
|
|
182
175
|
// Turn 2: Provide more details
|
|
183
176
|
console.log("\n--- Turn 2 ---");
|
|
184
|
-
|
|
177
|
+
|
|
185
178
|
await agent.session.addMessage(
|
|
186
179
|
"user",
|
|
187
180
|
"I keep getting 'Invalid credentials' error even though I reset my password",
|
|
@@ -193,20 +186,20 @@ async function example() {
|
|
|
193
186
|
});
|
|
194
187
|
|
|
195
188
|
console.log("š¤ Agent:", response2.message);
|
|
196
|
-
console.log("š Collected data:", agent.session.getData
|
|
189
|
+
console.log("š Collected data:", agent.session.getData());
|
|
197
190
|
|
|
198
191
|
await agent.session.addMessage("assistant", response2.message);
|
|
199
192
|
|
|
200
193
|
if (response2.isRouteComplete) {
|
|
201
194
|
console.log("\nā
Support ticket route complete!");
|
|
202
|
-
await fileSupportTicket(agent.session.getData
|
|
195
|
+
await fileSupportTicket(agent.session.getData() as SupportTicketData);
|
|
203
196
|
}
|
|
204
197
|
|
|
205
198
|
// Demonstrate session recovery with new agent instance
|
|
206
199
|
console.log("\n--- Session Recovery Example ---");
|
|
207
200
|
const sessionId = agent.session.id;
|
|
208
|
-
|
|
209
|
-
const recoveredAgent = new Agent<ChatContext>({
|
|
201
|
+
|
|
202
|
+
const recoveredAgent = new Agent<ChatContext, SupportTicketData>({
|
|
210
203
|
name: "Support Assistant",
|
|
211
204
|
provider: new GeminiProvider({
|
|
212
205
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
@@ -217,6 +210,8 @@ async function example() {
|
|
|
217
210
|
userName: "Alice",
|
|
218
211
|
chatType: "support",
|
|
219
212
|
},
|
|
213
|
+
// NEW: Agent-level schema (same as original agent)
|
|
214
|
+
schema: supportTicketSchema,
|
|
220
215
|
persistence: {
|
|
221
216
|
adapter: new RedisAdapter<ChatContext>({
|
|
222
217
|
redis,
|
|
@@ -230,7 +225,7 @@ async function example() {
|
|
|
230
225
|
});
|
|
231
226
|
|
|
232
227
|
// Recreate the same route on recovered agent
|
|
233
|
-
recoveredAgent.createRoute
|
|
228
|
+
recoveredAgent.createRoute({
|
|
234
229
|
title: "Create Support Ticket",
|
|
235
230
|
description: "Help user create and track support tickets",
|
|
236
231
|
conditions: [
|
|
@@ -238,31 +233,16 @@ async function example() {
|
|
|
238
233
|
"User wants to report a problem",
|
|
239
234
|
"User mentions support, help, or issue",
|
|
240
235
|
],
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
category: {
|
|
246
|
-
type: "string",
|
|
247
|
-
enum: ["technical", "billing", "account", "other"],
|
|
248
|
-
description: "Issue category",
|
|
249
|
-
},
|
|
250
|
-
priority: {
|
|
251
|
-
type: "string",
|
|
252
|
-
enum: ["low", "medium", "high"],
|
|
253
|
-
default: "medium",
|
|
254
|
-
description: "Issue priority",
|
|
255
|
-
},
|
|
256
|
-
description: { type: "string", description: "Detailed description of the issue" },
|
|
257
|
-
},
|
|
258
|
-
required: ["issue", "category", "description"],
|
|
259
|
-
},
|
|
236
|
+
// NEW: Required fields for route completion
|
|
237
|
+
requiredFields: ["issue", "category", "description"],
|
|
238
|
+
// NEW: Optional fields that enhance the experience
|
|
239
|
+
optionalFields: ["priority"],
|
|
260
240
|
});
|
|
261
241
|
|
|
262
242
|
console.log("š„ Recovered session:", {
|
|
263
243
|
sessionId: recoveredAgent.session.id,
|
|
264
244
|
historyLength: recoveredAgent.session.getHistory().length,
|
|
265
|
-
data: recoveredAgent.session.getData
|
|
245
|
+
data: recoveredAgent.session.getData(),
|
|
266
246
|
});
|
|
267
247
|
|
|
268
248
|
console.log("ā
Session recovery complete!");
|
|
@@ -278,15 +258,27 @@ async function example() {
|
|
|
278
258
|
async function highThroughputExample() {
|
|
279
259
|
const redis = new Redis();
|
|
280
260
|
|
|
281
|
-
|
|
261
|
+
// Define quick chat schema
|
|
262
|
+
const quickChatSchema = {
|
|
263
|
+
type: "object",
|
|
264
|
+
properties: {
|
|
265
|
+
topic: { type: "string" },
|
|
266
|
+
sentiment: { type: "string", enum: ["positive", "neutral", "negative"] },
|
|
267
|
+
},
|
|
268
|
+
required: ["topic", "sentiment"],
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
const agent = new Agent<unknown, QuickChatData>({
|
|
282
272
|
name: "Chat Bot",
|
|
283
273
|
description: "Fast chat responses",
|
|
284
274
|
provider: new GeminiProvider({
|
|
285
275
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
286
276
|
model: "models/gemini-2.5-flash",
|
|
287
277
|
}),
|
|
278
|
+
// NEW: Agent-level schema
|
|
279
|
+
schema: quickChatSchema,
|
|
288
280
|
persistence: {
|
|
289
|
-
adapter: new RedisAdapter<
|
|
281
|
+
adapter: new RedisAdapter<unknown>({
|
|
290
282
|
redis,
|
|
291
283
|
keyPrefix: "chat:",
|
|
292
284
|
sessionTTL: 60 * 60, // 1 hour for quick chats
|
|
@@ -297,23 +289,10 @@ async function highThroughputExample() {
|
|
|
297
289
|
});
|
|
298
290
|
|
|
299
291
|
// Simple chat route that extracts topic and sentiment
|
|
300
|
-
const chatRoute = agent.createRoute
|
|
292
|
+
const chatRoute = agent.createRoute({
|
|
301
293
|
title: "General Chat",
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
properties: {
|
|
305
|
-
topic: {
|
|
306
|
-
type: "string",
|
|
307
|
-
description: "Main topic of conversation",
|
|
308
|
-
},
|
|
309
|
-
sentiment: {
|
|
310
|
-
type: "string",
|
|
311
|
-
enum: ["positive", "neutral", "negative"],
|
|
312
|
-
description: "User's sentiment",
|
|
313
|
-
},
|
|
314
|
-
},
|
|
315
|
-
required: ["topic", "sentiment"],
|
|
316
|
-
},
|
|
294
|
+
// NEW: Required fields for route completion
|
|
295
|
+
requiredFields: ["topic", "sentiment"],
|
|
317
296
|
});
|
|
318
297
|
|
|
319
298
|
chatRoute.initialStep
|
|
@@ -334,13 +313,13 @@ async function highThroughputExample() {
|
|
|
334
313
|
});
|
|
335
314
|
|
|
336
315
|
console.log("š¤ Response:", response.message);
|
|
337
|
-
console.log("š Data:", agent.session.getData
|
|
316
|
+
console.log("š Data:", agent.session.getData());
|
|
338
317
|
|
|
339
318
|
await agent.session.addMessage("assistant", response.message);
|
|
340
319
|
|
|
341
320
|
if (response.isRouteComplete) {
|
|
342
321
|
console.log("\nā
Chat analytics route complete!");
|
|
343
|
-
await logChatAnalytics(agent.session.getData
|
|
322
|
+
await logChatAnalytics(agent.session.getData() as QuickChatData);
|
|
344
323
|
}
|
|
345
324
|
|
|
346
325
|
console.log("š¾ Session automatically saved to Redis!");
|
|
@@ -355,30 +334,36 @@ async function highThroughputExample() {
|
|
|
355
334
|
async function sessionRecoveryExample() {
|
|
356
335
|
const redis = new Redis();
|
|
357
336
|
|
|
358
|
-
|
|
337
|
+
// Define order schema
|
|
338
|
+
const orderSchema = {
|
|
339
|
+
type: "object",
|
|
340
|
+
properties: {
|
|
341
|
+
productId: { type: "string" },
|
|
342
|
+
quantity: { type: "number", minimum: 1 },
|
|
343
|
+
shippingAddress: { type: "string" },
|
|
344
|
+
},
|
|
345
|
+
required: ["productId", "quantity", "shippingAddress"],
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
const agent = new Agent<unknown, OrderData>({
|
|
359
349
|
name: "Order Assistant",
|
|
360
350
|
provider: new GeminiProvider({
|
|
361
351
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
362
352
|
model: "models/gemini-2.5-flash",
|
|
363
353
|
}),
|
|
354
|
+
// NEW: Agent-level schema
|
|
355
|
+
schema: orderSchema,
|
|
364
356
|
persistence: {
|
|
365
|
-
adapter: new RedisAdapter<
|
|
357
|
+
adapter: new RedisAdapter<unknown>({ redis }),
|
|
366
358
|
autoSave: true,
|
|
367
359
|
userId: "user_789",
|
|
368
360
|
},
|
|
369
361
|
});
|
|
370
362
|
|
|
371
|
-
const orderRoute = agent.createRoute
|
|
363
|
+
const orderRoute = agent.createRoute({
|
|
372
364
|
title: "Place Order",
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
properties: {
|
|
376
|
-
productId: { type: "string" },
|
|
377
|
-
quantity: { type: "number", minimum: 1 },
|
|
378
|
-
shippingAddress: { type: "string" },
|
|
379
|
-
},
|
|
380
|
-
required: ["productId", "quantity", "shippingAddress"],
|
|
381
|
-
},
|
|
365
|
+
// NEW: Required fields for route completion
|
|
366
|
+
requiredFields: ["productId", "quantity", "shippingAddress"],
|
|
382
367
|
});
|
|
383
368
|
|
|
384
369
|
orderRoute.initialStep
|
|
@@ -404,7 +389,7 @@ async function sessionRecoveryExample() {
|
|
|
404
389
|
});
|
|
405
390
|
|
|
406
391
|
console.log("š¤ Response:", response1.message);
|
|
407
|
-
console.log("š Data so far:", agent.session.getData
|
|
392
|
+
console.log("š Data so far:", agent.session.getData());
|
|
408
393
|
|
|
409
394
|
await agent.session.addMessage("assistant", response1.message);
|
|
410
395
|
|
|
@@ -412,24 +397,25 @@ async function sessionRecoveryExample() {
|
|
|
412
397
|
console.log("\n--- User Reconnects ---");
|
|
413
398
|
|
|
414
399
|
// Create new agent instance with same sessionId (simulates reconnection)
|
|
415
|
-
const reconnectedAgent = new Agent<OrderData>({
|
|
400
|
+
const reconnectedAgent = new Agent<unknown, OrderData>({
|
|
416
401
|
name: "Order Assistant",
|
|
417
402
|
provider: new GeminiProvider({
|
|
418
403
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
419
404
|
model: "models/gemini-2.5-flash",
|
|
420
405
|
}),
|
|
406
|
+
// NEW: Agent-level schema (same as original agent)
|
|
407
|
+
schema: orderSchema,
|
|
421
408
|
persistence: {
|
|
422
|
-
adapter: new RedisAdapter<
|
|
409
|
+
adapter: new RedisAdapter<unknown>({ redis }),
|
|
423
410
|
autoSave: true,
|
|
424
411
|
},
|
|
425
412
|
sessionId, // Same sessionId - will load existing session
|
|
426
|
-
routes: [orderRoute],
|
|
427
413
|
});
|
|
428
414
|
|
|
429
415
|
console.log("š„ Recovered session:", {
|
|
430
416
|
sessionId: reconnectedAgent.session.id,
|
|
431
417
|
historyLength: reconnectedAgent.session.getHistory().length,
|
|
432
|
-
data: reconnectedAgent.session.getData
|
|
418
|
+
data: reconnectedAgent.session.getData(),
|
|
433
419
|
});
|
|
434
420
|
|
|
435
421
|
// Continue conversation
|
|
@@ -440,13 +426,13 @@ async function sessionRecoveryExample() {
|
|
|
440
426
|
});
|
|
441
427
|
|
|
442
428
|
console.log("š¤ Response:", response2.message);
|
|
443
|
-
console.log("š Final collected data:", reconnectedAgent.session.getData
|
|
429
|
+
console.log("š Final collected data:", reconnectedAgent.session.getData());
|
|
444
430
|
|
|
445
431
|
await reconnectedAgent.session.addMessage("assistant", response2.message);
|
|
446
432
|
|
|
447
433
|
if (response2.isRouteComplete) {
|
|
448
434
|
console.log("\nā
Order placement complete!");
|
|
449
|
-
await processOrder(reconnectedAgent.session.getData
|
|
435
|
+
await processOrder(reconnectedAgent.session.getData() as OrderData);
|
|
450
436
|
}
|
|
451
437
|
|
|
452
438
|
console.log("ā
Order complete with recovered session!");
|