@falai/agent 0.9.0-alpha-1 ā 0.9.0-alpha-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/README.md +34 -22
- package/dist/cjs/src/core/Agent.d.ts +52 -24
- package/dist/cjs/src/core/Agent.d.ts.map +1 -1
- package/dist/cjs/src/core/Agent.js +266 -39
- 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/ResponsePipeline.d.ts +66 -38
- package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/cjs/src/core/ResponsePipeline.js +71 -3
- 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/types/agent.d.ts +41 -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/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/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 +52 -24
- package/dist/src/core/Agent.d.ts.map +1 -1
- package/dist/src/core/Agent.js +266 -39
- 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/ResponsePipeline.d.ts +66 -38
- package/dist/src/core/ResponsePipeline.d.ts.map +1 -1
- package/dist/src/core/ResponsePipeline.js +71 -3
- 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/types/agent.d.ts +41 -21
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js.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/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 +3 -3
- package/docs/api/README.md +35 -4
- package/docs/api/overview.md +166 -12
- 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/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 +28 -23
- 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/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 +418 -128
- package/src/core/PersistenceManager.ts +51 -27
- package/src/core/PromptComposer.ts +1 -1
- package/src/core/ResponseEngine.ts +21 -19
- package/src/core/ResponsePipeline.ts +174 -59
- 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/types/agent.ts +46 -23
- 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/session.ts +6 -31
|
@@ -43,7 +43,7 @@ interface PaymentData {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
// Tools for order processing
|
|
46
|
-
const createOrder: Tool<unknown, [], string
|
|
46
|
+
const createOrder: Tool<unknown, UnifiedOrderData, [], string> = {
|
|
47
47
|
id: "create_order",
|
|
48
48
|
description: "Create a new order from the collected order data",
|
|
49
49
|
parameters: {
|
|
@@ -52,8 +52,7 @@ const createOrder: Tool<unknown, [], string, OrderData> = {
|
|
|
52
52
|
},
|
|
53
53
|
handler: ({ data }) => {
|
|
54
54
|
const orderId = `ORD-${Date.now()}`;
|
|
55
|
-
|
|
56
|
-
console.log(`Creating order ${orderId} for ${orderData?.customerName}`);
|
|
55
|
+
console.log(`Creating order ${orderId} for ${data?.customerName}`);
|
|
57
56
|
|
|
58
57
|
return {
|
|
59
58
|
data: `Order ${orderId} created successfully!`,
|
|
@@ -64,7 +63,7 @@ const createOrder: Tool<unknown, [], string, OrderData> = {
|
|
|
64
63
|
},
|
|
65
64
|
};
|
|
66
65
|
|
|
67
|
-
const processPayment: Tool<unknown, [], string
|
|
66
|
+
const processPayment: Tool<unknown, UnifiedOrderData, [], string> = {
|
|
68
67
|
id: "process_payment",
|
|
69
68
|
description: "Process payment for an order",
|
|
70
69
|
parameters: {
|
|
@@ -72,15 +71,14 @@ const processPayment: Tool<unknown, [], string, PaymentData> = {
|
|
|
72
71
|
properties: {},
|
|
73
72
|
},
|
|
74
73
|
handler: ({ data }) => {
|
|
75
|
-
|
|
76
|
-
console.log(`Processing payment for order ${paymentData?.orderId}`);
|
|
74
|
+
console.log(`Processing payment for order ${data?.orderId}`);
|
|
77
75
|
|
|
78
76
|
// Simulate payment processing
|
|
79
77
|
const success = Math.random() > 0.1; // 90% success rate
|
|
80
78
|
|
|
81
79
|
if (success) {
|
|
82
80
|
return {
|
|
83
|
-
data: `Payment processed successfully! Order ${
|
|
81
|
+
data: `Payment processed successfully! Order ${data?.orderId} is now confirmed.`,
|
|
84
82
|
dataUpdate: {
|
|
85
83
|
confirmed: true,
|
|
86
84
|
},
|
|
@@ -96,8 +94,31 @@ const processPayment: Tool<unknown, [], string, PaymentData> = {
|
|
|
96
94
|
},
|
|
97
95
|
};
|
|
98
96
|
|
|
99
|
-
//
|
|
100
|
-
|
|
97
|
+
// Define unified data schema for all order-related interactions
|
|
98
|
+
interface UnifiedOrderData extends OrderData, PaymentData {}
|
|
99
|
+
|
|
100
|
+
const orderSchema = {
|
|
101
|
+
type: "object",
|
|
102
|
+
properties: {
|
|
103
|
+
// Order fields
|
|
104
|
+
customerName: { type: "string" },
|
|
105
|
+
productType: { type: "string", enum: ["laptop", "phone", "tablet"] },
|
|
106
|
+
budget: { type: "number", minimum: 100 },
|
|
107
|
+
preferredColor: { type: "string" },
|
|
108
|
+
urgentDelivery: { type: "boolean" },
|
|
109
|
+
orderId: { type: "string" },
|
|
110
|
+
// Payment fields
|
|
111
|
+
paymentMethod: {
|
|
112
|
+
type: "string",
|
|
113
|
+
enum: ["credit_card", "paypal", "bank_transfer"],
|
|
114
|
+
},
|
|
115
|
+
amount: { type: "number" },
|
|
116
|
+
confirmed: { type: "boolean" },
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// Create agent with persistence and agent-level schema
|
|
121
|
+
const agent = new Agent<unknown, UnifiedOrderData>({
|
|
101
122
|
name: "OrderBot",
|
|
102
123
|
description:
|
|
103
124
|
"A bot that handles multi-step order processing with session management",
|
|
@@ -105,27 +126,21 @@ const agent = new Agent({
|
|
|
105
126
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
106
127
|
model: "models/gemini-2.5-flash",
|
|
107
128
|
}),
|
|
129
|
+
// NEW: Agent-level schema
|
|
130
|
+
schema: orderSchema,
|
|
108
131
|
persistence: {
|
|
109
132
|
adapter: new MemoryAdapter(), // In production, use RedisAdapter, PrismaAdapter, etc.
|
|
110
133
|
},
|
|
111
134
|
});
|
|
112
135
|
|
|
113
136
|
// Order collection route with sequential steps
|
|
114
|
-
agent.createRoute
|
|
137
|
+
agent.createRoute({
|
|
115
138
|
title: "Product Order",
|
|
116
139
|
description: "Collect order details and create an order",
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
productType: { type: "string", enum: ["laptop", "phone", "tablet"] },
|
|
122
|
-
budget: { type: "number", minimum: 100 },
|
|
123
|
-
preferredColor: { type: "string" },
|
|
124
|
-
urgentDelivery: { type: "boolean" },
|
|
125
|
-
orderId: { type: "string" },
|
|
126
|
-
},
|
|
127
|
-
required: ["customerName", "productType", "budget"],
|
|
128
|
-
},
|
|
140
|
+
// NEW: Required fields for route completion
|
|
141
|
+
requiredFields: ["customerName", "productType", "budget"],
|
|
142
|
+
// NEW: Optional fields that enhance the experience
|
|
143
|
+
optionalFields: ["preferredColor", "urgentDelivery", "orderId"],
|
|
129
144
|
// Sequential steps for order collection
|
|
130
145
|
steps: [
|
|
131
146
|
{
|
|
@@ -133,7 +148,7 @@ agent.createRoute<OrderData>({
|
|
|
133
148
|
description: "Ask for customer name",
|
|
134
149
|
prompt: "Hi! I'd like to help you place an order. What's your name?",
|
|
135
150
|
collect: ["customerName"],
|
|
136
|
-
skipIf: (data: Partial<
|
|
151
|
+
skipIf: (data: Partial<UnifiedOrderData>) => !!data.customerName,
|
|
137
152
|
},
|
|
138
153
|
{
|
|
139
154
|
id: "ask_product",
|
|
@@ -141,7 +156,7 @@ agent.createRoute<OrderData>({
|
|
|
141
156
|
prompt: "What would you like to order? (laptop, phone, or tablet)",
|
|
142
157
|
collect: ["productType"],
|
|
143
158
|
requires: ["customerName"],
|
|
144
|
-
skipIf: (data: Partial<
|
|
159
|
+
skipIf: (data: Partial<UnifiedOrderData>) => !!data.productType,
|
|
145
160
|
},
|
|
146
161
|
{
|
|
147
162
|
id: "ask_budget",
|
|
@@ -149,7 +164,7 @@ agent.createRoute<OrderData>({
|
|
|
149
164
|
prompt: "What's your budget for this purchase?",
|
|
150
165
|
collect: ["budget"],
|
|
151
166
|
requires: ["customerName", "productType"],
|
|
152
|
-
skipIf: (data: Partial<
|
|
167
|
+
skipIf: (data: Partial<UnifiedOrderData>) => data.budget !== undefined,
|
|
153
168
|
},
|
|
154
169
|
{
|
|
155
170
|
id: "ask_color",
|
|
@@ -157,7 +172,7 @@ agent.createRoute<OrderData>({
|
|
|
157
172
|
prompt: "Do you have a preferred color?",
|
|
158
173
|
collect: ["preferredColor"],
|
|
159
174
|
requires: ["customerName", "productType", "budget"],
|
|
160
|
-
skipIf: (data: Partial<
|
|
175
|
+
skipIf: (data: Partial<UnifiedOrderData>) => !!data.preferredColor,
|
|
161
176
|
},
|
|
162
177
|
{
|
|
163
178
|
id: "ask_urgent",
|
|
@@ -165,7 +180,7 @@ agent.createRoute<OrderData>({
|
|
|
165
180
|
prompt: "Do you need urgent delivery?",
|
|
166
181
|
collect: ["urgentDelivery"],
|
|
167
182
|
requires: ["customerName", "productType", "budget"],
|
|
168
|
-
skipIf: (data: Partial<
|
|
183
|
+
skipIf: (data: Partial<UnifiedOrderData>) => data.urgentDelivery !== undefined,
|
|
169
184
|
},
|
|
170
185
|
{
|
|
171
186
|
id: "create_order",
|
|
@@ -182,22 +197,13 @@ agent.createRoute<OrderData>({
|
|
|
182
197
|
});
|
|
183
198
|
|
|
184
199
|
// Payment route with sequential steps
|
|
185
|
-
agent.createRoute
|
|
200
|
+
agent.createRoute({
|
|
186
201
|
title: "Payment Processing",
|
|
187
202
|
description: "Process payment for an order",
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
paymentMethod: {
|
|
193
|
-
type: "string",
|
|
194
|
-
enum: ["credit_card", "paypal", "bank_transfer"],
|
|
195
|
-
},
|
|
196
|
-
amount: { type: "number" },
|
|
197
|
-
confirmed: { type: "boolean" },
|
|
198
|
-
},
|
|
199
|
-
required: ["orderId", "paymentMethod", "amount"],
|
|
200
|
-
},
|
|
203
|
+
// NEW: Required fields for route completion
|
|
204
|
+
requiredFields: ["orderId", "paymentMethod", "amount"],
|
|
205
|
+
// NEW: Optional fields
|
|
206
|
+
optionalFields: ["confirmed"],
|
|
201
207
|
// Sequential steps for payment processing
|
|
202
208
|
steps: [
|
|
203
209
|
{
|
|
@@ -206,7 +212,7 @@ agent.createRoute<PaymentData>({
|
|
|
206
212
|
prompt:
|
|
207
213
|
"Now let's process payment for your order. What payment method would you prefer?",
|
|
208
214
|
collect: ["paymentMethod"],
|
|
209
|
-
skipIf: (data: Partial<
|
|
215
|
+
skipIf: (data: Partial<UnifiedOrderData>) => !!data.paymentMethod,
|
|
210
216
|
},
|
|
211
217
|
{
|
|
212
218
|
id: "ask_amount",
|
|
@@ -214,7 +220,7 @@ agent.createRoute<PaymentData>({
|
|
|
214
220
|
prompt: "What's the payment amount?",
|
|
215
221
|
collect: ["amount"],
|
|
216
222
|
requires: ["paymentMethod"],
|
|
217
|
-
skipIf: (data: Partial<
|
|
223
|
+
skipIf: (data: Partial<UnifiedOrderData>) => data.amount !== undefined,
|
|
218
224
|
},
|
|
219
225
|
{
|
|
220
226
|
id: "process_payment",
|
|
@@ -232,13 +238,15 @@ async function demonstrateSessionManagement() {
|
|
|
232
238
|
console.log("=== Automatic Session Management Demo ===\n");
|
|
233
239
|
|
|
234
240
|
// Create agent with automatic session management
|
|
235
|
-
const sessionAgent = new Agent({
|
|
241
|
+
const sessionAgent = new Agent<unknown, UnifiedOrderData>({
|
|
236
242
|
name: "OrderBot",
|
|
237
243
|
description: "A bot that handles multi-step order processing",
|
|
238
244
|
provider: new GeminiProvider({
|
|
239
245
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
240
246
|
model: "models/gemini-2.5-flash",
|
|
241
247
|
}),
|
|
248
|
+
// NEW: Agent-level schema
|
|
249
|
+
schema: orderSchema,
|
|
242
250
|
persistence: {
|
|
243
251
|
adapter: new MemoryAdapter(),
|
|
244
252
|
},
|
|
@@ -258,7 +266,7 @@ async function demonstrateSessionManagement() {
|
|
|
258
266
|
|
|
259
267
|
console.log("Bot:", response1.message);
|
|
260
268
|
console.log("Session ID:", sessionAgent.session.id);
|
|
261
|
-
console.log("Session data:", JSON.stringify(sessionAgent.session.getData<
|
|
269
|
+
console.log("Session data:", JSON.stringify(sessionAgent.session.getData<UnifiedOrderData>(), null, 2));
|
|
262
270
|
console.log("History length:", sessionAgent.session.getHistory().length);
|
|
263
271
|
console.log();
|
|
264
272
|
|
|
@@ -269,7 +277,7 @@ async function demonstrateSessionManagement() {
|
|
|
269
277
|
const response2 = await sessionAgent.chat("My budget is $1500");
|
|
270
278
|
|
|
271
279
|
console.log("Bot:", response2.message);
|
|
272
|
-
console.log("Session data:", JSON.stringify(sessionAgent.session.getData<
|
|
280
|
+
console.log("Session data:", JSON.stringify(sessionAgent.session.getData<UnifiedOrderData>(), null, 2));
|
|
273
281
|
console.log("History length:", sessionAgent.session.getHistory().length);
|
|
274
282
|
console.log();
|
|
275
283
|
|
|
@@ -280,7 +288,7 @@ async function demonstrateSessionManagement() {
|
|
|
280
288
|
const response3 = await sessionAgent.chat("I want black color and urgent delivery please");
|
|
281
289
|
|
|
282
290
|
console.log("Bot:", response3.message);
|
|
283
|
-
console.log("Session data:", JSON.stringify(sessionAgent.session.getData<
|
|
291
|
+
console.log("Session data:", JSON.stringify(sessionAgent.session.getData<UnifiedOrderData>(), null, 2));
|
|
284
292
|
console.log("Route complete:", response3.isRouteComplete);
|
|
285
293
|
console.log("History length:", sessionAgent.session.getHistory().length);
|
|
286
294
|
console.log();
|
|
@@ -292,7 +300,7 @@ async function demonstrateSessionManagement() {
|
|
|
292
300
|
const response4 = await sessionAgent.chat("I'll pay with credit card, amount is $1599");
|
|
293
301
|
|
|
294
302
|
console.log("Bot:", response4.message);
|
|
295
|
-
console.log("Session data:", JSON.stringify(sessionAgent.session.getData<
|
|
303
|
+
console.log("Session data:", JSON.stringify(sessionAgent.session.getData<UnifiedOrderData>(), null, 2));
|
|
296
304
|
console.log("Route complete:", response4.isRouteComplete);
|
|
297
305
|
console.log("Final history length:", sessionAgent.session.getHistory().length);
|
|
298
306
|
}
|
|
@@ -303,7 +311,7 @@ async function demonstrateSessionPersistence() {
|
|
|
303
311
|
|
|
304
312
|
// Create agent with specific sessionId for demonstration
|
|
305
313
|
const sessionId = "demo-session-456";
|
|
306
|
-
const persistentAgent = new Agent<OrderContext>({
|
|
314
|
+
const persistentAgent = new Agent<OrderContext, UnifiedOrderData>({
|
|
307
315
|
name: "Order Assistant",
|
|
308
316
|
description: "Help customers place orders with automatic persistence",
|
|
309
317
|
provider: new GeminiProvider({
|
|
@@ -315,6 +323,8 @@ async function demonstrateSessionPersistence() {
|
|
|
315
323
|
userName: "Alice",
|
|
316
324
|
isVip: false,
|
|
317
325
|
},
|
|
326
|
+
// NEW: Agent-level schema
|
|
327
|
+
schema: orderSchema,
|
|
318
328
|
persistence: {
|
|
319
329
|
adapter: new MemoryAdapter(),
|
|
320
330
|
autoSave: true, // Automatic persistence
|
|
@@ -334,14 +344,14 @@ async function demonstrateSessionPersistence() {
|
|
|
334
344
|
|
|
335
345
|
console.log("After first interaction:");
|
|
336
346
|
console.log("š¤ Agent:", response1.message);
|
|
337
|
-
console.log("Session data:", JSON.stringify(persistentAgent.session.getData<
|
|
347
|
+
console.log("Session data:", JSON.stringify(persistentAgent.session.getData<UnifiedOrderData>(), null, 2));
|
|
338
348
|
console.log("History length:", persistentAgent.session.getHistory().length);
|
|
339
349
|
console.log("Session automatically saved to persistence ā");
|
|
340
350
|
|
|
341
351
|
// Simulate server restart - create new agent instance with same sessionId
|
|
342
352
|
console.log("\nš Simulating server restart - creating new agent instance...");
|
|
343
353
|
|
|
344
|
-
const restoredAgent = new Agent<OrderContext>({
|
|
354
|
+
const restoredAgent = new Agent<OrderContext, UnifiedOrderData>({
|
|
345
355
|
name: "Order Assistant",
|
|
346
356
|
provider: new GeminiProvider({
|
|
347
357
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
@@ -352,6 +362,8 @@ async function demonstrateSessionPersistence() {
|
|
|
352
362
|
userName: "Alice",
|
|
353
363
|
isVip: false,
|
|
354
364
|
},
|
|
365
|
+
// NEW: Agent-level schema
|
|
366
|
+
schema: orderSchema,
|
|
355
367
|
persistence: {
|
|
356
368
|
adapter: new MemoryAdapter(), // Same adapter instance for demo
|
|
357
369
|
autoSave: true,
|
|
@@ -367,14 +379,14 @@ async function demonstrateSessionPersistence() {
|
|
|
367
379
|
console.log("Session automatically restored:");
|
|
368
380
|
console.log("- Session ID:", restoredAgent.session.id);
|
|
369
381
|
console.log("- History length:", restoredAgent.session.getHistory().length);
|
|
370
|
-
console.log("- Restored data:", JSON.stringify(restoredAgent.session.getData<
|
|
382
|
+
console.log("- Restored data:", JSON.stringify(restoredAgent.session.getData<UnifiedOrderData>(), null, 2));
|
|
371
383
|
|
|
372
384
|
// Continue conversation seamlessly
|
|
373
385
|
const response2 = await restoredAgent.chat("Actually, make it urgent delivery");
|
|
374
386
|
|
|
375
387
|
console.log("\nAfter continuing with restored session:");
|
|
376
388
|
console.log("š¤ Agent:", response2.message);
|
|
377
|
-
console.log("Session data:", JSON.stringify(restoredAgent.session.getData<
|
|
389
|
+
console.log("Session data:", JSON.stringify(restoredAgent.session.getData<UnifiedOrderData>(), null, 2));
|
|
378
390
|
console.log("History length:", restoredAgent.session.getHistory().length);
|
|
379
391
|
console.log("Session automatically saved again ā");
|
|
380
392
|
}
|
|
@@ -124,8 +124,21 @@ async function example() {
|
|
|
124
124
|
const userId = "user_123";
|
|
125
125
|
const sessionId = "session_user123_onboarding";
|
|
126
126
|
|
|
127
|
+
// Define onboarding schema
|
|
128
|
+
const onboardingSchema = {
|
|
129
|
+
type: "object",
|
|
130
|
+
properties: {
|
|
131
|
+
fullName: { type: "string" },
|
|
132
|
+
email: { type: "string" },
|
|
133
|
+
companyName: { type: "string" },
|
|
134
|
+
phoneNumber: { type: "string" },
|
|
135
|
+
industry: { type: "string" },
|
|
136
|
+
},
|
|
137
|
+
required: ["fullName", "email", "companyName"],
|
|
138
|
+
};
|
|
139
|
+
|
|
127
140
|
// Create agent with SessionManager (no persistence adapter)
|
|
128
|
-
const agent = new Agent({
|
|
141
|
+
const agent = new Agent<unknown, OnboardingData>({
|
|
129
142
|
name: "Onboarding Assistant",
|
|
130
143
|
description: "Help new customers get started",
|
|
131
144
|
goal: "Collect customer information efficiently",
|
|
@@ -133,28 +146,23 @@ async function example() {
|
|
|
133
146
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
134
147
|
model: "models/gemini-2.5-flash",
|
|
135
148
|
}),
|
|
149
|
+
// NEW: Agent-level schema
|
|
150
|
+
schema: onboardingSchema,
|
|
136
151
|
// No persistence - we'll sync manually with our database
|
|
137
152
|
});
|
|
138
153
|
|
|
139
154
|
// Create onboarding route
|
|
140
|
-
const onboardingRoute = agent.createRoute
|
|
155
|
+
const onboardingRoute = agent.createRoute({
|
|
141
156
|
title: "Customer Onboarding",
|
|
142
157
|
description: "Collect customer information",
|
|
143
158
|
conditions: [
|
|
144
159
|
"User is a new customer",
|
|
145
160
|
"User needs to set up their account",
|
|
146
161
|
],
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
email: { type: "string" },
|
|
152
|
-
companyName: { type: "string" },
|
|
153
|
-
phoneNumber: { type: "string" },
|
|
154
|
-
industry: { type: "string" },
|
|
155
|
-
},
|
|
156
|
-
required: ["fullName", "email", "companyName"],
|
|
157
|
-
},
|
|
162
|
+
// NEW: Required fields for route completion
|
|
163
|
+
requiredFields: ["fullName", "email", "companyName"],
|
|
164
|
+
// NEW: Optional fields that enhance the experience
|
|
165
|
+
optionalFields: ["phoneNumber", "industry"],
|
|
158
166
|
});
|
|
159
167
|
|
|
160
168
|
// Define steps with custom IDs
|
|
@@ -251,7 +259,7 @@ async function example() {
|
|
|
251
259
|
console.log("ā
Session synchronized:", {
|
|
252
260
|
sessionId: agent.session.id,
|
|
253
261
|
historyLength: agent.session.getHistory().length,
|
|
254
|
-
data: agent.session.getData
|
|
262
|
+
data: agent.session.getData(),
|
|
255
263
|
});
|
|
256
264
|
|
|
257
265
|
/**
|
|
@@ -267,7 +275,7 @@ async function example() {
|
|
|
267
275
|
});
|
|
268
276
|
|
|
269
277
|
console.log("š¤ Agent:", response1.message);
|
|
270
|
-
console.log("š Data collected:", agent.session.getData
|
|
278
|
+
console.log("š Data collected:", agent.session.getData());
|
|
271
279
|
|
|
272
280
|
// Add agent response to SessionManager
|
|
273
281
|
await agent.session.addMessage("assistant", response1.message);
|
|
@@ -286,7 +294,7 @@ async function example() {
|
|
|
286
294
|
});
|
|
287
295
|
|
|
288
296
|
console.log("š¤ Agent:", response2.message);
|
|
289
|
-
console.log("š Data collected:", agent.session.getData
|
|
297
|
+
console.log("š Data collected:", agent.session.getData());
|
|
290
298
|
|
|
291
299
|
await agent.session.addMessage("assistant", response2.message);
|
|
292
300
|
|
|
@@ -297,7 +305,7 @@ async function example() {
|
|
|
297
305
|
// Check for route completion
|
|
298
306
|
if (response2.isRouteComplete) {
|
|
299
307
|
console.log("\nā
Onboarding Complete!");
|
|
300
|
-
await processOnboarding(agent.session.getData
|
|
308
|
+
await processOnboarding(agent.session.getData());
|
|
301
309
|
}
|
|
302
310
|
|
|
303
311
|
/**
|
|
@@ -347,7 +355,7 @@ async function example() {
|
|
|
347
355
|
console.log("ā
Session recovered in new agent:", {
|
|
348
356
|
sessionId: newAgent.session.id,
|
|
349
357
|
historyLength: newAgent.session.getHistory().length,
|
|
350
|
-
data: newAgent.session.getData
|
|
358
|
+
data: newAgent.session.getData(),
|
|
351
359
|
});
|
|
352
360
|
|
|
353
361
|
// Continue conversation with recovered session
|
|
@@ -367,7 +375,7 @@ async function example() {
|
|
|
367
375
|
* Helper function to sync SessionManager state to custom database
|
|
368
376
|
*/
|
|
369
377
|
async function syncSessionToDatabase(
|
|
370
|
-
agent: Agent,
|
|
378
|
+
agent: Agent<unknown, OnboardingData>,
|
|
371
379
|
db: CustomDatabase,
|
|
372
380
|
sessionId: string,
|
|
373
381
|
userId: string
|
|
@@ -424,15 +432,28 @@ async function advancedExample() {
|
|
|
424
432
|
const db = new CustomDatabase();
|
|
425
433
|
const sessionId = "session_user456_smart_onboarding";
|
|
426
434
|
|
|
427
|
-
const
|
|
435
|
+
const smartOnboardingSchema = {
|
|
436
|
+
type: "object",
|
|
437
|
+
properties: {
|
|
438
|
+
fullName: { type: "string" },
|
|
439
|
+
email: { type: "string" },
|
|
440
|
+
companyName: { type: "string" },
|
|
441
|
+
phoneNumber: { type: "string" },
|
|
442
|
+
},
|
|
443
|
+
required: ["fullName", "email", "companyName"],
|
|
444
|
+
};
|
|
445
|
+
|
|
446
|
+
const agent = new Agent<unknown, OnboardingData>({
|
|
428
447
|
name: "Smart Onboarding",
|
|
429
448
|
provider: new GeminiProvider({
|
|
430
449
|
apiKey: process.env.GEMINI_API_KEY!,
|
|
431
450
|
model: "models/gemini-2.5-flash",
|
|
432
451
|
}),
|
|
452
|
+
// NEW: Agent-level schema
|
|
453
|
+
schema: smartOnboardingSchema,
|
|
433
454
|
hooks: {
|
|
434
455
|
// Validate and enrich collected data
|
|
435
|
-
onDataUpdate: (data: OnboardingData
|
|
456
|
+
onDataUpdate: (data: Partial<OnboardingData>, _previous: Partial<OnboardingData>) => {
|
|
436
457
|
console.log("š Data collected, validating...");
|
|
437
458
|
|
|
438
459
|
// Normalize email
|
|
@@ -450,18 +471,12 @@ async function advancedExample() {
|
|
|
450
471
|
},
|
|
451
472
|
});
|
|
452
473
|
|
|
453
|
-
const route = agent.createRoute
|
|
474
|
+
const route = agent.createRoute({
|
|
454
475
|
title: "Smart Onboarding",
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
email: { type: "string" },
|
|
460
|
-
companyName: { type: "string" },
|
|
461
|
-
phoneNumber: { type: "string" },
|
|
462
|
-
},
|
|
463
|
-
required: ["fullName", "email", "companyName"],
|
|
464
|
-
},
|
|
476
|
+
// NEW: Required fields for route completion
|
|
477
|
+
requiredFields: ["fullName", "email", "companyName"],
|
|
478
|
+
// NEW: Optional fields
|
|
479
|
+
optionalFields: ["phoneNumber"],
|
|
465
480
|
});
|
|
466
481
|
|
|
467
482
|
route.initialStep.nextStep({
|
|
@@ -492,7 +507,7 @@ async function advancedExample() {
|
|
|
492
507
|
});
|
|
493
508
|
|
|
494
509
|
console.log("š¤ Agent:", response.message);
|
|
495
|
-
console.log("š Normalized data:", agent.session.getData
|
|
510
|
+
console.log("š Normalized data:", agent.session.getData());
|
|
496
511
|
// Shows: { email: "alice@example.com", phoneNumber: "5551234567", ... }
|
|
497
512
|
|
|
498
513
|
await agent.session.addMessage("assistant", response.message);
|
|
@@ -518,7 +533,7 @@ async function serverEndpointExample() {
|
|
|
518
533
|
const { sessionId, userId, message } = req;
|
|
519
534
|
|
|
520
535
|
// Create agent with sessionId (loads existing or creates new)
|
|
521
|
-
const agent = new Agent({
|
|
536
|
+
const agent = new Agent<unknown, OnboardingData>({
|
|
522
537
|
name: "Customer Support",
|
|
523
538
|
provider: new GeminiProvider({
|
|
524
539
|
apiKey: process.env.GEMINI_API_KEY!,
|