@falai/agent 0.6.9 → 0.8.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 (242) hide show
  1. package/README.md +78 -82
  2. package/dist/adapters/MemoryAdapter.d.ts +1 -1
  3. package/dist/adapters/MemoryAdapter.js +3 -3
  4. package/dist/adapters/MemoryAdapter.js.map +1 -1
  5. package/dist/adapters/MongoAdapter.d.ts +1 -1
  6. package/dist/adapters/MongoAdapter.js +3 -3
  7. package/dist/adapters/MongoAdapter.js.map +1 -1
  8. package/dist/adapters/OpenSearchAdapter.js +7 -7
  9. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  10. package/dist/adapters/PostgreSQLAdapter.d.ts +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.js +10 -10
  12. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  13. package/dist/adapters/PrismaAdapter.d.ts +1 -1
  14. package/dist/adapters/PrismaAdapter.js +4 -4
  15. package/dist/adapters/PrismaAdapter.js.map +1 -1
  16. package/dist/adapters/RedisAdapter.d.ts +1 -1
  17. package/dist/adapters/RedisAdapter.js +3 -3
  18. package/dist/adapters/RedisAdapter.js.map +1 -1
  19. package/dist/adapters/SQLiteAdapter.d.ts +4 -4
  20. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  21. package/dist/adapters/SQLiteAdapter.js +12 -12
  22. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  23. package/dist/adapters/index.d.ts +1 -1
  24. package/dist/adapters/index.d.ts.map +1 -1
  25. package/dist/cjs/adapters/MemoryAdapter.d.ts +1 -1
  26. package/dist/cjs/adapters/MemoryAdapter.js +3 -3
  27. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  28. package/dist/cjs/adapters/MongoAdapter.d.ts +1 -1
  29. package/dist/cjs/adapters/MongoAdapter.js +3 -3
  30. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  31. package/dist/cjs/adapters/OpenSearchAdapter.js +7 -7
  32. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  33. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +1 -1
  34. package/dist/cjs/adapters/PostgreSQLAdapter.js +10 -10
  35. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  36. package/dist/cjs/adapters/PrismaAdapter.d.ts +1 -1
  37. package/dist/cjs/adapters/PrismaAdapter.js +4 -4
  38. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  39. package/dist/cjs/adapters/RedisAdapter.d.ts +1 -1
  40. package/dist/cjs/adapters/RedisAdapter.js +3 -3
  41. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  42. package/dist/cjs/adapters/SQLiteAdapter.d.ts +4 -4
  43. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  44. package/dist/cjs/adapters/SQLiteAdapter.js +12 -12
  45. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  46. package/dist/cjs/adapters/index.d.ts +1 -1
  47. package/dist/cjs/adapters/index.d.ts.map +1 -1
  48. package/dist/cjs/constants/index.d.ts +4 -4
  49. package/dist/cjs/constants/index.js +5 -5
  50. package/dist/cjs/core/Agent.d.ts +22 -22
  51. package/dist/cjs/core/Agent.d.ts.map +1 -1
  52. package/dist/cjs/core/Agent.js +168 -160
  53. package/dist/cjs/core/Agent.js.map +1 -1
  54. package/dist/cjs/core/Events.d.ts +6 -6
  55. package/dist/cjs/core/Events.d.ts.map +1 -1
  56. package/dist/cjs/core/PersistenceManager.d.ts +13 -13
  57. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  58. package/dist/cjs/core/PersistenceManager.js +24 -24
  59. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  60. package/dist/cjs/core/ResponseEngine.d.ts +3 -8
  61. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  62. package/dist/cjs/core/ResponseEngine.js +8 -8
  63. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  64. package/dist/cjs/core/Route.d.ts +17 -17
  65. package/dist/cjs/core/Route.d.ts.map +1 -1
  66. package/dist/cjs/core/Route.js +33 -33
  67. package/dist/cjs/core/Route.js.map +1 -1
  68. package/dist/cjs/core/RoutingEngine.d.ts +31 -31
  69. package/dist/cjs/core/RoutingEngine.d.ts.map +1 -1
  70. package/dist/cjs/core/RoutingEngine.js +196 -196
  71. package/dist/cjs/core/RoutingEngine.js.map +1 -1
  72. package/dist/cjs/core/Step.d.ts +72 -0
  73. package/dist/cjs/core/Step.d.ts.map +1 -0
  74. package/dist/cjs/core/Step.js +150 -0
  75. package/dist/cjs/core/Step.js.map +1 -0
  76. package/dist/cjs/core/ToolExecutor.d.ts +5 -5
  77. package/dist/cjs/core/ToolExecutor.d.ts.map +1 -1
  78. package/dist/cjs/core/ToolExecutor.js +8 -8
  79. package/dist/cjs/core/ToolExecutor.js.map +1 -1
  80. package/dist/cjs/core/Transition.d.ts +14 -14
  81. package/dist/cjs/core/Transition.d.ts.map +1 -1
  82. package/dist/cjs/core/Transition.js +48 -19
  83. package/dist/cjs/core/Transition.js.map +1 -1
  84. package/dist/cjs/index.d.ts +7 -7
  85. package/dist/cjs/index.d.ts.map +1 -1
  86. package/dist/cjs/index.js +8 -8
  87. package/dist/cjs/index.js.map +1 -1
  88. package/dist/cjs/types/agent.d.ts +9 -9
  89. package/dist/cjs/types/agent.d.ts.map +1 -1
  90. package/dist/cjs/types/ai.d.ts +2 -2
  91. package/dist/cjs/types/ai.d.ts.map +1 -1
  92. package/dist/cjs/types/history.d.ts +3 -3
  93. package/dist/cjs/types/history.d.ts.map +1 -1
  94. package/dist/cjs/types/index.d.ts +1 -1
  95. package/dist/cjs/types/index.d.ts.map +1 -1
  96. package/dist/cjs/types/persistence.d.ts +5 -5
  97. package/dist/cjs/types/persistence.d.ts.map +1 -1
  98. package/dist/cjs/types/route.d.ts +57 -52
  99. package/dist/cjs/types/route.d.ts.map +1 -1
  100. package/dist/cjs/types/session.d.ts +27 -27
  101. package/dist/cjs/types/session.d.ts.map +1 -1
  102. package/dist/cjs/types/session.js +48 -50
  103. package/dist/cjs/types/session.js.map +1 -1
  104. package/dist/cjs/types/tool.d.ts +13 -13
  105. package/dist/cjs/types/tool.d.ts.map +1 -1
  106. package/dist/cjs/utils/id.d.ts +8 -3
  107. package/dist/cjs/utils/id.d.ts.map +1 -1
  108. package/dist/cjs/utils/id.js +16 -7
  109. package/dist/cjs/utils/id.js.map +1 -1
  110. package/dist/constants/index.d.ts +4 -4
  111. package/dist/constants/index.js +4 -4
  112. package/dist/core/Agent.d.ts +22 -22
  113. package/dist/core/Agent.d.ts.map +1 -1
  114. package/dist/core/Agent.js +170 -162
  115. package/dist/core/Agent.js.map +1 -1
  116. package/dist/core/Events.d.ts +6 -6
  117. package/dist/core/Events.d.ts.map +1 -1
  118. package/dist/core/PersistenceManager.d.ts +13 -13
  119. package/dist/core/PersistenceManager.d.ts.map +1 -1
  120. package/dist/core/PersistenceManager.js +25 -25
  121. package/dist/core/PersistenceManager.js.map +1 -1
  122. package/dist/core/ResponseEngine.d.ts +3 -8
  123. package/dist/core/ResponseEngine.d.ts.map +1 -1
  124. package/dist/core/ResponseEngine.js +8 -8
  125. package/dist/core/ResponseEngine.js.map +1 -1
  126. package/dist/core/Route.d.ts +17 -17
  127. package/dist/core/Route.d.ts.map +1 -1
  128. package/dist/core/Route.js +33 -33
  129. package/dist/core/Route.js.map +1 -1
  130. package/dist/core/RoutingEngine.d.ts +31 -31
  131. package/dist/core/RoutingEngine.d.ts.map +1 -1
  132. package/dist/core/RoutingEngine.js +197 -197
  133. package/dist/core/RoutingEngine.js.map +1 -1
  134. package/dist/core/Step.d.ts +72 -0
  135. package/dist/core/Step.d.ts.map +1 -0
  136. package/dist/core/Step.js +146 -0
  137. package/dist/core/Step.js.map +1 -0
  138. package/dist/core/ToolExecutor.d.ts +5 -5
  139. package/dist/core/ToolExecutor.d.ts.map +1 -1
  140. package/dist/core/ToolExecutor.js +8 -8
  141. package/dist/core/ToolExecutor.js.map +1 -1
  142. package/dist/core/Transition.d.ts +14 -14
  143. package/dist/core/Transition.d.ts.map +1 -1
  144. package/dist/core/Transition.js +48 -19
  145. package/dist/core/Transition.js.map +1 -1
  146. package/dist/index.d.ts +7 -7
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +4 -4
  149. package/dist/index.js.map +1 -1
  150. package/dist/types/agent.d.ts +9 -9
  151. package/dist/types/agent.d.ts.map +1 -1
  152. package/dist/types/ai.d.ts +2 -2
  153. package/dist/types/ai.d.ts.map +1 -1
  154. package/dist/types/history.d.ts +3 -3
  155. package/dist/types/history.d.ts.map +1 -1
  156. package/dist/types/index.d.ts +1 -1
  157. package/dist/types/index.d.ts.map +1 -1
  158. package/dist/types/persistence.d.ts +5 -5
  159. package/dist/types/persistence.d.ts.map +1 -1
  160. package/dist/types/route.d.ts +57 -52
  161. package/dist/types/route.d.ts.map +1 -1
  162. package/dist/types/session.d.ts +27 -27
  163. package/dist/types/session.d.ts.map +1 -1
  164. package/dist/types/session.js +44 -46
  165. package/dist/types/session.js.map +1 -1
  166. package/dist/types/tool.d.ts +13 -13
  167. package/dist/types/tool.d.ts.map +1 -1
  168. package/dist/utils/id.d.ts +8 -3
  169. package/dist/utils/id.d.ts.map +1 -1
  170. package/dist/utils/id.js +14 -6
  171. package/dist/utils/id.js.map +1 -1
  172. package/docs/ADAPTERS.md +21 -21
  173. package/docs/AGENT.md +63 -61
  174. package/docs/API_REFERENCE.md +218 -220
  175. package/docs/ARCHITECTURE.md +99 -104
  176. package/docs/CONTEXT_MANAGEMENT.md +84 -91
  177. package/docs/CONTRIBUTING.md +3 -3
  178. package/docs/DOCS.md +18 -18
  179. package/docs/DOMAINS.md +18 -18
  180. package/docs/EXAMPLES.md +44 -44
  181. package/docs/GETTING_STARTED.md +63 -66
  182. package/docs/PERSISTENCE.md +70 -74
  183. package/docs/PROVIDERS.md +6 -6
  184. package/docs/README.md +6 -6
  185. package/docs/ROUTES.md +218 -220
  186. package/docs/STEPS.md +883 -0
  187. package/examples/business-onboarding.ts +85 -82
  188. package/examples/company-qna-agent.ts +69 -68
  189. package/examples/custom-database-persistence.ts +89 -91
  190. package/examples/declarative-agent.ts +33 -33
  191. package/examples/domain-scoping.ts +20 -20
  192. package/examples/extracted-data-modification.ts +93 -98
  193. package/examples/healthcare-agent.ts +90 -92
  194. package/examples/openai-agent.ts +30 -33
  195. package/examples/opensearch-persistence.ts +46 -48
  196. package/examples/persistent-onboarding.ts +67 -68
  197. package/examples/prisma-persistence.ts +111 -115
  198. package/examples/prisma-schema.example.prisma +3 -3
  199. package/examples/redis-persistence.ts +70 -76
  200. package/examples/route-transitions.ts +72 -48
  201. package/examples/rules-prohibitions.ts +31 -31
  202. package/examples/streaming-agent.ts +29 -29
  203. package/examples/travel-agent.ts +95 -110
  204. package/package.json +1 -1
  205. package/src/adapters/MemoryAdapter.ts +4 -4
  206. package/src/adapters/MongoAdapter.ts +4 -4
  207. package/src/adapters/OpenSearchAdapter.ts +8 -8
  208. package/src/adapters/PostgreSQLAdapter.ts +11 -11
  209. package/src/adapters/PrismaAdapter.ts +5 -5
  210. package/src/adapters/RedisAdapter.ts +4 -4
  211. package/src/adapters/SQLiteAdapter.ts +16 -16
  212. package/src/adapters/index.ts +1 -1
  213. package/src/constants/index.ts +4 -4
  214. package/src/core/Agent.ts +218 -214
  215. package/src/core/Events.ts +12 -12
  216. package/src/core/PersistenceManager.ts +32 -36
  217. package/src/core/ResponseEngine.ts +11 -17
  218. package/src/core/Route.ts +55 -49
  219. package/src/core/RoutingEngine.ts +252 -258
  220. package/src/core/Step.ts +197 -0
  221. package/src/core/ToolExecutor.ts +11 -11
  222. package/src/core/Transition.ts +72 -26
  223. package/src/index.ts +8 -8
  224. package/src/types/agent.ts +9 -9
  225. package/src/types/ai.ts +2 -2
  226. package/src/types/history.ts +3 -3
  227. package/src/types/index.ts +1 -1
  228. package/src/types/persistence.ts +6 -6
  229. package/src/types/route.ts +77 -61
  230. package/src/types/session.ts +75 -78
  231. package/src/types/tool.ts +17 -17
  232. package/src/utils/id.ts +15 -6
  233. package/dist/cjs/core/State.d.ts +0 -72
  234. package/dist/cjs/core/State.d.ts.map +0 -1
  235. package/dist/cjs/core/State.js +0 -148
  236. package/dist/cjs/core/State.js.map +0 -1
  237. package/dist/core/State.d.ts +0 -72
  238. package/dist/core/State.d.ts.map +0 -1
  239. package/dist/core/State.js +0 -144
  240. package/dist/core/State.js.map +0 -1
  241. package/docs/STATES.md +0 -888
  242. package/src/core/State.ts +0 -212
