@falai/agent 0.6.9 β†’ 0.7.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 (231) hide show
  1. package/README.md +62 -59
  2. package/dist/adapters/MemoryAdapter.js +2 -2
  3. package/dist/adapters/MemoryAdapter.js.map +1 -1
  4. package/dist/adapters/MongoAdapter.js +2 -2
  5. package/dist/adapters/MongoAdapter.js.map +1 -1
  6. package/dist/adapters/OpenSearchAdapter.js +7 -7
  7. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  8. package/dist/adapters/PostgreSQLAdapter.js +9 -9
  9. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  10. package/dist/adapters/PrismaAdapter.js +3 -3
  11. package/dist/adapters/PrismaAdapter.js.map +1 -1
  12. package/dist/adapters/RedisAdapter.js +2 -2
  13. package/dist/adapters/RedisAdapter.js.map +1 -1
  14. package/dist/adapters/SQLiteAdapter.d.ts +3 -3
  15. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  16. package/dist/adapters/SQLiteAdapter.js +11 -11
  17. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  18. package/dist/adapters/index.d.ts +1 -1
  19. package/dist/adapters/index.d.ts.map +1 -1
  20. package/dist/cjs/adapters/MemoryAdapter.js +2 -2
  21. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  22. package/dist/cjs/adapters/MongoAdapter.js +2 -2
  23. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  24. package/dist/cjs/adapters/OpenSearchAdapter.js +7 -7
  25. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  26. package/dist/cjs/adapters/PostgreSQLAdapter.js +9 -9
  27. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  28. package/dist/cjs/adapters/PrismaAdapter.js +3 -3
  29. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  30. package/dist/cjs/adapters/RedisAdapter.js +2 -2
  31. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/SQLiteAdapter.d.ts +3 -3
  33. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  34. package/dist/cjs/adapters/SQLiteAdapter.js +11 -11
  35. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  36. package/dist/cjs/adapters/index.d.ts +1 -1
  37. package/dist/cjs/adapters/index.d.ts.map +1 -1
  38. package/dist/cjs/constants/index.d.ts +4 -4
  39. package/dist/cjs/constants/index.js +5 -5
  40. package/dist/cjs/core/Agent.d.ts +22 -22
  41. package/dist/cjs/core/Agent.d.ts.map +1 -1
  42. package/dist/cjs/core/Agent.js +160 -152
  43. package/dist/cjs/core/Agent.js.map +1 -1
  44. package/dist/cjs/core/Events.d.ts +6 -6
  45. package/dist/cjs/core/Events.d.ts.map +1 -1
  46. package/dist/cjs/core/PersistenceManager.d.ts +13 -13
  47. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  48. package/dist/cjs/core/PersistenceManager.js +24 -24
  49. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  50. package/dist/cjs/core/ResponseEngine.d.ts +3 -8
  51. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  52. package/dist/cjs/core/ResponseEngine.js +8 -8
  53. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  54. package/dist/cjs/core/Route.d.ts +17 -17
  55. package/dist/cjs/core/Route.d.ts.map +1 -1
  56. package/dist/cjs/core/Route.js +33 -33
  57. package/dist/cjs/core/Route.js.map +1 -1
  58. package/dist/cjs/core/RoutingEngine.d.ts +30 -30
  59. package/dist/cjs/core/RoutingEngine.d.ts.map +1 -1
  60. package/dist/cjs/core/RoutingEngine.js +192 -192
  61. package/dist/cjs/core/RoutingEngine.js.map +1 -1
  62. package/dist/cjs/core/Step.d.ts +72 -0
  63. package/dist/cjs/core/Step.d.ts.map +1 -0
  64. package/dist/cjs/core/Step.js +150 -0
  65. package/dist/cjs/core/Step.js.map +1 -0
  66. package/dist/cjs/core/ToolExecutor.d.ts +5 -5
  67. package/dist/cjs/core/ToolExecutor.d.ts.map +1 -1
  68. package/dist/cjs/core/ToolExecutor.js +8 -8
  69. package/dist/cjs/core/ToolExecutor.js.map +1 -1
  70. package/dist/cjs/core/Transition.d.ts +14 -14
  71. package/dist/cjs/core/Transition.d.ts.map +1 -1
  72. package/dist/cjs/core/Transition.js +48 -19
  73. package/dist/cjs/core/Transition.js.map +1 -1
  74. package/dist/cjs/index.d.ts +7 -7
  75. package/dist/cjs/index.d.ts.map +1 -1
  76. package/dist/cjs/index.js +8 -8
  77. package/dist/cjs/index.js.map +1 -1
  78. package/dist/cjs/types/agent.d.ts +8 -8
  79. package/dist/cjs/types/agent.d.ts.map +1 -1
  80. package/dist/cjs/types/ai.d.ts +2 -2
  81. package/dist/cjs/types/ai.d.ts.map +1 -1
  82. package/dist/cjs/types/history.d.ts +3 -3
  83. package/dist/cjs/types/history.d.ts.map +1 -1
  84. package/dist/cjs/types/index.d.ts +1 -1
  85. package/dist/cjs/types/index.d.ts.map +1 -1
  86. package/dist/cjs/types/persistence.d.ts +5 -5
  87. package/dist/cjs/types/persistence.d.ts.map +1 -1
  88. package/dist/cjs/types/route.d.ts +57 -52
  89. package/dist/cjs/types/route.d.ts.map +1 -1
  90. package/dist/cjs/types/session.d.ts +27 -27
  91. package/dist/cjs/types/session.d.ts.map +1 -1
  92. package/dist/cjs/types/session.js +48 -50
  93. package/dist/cjs/types/session.js.map +1 -1
  94. package/dist/cjs/types/tool.d.ts +13 -13
  95. package/dist/cjs/types/tool.d.ts.map +1 -1
  96. package/dist/cjs/utils/id.d.ts +8 -3
  97. package/dist/cjs/utils/id.d.ts.map +1 -1
  98. package/dist/cjs/utils/id.js +16 -7
  99. package/dist/cjs/utils/id.js.map +1 -1
  100. package/dist/constants/index.d.ts +4 -4
  101. package/dist/constants/index.js +4 -4
  102. package/dist/core/Agent.d.ts +22 -22
  103. package/dist/core/Agent.d.ts.map +1 -1
  104. package/dist/core/Agent.js +162 -154
  105. package/dist/core/Agent.js.map +1 -1
  106. package/dist/core/Events.d.ts +6 -6
  107. package/dist/core/Events.d.ts.map +1 -1
  108. package/dist/core/PersistenceManager.d.ts +13 -13
  109. package/dist/core/PersistenceManager.d.ts.map +1 -1
  110. package/dist/core/PersistenceManager.js +25 -25
  111. package/dist/core/PersistenceManager.js.map +1 -1
  112. package/dist/core/ResponseEngine.d.ts +3 -8
  113. package/dist/core/ResponseEngine.d.ts.map +1 -1
  114. package/dist/core/ResponseEngine.js +8 -8
  115. package/dist/core/ResponseEngine.js.map +1 -1
  116. package/dist/core/Route.d.ts +17 -17
  117. package/dist/core/Route.d.ts.map +1 -1
  118. package/dist/core/Route.js +33 -33
  119. package/dist/core/Route.js.map +1 -1
  120. package/dist/core/RoutingEngine.d.ts +30 -30
  121. package/dist/core/RoutingEngine.d.ts.map +1 -1
  122. package/dist/core/RoutingEngine.js +193 -193
  123. package/dist/core/RoutingEngine.js.map +1 -1
  124. package/dist/core/Step.d.ts +72 -0
  125. package/dist/core/Step.d.ts.map +1 -0
  126. package/dist/core/Step.js +146 -0
  127. package/dist/core/Step.js.map +1 -0
  128. package/dist/core/ToolExecutor.d.ts +5 -5
  129. package/dist/core/ToolExecutor.d.ts.map +1 -1
  130. package/dist/core/ToolExecutor.js +8 -8
  131. package/dist/core/ToolExecutor.js.map +1 -1
  132. package/dist/core/Transition.d.ts +14 -14
  133. package/dist/core/Transition.d.ts.map +1 -1
  134. package/dist/core/Transition.js +48 -19
  135. package/dist/core/Transition.js.map +1 -1
  136. package/dist/index.d.ts +7 -7
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +4 -4
  139. package/dist/index.js.map +1 -1
  140. package/dist/types/agent.d.ts +8 -8
  141. package/dist/types/agent.d.ts.map +1 -1
  142. package/dist/types/ai.d.ts +2 -2
  143. package/dist/types/ai.d.ts.map +1 -1
  144. package/dist/types/history.d.ts +3 -3
  145. package/dist/types/history.d.ts.map +1 -1
  146. package/dist/types/index.d.ts +1 -1
  147. package/dist/types/index.d.ts.map +1 -1
  148. package/dist/types/persistence.d.ts +5 -5
  149. package/dist/types/persistence.d.ts.map +1 -1
  150. package/dist/types/route.d.ts +57 -52
  151. package/dist/types/route.d.ts.map +1 -1
  152. package/dist/types/session.d.ts +27 -27
  153. package/dist/types/session.d.ts.map +1 -1
  154. package/dist/types/session.js +44 -46
  155. package/dist/types/session.js.map +1 -1
  156. package/dist/types/tool.d.ts +13 -13
  157. package/dist/types/tool.d.ts.map +1 -1
  158. package/dist/utils/id.d.ts +8 -3
  159. package/dist/utils/id.d.ts.map +1 -1
  160. package/dist/utils/id.js +14 -6
  161. package/dist/utils/id.js.map +1 -1
  162. package/docs/ADAPTERS.md +21 -21
  163. package/docs/AGENT.md +57 -55
  164. package/docs/API_REFERENCE.md +218 -220
  165. package/docs/ARCHITECTURE.md +99 -104
  166. package/docs/CONTEXT_MANAGEMENT.md +81 -88
  167. package/docs/DOCS.md +18 -18
  168. package/docs/DOMAINS.md +16 -16
  169. package/docs/EXAMPLES.md +43 -43
  170. package/docs/GETTING_STARTED.md +60 -63
  171. package/docs/PERSISTENCE.md +66 -70
  172. package/docs/PROVIDERS.md +2 -2
  173. package/docs/README.md +6 -6
  174. package/docs/ROUTES.md +218 -220
  175. package/docs/STEPS.md +883 -0
  176. package/examples/business-onboarding.ts +84 -81
  177. package/examples/company-qna-agent.ts +68 -67
  178. package/examples/custom-database-persistence.ts +87 -89
  179. package/examples/declarative-agent.ts +32 -32
  180. package/examples/domain-scoping.ts +18 -18
  181. package/examples/extracted-data-modification.ts +92 -97
  182. package/examples/healthcare-agent.ts +89 -91
  183. package/examples/openai-agent.ts +29 -32
  184. package/examples/opensearch-persistence.ts +43 -45
  185. package/examples/persistent-onboarding.ts +65 -66
  186. package/examples/prisma-persistence.ts +108 -112
  187. package/examples/prisma-schema.example.prisma +3 -3
  188. package/examples/redis-persistence.ts +67 -73
  189. package/examples/route-transitions.ts +71 -47
  190. package/examples/rules-prohibitions.ts +28 -28
  191. package/examples/streaming-agent.ts +24 -24
  192. package/examples/travel-agent.ts +94 -109
  193. package/package.json +1 -1
  194. package/src/adapters/MemoryAdapter.ts +3 -3
  195. package/src/adapters/MongoAdapter.ts +3 -3
  196. package/src/adapters/OpenSearchAdapter.ts +8 -8
  197. package/src/adapters/PostgreSQLAdapter.ts +10 -10
  198. package/src/adapters/PrismaAdapter.ts +4 -4
  199. package/src/adapters/RedisAdapter.ts +3 -3
  200. package/src/adapters/SQLiteAdapter.ts +15 -15
  201. package/src/adapters/index.ts +1 -1
  202. package/src/constants/index.ts +4 -4
  203. package/src/core/Agent.ts +210 -206
  204. package/src/core/Events.ts +12 -12
  205. package/src/core/PersistenceManager.ts +32 -36
  206. package/src/core/ResponseEngine.ts +11 -17
  207. package/src/core/Route.ts +55 -49
  208. package/src/core/RoutingEngine.ts +244 -252
  209. package/src/core/Step.ts +197 -0
  210. package/src/core/ToolExecutor.ts +11 -11
  211. package/src/core/Transition.ts +72 -26
  212. package/src/index.ts +8 -8
  213. package/src/types/agent.ts +8 -8
  214. package/src/types/ai.ts +2 -2
  215. package/src/types/history.ts +3 -3
  216. package/src/types/index.ts +1 -1
  217. package/src/types/persistence.ts +6 -6
  218. package/src/types/route.ts +77 -61
  219. package/src/types/session.ts +75 -78
  220. package/src/types/tool.ts +17 -17
  221. package/src/utils/id.ts +15 -6
  222. package/dist/cjs/core/State.d.ts +0 -72
  223. package/dist/cjs/core/State.d.ts.map +0 -1
  224. package/dist/cjs/core/State.js +0 -148
  225. package/dist/cjs/core/State.js.map +0 -1
  226. package/dist/core/State.d.ts +0 -72
  227. package/dist/core/State.d.ts.map +0 -1
  228. package/dist/core/State.js +0 -144
  229. package/dist/core/State.js.map +0 -1
  230. package/docs/STATES.md +0 -888
  231. package/src/core/State.ts +0 -212
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Healthcare agent example demonstrating route-based
3
- * Updated for v2 architecture with session state management and schema-first data extraction
3
+ * Updated for v2 architecture with session step management and schema-first data extraction
4
4
  */
