@falai/agent 0.4.0 → 0.5.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 (285) hide show
  1. package/README.md +21 -74
  2. package/dist/cjs/core/Agent.d.ts +22 -29
  3. package/dist/cjs/core/Agent.d.ts.map +1 -1
  4. package/dist/cjs/core/Agent.js +465 -275
  5. package/dist/cjs/core/Agent.js.map +1 -1
  6. package/dist/cjs/core/Events.d.ts +10 -1
  7. package/dist/cjs/core/Events.d.ts.map +1 -1
  8. package/dist/cjs/core/Events.js +3 -2
  9. package/dist/cjs/core/Events.js.map +1 -1
  10. package/dist/cjs/core/PersistenceManager.d.ts +19 -0
  11. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  12. package/dist/cjs/core/PersistenceManager.js +57 -0
  13. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  14. package/dist/cjs/core/PromptComposer.d.ts +24 -0
  15. package/dist/cjs/core/PromptComposer.d.ts.map +1 -0
  16. package/dist/cjs/core/PromptComposer.js +127 -0
  17. package/dist/cjs/core/PromptComposer.js.map +1 -0
  18. package/dist/cjs/core/ResponseEngine.d.ts +19 -0
  19. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -0
  20. package/dist/cjs/core/ResponseEngine.js +51 -0
  21. package/dist/cjs/core/ResponseEngine.js.map +1 -0
  22. package/dist/cjs/core/Route.d.ts +18 -12
  23. package/dist/cjs/core/Route.d.ts.map +1 -1
  24. package/dist/cjs/core/Route.js +15 -9
  25. package/dist/cjs/core/Route.js.map +1 -1
  26. package/dist/cjs/core/RoutingEngine.d.ts +38 -0
  27. package/dist/cjs/core/RoutingEngine.d.ts.map +1 -0
  28. package/dist/cjs/core/RoutingEngine.js +110 -0
  29. package/dist/cjs/core/RoutingEngine.js.map +1 -0
  30. package/dist/cjs/core/State.d.ts +15 -4
  31. package/dist/cjs/core/State.d.ts.map +1 -1
  32. package/dist/cjs/core/State.js +21 -2
  33. package/dist/cjs/core/State.js.map +1 -1
  34. package/dist/cjs/core/ToolExecutor.d.ts +29 -0
  35. package/dist/cjs/core/ToolExecutor.d.ts.map +1 -0
  36. package/dist/cjs/core/ToolExecutor.js +73 -0
  37. package/dist/cjs/core/ToolExecutor.js.map +1 -0
  38. package/dist/cjs/core/Transition.d.ts +5 -5
  39. package/dist/cjs/core/Transition.d.ts.map +1 -1
  40. package/dist/cjs/core/Transition.js.map +1 -1
  41. package/dist/cjs/index.d.ts +6 -8
  42. package/dist/cjs/index.d.ts.map +1 -1
  43. package/dist/cjs/index.js +8 -10
  44. package/dist/cjs/index.js.map +1 -1
  45. package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
  46. package/dist/cjs/providers/AnthropicProvider.js +10 -13
  47. package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
  48. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  49. package/dist/cjs/providers/GeminiProvider.js +12 -8
  50. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  51. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  52. package/dist/cjs/providers/OpenAIProvider.js +10 -53
  53. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  54. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  55. package/dist/cjs/providers/OpenRouterProvider.js +10 -53
  56. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  57. package/dist/cjs/types/agent.d.ts +13 -9
  58. package/dist/cjs/types/agent.d.ts.map +1 -1
  59. package/dist/cjs/types/ai.d.ts +8 -2
  60. package/dist/cjs/types/ai.d.ts.map +1 -1
  61. package/dist/cjs/types/history.d.ts +8 -0
  62. package/dist/cjs/types/history.d.ts.map +1 -1
  63. package/dist/cjs/types/index.d.ts +0 -3
  64. package/dist/cjs/types/index.d.ts.map +1 -1
  65. package/dist/cjs/types/index.js +1 -3
  66. package/dist/cjs/types/index.js.map +1 -1
  67. package/dist/cjs/types/route.d.ts +39 -4
  68. package/dist/cjs/types/route.d.ts.map +1 -1
  69. package/dist/cjs/types/routing.d.ts +16 -0
  70. package/dist/cjs/types/routing.d.ts.map +1 -0
  71. package/dist/cjs/types/routing.js +3 -0
  72. package/dist/cjs/types/routing.js.map +1 -0
  73. package/dist/cjs/types/schema.d.ts +22 -0
  74. package/dist/cjs/types/schema.d.ts.map +1 -0
  75. package/dist/cjs/types/schema.js +3 -0
  76. package/dist/cjs/types/schema.js.map +1 -0
  77. package/dist/cjs/types/session.d.ts +72 -0
  78. package/dist/cjs/types/session.d.ts.map +1 -0
  79. package/dist/cjs/types/session.js +140 -0
  80. package/dist/cjs/types/session.js.map +1 -0
  81. package/dist/cjs/types/tool.d.ts +11 -5
  82. package/dist/cjs/types/tool.d.ts.map +1 -1
  83. package/dist/cjs/utils/id.d.ts +0 -5
  84. package/dist/cjs/utils/id.d.ts.map +1 -1
  85. package/dist/cjs/utils/id.js +0 -10
  86. package/dist/cjs/utils/id.js.map +1 -1
  87. package/dist/cjs/utils/schema.d.ts +17 -0
  88. package/dist/cjs/utils/schema.d.ts.map +1 -0
  89. package/dist/cjs/utils/schema.js +32 -0
  90. package/dist/cjs/utils/schema.js.map +1 -0
  91. package/dist/core/Agent.d.ts +22 -29
  92. package/dist/core/Agent.d.ts.map +1 -1
  93. package/dist/core/Agent.js +465 -275
  94. package/dist/core/Agent.js.map +1 -1
  95. package/dist/core/Events.d.ts +10 -1
  96. package/dist/core/Events.d.ts.map +1 -1
  97. package/dist/core/Events.js +3 -2
  98. package/dist/core/Events.js.map +1 -1
  99. package/dist/core/PersistenceManager.d.ts +19 -0
  100. package/dist/core/PersistenceManager.d.ts.map +1 -1
  101. package/dist/core/PersistenceManager.js +57 -0
  102. package/dist/core/PersistenceManager.js.map +1 -1
  103. package/dist/core/PromptComposer.d.ts +24 -0
  104. package/dist/core/PromptComposer.d.ts.map +1 -0
  105. package/dist/core/PromptComposer.js +123 -0
  106. package/dist/core/PromptComposer.js.map +1 -0
  107. package/dist/core/ResponseEngine.d.ts +19 -0
  108. package/dist/core/ResponseEngine.d.ts.map +1 -0
  109. package/dist/core/ResponseEngine.js +47 -0
  110. package/dist/core/ResponseEngine.js.map +1 -0
  111. package/dist/core/Route.d.ts +18 -12
  112. package/dist/core/Route.d.ts.map +1 -1
  113. package/dist/core/Route.js +15 -9
  114. package/dist/core/Route.js.map +1 -1
  115. package/dist/core/RoutingEngine.d.ts +38 -0
  116. package/dist/core/RoutingEngine.d.ts.map +1 -0
  117. package/dist/core/RoutingEngine.js +106 -0
  118. package/dist/core/RoutingEngine.js.map +1 -0
  119. package/dist/core/State.d.ts +15 -4
  120. package/dist/core/State.d.ts.map +1 -1
  121. package/dist/core/State.js +21 -2
  122. package/dist/core/State.js.map +1 -1
  123. package/dist/core/ToolExecutor.d.ts +29 -0
  124. package/dist/core/ToolExecutor.d.ts.map +1 -0
  125. package/dist/core/ToolExecutor.js +69 -0
  126. package/dist/core/ToolExecutor.js.map +1 -0
  127. package/dist/core/Transition.d.ts +5 -5
  128. package/dist/core/Transition.d.ts.map +1 -1
  129. package/dist/core/Transition.js.map +1 -1
  130. package/dist/index.d.ts +6 -8
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +3 -5
  133. package/dist/index.js.map +1 -1
  134. package/dist/providers/AnthropicProvider.d.ts.map +1 -1
  135. package/dist/providers/AnthropicProvider.js +10 -13
  136. package/dist/providers/AnthropicProvider.js.map +1 -1
  137. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  138. package/dist/providers/GeminiProvider.js +12 -8
  139. package/dist/providers/GeminiProvider.js.map +1 -1
  140. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  141. package/dist/providers/OpenAIProvider.js +10 -53
  142. package/dist/providers/OpenAIProvider.js.map +1 -1
  143. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  144. package/dist/providers/OpenRouterProvider.js +10 -53
  145. package/dist/providers/OpenRouterProvider.js.map +1 -1
  146. package/dist/types/agent.d.ts +13 -9
  147. package/dist/types/agent.d.ts.map +1 -1
  148. package/dist/types/ai.d.ts +8 -2
  149. package/dist/types/ai.d.ts.map +1 -1
  150. package/dist/types/history.d.ts +8 -0
  151. package/dist/types/history.d.ts.map +1 -1
  152. package/dist/types/index.d.ts +0 -3
  153. package/dist/types/index.d.ts.map +1 -1
  154. package/dist/types/index.js +0 -1
  155. package/dist/types/index.js.map +1 -1
  156. package/dist/types/route.d.ts +39 -4
  157. package/dist/types/route.d.ts.map +1 -1
  158. package/dist/types/routing.d.ts +16 -0
  159. package/dist/types/routing.d.ts.map +1 -0
  160. package/dist/types/routing.js +2 -0
  161. package/dist/types/routing.js.map +1 -0
  162. package/dist/types/schema.d.ts +22 -0
  163. package/dist/types/schema.d.ts.map +1 -0
  164. package/dist/types/schema.js +2 -0
  165. package/dist/types/schema.js.map +1 -0
  166. package/dist/types/session.d.ts +72 -0
  167. package/dist/types/session.d.ts.map +1 -0
  168. package/dist/types/session.js +132 -0
  169. package/dist/types/session.js.map +1 -0
  170. package/dist/types/tool.d.ts +11 -5
  171. package/dist/types/tool.d.ts.map +1 -1
  172. package/dist/utils/id.d.ts +0 -5
  173. package/dist/utils/id.d.ts.map +1 -1
  174. package/dist/utils/id.js +0 -9
  175. package/dist/utils/id.js.map +1 -1
  176. package/dist/utils/schema.d.ts +17 -0
  177. package/dist/utils/schema.d.ts.map +1 -0
  178. package/dist/utils/schema.js +27 -0
  179. package/dist/utils/schema.js.map +1 -0
  180. package/docs/ADAPTERS.md +83 -3
  181. package/docs/API_REFERENCE.md +95 -104
  182. package/docs/ARCHITECTURE.md +284 -286
  183. package/docs/CONSTRUCTOR_OPTIONS.md +192 -135
  184. package/docs/CONTEXT_MANAGEMENT.md +311 -28
  185. package/docs/CONTRIBUTING.md +1 -1
  186. package/docs/DOMAINS.md +61 -0
  187. package/docs/GETTING_STARTED.md +177 -88
  188. package/docs/PERSISTENCE.md +170 -23
  189. package/docs/README.md +7 -10
  190. package/examples/business-onboarding.ts +21 -9
  191. package/examples/company-qna-agent.ts +508 -0
  192. package/examples/declarative-agent.ts +143 -26
  193. package/examples/domain-scoping.ts +31 -10
  194. package/examples/extracted-data-modification.ts +415 -0
  195. package/examples/healthcare-agent.ts +194 -90
  196. package/examples/openai-agent.ts +67 -25
  197. package/examples/opensearch-persistence.ts +455 -151
  198. package/examples/persistent-onboarding.ts +162 -96
  199. package/examples/prisma-persistence.ts +371 -125
  200. package/examples/redis-persistence.ts +393 -23
  201. package/examples/rules-prohibitions.ts +32 -11
  202. package/examples/streaming-agent.ts +61 -13
  203. package/examples/travel-agent.ts +266 -133
  204. package/package.json +1 -1
  205. package/src/core/Agent.ts +679 -332
  206. package/src/core/Events.ts +12 -2
  207. package/src/core/PersistenceManager.ts +83 -0
  208. package/src/core/PromptComposer.ts +143 -0
  209. package/src/core/ResponseEngine.ts +82 -0
  210. package/src/core/Route.ts +32 -17
  211. package/src/core/RoutingEngine.ts +165 -0
  212. package/src/core/State.ts +55 -15
  213. package/src/core/ToolExecutor.ts +117 -0
  214. package/src/core/Transition.ts +5 -5
  215. package/src/index.ts +12 -21
  216. package/src/providers/AnthropicProvider.ts +10 -13
  217. package/src/providers/GeminiProvider.ts +12 -8
  218. package/src/providers/OpenAIProvider.ts +10 -56
  219. package/src/providers/OpenRouterProvider.ts +10 -56
  220. package/src/types/agent.ts +16 -10
  221. package/src/types/ai.ts +6 -2
  222. package/src/types/history.ts +8 -0
  223. package/src/types/index.ts +0 -11
  224. package/src/types/route.ts +41 -5
  225. package/src/types/routing.ts +18 -0
  226. package/src/types/schema.ts +23 -0
  227. package/src/types/session.ts +207 -0
  228. package/src/types/tool.ts +29 -7
  229. package/src/utils/id.ts +0 -10
  230. package/src/utils/schema.ts +32 -0
  231. package/dist/cjs/core/ConditionEvaluator.d.ts +0 -72
  232. package/dist/cjs/core/ConditionEvaluator.d.ts.map +0 -1
  233. package/dist/cjs/core/ConditionEvaluator.js +0 -272
  234. package/dist/cjs/core/ConditionEvaluator.js.map +0 -1
  235. package/dist/cjs/core/Observation.d.ts +0 -24
  236. package/dist/cjs/core/Observation.d.ts.map +0 -1
  237. package/dist/cjs/core/Observation.js +0 -39
  238. package/dist/cjs/core/Observation.js.map +0 -1
  239. package/dist/cjs/core/PreparationEngine.d.ts +0 -105
  240. package/dist/cjs/core/PreparationEngine.d.ts.map +0 -1
  241. package/dist/cjs/core/PreparationEngine.js +0 -320
  242. package/dist/cjs/core/PreparationEngine.js.map +0 -1
  243. package/dist/cjs/core/PromptBuilder.d.ts +0 -136
  244. package/dist/cjs/core/PromptBuilder.d.ts.map +0 -1
  245. package/dist/cjs/core/PromptBuilder.js +0 -421
  246. package/dist/cjs/core/PromptBuilder.js.map +0 -1
  247. package/dist/cjs/types/observation.d.ts +0 -27
  248. package/dist/cjs/types/observation.d.ts.map +0 -1
  249. package/dist/cjs/types/observation.js +0 -6
  250. package/dist/cjs/types/observation.js.map +0 -1
  251. package/dist/cjs/types/prompt.d.ts +0 -46
  252. package/dist/cjs/types/prompt.d.ts.map +0 -1
  253. package/dist/cjs/types/prompt.js +0 -19
  254. package/dist/cjs/types/prompt.js.map +0 -1
  255. package/dist/core/ConditionEvaluator.d.ts +0 -72
  256. package/dist/core/ConditionEvaluator.d.ts.map +0 -1
  257. package/dist/core/ConditionEvaluator.js +0 -268
  258. package/dist/core/ConditionEvaluator.js.map +0 -1
  259. package/dist/core/Observation.d.ts +0 -24
  260. package/dist/core/Observation.d.ts.map +0 -1
  261. package/dist/core/Observation.js +0 -35
  262. package/dist/core/Observation.js.map +0 -1
  263. package/dist/core/PreparationEngine.d.ts +0 -105
  264. package/dist/core/PreparationEngine.d.ts.map +0 -1
  265. package/dist/core/PreparationEngine.js +0 -316
  266. package/dist/core/PreparationEngine.js.map +0 -1
  267. package/dist/core/PromptBuilder.d.ts +0 -136
  268. package/dist/core/PromptBuilder.d.ts.map +0 -1
  269. package/dist/core/PromptBuilder.js +0 -417
  270. package/dist/core/PromptBuilder.js.map +0 -1
  271. package/dist/types/observation.d.ts +0 -27
  272. package/dist/types/observation.d.ts.map +0 -1
  273. package/dist/types/observation.js +0 -5
  274. package/dist/types/observation.js.map +0 -1
  275. package/dist/types/prompt.d.ts +0 -46
  276. package/dist/types/prompt.d.ts.map +0 -1
  277. package/dist/types/prompt.js +0 -16
  278. package/dist/types/prompt.js.map +0 -1
  279. package/docs/STRUCTURE.md +0 -58
  280. package/src/core/ConditionEvaluator.ts +0 -381
  281. package/src/core/Observation.ts +0 -47
  282. package/src/core/PreparationEngine.ts +0 -500
  283. package/src/core/PromptBuilder.ts +0 -617
  284. package/src/types/observation.ts +0 -29
  285. package/src/types/prompt.ts +0 -49