@@ -1,9 +1,9 @@
1
1
  /**
2
- * Example: Using Redis for Persistence with Session State
2
+ * Example: Using Redis for Persistence with Session Step
3
3
  *
4
4
  * Fast, in-memory persistence perfect for:
5
5
  * - High-throughput applications
6
- * - Session caching with extracted data
6
+ * - Session caching with collected data
7
7
  * - Real-time chat applications
8
8
  * - Temporary conversation storage
9
9
  */
@@ -16,7 +16,7 @@ import {
16
16
  EventSource,
17
17
  MessageEventData,
18
18
  Event,
19
- END_STATE,
19
+ END_ROUTE,
20
20
  } from "../src/index";
21
21
  // @ts-ignore
22
22
  import Redis from "ioredis";
@@ -69,7 +69,7 @@ async function example() {
69
69
  name: "Support Assistant",
70
70
  description: "Fast, real-time support assistant",
71
71
  goal: "Help users resolve issues quickly",
72
- ai: new GeminiProvider({
72
+ provider: new GeminiProvider({
73
73
  apiKey: process.env.GEMINI_API_KEY!,
74
74
  model: "models/gemini-2.0-flash-exp",
75
75
  }),
@@ -86,12 +86,12 @@ async function example() {
86
86
  sessionTTL: 24 * 60 * 60, // 24 hours
87
87
  messageTTL: 7 * 24 * 60 * 60, // 7 days
88
88
  }),
89
- autoSave: true, // Auto-save session state
89
+ autoSave: true, // Auto-save session step
90
90
  userId,
91
91
  },
92
92
  });