5
5
 
6
6
  import {
7
7
  Agent,
8
8
  defineTool,
9
9
  AnthropicProvider,
10
- END_STATE,
10
+ END_ROUTE,
11
11
  EventSource,
12
12
  createMessageEvent,
13
13
  createSession,
@@ -69,8 +69,8 @@ const scheduleAppointment = defineTool<
69
69
  HealthcareContext,
70
70
  [datetime: string],
71
71
  string
72
- >("schedule_appointment", async ({ context, extracted }, datetime) => {
73
- const appointment = extracted as Partial<AppointmentData>;
72
+ >("schedule_appointment", async ({ context, data }, datetime) => {
73
+ const appointment = data as Partial<AppointmentData>;
74
74
  if (!appointment?.preferredDate || !appointment?.preferredTime) {
75
75
  return {
76
76
  data: "Please specify preferred date and time for the appointment",
@@ -85,8 +85,8 @@ const scheduleAppointment = defineTool<
85
85
 
86
86
  const getLabResults = defineTool<HealthcareContext, [], object>(
87
87
  "get_lab_results",
88
- async ({ context, extracted }) => {
89
- const labData = extracted as Partial<LabResultsData>;
88
+ async ({ context, data }) => {
89
+ const labData = data as Partial<LabResultsData>;
90
90
  return {
91
91
  data: {
92
92
  report: `Lab results for ${labData?.testType || "general"} tests`,
@@ -137,7 +137,7 @@ async function createHealthcareAgent() {
137
137
  title: "Schedule an Appointment",
138
138
  description: "Helps the patient find a time for their appointment.",
139
139
  conditions: ["The patient wants to schedule an appointment"],
140
- extractionSchema: {
140
+ schema: {
141
141
  type: "object",
142
142
  properties: {
143
143
  appointmentReason: {
@@ -169,79 +169,78 @@ async function createHealthcareAgent() {
169
169
  onComplete: "Satisfaction Survey",
170
170
  });
171
171
 
172
- // State 1: Gather appointment reason
173
- const gatherReason = schedulingRoute.initialState.transitionTo({
174
- chatState: "Ask what the patient needs an appointment for",
175
- gather: ["appointmentReason"],
176
- skipIf: (extracted) => !!extracted.appointmentReason,
172
+ // Step 1: Collect appointment reason
173
+ const collectReason = schedulingRoute.initialStep.nextStep({
174
+ instructions: "Ask what the patient needs an appointment for",
175
+ collect: ["appointmentReason"],
176
+ skipIf: (data) => !!data.appointmentReason,
177
177
  condition: "Patient hasn't specified reason for appointment yet",
178
178
  });
179
179
 
180
- // State 2: Check urgency and show available slots
181
- const checkUrgency = gatherReason.transitionTo({
182
- chatState: "Check if this is urgent and show available slots",
183
- gather: ["urgency"],
184
- skipIf: (extracted) => !!extracted.urgency,
185
- requiredData: ["appointmentReason"],
180
+ // Step 2: Check urgency and show available slots
181
+ const checkUrgency = collectReason.nextStep({
182
+ instructions: "Check if this is urgent and show available slots",
183
+ collect: ["urgency"],
184
+ skipIf: (data) => !!data.urgency,
185
+ requires: ["appointmentReason"],
186
186
  condition: "Reason provided, now assess urgency level",
187
187
  });
188
188
 
189
- const showSlots = checkUrgency.transitionTo({
190
- toolState: getUpcomingSlots,
189
+ const showSlots = checkUrgency.nextStep({
190
+ tool: getUpcomingSlots,
191
191
  });
192
192
 
193
- // State 3: Present available times
194
- const presentTimes = showSlots.transitionTo({
195
- chatState: "List available times and ask which one works for them",
193
+ // Step 3: Present available times
194
+ const presentTimes = showSlots.nextStep({
195
+ instructions: "List available times and ask which one works for them",
196
196
  });
197
197
 
198
- // State 4: Gather preferred time and date
199
- const gatherPreferences = presentTimes.transitionTo({
200
- chatState: "Collect preferred time and date",
201
- gather: ["preferredTime", "preferredDate"],
202
- skipIf: (extracted) =>
203
- !!extracted.preferredTime && !!extracted.preferredDate,
198
+ // Step 4: Collect preferred time and date
199
+ const collectPreferences = presentTimes.nextStep({
200
+ instructions: "Collect preferred time and date",
201
+ collect: ["preferredTime", "preferredDate"],
202
+ skipIf: (data) => !!data.preferredTime && !!data.preferredDate,
204
203
  });
205
204
 
206
- // State 5: Confirm details and schedule
207
- const confirmDetails = gatherPreferences.transitionTo({
208
- chatState: "Confirm the details with the patient before scheduling",
209
- gather: ["appointmentType"],
210
- skipIf: (extracted) => !!extracted.appointmentType,
211
- requiredData: ["appointmentReason", "preferredTime", "preferredDate"],
205
+ // Step 5: Confirm details and schedule
206
+ const confirmDetails = collectPreferences.nextStep({
207
+ instructions: "Confirm the details with the patient before scheduling",
208
+ collect: ["appointmentType"],
209
+ skipIf: (data) => !!data.appointmentType,
210
+ requires: ["appointmentReason", "preferredTime", "preferredDate"],
212
211
  });
213
212
 
214
- const schedule = confirmDetails.transitionTo({
215
- toolState: scheduleAppointment,
216
- requiredData: ["appointmentReason", "preferredTime", "preferredDate"],
213
+ const schedule = confirmDetails.nextStep({
214
+ tool: scheduleAppointment,
215
+ requires: ["appointmentReason", "preferredTime", "preferredDate"],
217
216
  condition: "All details confirmed, book the appointment",
218
217
  });
219
218
 
220
- const confirmation = schedule.transitionTo({
221
- chatState: "Confirm the appointment has been scheduled",
219
+ const confirmation = schedule.nextStep({
220
+ instructions: "Confirm the appointment has been scheduled",
222
221
  });
223
222
 
224
- confirmation.transitionTo({
225
- state: END_STATE,
223
+ confirmation.nextStep({
224
+ step: END_ROUTE,
226
225
  condition: "Appointment booked successfully",
227
226
  });
228
227
 
229
228
  // Alternative path: no times work - show later slots
230
- const laterSlots = presentTimes.transitionTo({
231
- toolState: getLaterSlots,
229
+ const laterSlots = presentTimes.nextStep({
230
+ tool: getLaterSlots,
232
231
  });
233
232
 
234
- laterSlots.transitionTo({
235
- chatState: "List later times and ask if any of them works",
233
+ laterSlots.nextStep({
234
+ instructions: "List later times and ask if any of them works",
236
235
  });
237
236
 
238
237
  // If no times work at all, end route
239
238
  laterSlots
240
- .transitionTo({
241
- chatState:
239
+ .nextStep({
240
+ instructions:
242
241
  "Ask the patient to call the office to schedule an appointment",
243
242
  })
244
- .transitionTo({ state: END_STATE });
243
+ .nextStep({ step: END_ROUTE });
245
244
 
246
245
  schedulingRoute.createGuideline({
247
246
  condition: "The patient says their visit is urgent",
@@ -253,7 +252,7 @@ async function createHealthcareAgent() {
253
252
  title: "Lab Results",
254
253
  description: "Retrieves the patient's lab results and explains them.",
255
254
  conditions: ["The patient wants to see their lab results"],
256
- extractionSchema: {
255
+ schema: {
257
256
  type: "object",
258
257
  properties: {
259
258
  testType: {
@@ -274,33 +273,33 @@ async function createHealthcareAgent() {
274
273
  },
275
274
  });
276
275
 
277
- // State 1: Gather test information
278
- const gatherTestInfo = labResultsRoute.initialState.transitionTo({
279
- chatState: "Ask what type of test results they want to see",
280
- gather: ["testType"],
281
- skipIf: (extracted) => !!extracted.testType,
276
+ // Step 1: Collect test information
277
+ const collectTestInfo = labResultsRoute.initialStep.nextStep({
278
+ instructions: "Ask what type of test results they want to see",
279
+ collect: ["testType"],
280
+ skipIf: (data) => !!data.testType,
282
281
  });
283
282
 
284
- // State 2: Optional: gather test date
285
- const gatherTestDate = gatherTestInfo.transitionTo({
286
- chatState: "Ask for the test date if they remember it",
287
- gather: ["testDate"],
288
- skipIf: (extracted) => !!extracted.testDate,
289
- requiredData: ["testType"],
283
+ // Step 2: Optional: collect test date
284
+ const collectTestDate = collectTestInfo.nextStep({
285
+ instructions: "Ask for the test date if they remember it",
286
+ collect: ["testDate"],
287
+ skipIf: (data) => !!data.testDate,
288
+ requires: ["testType"],
290
289
  });
291
290
 
292
- // State 3: Get lab results
293
- const getResults = gatherTestDate.transitionTo({
294
- toolState: getLabResults,
295
- requiredData: ["testType"],
291
+ // Step 3: Get lab results
292
+ const getResults = collectTestDate.nextStep({
293
+ tool: getLabResults,
294
+ requires: ["testType"],
296
295
  });
297
296
 
298
- // State 4: Present results based on status
299
- const presentResults = getResults.transitionTo({
300
- chatState: "Present the lab results and explain what they mean",
297
+ // Step 4: Present results based on status
298
+ const presentResults = getResults.nextStep({
299
+ instructions: "Present the lab results and explain what they mean",
301
300
  });
302
301
 
303
- presentResults.transitionTo({ state: END_STATE });
302
+ presentResults.nextStep({ step: END_ROUTE });
304
303
 
305
304
  labResultsRoute.createGuideline({
306
305
  condition:
@@ -314,7 +313,7 @@ async function createHealthcareAgent() {
314
313
  title: "Satisfaction Survey",
315
314
  description: "Quick satisfaction survey after scheduling",
316
315
  conditions: ["Collect patient satisfaction feedback"],
317
- extractionSchema: {
316
+ schema: {
318
317
  type: "object",
319
318
  properties: {
320
319
  rating: {
@@ -334,24 +333,25 @@ async function createHealthcareAgent() {
334
333
  },
335
334
  });
336
335
 
337
- const askRating = satisfactionRoute.initialState.transitionTo({
338
- chatState:
336
+ const askRating = satisfactionRoute.initialStep.nextStep({
337
+ instructions:
339
338
  "Ask for overall satisfaction rating from 1 to 5 with the scheduling experience",
340
- gather: ["rating"],
341
- skipIf: (extracted) => !!extracted.rating,
339
+ collect: ["rating"],
340
+ skipIf: (data) => !!data.rating,
342
341
  });
343
342
 
344
- const askComments = askRating.transitionTo({
345
- chatState: "Ask if they have any additional comments or feedback (optional)",
346
- gather: ["comments"],
343
+ const askComments = askRating.nextStep({
344
+ instructions:
345
+ "Ask if they have any additional comments or feedback (optional)",
346
+ collect: ["comments"],
347
347
  });
348
348
 
349
- const thankYou = askComments.transitionTo({
350
- chatState:
349
+ const thankYou = askComments.nextStep({
350
+ instructions:
351
351
  "Thank them for their feedback and confirm their appointment details one more time",
352
352
  });
353
353
 
354
- thankYou.transitionTo({ state: END_STATE });
354
+ thankYou.nextStep({ step: END_ROUTE });
355
355
 
356
356
  // Global guidelines
357
357
  agent.createGuideline({
@@ -376,11 +376,11 @@ async function createHealthcareAgent() {
376
376
  return agent;
377
377
  }
378
378
 
379
- // Example usage with session state management
379
+ // Example usage with session step management
380
380
  async function main() {
381
381
  const agent = await createHealthcareAgent();
382
382
 
383
- // Initialize session state for multi-turn conversation
383
+ // Initialize session step for multi-turn conversation
384
384
  let session = createSession<AppointmentData | LabResultsData>();
385
385
 
386
386
  const history = [
@@ -403,7 +403,7 @@ async function main() {
403
403
  console.log("\n" + route.describe());
404
404
  }
405
405
 
406
- // Example conversation with session state
406
+ // Example conversation with session step
407
407
  console.log("\n=== EXAMPLE CONVERSATION ===");
408
408
 
409
409
  // Turn 1: Patient wants to follow up
@@ -411,7 +411,7 @@ async function main() {
411
411
  console.log("Patient: Hi, I need to follow up on my visit");
412
412
  console.log("Agent:", response1.message);
413
413
  console.log("Route:", response1.session?.currentRoute?.title);
414
- console.log("Extracted:", response1.session?.extracted);
414
+ console.log("Data:", response1.session?.data);
415
415
 
416
416
  // Update session with progress
417
417
  session = response1.session!;
@@ -431,8 +431,8 @@ async function main() {
431
431
  const response2 = await agent.respond({ history: history2, session });
432
432
  console.log("\nPatient: I need to schedule a checkup for next week");
433
433
  console.log("Agent:", response2.message);
434
- console.log("Updated extracted:", response2.session?.extracted);
435
- console.log("Current state:", response2.session?.currentState?.id);
434
+ console.log("Updated data:", response2.session?.data);
435
+ console.log("Current step:", response2.session?.currentStep?.id);
436
436
 
437
437
  // Update session again
438
438
  session = response2.session!;
@@ -461,16 +461,14 @@ async function main() {
461
461
  const response3 = await agent.respond({ history: history3, session });
462
462
  console.log("\nPatient: Tuesday at 2 PM works for me.");
463
463
  console.log("Agent:", response3.message);
464
- console.log("Updated extracted:", response3.session?.extracted);
465
- console.log("Current state:", response3.session?.currentState?.id);
464
+ console.log("Updated data:", response3.session?.data);
465
+ console.log("Current step:", response3.session?.currentStep?.id);
466
466
 
467
467
  // Check for route completion
468
468
  if (response3.isRouteComplete) {
469
469
  console.log("\nβœ… Appointment scheduling complete!");
470
470
  await sendAppointmentReminder(
471
- agent.getExtractedData(
472
- response3.session?.id
473
- ) as unknown as AppointmentData
471
+ agent.getData(response3.session?.id) as unknown as AppointmentData
474
472
  );
475
473
  }
476
474
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Example: OpenAI Agent with multiple providers
3
- * Updated for v2 architecture with session state management and schema-first data extraction
3
+ * Updated for v2 architecture with session step management and schema-first data extraction
4
4
  */
5
5
 
6
6
  import {
@@ -10,7 +10,7 @@ import {
10
10
  createMessageEvent,
11
11
  EventSource,
12
12
  createSession,
13
- END_STATE,
13
+ END_ROUTE,
14
14
  } from "../src/index";
15
15
 
16
16
  // Custom context type
@@ -27,17 +27,16 @@ interface WeatherData {
27
27
  condition?: string;
28
28
  }
29
29
 
30
- // Define a tool that can access extracted data
30
+ // Define a tool that can access collected data
31
31
  const getWeather = defineTool<
32
32
  CustomerContext,
33
33
  [{ location: string }],
34
34
  { location: string; temperature: number; condition: string }
35
35
  >(
36
36
  "get_weather",
37
- async ({ context, extracted }, args) => {
38
- // Use extracted location if available, otherwise use args
39
- const location =
40
- (extracted as Partial<WeatherData>)?.location || args.location;
37
+ async ({ context, data }, args) => {
38
+ // Use data location if available, otherwise use args
39
+ const location = (data as Partial<WeatherData>)?.location || args.location;
41
40
 
42
41
  // Simulate API call
43
42
  return {
@@ -112,7 +111,7 @@ async function main() {
112
111
  title: "Check Weather",
113
112
  description: "Help user check weather for a location",
114
113
  conditions: ["User wants to know the weather"],
115
- extractionSchema: {
114
+ schema: {
116
115
  type: "object",
117
116
  properties: {
118
117
  location: {
@@ -132,31 +131,31 @@ async function main() {
132
131
  },
133
132
  });
134
133
 
135
- // State 1: Gather location
136
- const askLocation = weatherRoute.initialState.transitionTo({
137
- chatState: "Ask which city they want weather for",
138
- gather: ["location"],
139
- skipIf: (extracted) => !!extracted.location,
134
+ // Step 1: Collect location
135
+ const askLocation = weatherRoute.initialStep.nextStep({
136
+ instructions: "Ask which city they want weather for",
137
+ collect: ["location"],
138
+ skipIf: (data) => !!data.location,
140
139
  });
141
140
 
142
- // State 2: Get weather data
143
- const fetchWeather = askLocation.transitionTo({
144
- toolState: getWeather,
145
- requiredData: ["location"],
141
+ // Step 2: Get weather data
142
+ const fetchWeather = askLocation.nextStep({
143
+ tool: getWeather,
144
+ requires: ["location"],
146
145
  });
147
146
 
148
- // State 3: Present weather information
149
- const showWeather = fetchWeather.transitionTo({
150
- chatState:
147
+ // Step 3: Present weather information
148
+ const showWeather = fetchWeather.nextStep({
149
+ instructions:
151
150
  "Present the weather information in a friendly way with temperature and condition",
152
151
  });
153
152
 
154
- showWeather.transitionTo({ state: END_STATE });
153
+ showWeather.nextStep({ step: END_ROUTE });
155
154
 
156
- // Example conversation with session state management
155
+ // Example conversation with session step management
157
156
  console.log("πŸ€– Starting OpenAI Agent Example\n");
158
157
 
159
- // Initialize session state for multi-turn conversation
158
+ // Initialize session step for multi-turn conversation
160
159
  let session = createSession<WeatherData>();
161
160
 
162
161
  // Build history
@@ -169,8 +168,8 @@ async function main() {
169
168
  ];
170
169
 
171
170
  try {
172
- // Turn 1: Process weather query with session state
173
- console.log("πŸ“€ Processing with session state...");
171
+ // Turn 1: Process weather query with session step
172
+ console.log("πŸ“€ Processing with session step...");
174
173
  const response = await agent.respond({ history, session });
175
174
 
176
175
  console.log("\nβœ… Agent Configuration:");
@@ -179,14 +178,14 @@ async function main() {
179
178
  console.log("\nπŸ—ΊοΈ Route Configuration:");
180
179
  console.log(` Title: ${weatherRoute.title}`);
181
180
  console.log(
182
- ` States: Initial β†’ Ask Location β†’ Fetch Weather β†’ Show Weather`
181
+ ` Steps: Initial β†’ Ask Location β†’ Fetch Weather β†’ Show Weather`
183
182
  );
184
183
 
185
184
  console.log("\nπŸ’¬ Conversation:");
186
185
  console.log(` Customer: ${history[0].data.message}`);
187
186
  console.log(` Agent: ${response.message}`);
188
187
  console.log(` Route: ${response.session?.currentRoute?.title}`);
189
- console.log(` Extracted:`, response.session?.extracted);
188
+ console.log(` Data:`, response.session?.data);
190
189
 
191
190
  // Update session with progress
192
191
  session = response.session!;
@@ -194,14 +193,12 @@ async function main() {
194
193
  // Check for route completion
195
194
  if (response.isRouteComplete) {
196
195
  console.log("\nβœ… Weather route complete!");
197
- await logWeatherRequest(
198
- agent.getExtractedData(session.id) as WeatherData
199
- );
196
+ await logWeatherRequest(agent.getData(session.id) as WeatherData);
200
197
  }
201
198
 
202
- console.log("\n✨ Session state benefits:");
199
+ console.log("\n✨ Session step benefits:");
203
200
  console.log(" βœ… Data extraction tracked across turns");
204
- console.log(" βœ… State progression managed automatically");
201
+ console.log(" βœ… Step progression managed automatically");
205
202
  console.log(" βœ… Always-on routing respects intent changes");
206
203
  console.log(
207
204
  " (Set OPENAI_API_KEY environment variable to make actual API calls)"