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