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