93
93
 
94
- // Create support ticket route with data gathering
94
+ // Create support ticket route with data collecting
95
95
  const ticketRoute = agent.createRoute<SupportTicketData>({
96
96
  title: "Create Support Ticket",
97
97
  description: "Help user create and track support tickets",
@@ -100,7 +100,7 @@ async function example() {
100
100
  "User wants to report a problem",
101
101
  "User mentions support, help, or issue",
102
102
  ],
103
- extractionSchema: {
103
+ schema: {
104
104
  type: "object",
105
105
  properties: {
106
106
  issue: {
@@ -127,37 +127,37 @@ async function example() {
127
127
  },
128
128
  });
129
129
 
130
- // State flow
131
- ticketRoute.initialState
132
- .transitionTo({
133
- chatState: "Ask what the issue is",
134
- gather: ["issue", "category"],
130
+ // Step flow
131
+ ticketRoute.initialStep
132
+ .nextStep({
133
+ instructions: "Ask what the issue is",
134
+ collect: ["issue", "category"],
135
135
  skipIf: (data) => !!data.issue && !!data.category,
136
136
  })
137
- .transitionTo({
138
- chatState: "Ask for priority",
139
- gather: ["priority"],
137
+ .nextStep({
138
+ instructions: "Ask for priority",
139
+ collect: ["priority"],
140
140
  skipIf: (data) => !!data.priority,
141
- requiredData: ["issue", "category"],
141
+ requires: ["issue", "category"],
142
142
  })
143
- .transitionTo({
144
- chatState: "Ask for detailed description",
145
- gather: ["description"],
143
+ .nextStep({
144
+ instructions: "Ask for detailed description",
145
+ collect: ["description"],
146
146
  skipIf: (data) => !!data.description,
147
- requiredData: ["issue", "category"],
147
+ requires: ["issue", "category"],
148
148
  })
149
- .transitionTo({
150
- chatState: "Confirm and create ticket",
151
- requiredData: ["issue", "category", "description"],
149
+ .nextStep({
150
+ instructions: "Confirm and create ticket",
151
+ requires: ["issue", "category", "description"],
152
152
  })
153
- .transitionTo({ state: END_STATE });
153
+ .nextStep({ step: END_ROUTE });
154
154
 
155
155
  const persistence = agent.getPersistenceManager();
156
156
  if (!persistence) return;
157
157
 
158
- // Create session with state support
159
- const { sessionData, sessionState } =
160
- await persistence.createSessionWithState<SupportTicketData>({
158
+ // Create session with step support
159
+ const { sessionData, sessionStep } =
160
+ await persistence.createSessionWithStep<SupportTicketData>({
161
161
  userId,
162
162
  agentName: "Support Assistant",
163
163
  initialData: {
@@ -166,13 +166,13 @@ async function example() {
166
166
  });
167
167
 
168
168
  console.log("✨ Session created in Redis:", sessionData.id);
169
- console.log("📊 Initial state:", {
170
- extracted: sessionState.extracted,
169
+ console.log("📊 Initial step:", {
170
+ data: sessionStep.data,
171
171
  });
172
172
 
173
173
  // Turn 1: User provides issue
174
174
  const history: Event<MessageEventData>[] = [];
175
- let session = sessionState;
175
+ let session = sessionStep;
176
176
 
177
177
  const message1 = createMessageEvent(
178
178
  EventSource.CUSTOMER,
@@ -188,7 +188,7 @@ async function example() {
188
188
 
189
189
  console.log("\n--- Turn 1 ---");
190
190
  console.log("🤖 Agent:", response1.message);
191
- console.log("📊 Extracted data:", response1.session?.extracted);
191
+ console.log("📊 Collected data:", response1.session?.data);
192
192
 
193
193
  // Save messages
194
194
  await persistence.saveMessage({
@@ -202,7 +202,7 @@ async function example() {
202
202
  role: "agent",
203
203
  content: response1.message,
204
204
  route: response1.session?.currentRoute?.id,
205
- state: response1.session?.currentState?.id,
205
+ step: response1.session?.currentStep?.id,
206
206
  });
207
207
 
208
208
  session = response1.session!;
@@ -230,7 +230,7 @@ async function example() {
230
230
 
231
231
  console.log("\n--- Turn 2 ---");
232
232
  console.log("🤖 Agent:", response2.message);
233
- console.log("📊 Extracted data:", response2.session?.extracted);
233
+ console.log("📊 Collected data:", response2.session?.data);
234
234
 
235
235
  await persistence.saveMessage({
236
236
  sessionId: sessionData.id,
@@ -246,20 +246,18 @@ async function example() {
246
246
 
247
247
  if (response2.isRouteComplete) {
248
248
  console.log("\n✅ Support ticket route complete!");
249
- await fileSupportTicket(
250
- agent.getExtractedData(session.id) as SupportTicketData
251
- );
249
+ await fileSupportTicket(agent.getData(session.id) as SupportTicketData);
252
250
  }
253
251
 
254
- // Load session state from Redis (demonstrates persistence)
252
+ // Load session step from Redis (demonstrates persistence)
255
253
  console.log("\n--- Loading Session from Redis ---");
256
- const loadedSession = await persistence.loadSessionState<SupportTicketData>(
254
+ const loadedSession = await persistence.loadSessionStep<SupportTicketData>(
257
255
  sessionData.id
258
256
  );
259
257
 
260
258
  console.log("📥 Loaded session:", {
261
259
  currentRoute: loadedSession?.currentRoute?.title,
262
- extracted: loadedSession?.extracted,
260
+ data: loadedSession?.data,
263
261
  });
264
262
 
265
263
  // Get messages
@@ -275,7 +273,7 @@ async function example() {
275
273
  }
276
274
 
277
275
  /**
278
- * Advanced Example: High-Throughput Chat with Session State
276
+ * Advanced Example: High-Throughput Chat with Session Step
279
277
  */
280
278
  async function highThroughputExample() {
281
279
  const redis = new Redis();
@@ -283,7 +281,7 @@ async function highThroughputExample() {
283
281
  const agent = new Agent({
284
282
  name: "Chat Bot",
285
283
  description: "Fast chat responses",
286
- ai: new GeminiProvider({
284
+ provider: new GeminiProvider({
287
285
  apiKey: process.env.GEMINI_API_KEY!,
288
286
  model: "models/gemini-2.0-flash-exp",
289
287
  }),
@@ -301,7 +299,7 @@ async function highThroughputExample() {
301
299
  // Simple chat route that extracts topic and sentiment
302
300
  const chatRoute = agent.createRoute<QuickChatData>({
303
301
  title: "General Chat",
304
- extractionSchema: {
302
+ schema: {
305
303
  type: "object",
306
304
  properties: {
307
305
  topic: {
@@ -318,18 +316,18 @@ async function highThroughputExample() {
318
316
  },
319
317
  });
320
318
 
321
- chatRoute.initialState
322
- .transitionTo({
323
- chatState: "Chat and extract topic/sentiment",
324
- gather: ["topic", "sentiment"],
319
+ chatRoute.initialStep
320
+ .nextStep({
321
+ instructions: "Chat and extract topic/sentiment",
322
+ collect: ["topic", "sentiment"],
325
323
  })
326
- .transitionTo({ state: END_STATE });
324
+ .nextStep({ step: END_ROUTE });
327
325
 
328
326
  const persistence = agent.getPersistenceManager()!;
329
327
 
330
328
  // Create session
331
- const { sessionData, sessionState } =
332
- await persistence.createSessionWithState<QuickChatData>({
329
+ const { sessionData, sessionStep } =
330
+ await persistence.createSessionWithStep<QuickChatData>({
333
331
  userId: "user_456",
334
332
  agentName: "Chat Bot",
335
333
  });
@@ -343,20 +341,18 @@ async function highThroughputExample() {
343
341
  "I'm loving the new features you added!"
344
342
  ),
345
343
  ],
346
- session: sessionState,
344
+ session: sessionStep,
347
345
  });
348
346
 
349
347
  console.log("🤖 Response:", response.message);
350
- console.log("📊 Extracted:", response.session?.extracted);
348
+ console.log("📊 Data:", response.session?.data);
351
349
 
352
350
  if (response.isRouteComplete) {
353
351
  console.log("\n✅ Chat analytics route complete!");
354
- await logChatAnalytics(
355
- agent.getExtractedData(sessionData.id) as QuickChatData
356
- );
352
+ await logChatAnalytics(agent.getData(sessionData.id) as QuickChatData);
357
353
  }
358
354
 
359
- console.log("💾 Session state cached in Redis!");
355
+ console.log("💾 Session step cached in Redis!");
360
356
 
361
357
  await redis.quit();
362
358
  }
@@ -370,7 +366,7 @@ async function sessionRecoveryExample() {
370
366
 
371
367
  const agent = new Agent({
372
368
  name: "Order Assistant",
373
- ai: new GeminiProvider({
369
+ provider: new GeminiProvider({
374
370
  apiKey: process.env.GEMINI_API_KEY!,
375
371
  model: "models/gemini-2.0-flash-exp",
376
372
  }),
@@ -383,7 +379,7 @@ async function sessionRecoveryExample() {
383
379
 
384
380
  const orderRoute = agent.createRoute<OrderData>({
385
381
  title: "Place Order",
386
- extractionSchema: {
382
+ schema: {
387
383
  type: "object",
388
384
  properties: {
389
385
  productId: { type: "string" },
@@ -394,22 +390,22 @@ async function sessionRecoveryExample() {
394
390
  },
395
391
  });
396
392
 
397
- orderRoute.initialState
398
- .transitionTo({
399
- chatState: "Ask what to order",
400
- gather: ["productId", "quantity"],
393
+ orderRoute.initialStep
394
+ .nextStep({
395
+ instructions: "Ask what to order",
396
+ collect: ["productId", "quantity"],
401
397
  })
402
- .transitionTo({
403
- chatState: "Ask for shipping address",
404
- gather: ["shippingAddress"],
398
+ .nextStep({
399
+ instructions: "Ask for shipping address",
400
+ collect: ["shippingAddress"],
405
401
  })
406
- .transitionTo({ state: END_STATE });
402
+ .nextStep({ step: END_ROUTE });
407
403
 
408
404
  const persistence = agent.getPersistenceManager()!;
409
405
 
410
406
  // Start a new session
411
- const { sessionData, sessionState } =
412
- await persistence.createSessionWithState<OrderData>({
407
+ const { sessionData, sessionStep } =
408
+ await persistence.createSessionWithStep<OrderData>({
413
409
  userId: "user_789",
414
410
  agentName: "Order Assistant",
415
411
  });
@@ -427,23 +423,23 @@ async function sessionRecoveryExample() {
427
423
  "I want to order product ABC123, 2 units"
428
424
  ),
429
425
  ],
430
- session: sessionState,
426
+ session: sessionStep,
431
427
  });
432
428
 
433
429
  console.log("🤖 Response:", response1.message);
434
- console.log("📊 Extracted so far:", response1.session?.extracted);
430
+ console.log("📊 Data so far:", response1.session?.data);
435
431
 
436
432
  // --- Simulate user disconnecting and reconnecting ---
437
433
  console.log("\n--- User Reconnects ---");
438
434
 
439
435
  // Load session from Redis
440
- const recoveredSession = await persistence.loadSessionState<OrderData>(
436
+ const recoveredSession = await persistence.loadSessionStep<OrderData>(
441
437
  sessionId
442
438
  );
443
439
 
444
- console.log("📥 Recovered session state:", {
440
+ console.log("📥 Recovered session step:", {
445
441
  currentRoute: recoveredSession?.currentRoute?.title,
446
- extracted: recoveredSession?.extracted,
442
+ data: recoveredSession?.data,
447
443
  });
448
444
 
449
445
  // Load message history
@@ -465,13 +461,11 @@ async function sessionRecoveryExample() {
465
461
  });
466
462
 
467
463
  console.log("🤖 Response:", response2.message);
468
- console.log("📊 Final extracted data:", response2.session?.extracted);
464
+ console.log("📊 Final collected data:", response2.session?.data);
469
465
 
470
466
  if (response2.isRouteComplete) {
471
467
  console.log("\n✅ Order placement complete!");
472
- await processOrder(
473
- agent.getExtractedData(sessionId) as unknown as OrderData
474
- );
468
+ await processOrder(agent.getData(sessionId) as unknown as OrderData);
475
469
  }
476
470
 
477
471
  console.log("✅ Order complete with recovered session!");
@@ -13,8 +13,8 @@ import {
13
13
  GeminiProvider,
14
14
  createMessageEvent,
15
15
  EventSource,
16
- END_STATE,
17
- type SessionState,
16
+ END_ROUTE,
17
+ type SessionStep,
18
18
  } from "../src/index";
19
19
 
20
20
  // Type definitions for our booking data
@@ -34,7 +34,7 @@ async function main() {
34
34
  const agent = new Agent({
35
35
  name: "HotelBot",
36
36
  description: "A hotel booking assistant with feedback collection",
37
- ai: new GeminiProvider({
37
+ provider: new GeminiProvider({
38
38
  apiKey: process.env.GEMINI_API_KEY!,
39
39
  model: "models/gemini-2.0-flash-exp",
40
40
  }),
@@ -46,7 +46,7 @@ async function main() {
46
46
  title: "Book Hotel",
47
47
  description: "Collects hotel booking information",
48
48
  conditions: ["User wants to book a hotel"],
49
- extractionSchema: {
49
+ schema: {
50
50
  type: "object",
51
51
  properties: {
52
52
  hotelName: { type: "string" },
@@ -56,46 +56,47 @@ async function main() {
56
56
  required: ["hotelName", "date", "guests"],
57
57
  },
58
58
  // Configure completion message at route level
59
- endState: {
60
- chatState: "Confirm the booking with a summary of the hotel, date, and number of guests. Be enthusiastic!",
59
+ endStep: {
60
+ instructions:
61
+ "Confirm the booking with a summary of the hotel, date, and number of guests. Be enthusiastic!",
61
62
  },
62
63
  // Option 1: Simple string
63
64
  onComplete: "Collect Feedback",
64
65
  // Option 2: Object with condition
65
66
  // onComplete: {
66
- // transitionTo: "Collect Feedback",
67
+ // nextStep: "Collect Feedback",
67
68
  // condition: "if booking was successful"
68
69
  // },
69
70
  // Option 3: Function with logic
70
71
  // onComplete: (session) => {
71
- // if (session.extracted?.guests && session.extracted.guests > 5) {
72
+ // if (session.data?.guests && session.data.guests > 5) {
72
73
  // return "VIP Feedback"; // Different feedback for large groups
73
74
  // }
74
75
  // return "Collect Feedback";
75
76
  // },
76
77
  });
77
78
 
78
- const askHotel = bookingRoute.initialState.transitionTo({
79
- chatState: "Ask which hotel they want to book",
80
- gather: ["hotelName"],
81
- skipIf: (extracted) => !!extracted.hotelName,
79
+ const askHotel = bookingRoute.initialStep.nextStep({
80
+ instructions: "Ask which hotel they want to book",
81
+ collect: ["hotelName"],
82
+ skipIf: (data) => !!data.hotelName,
82
83
  });
83
84
 
84
- const askDate = askHotel.transitionTo({
85
- chatState: "Ask for the booking date",
86
- gather: ["date"],
87
- skipIf: (extracted) => !!extracted.date,
85
+ const askDate = askHotel.nextStep({
86
+ instructions: "Ask for the booking date",
87
+ collect: ["date"],
88
+ skipIf: (data) => !!data.date,
88
89
  });
89
90
 
90
- const askGuests = askDate.transitionTo({
91
- chatState: "Ask for the number of guests",
92
- gather: ["guests"],
93
- skipIf: (extracted) => !!extracted.guests,
91
+ const askGuests = askDate.nextStep({
92
+ instructions: "Ask for the number of guests",
93
+ collect: ["guests"],
94
+ skipIf: (data) => !!data.guests,
94
95
  });
95
96
 
96
- // No need to specify chatState here - using route-level endState configuration
97
- askGuests.transitionTo({
98
- state: END_STATE,
97
+ // No need to specify instructions here - using route-level endStep configuration
98
+ askGuests.nextStep({
99
+ step: END_ROUTE,
99
100
  });
100
101
 
101
102
  // Route 2: Feedback Collection
@@ -103,7 +104,7 @@ async function main() {
103
104
  title: "Collect Feedback",
104
105
  description: "Collects user feedback after booking",
105
106
  conditions: ["User wants to provide feedback"],
106
- extractionSchema: {
107
+ schema: {
107
108
  type: "object",
108
109
  properties: {
109
110
  rating: { type: "number" },
@@ -112,31 +113,32 @@ async function main() {
112
113
  required: ["rating"],
113
114
  },
114
115
  // Configure completion message for feedback route
115
- endState: {
116
- chatState: "Thank the user warmly for their feedback and let them know their input is valuable",
116
+ endStep: {
117
+ instructions:
118
+ "Thank the user warmly for their feedback and let them know their input is valuable",
117
119
  },
118
120
  });
119
121
 
120
- const askRating = feedbackRoute.initialState.transitionTo({
121
- chatState: "Ask for rating from 1 to 5",
122
- gather: ["rating"],
123
- skipIf: (extracted) => !!extracted.rating,
122
+ const askRating = feedbackRoute.initialStep.nextStep({
123
+ instructions: "Ask for rating from 1 to 5",
124
+ collect: ["rating"],
125
+ skipIf: (data) => !!data.rating,
124
126
  });
125
127
 
126
- const askComments = askRating.transitionTo({
127
- chatState: "Ask for any additional comments (optional)",
128
- gather: ["comments"],
128
+ const askComments = askRating.nextStep({
129
+ instructions: "Ask for any additional comments (optional)",
130
+ collect: ["comments"],
129
131
  });
130
132
 
131
- // No need to specify chatState here - using route-level endState configuration
132
- askComments.transitionTo({
133
- state: END_STATE,
133
+ // No need to specify instructions here - using route-level endStep configuration
134
+ askComments.nextStep({
135
+ step: END_ROUTE,
134
136
  });
135
137
 
136
138
  console.log("\n=== Route Transitions Example ===\n");
137
139
 
138
140
  // Conversation 1: User provides all booking info at once
139
- let session: SessionState | undefined;
141
+ let session: SessionStep | undefined;
140
142
  let history = [
141
143
  createMessageEvent(
142
144
  EventSource.CUSTOMER,
@@ -155,12 +157,15 @@ async function main() {
155
157
  "Pending transition?",
156
158
  response1.session?.pendingTransition?.targetRouteId
157
159
  );
158
- console.log("Extracted booking data:", response1.session?.extracted);
160
+ console.log("Data booking data:", response1.session?.data);
159
161
 
160
162
  session = response1.session;
161
163
  history = [
162
164
  ...history,
163
- { ...createMessageEvent(EventSource.AI_AGENT, "Bot", response1.message), id: "2" },
165
+ {
166
+ ...createMessageEvent(EventSource.AI_AGENT, "Bot", response1.message),
167
+ id: "2",
168
+ },
164
169
  ];
165
170
 
166
171
  // Second response - should auto-transition to a feedback route
@@ -178,7 +183,10 @@ async function main() {
178
183
  session = response2.session;
179
184
  history = [
180
185
  ...history,
181
- { ...createMessageEvent(EventSource.AI_AGENT, "Bot", response2.message), id: "4" },
186
+ {
187
+ ...createMessageEvent(EventSource.AI_AGENT, "Bot", response2.message),
188
+ id: "4",
189
+ },
182
190
  ];
183
191
 
184
192
  // Third response - provide rating
@@ -195,13 +203,13 @@ async function main() {
195
203
  const response3 = await agent.respond({ history, session });
196
204
  console.log("\nBot:", response3.message);
197
205
  console.log("Current route:", response3.session?.currentRoute?.title);
198
- console.log("Extracted feedback data:", response3.session?.extracted);
206
+ console.log("Data feedback data:", response3.session?.data);
199
207
  console.log("Route complete?", response3.isRouteComplete);
200
208
 
201
209
  console.log("\n=== Manual Transition Example ===\n");
202
210
 
203
- // Demonstrate manual transition using agent.transitionToRoute()
204
- let session2: SessionState | undefined;
211
+ // Demonstrate manual transition using agent.nextStepRoute()
212
+ let session2: SessionStep | undefined;
205
213
  let history2 = [
206
214
  createMessageEvent(
207
215
  EventSource.CUSTOMER,
@@ -212,14 +220,17 @@ async function main() {
212
220
 
213
221
  console.log("User:", history2[0].data.message);
214
222
 
215
- const manualResponse = await agent.respond({ history: history2, session: session2 });
223
+ const manualResponse = await agent.respond({
224
+ history: history2,
225
+ session: session2,
226
+ });
216
227
  console.log("\nBot:", manualResponse.message);
217
228
  console.log("Route complete?", manualResponse.isRouteComplete);
218
229
 
219
230
  if (manualResponse.isRouteComplete && manualResponse.session) {
220
231
  // Manually trigger transition instead of auto-transition
221
232
  console.log("\n[Manually transitioning to feedback route...]");
222
- session2 = agent.transitionToRoute("Collect Feedback", manualResponse.session);
233
+ session2 = agent.nextStepRoute("Collect Feedback", manualResponse.session);
223
234
  console.log(
224
235
  "Pending transition set:",
225
236
  session2.pendingTransition?.targetRouteId
@@ -227,13 +238,26 @@ async function main() {
227
238
 
228
239
  history2 = [
229
240
  ...history2,
230
- { ...createMessageEvent(EventSource.AI_AGENT, "Bot", manualResponse.message), id: "2" },
241
+ {
242
+ ...createMessageEvent(
243
+ EventSource.AI_AGENT,
244
+ "Bot",
245
+ manualResponse.message
246
+ ),
247
+ id: "2",
248
+ },
231
249
  createMessageEvent(EventSource.CUSTOMER, "Bob", "Great!"),
232
250
  ];
233
251
 
234
- const feedbackResponse = await agent.respond({ history: history2, session: session2 });
252
+ const feedbackResponse = await agent.respond({
253
+ history: history2,
254
+ session: session2,
255
+ });
235
256
  console.log("\nBot:", feedbackResponse.message);
236
- console.log("Current route:", feedbackResponse.session?.currentRoute?.title);
257
+ console.log(
258
+ "Current route:",
259
+ feedbackResponse.session?.currentRoute?.title
260
+ );
237
261
  }
238
262
 
239
263
  console.log("\n=== Done ===\n");