@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.
Files changed (166) hide show
  1. package/README.md +34 -22
  2. package/dist/cjs/src/core/Agent.d.ts +52 -24
  3. package/dist/cjs/src/core/Agent.d.ts.map +1 -1
  4. package/dist/cjs/src/core/Agent.js +266 -39
  5. package/dist/cjs/src/core/Agent.js.map +1 -1
  6. package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -1
  7. package/dist/cjs/src/core/PersistenceManager.js +48 -25
  8. package/dist/cjs/src/core/PersistenceManager.js.map +1 -1
  9. package/dist/cjs/src/core/PromptComposer.d.ts +1 -1
  10. package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -1
  11. package/dist/cjs/src/core/PromptComposer.js.map +1 -1
  12. package/dist/cjs/src/core/ResponseEngine.d.ts +13 -12
  13. package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -1
  14. package/dist/cjs/src/core/ResponseEngine.js +4 -4
  15. package/dist/cjs/src/core/ResponseEngine.js.map +1 -1
  16. package/dist/cjs/src/core/ResponsePipeline.d.ts +66 -38
  17. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -1
  18. package/dist/cjs/src/core/ResponsePipeline.js +71 -3
  19. package/dist/cjs/src/core/ResponsePipeline.js.map +1 -1
  20. package/dist/cjs/src/core/Route.d.ts +24 -5
  21. package/dist/cjs/src/core/Route.d.ts.map +1 -1
  22. package/dist/cjs/src/core/Route.js +45 -1
  23. package/dist/cjs/src/core/Route.js.map +1 -1
  24. package/dist/cjs/src/core/RoutingEngine.d.ts +31 -6
  25. package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -1
  26. package/dist/cjs/src/core/RoutingEngine.js +113 -9
  27. package/dist/cjs/src/core/RoutingEngine.js.map +1 -1
  28. package/dist/cjs/src/core/SessionManager.d.ts +14 -4
  29. package/dist/cjs/src/core/SessionManager.d.ts.map +1 -1
  30. package/dist/cjs/src/core/SessionManager.js +25 -5
  31. package/dist/cjs/src/core/SessionManager.js.map +1 -1
  32. package/dist/cjs/src/core/Step.d.ts +10 -10
  33. package/dist/cjs/src/core/Step.d.ts.map +1 -1
  34. package/dist/cjs/src/core/Step.js.map +1 -1
  35. package/dist/cjs/src/core/ToolExecutor.d.ts +4 -2
  36. package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -1
  37. package/dist/cjs/src/core/ToolExecutor.js +13 -3
  38. package/dist/cjs/src/core/ToolExecutor.js.map +1 -1
  39. package/dist/cjs/src/types/agent.d.ts +41 -21
  40. package/dist/cjs/src/types/agent.d.ts.map +1 -1
  41. package/dist/cjs/src/types/agent.js.map +1 -1
  42. package/dist/cjs/src/types/index.d.ts +1 -1
  43. package/dist/cjs/src/types/index.d.ts.map +1 -1
  44. package/dist/cjs/src/types/index.js.map +1 -1
  45. package/dist/cjs/src/types/persistence.d.ts +0 -1
  46. package/dist/cjs/src/types/persistence.d.ts.map +1 -1
  47. package/dist/cjs/src/types/route.d.ts +22 -16
  48. package/dist/cjs/src/types/route.d.ts.map +1 -1
  49. package/dist/cjs/src/types/session.d.ts +6 -11
  50. package/dist/cjs/src/types/session.d.ts.map +1 -1
  51. package/dist/cjs/src/types/tool.d.ts +12 -6
  52. package/dist/cjs/src/types/tool.d.ts.map +1 -1
  53. package/dist/cjs/src/utils/session.d.ts +2 -2
  54. package/dist/cjs/src/utils/session.d.ts.map +1 -1
  55. package/dist/cjs/src/utils/session.js +6 -26
  56. package/dist/cjs/src/utils/session.js.map +1 -1
  57. package/dist/src/core/Agent.d.ts +52 -24
  58. package/dist/src/core/Agent.d.ts.map +1 -1
  59. package/dist/src/core/Agent.js +266 -39
  60. package/dist/src/core/Agent.js.map +1 -1
  61. package/dist/src/core/PersistenceManager.d.ts.map +1 -1
  62. package/dist/src/core/PersistenceManager.js +48 -25
  63. package/dist/src/core/PersistenceManager.js.map +1 -1
  64. package/dist/src/core/PromptComposer.d.ts +1 -1
  65. package/dist/src/core/PromptComposer.d.ts.map +1 -1
  66. package/dist/src/core/PromptComposer.js.map +1 -1
  67. package/dist/src/core/ResponseEngine.d.ts +13 -12
  68. package/dist/src/core/ResponseEngine.d.ts.map +1 -1
  69. package/dist/src/core/ResponseEngine.js +4 -4
  70. package/dist/src/core/ResponseEngine.js.map +1 -1
  71. package/dist/src/core/ResponsePipeline.d.ts +66 -38
  72. package/dist/src/core/ResponsePipeline.d.ts.map +1 -1
  73. package/dist/src/core/ResponsePipeline.js +71 -3
  74. package/dist/src/core/ResponsePipeline.js.map +1 -1
  75. package/dist/src/core/Route.d.ts +24 -5
  76. package/dist/src/core/Route.d.ts.map +1 -1
  77. package/dist/src/core/Route.js +45 -1
  78. package/dist/src/core/Route.js.map +1 -1
  79. package/dist/src/core/RoutingEngine.d.ts +31 -6
  80. package/dist/src/core/RoutingEngine.d.ts.map +1 -1
  81. package/dist/src/core/RoutingEngine.js +113 -9
  82. package/dist/src/core/RoutingEngine.js.map +1 -1
  83. package/dist/src/core/SessionManager.d.ts +14 -4
  84. package/dist/src/core/SessionManager.d.ts.map +1 -1
  85. package/dist/src/core/SessionManager.js +25 -5
  86. package/dist/src/core/SessionManager.js.map +1 -1
  87. package/dist/src/core/Step.d.ts +10 -10
  88. package/dist/src/core/Step.d.ts.map +1 -1
  89. package/dist/src/core/Step.js.map +1 -1
  90. package/dist/src/core/ToolExecutor.d.ts +4 -2
  91. package/dist/src/core/ToolExecutor.d.ts.map +1 -1
  92. package/dist/src/core/ToolExecutor.js +13 -3
  93. package/dist/src/core/ToolExecutor.js.map +1 -1
  94. package/dist/src/types/agent.d.ts +41 -21
  95. package/dist/src/types/agent.d.ts.map +1 -1
  96. package/dist/src/types/agent.js.map +1 -1
  97. package/dist/src/types/index.d.ts +1 -1
  98. package/dist/src/types/index.d.ts.map +1 -1
  99. package/dist/src/types/index.js.map +1 -1
  100. package/dist/src/types/persistence.d.ts +0 -1
  101. package/dist/src/types/persistence.d.ts.map +1 -1
  102. package/dist/src/types/route.d.ts +22 -16
  103. package/dist/src/types/route.d.ts.map +1 -1
  104. package/dist/src/types/session.d.ts +6 -11
  105. package/dist/src/types/session.d.ts.map +1 -1
  106. package/dist/src/types/tool.d.ts +12 -6
  107. package/dist/src/types/tool.d.ts.map +1 -1
  108. package/dist/src/utils/session.d.ts +2 -2
  109. package/dist/src/utils/session.d.ts.map +1 -1
  110. package/dist/src/utils/session.js +6 -26
  111. package/dist/src/utils/session.js.map +1 -1
  112. package/docs/README.md +3 -3
  113. package/docs/api/README.md +35 -4
  114. package/docs/api/overview.md +166 -12
  115. package/docs/core/agent/README.md +162 -17
  116. package/docs/core/agent/context-management.md +39 -15
  117. package/docs/core/agent/session-management.md +49 -16
  118. package/docs/core/ai-integration/prompt-composition.md +38 -14
  119. package/docs/core/ai-integration/response-processing.md +28 -17
  120. package/docs/core/conversation-flows/data-collection.md +103 -25
  121. package/docs/core/conversation-flows/route-dsl.md +45 -22
  122. package/docs/core/conversation-flows/routes.md +74 -18
  123. package/docs/core/conversation-flows/step-transitions.md +3 -3
  124. package/docs/core/conversation-flows/steps.md +39 -15
  125. package/docs/core/routing/intelligent-routing.md +18 -9
  126. package/docs/core/tools/tool-definition.md +8 -8
  127. package/docs/core/tools/tool-execution.md +26 -26
  128. package/docs/core/tools/tool-scoping.md +5 -5
  129. package/docs/guides/getting-started/README.md +54 -32
  130. package/examples/advanced-patterns/knowledge-based-agent.ts +37 -28
  131. package/examples/advanced-patterns/persistent-onboarding.ts +70 -41
  132. package/examples/advanced-patterns/route-lifecycle-hooks.ts +28 -2
  133. package/examples/advanced-patterns/streaming-responses.ts +28 -23
  134. package/examples/ai-providers/anthropic-integration.ts +40 -33
  135. package/examples/ai-providers/openai-integration.ts +25 -25
  136. package/examples/conversation-flows/completion-transitions.ts +36 -32
  137. package/examples/core-concepts/basic-agent.ts +76 -78
  138. package/examples/core-concepts/schema-driven-extraction.ts +20 -16
  139. package/examples/core-concepts/session-management.ts +65 -53
  140. package/examples/integrations/database-integration.ts +49 -34
  141. package/examples/integrations/healthcare-integration.ts +96 -91
  142. package/examples/integrations/search-integration.ts +79 -82
  143. package/examples/integrations/server-session-management.ts +25 -17
  144. package/examples/persistence/database-persistence.ts +61 -45
  145. package/examples/persistence/memory-sessions.ts +52 -63
  146. package/examples/persistence/redis-persistence.ts +81 -95
  147. package/examples/tools/basic-tools.ts +73 -62
  148. package/examples/tools/data-enrichment-tools.ts +52 -44
  149. package/package.json +1 -1
  150. package/src/core/Agent.ts +418 -128
  151. package/src/core/PersistenceManager.ts +51 -27
  152. package/src/core/PromptComposer.ts +1 -1
  153. package/src/core/ResponseEngine.ts +21 -19
  154. package/src/core/ResponsePipeline.ts +174 -59
  155. package/src/core/Route.ts +58 -6
  156. package/src/core/RoutingEngine.ts +174 -27
  157. package/src/core/SessionManager.ts +32 -8
  158. package/src/core/Step.ts +20 -12
  159. package/src/core/ToolExecutor.ts +19 -5
  160. package/src/types/agent.ts +46 -23
  161. package/src/types/index.ts +2 -0
  162. package/src/types/persistence.ts +0 -1
  163. package/src/types/route.ts +22 -16
  164. package/src/types/session.ts +6 -12
  165. package/src/types/tool.ts +15 -9
  166. 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, OrderData> = {
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
- const orderData = data as Partial<OrderData>;
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, PaymentData> = {
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
- const paymentData = data as Partial<PaymentData>;
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 ${paymentData?.orderId} is now confirmed.`,
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
- // Create agent with persistence
100
- const agent = new Agent({
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<OrderData>({
137
+ agent.createRoute({
115
138
  title: "Product Order",
116
139
  description: "Collect order details and create an order",
117
- schema: {
118
- type: "object",
119
- properties: {
120
- customerName: { type: "string" },
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<OrderData>) => !!data.customerName,
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<OrderData>) => !!data.productType,
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<OrderData>) => data.budget !== undefined,
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<OrderData>) => !!data.preferredColor,
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<OrderData>) => data.urgentDelivery !== undefined,
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<PaymentData>({
200
+ agent.createRoute({
186
201
  title: "Payment Processing",
187
202
  description: "Process payment for an order",
188
- schema: {
189
- type: "object",
190
- properties: {
191
- orderId: { type: "string" },
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<PaymentData>) => !!data.paymentMethod,
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<PaymentData>) => data.amount !== undefined,
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<OrderData>(), null, 2));
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<OrderData>(), null, 2));
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<OrderData>(), null, 2));
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<PaymentData>(), null, 2));
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<OrderData>(), null, 2));
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<OrderData>(), null, 2));
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<OrderData>(), null, 2));
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<OnboardingData>({
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
- schema: {
148
- type: "object",
149
- properties: {
150
- fullName: { type: "string" },
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<OnboardingData>(),
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<OnboardingData>());
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<OnboardingData>());
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<OnboardingData>());
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<OnboardingData>(),
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 agent = new Agent({
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, _previous: 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<OnboardingData>({
474
+ const route = agent.createRoute({
454
475
  title: "Smart Onboarding",
455
- schema: {
456
- type: "object",
457
- properties: {
458
- fullName: { type: "string" },
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<OnboardingData>());
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!,