package/docs/ADAPTERS.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  All adapters follow the **provider pattern** - no dependencies required in the package, users install only what they need.
4
4
 
5
+ **NEW**: All adapters now support the new **Session State** pattern with automatic persistence of extracted data, current route/state, and conversation progress!
6
+
5
7
  ## ✅ Implemented Adapters
6
8
 
7
9
  ### 1. **PrismaAdapter**
@@ -73,11 +75,17 @@ All adapters follow the **provider pattern** - no dependencies required in the p
73
75
 
74
76
  ## 🎯 Usage Pattern
75
77
 
76
- All adapters follow the same simple pattern:
78
+ All adapters follow the same simple pattern with full session state support:
77
79
 
78
80
  ```typescript
79
81
  import { Agent, [Adapter]Adapter } from "@falai/agent";
80
82
 
83
+ // Define your data extraction type
84
+ interface YourDataType {
85
+ field1: string;
86
+ field2: number;
87
+ }
88
+
81
89
  const adapter = new [Adapter]Adapter({
82
90
  client: yourClientInstance,
83
91
  // ... adapter-specific options
@@ -87,9 +95,45 @@ const agent = new Agent({
87
95
  persistence: {
88
96
  adapter,
89
97
  userId: "user_123",
90
- autoSave: true,
98
+ autoSave: true, // ✨ Auto-saves session state!
99
+ },
100
+ });
101
+
102
+ // Create a route with data extraction
103
+ const route = agent.createRoute<YourDataType>({
104
+ title: "My Route",
105
+ gatherSchema: {
106
+ type: "object",
107
+ properties: {
108
+ field1: { type: "string" },
109
+ field2: { type: "number" },
110
+ },
111
+ required: ["field1", "field2"],
91
112
  },
92
113
  });
114
+
115
+ // Define states
116
+ route.initialState.transitionTo({
117
+ chatState: "Collect data",
118
+ gather: ["field1", "field2"],
119
+ });
120
+
121
+ // Use with session state
122
+ const persistence = agent.getPersistenceManager();
123
+ const { sessionData, sessionState } =
124
+ await persistence.createSessionWithState<YourDataType>({
125
+ userId: "user_123",
126
+ agentName: "My Agent",
127
+ });
128
+
129
+ // Chat with automatic session state persistence
130
+ const response = await agent.respond({
131
+ history: [...],
132
+ session: sessionState, // Pass session state
133
+ });
134
+
135
+ // Session state auto-saved! Includes extracted data
136
+ console.log("Extracted:", response.session?.extracted);
93
137
  ```
