@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
|
@@ -88,8 +88,38 @@ async function example() {
|
|
|
88
88
|
// Initialize indices
|
|
89
89
|
await adapter.initialize();
|
|
90
90
|
|
|
91
|
+
// Define complaint schema
|
|
92
|
+
const complaintSchema = {
|
|
93
|
+
type: "object",
|
|
94
|
+
properties: {
|
|
95
|
+
category: {
|
|
96
|
+
type: "string",
|
|
97
|
+
description: "Complaint category",
|
|
98
|
+
},
|
|
99
|
+
severity: {
|
|
100
|
+
type: "string",
|
|
101
|
+
enum: ["low", "medium", "high", "critical"],
|
|
102
|
+
default: "medium",
|
|
103
|
+
description: "Severity level",
|
|
104
|
+
},
|
|
105
|
+
description: {
|
|
106
|
+
type: "string",
|
|
107
|
+
description: "Detailed complaint description",
|
|
108
|
+
},
|
|
109
|
+
affectedService: {
|
|
110
|
+
type: "string",
|
|
111
|
+
description: "Which service is affected",
|
|
112
|
+
},
|
|
113
|
+
requestedResolution: {
|
|
114
|
+
type: "string",
|
|
115
|
+
description: "What resolution the customer wants",
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
required: ["category", "severity", "description"],
|
|
119
|
+
};
|
|
120
|
+
|
|
91
121
|
// Create agent with OpenSearch persistence
|
|
92
|
-
const agent = new Agent<ConversationContext>({
|
|
122
|
+
const agent = new Agent<ConversationContext, ComplaintData>({
|
|
93
123
|
name: "Customer Service Agent",
|
|
94
124
|
description: "Handle customer complaints with full-text search",
|
|
95
125
|
goal: "Resolve customer issues efficiently",
|
|
@@ -102,6 +132,8 @@ async function example() {
|
|
|
102
132
|
userName: "Alice",
|
|
103
133
|
department: "customer_service",
|
|
104
134
|
},
|
|
135
|
+
// NEW: Agent-level schema
|
|
136
|
+
schema: complaintSchema,
|
|
105
137
|
persistence: {
|
|
106
138
|
adapter,
|
|
107
139
|
autoSave: true, // Auto-save session step with collected data
|
|
@@ -110,7 +142,7 @@ async function example() {
|
|
|
110
142
|
});
|
|
111
143
|
|
|
112
144
|
// Create complaint handling route
|
|
113
|
-
const complaintRoute = agent.createRoute
|
|
145
|
+
const complaintRoute = agent.createRoute({
|
|
114
146
|
title: "Handle Customer Complaint",
|
|
115
147
|
description: "Process and resolve customer complaints",
|
|
116
148
|
conditions: [
|
|
@@ -118,34 +150,10 @@ async function example() {
|
|
|
118
150
|
"User reports an issue or problem",
|
|
119
151
|
"User is dissatisfied",
|
|
120
152
|
],
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
type: "string",
|
|
126
|
-
description: "Complaint category",
|
|
127
|
-
},
|
|
128
|
-
severity: {
|
|
129
|
-
type: "string",
|
|
130
|
-
enum: ["low", "medium", "high", "critical"],
|
|
131
|
-
default: "medium",
|
|
132
|
-
description: "Severity level",
|
|
133
|
-
},
|
|
134
|
-
description: {
|
|
135
|
-
type: "string",
|
|
136
|
-
description: "Detailed complaint description",
|
|
137
|
-
},
|
|
138
|
-
affectedService: {
|
|
139
|
-
type: "string",
|
|
140
|
-
description: "Which service is affected",
|
|
141
|
-
},
|
|
142
|
-
requestedResolution: {
|
|
143
|
-
type: "string",
|
|
144
|
-
description: "What resolution the customer wants",
|
|
145
|
-
},
|
|
146
|
-
},
|
|
147
|
-
required: ["category", "severity", "description"],
|
|
148
|
-
},
|
|
153
|
+
// NEW: Required fields for route completion
|
|
154
|
+
requiredFields: ["category", "severity", "description"],
|
|
155
|
+
// NEW: Optional fields that enhance the experience
|
|
156
|
+
optionalFields: ["affectedService", "requestedResolution"],
|
|
149
157
|
});
|
|
150
158
|
|
|
151
159
|
// Step flow
|
|
@@ -177,7 +185,7 @@ async function example() {
|
|
|
177
185
|
console.log("⨠Session ready:", agent.session.id);
|
|
178
186
|
|
|
179
187
|
// Set initial data
|
|
180
|
-
await agent.session.setData
|
|
188
|
+
await agent.session.setData({ severity: "medium" });
|
|
181
189
|
|
|
182
190
|
// Turn 1
|
|
183
191
|
console.log("\n--- Turn 1 ---");
|
|
@@ -193,7 +201,7 @@ async function example() {
|
|
|
193
201
|
});
|
|
194
202
|
|
|
195
203
|
console.log("š¤ Agent:", response1.message);
|
|
196
|
-
console.log("š Data:", agent.session.getData
|
|
204
|
+
console.log("š Data:", agent.session.getData());
|
|
197
205
|
|
|
198
206
|
await agent.session.addMessage("assistant", response1.message);
|
|
199
207
|
|
|
@@ -211,20 +219,20 @@ async function example() {
|
|
|
211
219
|
});
|
|
212
220
|
|
|
213
221
|
console.log("š¤ Agent:", response2.message);
|
|
214
|
-
console.log("š Data:", agent.session.getData
|
|
222
|
+
console.log("š Data:", agent.session.getData());
|
|
215
223
|
|
|
216
224
|
await agent.session.addMessage("assistant", response2.message);
|
|
217
225
|
|
|
218
226
|
if (response2.isRouteComplete) {
|
|
219
227
|
console.log("\nā
Complaint route complete!");
|
|
220
|
-
await createSupportTicket(agent.session.getData
|
|
228
|
+
await createSupportTicket(agent.session.getData() as ComplaintData);
|
|
221
229
|
}
|
|
222
230
|
|
|
223
231
|
// Demonstrate session recovery with new agent instance
|
|
224
232
|
console.log("\n--- Session Recovery Example ---");
|
|
225
233
|
const sessionId = agent.session.id;
|
|
226
234
|
|
|
227
|
-
const recoveredAgent = new Agent<ConversationContext>({
|
|
235
|
+
const recoveredAgent = new Agent<ConversationContext, ComplaintData>({
|
|
228
236
|
name: "Customer Service Agent",
|
|
229
237
|
provider: new GeminiProvider({
|
|
230
238
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
@@ -243,7 +251,7 @@ async function example() {
|
|
|
243
251
|
});
|
|
244
252
|
|
|
245
253
|
// Recreate the same route on recovered agent
|
|
246
|
-
recoveredAgent.createRoute
|
|
254
|
+
recoveredAgent.createRoute({
|
|
247
255
|
title: "Handle Customer Complaint",
|
|
248
256
|
description: "Process and resolve customer complaints",
|
|
249
257
|
conditions: [
|
|
@@ -251,28 +259,16 @@ async function example() {
|
|
|
251
259
|
"User reports an issue or problem",
|
|
252
260
|
"User is dissatisfied",
|
|
253
261
|
],
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
severity: {
|
|
259
|
-
type: "string",
|
|
260
|
-
enum: ["low", "medium", "high", "critical"],
|
|
261
|
-
default: "medium",
|
|
262
|
-
description: "Severity level",
|
|
263
|
-
},
|
|
264
|
-
description: { type: "string", description: "Detailed complaint description" },
|
|
265
|
-
affectedService: { type: "string", description: "Which service is affected" },
|
|
266
|
-
requestedResolution: { type: "string", description: "What resolution the customer wants" },
|
|
267
|
-
},
|
|
268
|
-
required: ["category", "severity", "description"],
|
|
269
|
-
},
|
|
262
|
+
// NEW: Required fields for route completion
|
|
263
|
+
requiredFields: ["category", "severity", "description"],
|
|
264
|
+
// NEW: Optional fields
|
|
265
|
+
optionalFields: ["affectedService", "requestedResolution"],
|
|
270
266
|
});
|
|
271
267
|
|
|
272
268
|
console.log("š„ Recovered session:", {
|
|
273
269
|
sessionId: recoveredAgent.session.id,
|
|
274
270
|
historyLength: recoveredAgent.session.getHistory().length,
|
|
275
|
-
data: recoveredAgent.session.getData
|
|
271
|
+
data: recoveredAgent.session.getData(),
|
|
276
272
|
});
|
|
277
273
|
|
|
278
274
|
// Demonstrate full-text search
|
|
@@ -344,12 +340,27 @@ async function analyticsExample() {
|
|
|
344
340
|
tags: string[];
|
|
345
341
|
}
|
|
346
342
|
|
|
347
|
-
const
|
|
343
|
+
const ticketSchema = {
|
|
344
|
+
type: "object",
|
|
345
|
+
properties: {
|
|
346
|
+
ticketType: { type: "string" },
|
|
347
|
+
priority: { type: "string" },
|
|
348
|
+
tags: {
|
|
349
|
+
type: "array",
|
|
350
|
+
items: { type: "string" },
|
|
351
|
+
},
|
|
352
|
+
},
|
|
353
|
+
required: ["ticketType", "priority"],
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
const agent = new Agent<ConversationContext, TicketData>({
|
|
348
357
|
name: "Support Analyzer",
|
|
349
358
|
provider: new GeminiProvider({
|
|
350
359
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
351
360
|
model: "models/gemini-2.5-flash",
|
|
352
361
|
}),
|
|
362
|
+
// NEW: Agent-level schema
|
|
363
|
+
schema: ticketSchema,
|
|
353
364
|
persistence: {
|
|
354
365
|
adapter,
|
|
355
366
|
autoSave: true,
|
|
@@ -357,20 +368,12 @@ async function analyticsExample() {
|
|
|
357
368
|
},
|
|
358
369
|
});
|
|
359
370
|
|
|
360
|
-
const ticketRoute = agent.createRoute
|
|
371
|
+
const ticketRoute = agent.createRoute({
|
|
361
372
|
title: "Analyze Support Ticket",
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
priority: { type: "string" },
|
|
367
|
-
tags: {
|
|
368
|
-
type: "array",
|
|
369
|
-
items: { type: "string" },
|
|
370
|
-
},
|
|
371
|
-
},
|
|
372
|
-
required: ["ticketType", "priority"],
|
|
373
|
-
},
|
|
373
|
+
// NEW: Required fields for route completion
|
|
374
|
+
requiredFields: ["ticketType", "priority"],
|
|
375
|
+
// NEW: Optional fields
|
|
376
|
+
optionalFields: ["tags"],
|
|
374
377
|
});
|
|
375
378
|
|
|
376
379
|
ticketRoute.initialStep.nextStep({
|
|
@@ -380,7 +383,7 @@ async function analyticsExample() {
|
|
|
380
383
|
|
|
381
384
|
// Create multiple sessions with different agents
|
|
382
385
|
for (let i = 0; i < 3; i++) {
|
|
383
|
-
const sessionAgent = new Agent<AnalyticsContext>({
|
|
386
|
+
const sessionAgent = new Agent<AnalyticsContext, TicketData>({
|
|
384
387
|
name: "Support Analyzer",
|
|
385
388
|
provider: new GeminiProvider({
|
|
386
389
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
@@ -390,6 +393,8 @@ async function analyticsExample() {
|
|
|
390
393
|
userId: "analyst_001",
|
|
391
394
|
department: "support",
|
|
392
395
|
},
|
|
396
|
+
// NEW: Agent-level schema
|
|
397
|
+
schema: ticketSchema,
|
|
393
398
|
persistence: {
|
|
394
399
|
adapter: new OpenSearchAdapter<AnalyticsContext>(client),
|
|
395
400
|
autoSave: true,
|
|
@@ -397,20 +402,12 @@ async function analyticsExample() {
|
|
|
397
402
|
});
|
|
398
403
|
|
|
399
404
|
// Create the ticket route on each agent
|
|
400
|
-
sessionAgent.createRoute
|
|
405
|
+
sessionAgent.createRoute({
|
|
401
406
|
title: "Analyze Support Ticket",
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
priority: { type: "string" },
|
|
407
|
-
tags: {
|
|
408
|
-
type: "array",
|
|
409
|
-
items: { type: "string" },
|
|
410
|
-
},
|
|
411
|
-
},
|
|
412
|
-
required: ["ticketType", "priority"],
|
|
413
|
-
},
|
|
407
|
+
// NEW: Required fields for route completion
|
|
408
|
+
requiredFields: ["ticketType", "priority"],
|
|
409
|
+
// NEW: Optional fields
|
|
410
|
+
optionalFields: ["tags"],
|
|
414
411
|
});
|
|
415
412
|
|
|
416
413
|
const ticketContent = `Support ticket ${i + 1}: ${
|
|
@@ -474,7 +471,7 @@ async function timeSeriesExample() {
|
|
|
474
471
|
const adapter = new OpenSearchAdapter<ConversationContext>(client);
|
|
475
472
|
await adapter.initialize();
|
|
476
473
|
|
|
477
|
-
new Agent<ConversationContext>({
|
|
474
|
+
new Agent<ConversationContext, unknown>({
|
|
478
475
|
name: "Metrics Agent",
|
|
479
476
|
provider: new GeminiProvider({
|
|
480
477
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
@@ -31,7 +31,7 @@ interface BookingData {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
// Booking confirmation tool
|
|
34
|
-
const confirmBooking: Tool<unknown, [], string
|
|
34
|
+
const confirmBooking: Tool<unknown, BookingData, [], string> = {
|
|
35
35
|
id: "confirm_booking",
|
|
36
36
|
description: "Confirm the hotel booking with all details",
|
|
37
37
|
parameters: {
|
|
@@ -56,15 +56,33 @@ const confirmBooking: Tool<unknown, [], string, BookingData> = {
|
|
|
56
56
|
},
|
|
57
57
|
};
|
|
58
58
|
|
|
59
|
+
// Define booking schema
|
|
60
|
+
const bookingSchema = {
|
|
61
|
+
type: "object",
|
|
62
|
+
properties: {
|
|
63
|
+
customerName: { type: "string" },
|
|
64
|
+
hotelName: { type: "string" },
|
|
65
|
+
checkInDate: { type: "string" },
|
|
66
|
+
checkOutDate: { type: "string" },
|
|
67
|
+
guests: { type: "number", minimum: 1, maximum: 10 },
|
|
68
|
+
roomType: { type: "string", enum: ["standard", "deluxe", "suite"] },
|
|
69
|
+
specialRequests: { type: "string" },
|
|
70
|
+
bookingId: { type: "string" },
|
|
71
|
+
},
|
|
72
|
+
required: ["customerName", "hotelName", "checkInDate", "checkOutDate", "guests"],
|
|
73
|
+
};
|
|
74
|
+
|
|
59
75
|
// Function to create agent for each request (server pattern)
|
|
60
76
|
function createBookingAgent(sessionId?: string) {
|
|
61
|
-
return new Agent({
|
|
77
|
+
return new Agent<unknown, BookingData>({
|
|
62
78
|
name: "Hotel Booking Assistant",
|
|
63
79
|
description: "Help customers book hotel rooms",
|
|
64
80
|
provider: new OpenAIProvider({
|
|
65
81
|
apiKey: process.env.OPENAI_API_KEY!,
|
|
66
82
|
model: "gpt-4",
|
|
67
83
|
}),
|
|
84
|
+
// NEW: Agent-level schema
|
|
85
|
+
schema: bookingSchema,
|
|
68
86
|
persistence: {
|
|
69
87
|
adapter: new MemoryAdapter(), // In production: RedisAdapter, PrismaAdapter, etc.
|
|
70
88
|
autoSave: true,
|
|
@@ -75,20 +93,10 @@ function createBookingAgent(sessionId?: string) {
|
|
|
75
93
|
title: "Hotel Booking",
|
|
76
94
|
description: "Collect booking details and confirm reservation",
|
|
77
95
|
conditions: ["User wants to book a hotel room"],
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
hotelName: { type: "string" },
|
|
83
|
-
checkInDate: { type: "string" },
|
|
84
|
-
checkOutDate: { type: "string" },
|
|
85
|
-
guests: { type: "number", minimum: 1, maximum: 10 },
|
|
86
|
-
roomType: { type: "string", enum: ["standard", "deluxe", "suite"] },
|
|
87
|
-
specialRequests: { type: "string" },
|
|
88
|
-
bookingId: { type: "string" },
|
|
89
|
-
},
|
|
90
|
-
required: ["customerName", "hotelName", "checkInDate", "checkOutDate", "guests"],
|
|
91
|
-
},
|
|
96
|
+
// NEW: Required fields for route completion
|
|
97
|
+
requiredFields: ["customerName", "hotelName", "checkInDate", "checkOutDate", "guests"],
|
|
98
|
+
// NEW: Optional fields that enhance the experience
|
|
99
|
+
optionalFields: ["roomType", "specialRequests", "bookingId"],
|
|
92
100
|
steps: [
|
|
93
101
|
{
|
|
94
102
|
id: "ask_name",
|
|
@@ -179,7 +187,7 @@ async function handleChatRequest(request: ChatRequest): Promise<ChatResponse> {
|
|
|
179
187
|
message: response.message,
|
|
180
188
|
sessionId: agent.session.id!,
|
|
181
189
|
isComplete: response.isRouteComplete!,
|
|
182
|
-
data: agent.session.getData
|
|
190
|
+
data: agent.session.getData(),
|
|
183
191
|
};
|
|
184
192
|
}
|
|
185
193
|
|
|
@@ -84,7 +84,7 @@ async function example() {
|
|
|
84
84
|
*/
|
|
85
85
|
const sessionId = "session_user123_booking"; // Could be from request params
|
|
86
86
|
|
|
87
|
-
const agent = new Agent<ConversationContext>({
|
|
87
|
+
const agent = new Agent<ConversationContext, FlightBookingData>({
|
|
88
88
|
name: "Travel Assistant",
|
|
89
89
|
description: "A helpful travel booking assistant",
|
|
90
90
|
goal: "Help users book flights with ease",
|
|
@@ -100,19 +100,6 @@ async function example() {
|
|
|
100
100
|
adapter: new PrismaAdapter<ConversationContext>({ prisma }),
|
|
101
101
|
autoSave: true, // Auto-saves session after each response
|
|
102
102
|
},
|
|
103
|
-
sessionId, // ⨠Agent will automatically load or create this session
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Create a route with data extraction schema
|
|
108
|
-
*/
|
|
109
|
-
const flightRoute = agent.createRoute<FlightBookingData>({
|
|
110
|
-
title: "Book a Flight",
|
|
111
|
-
description: "Help user book a flight ticket",
|
|
112
|
-
conditions: [
|
|
113
|
-
"User wants to book a flight",
|
|
114
|
-
"User mentions travel, flying, or booking tickets",
|
|
115
|
-
],
|
|
116
103
|
schema: {
|
|
117
104
|
type: "object",
|
|
118
105
|
properties: {
|
|
@@ -143,6 +130,19 @@ async function example() {
|
|
|
143
130
|
},
|
|
144
131
|
required: ["destination", "departureDate", "passengers", "cabinClass"],
|
|
145
132
|
},
|
|
133
|
+
sessionId, // ⨠Agent will automatically load or create this session
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Create a route with data extraction schema
|
|
138
|
+
*/
|
|
139
|
+
const flightRoute = agent.createRoute({
|
|
140
|
+
title: "Book a Flight",
|
|
141
|
+
description: "Help user book a flight ticket",
|
|
142
|
+
conditions: [
|
|
143
|
+
"User wants to book a flight",
|
|
144
|
+
"User mentions travel, flying, or booking tickets",
|
|
145
|
+
],
|
|
146
146
|
});
|
|
147
147
|
|
|
148
148
|
// Step flow with smart data collecting and custom IDs
|
|
@@ -194,8 +194,8 @@ async function example() {
|
|
|
194
194
|
console.log("š Conversation history:", agent.session.getHistory().length, "messages");
|
|
195
195
|
|
|
196
196
|
// Set some initial data if this is a new session
|
|
197
|
-
if (!agent.session.getData
|
|
198
|
-
await agent.session.setData
|
|
197
|
+
if (!agent.session.getData()?.cabinClass) {
|
|
198
|
+
await agent.session.setData({ cabinClass: "economy" });
|
|
199
199
|
}
|
|
200
200
|
|
|
201
201
|
/**
|
|
@@ -216,7 +216,7 @@ async function example() {
|
|
|
216
216
|
sessionId: agent.session.id,
|
|
217
217
|
currentRoute: response1.session?.currentRoute?.title,
|
|
218
218
|
currentStepId: response1.session?.currentStep?.id,
|
|
219
|
-
data: agent.session.getData
|
|
219
|
+
data: agent.session.getData(),
|
|
220
220
|
});
|
|
221
221
|
|
|
222
222
|
// Add agent response to session history
|
|
@@ -237,14 +237,14 @@ async function example() {
|
|
|
237
237
|
console.log("š Session after turn 2:", {
|
|
238
238
|
currentRoute: response2.session?.currentRoute?.title,
|
|
239
239
|
currentStep: response2.session?.currentStep?.id,
|
|
240
|
-
data: agent.session.getData
|
|
240
|
+
data: agent.session.getData(),
|
|
241
241
|
});
|
|
242
242
|
|
|
243
243
|
await agent.session.addMessage("assistant", response2.message);
|
|
244
244
|
|
|
245
245
|
if (response2.isRouteComplete) {
|
|
246
246
|
console.log("\nā
Flight booking complete!");
|
|
247
|
-
await sendFlightConfirmation(agent.session.getData
|
|
247
|
+
await sendFlightConfirmation(agent.session.getData());
|
|
248
248
|
}
|
|
249
249
|
|
|
250
250
|
/**
|
|
@@ -252,7 +252,7 @@ async function example() {
|
|
|
252
252
|
*/
|
|
253
253
|
console.log("\n--- Session Recovery (New Agent Instance) ---");
|
|
254
254
|
|
|
255
|
-
const newAgent = new Agent<ConversationContext>({
|
|
255
|
+
const newAgent = new Agent<ConversationContext, FlightBookingData>({
|
|
256
256
|
name: "Travel Assistant",
|
|
257
257
|
provider: new GeminiProvider({
|
|
258
258
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
@@ -262,6 +262,18 @@ async function example() {
|
|
|
262
262
|
userId: "user_123",
|
|
263
263
|
userName: "Alice",
|
|
264
264
|
},
|
|
265
|
+
// NEW: Agent-level schema (same as original agent)
|
|
266
|
+
schema: {
|
|
267
|
+
type: "object",
|
|
268
|
+
properties: {
|
|
269
|
+
destination: { type: "string" },
|
|
270
|
+
departureDate: { type: "string" },
|
|
271
|
+
returnDate: { type: "string" },
|
|
272
|
+
passengers: { type: "number", minimum: 1, maximum: 9 },
|
|
273
|
+
cabinClass: { type: "string", enum: ["economy", "premium", "business", "first"] },
|
|
274
|
+
},
|
|
275
|
+
required: ["destination", "departureDate", "passengers", "cabinClass"],
|
|
276
|
+
},
|
|
265
277
|
persistence: {
|
|
266
278
|
adapter: new PrismaAdapter<ConversationContext>({ prisma }),
|
|
267
279
|
},
|
|
@@ -271,7 +283,7 @@ async function example() {
|
|
|
271
283
|
console.log("š„ Recovered session:", {
|
|
272
284
|
sessionId: newAgent.session.id,
|
|
273
285
|
historyLength: newAgent.session.getHistory().length,
|
|
274
|
-
data: newAgent.session.getData
|
|
286
|
+
data: newAgent.session.getData(),
|
|
275
287
|
});
|
|
276
288
|
|
|
277
289
|
/**
|
|
@@ -308,7 +320,7 @@ async function advancedExample() {
|
|
|
308
320
|
};
|
|
309
321
|
}
|
|
310
322
|
|
|
311
|
-
const agent = new Agent<UserContext>({
|
|
323
|
+
const agent = new Agent<UserContext, OnboardingData>({
|
|
312
324
|
name: "Onboarding Assistant",
|
|
313
325
|
description: "Help new users get started",
|
|
314
326
|
provider: new GeminiProvider({
|
|
@@ -357,12 +369,6 @@ async function advancedExample() {
|
|
|
357
369
|
autoSave: true,
|
|
358
370
|
},
|
|
359
371
|
sessionId,
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
// Create onboarding route
|
|
363
|
-
const onboardingRoute = agent.createRoute<OnboardingData>({
|
|
364
|
-
title: "User Onboarding",
|
|
365
|
-
description: "Collect user information for account setup",
|
|
366
372
|
schema: {
|
|
367
373
|
type: "object",
|
|
368
374
|
properties: {
|
|
@@ -375,6 +381,12 @@ async function advancedExample() {
|
|
|
375
381
|
},
|
|
376
382
|
});
|
|
377
383
|
|
|
384
|
+
// Create onboarding route
|
|
385
|
+
const onboardingRoute = agent.createRoute({
|
|
386
|
+
title: "User Onboarding",
|
|
387
|
+
description: "Collect user information for account setup",
|
|
388
|
+
});
|
|
389
|
+
|
|
378
390
|
onboardingRoute.initialStep
|
|
379
391
|
.nextStep({
|
|
380
392
|
prompt: "Welcome and ask for name",
|
|
@@ -413,7 +425,7 @@ async function advancedExample() {
|
|
|
413
425
|
});
|
|
414
426
|
|
|
415
427
|
console.log("š¤ Agent:", response.message);
|
|
416
|
-
console.log("š Data collected:", agent.session.getData
|
|
428
|
+
console.log("š Data collected:", agent.session.getData());
|
|
417
429
|
|
|
418
430
|
// Add to session history for future responses
|
|
419
431
|
await agent.session.addMessage("user", "I'd like to create an account");
|
|
@@ -427,12 +439,12 @@ async function advancedExample() {
|
|
|
427
439
|
});
|
|
428
440
|
|
|
429
441
|
console.log("š¤ Agent:", response2.message);
|
|
430
|
-
console.log("š Normalized data:", agent.session.getData
|
|
442
|
+
console.log("š Normalized data:", agent.session.getData());
|
|
431
443
|
// Shows normalized phone and email
|
|
432
444
|
|
|
433
445
|
if (response2.isRouteComplete) {
|
|
434
446
|
console.log("\nā
Onboarding complete!");
|
|
435
|
-
await sendOnboardingEmail(agent.session.getData
|
|
447
|
+
await sendOnboardingEmail(agent.session.getData());
|
|
436
448
|
}
|
|
437
449
|
|
|
438
450
|
await prisma.$disconnect();
|
|
@@ -450,32 +462,36 @@ async function serverEndpointExample() {
|
|
|
450
462
|
message: "I need help, my name is John and my email is john@example.com",
|
|
451
463
|
};
|
|
452
464
|
|
|
465
|
+
// Define contact form schema
|
|
466
|
+
const contactFormSchema = {
|
|
467
|
+
type: "object",
|
|
468
|
+
properties: {
|
|
469
|
+
name: { type: "string" },
|
|
470
|
+
email: { type: "string" },
|
|
471
|
+
message: { type: "string" },
|
|
472
|
+
},
|
|
473
|
+
required: ["name", "email", "message"],
|
|
474
|
+
};
|
|
475
|
+
|
|
453
476
|
// Create agent with sessionId (loads existing or creates new)
|
|
454
|
-
const agent = new Agent({
|
|
477
|
+
const agent = new Agent<unknown, ContactFormData>({
|
|
455
478
|
name: "Support Agent",
|
|
456
479
|
provider: new GeminiProvider({
|
|
457
480
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
458
481
|
model: "models/gemini-2.5-flash",
|
|
459
482
|
}),
|
|
483
|
+
// NEW: Agent-level schema
|
|
484
|
+
schema: contactFormSchema,
|
|
460
485
|
persistence: {
|
|
461
|
-
adapter: new PrismaAdapter<
|
|
486
|
+
adapter: new PrismaAdapter<unknown>({ prisma }),
|
|
462
487
|
autoSave: true,
|
|
463
488
|
},
|
|
464
489
|
sessionId: requestData.sessionId, // ⨠Automatic session management
|
|
465
490
|
});
|
|
466
491
|
|
|
467
492
|
// Create a simple contact form route
|
|
468
|
-
const contactRoute = agent.createRoute
|
|
493
|
+
const contactRoute = agent.createRoute({
|
|
469
494
|
title: "Contact Form",
|
|
470
|
-
schema: {
|
|
471
|
-
type: "object",
|
|
472
|
-
properties: {
|
|
473
|
-
name: { type: "string" },
|
|
474
|
-
email: { type: "string" },
|
|
475
|
-
message: { type: "string" },
|
|
476
|
-
},
|
|
477
|
-
required: ["name", "email", "message"],
|
|
478
|
-
},
|
|
479
495
|
});
|
|
480
496
|
|
|
481
497
|
contactRoute.initialStep
|
|
@@ -502,14 +518,14 @@ async function serverEndpointExample() {
|
|
|
502
518
|
message: response.message,
|
|
503
519
|
sessionId: agent.session.id,
|
|
504
520
|
isComplete: response.isRouteComplete,
|
|
505
|
-
data: agent.session.getData
|
|
521
|
+
data: agent.session.getData(),
|
|
506
522
|
};
|
|
507
523
|
|
|
508
524
|
console.log("ā
API Response:", apiResponse);
|
|
509
525
|
|
|
510
526
|
if (response.isRouteComplete) {
|
|
511
527
|
console.log("\nā
Contact form submitted!");
|
|
512
|
-
await logContactForm(agent.session.getData
|
|
528
|
+
await logContactForm(agent.session.getData());
|
|
513
529
|
}
|
|
514
530
|
|
|
515
531
|
await prisma.$disconnect();
|