94
138
 
95
139
  ## 🔌 Optional Dependencies
@@ -150,9 +194,45 @@ export class MyCustomAdapter implements PersistenceAdapter {
150
194
 
151
195
  All adapters are fully typed with **zero `any` types** (except for Prisma's dynamic model access):
152
196
 
153
- - Generic client interfaces
197
+ - Generic client interfaces with `SessionState<TExtracted>` support
154
198
  - Typed repository methods
155
199
  - Full IDE autocomplete
200
+ - Type-safe data extraction throughout
201
+
202
+ ## 💾 What Gets Stored
203
+
204
+ All adapters store session state in the `collectedData` JSON field:
205
+
206
+ ```json
207
+ {
208
+ "extracted": {
209
+ "destination": "Paris",
210
+ "departureDate": "2025-06-15",
211
+ "passengers": 2
212
+ },
213
+ "routeHistory": [
214
+ {
215
+ "routeId": "book_flight",
216
+ "enteredAt": "2025-10-15T10:00:00Z",
217
+ "completed": false
218
+ }
219
+ ],
220
+ "currentRouteTitle": "Book a Flight",
221
+ "currentStateDescription": "Ask about travel dates",
222
+ "metadata": {
223
+ "sessionId": "session_123",
224
+ "createdAt": "2025-10-15T10:00:00Z",
225
+ "lastUpdatedAt": "2025-10-15T10:05:00Z"
226
+ }
227
+ }
228
+ ```
229
+
230
+ This allows:
231
+
232
+ - ✅ Full session state recovery
233
+ - ✅ Analytics on extracted data
234
+ - ✅ Conversation progress tracking
235
+ - ✅ Multi-turn conversation support
156
236
 
157
237
  ## 🚀 Coming Soon
158
238
 
@@ -36,10 +36,6 @@ Adds a behavioral guideline. Returns `this` for chaining.
36
36
 
37
37
  Adds an agent capability. Returns `this` for chaining.
38
38
 
39
- ##### `createObservation(description: string): Observation`
40
-
41
- Creates an observation for disambiguation.
42
-
43
39
  ##### `addDomain<TName, TDomain>(name: TName, domainObject: TDomain): void`
44
40
 
45
41
  Registers a domain with tools/methods.
@@ -54,12 +50,12 @@ Gets allowed domains for a specific route by title. Returns filtered domains bas
54
50
 
55
51
  ##### `respond(input: RespondInput<TContext>): Promise<RespondOutput>`
56
52
 
57
- Generates an AI response based on conversation history with structured output including route, state, and tool call information.
53
+ Generates an AI response with session state management, data extraction, and intelligent routing.
58
54
 
59
55
  ```typescript
60
56
  interface RespondInput<TContext> {
61
57
  history: Event[];
62
- state?: StateRef;
58
+ session?: SessionState; // NEW: Session state for conversation tracking
63
59
  contextOverride?: Partial<TContext>;
64
60
  signal?: AbortSignal;
65
61
  }
@@ -67,11 +63,9 @@ interface RespondInput<TContext> {
67
63
  interface RespondOutput {
68
64
  /** The message to send to the user */
69
65
  message: string;
70
- /** Route chosen by the agent (if applicable) */
71
- route?: { id: string; title: string };
72
- /** Current state within the route (if applicable) */
73
- state?: { id: string; description?: string };
74
- /** Tool calls requested by the agent */
66
+ /** Updated session state (includes extracted data, current route/state) */
67
+ session?: SessionState;
68
+ /** Tool calls executed during response (for debugging) */
75
69
  toolCalls?: Array<{
76
70
  toolName: string;
77
71
  arguments: Record<string, unknown>;
@@ -79,12 +73,19 @@ interface RespondOutput {
79
73
  }
80
74
  ```
81
75
 
82
- **Enhanced Response Information:**
76
+ **Enhanced Response Pipeline:**
83
77
 
84
- - Uses structured JSON output via `responses.parse()` API (OpenAI/OpenRouter) or JSON mode (Gemini)
85
- - Automatically detects which route the agent chose based on conversation context
86
- - Provides current state information for tracking conversation flow
87
- - Returns tool calls for execution in your application
78
+ 1. **Tool Execution** - Execute tools if current state has `toolState`
79
+ 2. **Always-On Routing** - Score all routes, respect user intent to change direction
80
+ 3. **State Traversal** - Use `skipIf` and `requiredData` to determine next state
81
+ 4. **Response Generation** - Build schema with `gather` fields, extract data
82
+ 5. **Session Update** - Merge extracted data into session state
83
+
84
+ **Session State Management:**
85
+
86
+ - Tracks current route, state, and extracted data across turns
87
+ - Enables "I changed my mind" scenarios with context-aware routing
88
+ - Automatically merges new extracted data with existing session data
88
89
 
89
90
  **Example:**
90
91
 
@@ -239,7 +240,7 @@ Represents a conversation flow with states and transitions.
239
240
  ```typescript
240
241
  new Route(options: RouteOptions)
241
242
 
242
- interface RouteOptions {
243
+ interface RouteOptions<TExtracted = unknown> {
243
244
  id?: string; // Optional custom ID (deterministic ID generated from title if not provided)
244
245
  title: string; // Route title
245
246
  description?: string; // Route description
@@ -248,6 +249,17 @@ interface RouteOptions {
248
249
  domains?: string[]; // Domain names allowed in this route (undefined = all domains)
249
250
  rules?: string[]; // Absolute rules the agent MUST follow in this route
250
251
  prohibitions?: string[]; // Absolute prohibitions the agent MUST NEVER do in this route
252
+
253
+ // NEW: Schema-first data extraction
254
+ gatherSchema?: {
255
+ type: "object";
256
+ properties: Record<string, any>;
257
+ required?: string[];
258
+ additionalProperties?: boolean;
259
+ };
260
+
261
+ // NEW: Pre-populate extracted data when entering route
262
+ initialData?: Partial<TExtracted>;
251
263
  }
252
264
  ```
253
265
 
@@ -279,10 +291,6 @@ Returns the prohibitions that must never be done in this route.
279
291
 
280
292
  Returns a reference to this route.
281
293
 
282
- ##### `toRef(): RouteRef`
283
-
284
- Returns a reference including the route instance (for disambiguation).
285
-
286
294
  ##### `describe(): string`
287
295
 
288
296
  Generates a description of this route's structure.
@@ -322,16 +330,28 @@ Represents a state within a conversation route.
322
330
  Creates a transition from this state and returns a chainable result.
323
331
 
324
332
  ```typescript
325
- interface TransitionSpec {
333
+ interface TransitionSpec<TExtracted = unknown> {
326
334
  chatState?: string; // Transition to a chat interaction
327
335
  toolState?: ToolRef; // Transition to execute a tool
328
336
  state?: StateRef | symbol; // Transition to specific state or END_ROUTE
337
+
338
+ // NEW: Data extraction fields for this state
339
+ gather?: string[];
340
+
341
+ // NEW: Code-based condition to skip this state
342
+ skipIf?: (extracted: Partial<TExtracted>) => boolean;
343
+
344
+ // NEW: Prerequisites that must be met to enter this state
345
+ requiredData?: string[];
329
346
  }
330
347
 
331
- interface TransitionResult {
348
+ interface TransitionResult<TExtracted = unknown> {
332
349
  id: string; // State identifier
333
350
  routeId: string; // Route identifier
334
- transitionTo: (spec: TransitionSpec, condition?: string) => TransitionResult;
351
+ transitionTo: (
352
+ spec: TransitionSpec<TExtracted>,
353
+ condition?: string
354
+ ) => TransitionResult<TExtracted>;
335
355
  }
336
356
  ```
337
357
 
@@ -340,39 +360,66 @@ interface TransitionResult {
340
360
  **Example:**
341
361
 
342
362
  ```typescript
343
- // Approach 1: Step-by-step (ideal for complex flows with branching)
344
- const t0 = route.initialState.transitionTo({
345
- chatState: "Ask for user name",
346
- });
363
+ // Define your data extraction type
364
+ interface FlightData {
365
+ destination: string;
366
+ departureDate: string;
367
+ passengers: number;
368
+ }
347
369
 
348
- const t1 = t0.transitionTo({
349
- chatState: "Ask for email",
370
+ // Create a data-driven route
371
+ const flightRoute = agent.createRoute<FlightData>({
372
+ title: "Book Flight",
373
+ gatherSchema: {
374
+ type: "object",
375
+ properties: {
376
+ destination: { type: "string" },
377
+ departureDate: { type: "string" },
378
+ passengers: { type: "number", minimum: 1, maximum: 9 },
379
+ },
380
+ required: ["destination", "departureDate", "passengers"],
381
+ },
350
382
  });
351
383
 
352
- const t2 = t1.transitionTo({
353
- chatState: "Confirm details",
384
+ // Approach 1: Step-by-step with data extraction
385
+ const askDestination = flightRoute.initialState.transitionTo({
386
+ chatState: "Ask where they want to fly",
387
+ gather: ["destination"],
388
+ skipIf: (extracted) => !!extracted.destination, // Skip if already have destination
354
389
  });
355
390
 
356
- // Access state properties
357
- console.log(t1.id); // State ID
358
- console.log(t1.routeId); // Route ID
391
+ const askDates = askDestination.transitionTo({
392
+ chatState: "Ask about travel dates",
393
+ gather: ["departureDate"],
394
+ skipIf: (extracted) => !!extracted.departureDate,
395
+ requiredData: ["destination"], // Must have destination first
396
+ });
359
397
 
360
- // Use saved references for branching
361
- t1.transitionTo(
362
- { chatState: "Handle invalid email" },
363
- "Email validation failed"
364
- );
398
+ const askPassengers = askDates.transitionTo({
399
+ chatState: "How many passengers?",
400
+ gather: ["passengers"],
401
+ skipIf: (extracted) => !!extracted.passengers,
402
+ });
365
403
 
366
- // Approach 2: Fluent chaining (elegant for linear flows)
367
- route.initialState
368
- .transitionTo({ chatState: "Ask for user name" })
369
- .transitionTo({ chatState: "Ask for email" })
370
- .transitionTo({ chatState: "Confirm details" })
404
+ // Access state properties
405
+ console.log(askDestination.id); // State ID
406
+ console.log(askDestination.routeId); // Route ID
407
+
408
+ // Approach 2: Fluent chaining for linear flows
409
+ flightRoute.initialState
410
+ .transitionTo({
411
+ chatState: "Extract travel details",
412
+ gather: ["destination", "departureDate", "passengers"],
413
+ })
414
+ .transitionTo({
415
+ chatState: "Present available flights",
416
+ })
371
417
  .transitionTo({ state: END_ROUTE });
372
418
 
373
- // Both approaches are equivalent - choose based on your needs:
374
- // - Use step-by-step for complex flows with conditional branches
375
- // - Use chaining for simple linear flows for conciseness
419
+ // Use with session state
420
+ let session = createSession<FlightData>();
421
+ const response = await agent.respond({ history, session });
422
+ console.log(response.session?.extracted); // { destination: "Paris", ... }
376
423
  ```
377
424
 
378
425
  ##### `addGuideline(guideline: Guideline): void`
@@ -395,46 +442,6 @@ State description (readonly).
395
442
 
396
443
  ---
397
444
 
398
- ### `Observation`
399
-
400
- Handles disambiguation between multiple routes.
401
-
402
- #### Constructor
403
-
404
- ```typescript
405
- new Observation(options: ObservationOptions)
406
-
407
- interface ObservationOptions {
408
- id?: string; // Optional custom ID (deterministic ID generated from description if not provided)
409
- description: string; // The observation description
410
- routeRefs?: string[]; // Route IDs or titles to disambiguate between
411
- }
412
- ```
413
-
414
- **Note on IDs:** Observation IDs are deterministic by default, generated from the description using a hash function. This ensures consistency across server restarts.
415
-
416
- #### Methods
417
-
418
- ##### `disambiguate(routes: (Route | RouteRef)[]): this`
419
-
420
- Sets routes this observation can disambiguate between. Returns `this` for chaining.
421
-
422
- ##### `getRoutes(): RouteRef[]`
423
-
424
- Returns routes associated with this observation.
425
-
426
- #### Properties
427
-
428
- ##### `id: string`
429
-
430
- Unique identifier (readonly).
431
-
432
- ##### `description: string`
433
-
434
- Observation description (readonly).
435
-
436
- ---
437
-
438
445
  ### `DomainRegistry`
439
446
 
440
447
  Registry for organizing agent tools and methods by domain.
@@ -1214,10 +1221,6 @@ Adds guidelines section.
1214
1221
 
1215
1222
  Adds capabilities section.
1216
1223
 
1217
- ##### `addObservations(observations): this`
1218
-
1219
- Adds observations for disambiguation.
1220
-
1221
1224
  ##### `addActiveRoutes(routes): this`
1222
1225
 
1223
1226
  Adds active routes to the prompt.
@@ -1479,17 +1482,6 @@ const stateId = generateStateId("route_123", "Ask for name");
1479
1482
  // Returns: "state_ask_for_name_{hash}"
1480
1483
  ```
1481
1484
 
1482
- #### `generateObservationId(description: string): string`
1483
-
1484
- Generates a deterministic observation ID from a description.
1485
-
1486
- ```typescript
1487
- import { generateObservationId } from "@falai/agent";
1488
-
1489
- const obsId = generateObservationId("User intent is unclear");
1490
- // Returns: "observation_user_intent_is_unclear_{hash}"
1491
- ```
1492
-
1493
1485
  #### `generateToolId(name: string): string`
1494
1486
 
1495
1487
  Generates a deterministic tool ID from a name.
@@ -1552,7 +1544,6 @@ enum BuiltInSection {
1552
1544
  CONTEXT = "context",
1553
1545
  GUIDELINES = "guidelines",
1554
1546
  CAPABILITIES = "capabilities",
1555
- OBSERVATIONS = "observations",
1556
1547
  ACTIVE_ROUTES = "active_routes",
1557
1548
  }
1558
1549
  ```