@falai/agent 1.2.7 → 2.0.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 (508) hide show
  1. package/README.md +40 -886
  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.d.ts.map +1 -1
  7. package/dist/adapters/OpenSearchAdapter.js +9 -7
  8. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  9. package/dist/adapters/PostgreSQLAdapter.d.ts +14 -0
  10. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.js +25 -9
  12. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  13. package/dist/adapters/PrismaAdapter.js +5 -5
  14. package/dist/adapters/PrismaAdapter.js.map +1 -1
  15. package/dist/adapters/RedisAdapter.js +2 -2
  16. package/dist/adapters/RedisAdapter.js.map +1 -1
  17. package/dist/adapters/SQLiteAdapter.d.ts +17 -0
  18. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  19. package/dist/adapters/SQLiteAdapter.js +30 -11
  20. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  21. package/dist/cjs/adapters/MemoryAdapter.js +2 -2
  22. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  23. package/dist/cjs/adapters/MongoAdapter.js +2 -2
  24. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  25. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  26. package/dist/cjs/adapters/OpenSearchAdapter.js +9 -7
  27. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  28. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +14 -0
  29. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  30. package/dist/cjs/adapters/PostgreSQLAdapter.js +25 -9
  31. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/PrismaAdapter.js +5 -5
  33. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  34. package/dist/cjs/adapters/RedisAdapter.js +2 -2
  35. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  36. package/dist/cjs/adapters/SQLiteAdapter.d.ts +17 -0
  37. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  38. package/dist/cjs/adapters/SQLiteAdapter.js +30 -11
  39. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  40. package/dist/cjs/constants/index.d.ts +0 -9
  41. package/dist/cjs/constants/index.d.ts.map +1 -1
  42. package/dist/cjs/constants/index.js +2 -11
  43. package/dist/cjs/constants/index.js.map +1 -1
  44. package/dist/cjs/core/Agent.d.ts +119 -153
  45. package/dist/cjs/core/Agent.d.ts.map +1 -1
  46. package/dist/cjs/core/Agent.js +471 -324
  47. package/dist/cjs/core/Agent.js.map +1 -1
  48. package/dist/cjs/core/AutoChainExecutor.d.ts +107 -0
  49. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -0
  50. package/dist/cjs/core/AutoChainExecutor.js +297 -0
  51. package/dist/cjs/core/AutoChainExecutor.js.map +1 -0
  52. package/dist/cjs/core/BranchEvaluator.d.ts +54 -0
  53. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -0
  54. package/dist/cjs/core/BranchEvaluator.js +130 -0
  55. package/dist/cjs/core/BranchEvaluator.js.map +1 -0
  56. package/dist/cjs/core/DirectiveBus.d.ts +88 -0
  57. package/dist/cjs/core/DirectiveBus.d.ts.map +1 -0
  58. package/dist/cjs/core/DirectiveBus.js +196 -0
  59. package/dist/cjs/core/DirectiveBus.js.map +1 -0
  60. package/dist/cjs/core/DirectiveChainTracker.d.ts +49 -0
  61. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -0
  62. package/dist/cjs/core/DirectiveChainTracker.js +121 -0
  63. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -0
  64. package/dist/cjs/core/Flow.d.ts +186 -0
  65. package/dist/cjs/core/Flow.d.ts.map +1 -0
  66. package/dist/cjs/core/Flow.js +550 -0
  67. package/dist/cjs/core/Flow.js.map +1 -0
  68. package/dist/cjs/core/FlowRouter.d.ts +182 -0
  69. package/dist/cjs/core/FlowRouter.d.ts.map +1 -0
  70. package/dist/cjs/core/{RoutingEngine.js → FlowRouter.js} +323 -306
  71. package/dist/cjs/core/FlowRouter.js.map +1 -0
  72. package/dist/cjs/core/PersistenceManager.d.ts +2 -2
  73. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  74. package/dist/cjs/core/PersistenceManager.js +7 -7
  75. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  76. package/dist/cjs/core/PromptComposer.d.ts +21 -8
  77. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  78. package/dist/cjs/core/PromptComposer.js +182 -105
  79. package/dist/cjs/core/PromptComposer.js.map +1 -1
  80. package/dist/cjs/core/PromptSectionCache.d.ts +1 -1
  81. package/dist/cjs/core/PromptSectionCache.js +1 -1
  82. package/dist/cjs/core/ResponseEngine.d.ts +18 -8
  83. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  84. package/dist/cjs/core/ResponseEngine.js +38 -36
  85. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  86. package/dist/cjs/core/ResponseModal.d.ts +73 -56
  87. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  88. package/dist/cjs/core/ResponseModal.js +1196 -1015
  89. package/dist/cjs/core/ResponseModal.js.map +1 -1
  90. package/dist/cjs/core/ResponsePipeline.d.ts +124 -26
  91. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  92. package/dist/cjs/core/ResponsePipeline.js +524 -134
  93. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  94. package/dist/cjs/core/SignalEvaluator.d.ts +86 -0
  95. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -0
  96. package/dist/cjs/core/SignalEvaluator.js +333 -0
  97. package/dist/cjs/core/SignalEvaluator.js.map +1 -0
  98. package/dist/cjs/core/SignalProcessor.d.ts +152 -0
  99. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -0
  100. package/dist/cjs/core/SignalProcessor.js +562 -0
  101. package/dist/cjs/core/SignalProcessor.js.map +1 -0
  102. package/dist/cjs/core/Step.d.ts +43 -32
  103. package/dist/cjs/core/Step.d.ts.map +1 -1
  104. package/dist/cjs/core/Step.js +221 -126
  105. package/dist/cjs/core/Step.js.map +1 -1
  106. package/dist/cjs/core/StreamingToolExecutor.d.ts +2 -2
  107. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  108. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  109. package/dist/cjs/core/ToolManager.d.ts +44 -13
  110. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  111. package/dist/cjs/core/ToolManager.js +174 -91
  112. package/dist/cjs/core/ToolManager.js.map +1 -1
  113. package/dist/cjs/core/createAgent.d.ts +35 -0
  114. package/dist/cjs/core/createAgent.d.ts.map +1 -0
  115. package/dist/cjs/core/createAgent.js +39 -0
  116. package/dist/cjs/core/createAgent.js.map +1 -0
  117. package/dist/cjs/core/flow-namespace.d.ts +49 -0
  118. package/dist/cjs/core/flow-namespace.d.ts.map +1 -0
  119. package/dist/cjs/core/flow-namespace.js +171 -0
  120. package/dist/cjs/core/flow-namespace.js.map +1 -0
  121. package/dist/cjs/index.d.ts +11 -14
  122. package/dist/cjs/index.d.ts.map +1 -1
  123. package/dist/cjs/index.js +18 -22
  124. package/dist/cjs/index.js.map +1 -1
  125. package/dist/cjs/providers/GeminiProvider.d.ts +3 -3
  126. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  127. package/dist/cjs/providers/GeminiProvider.js +16 -14
  128. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  129. package/dist/cjs/types/agent.d.ts +183 -54
  130. package/dist/cjs/types/agent.d.ts.map +1 -1
  131. package/dist/cjs/types/agent.js +0 -6
  132. package/dist/cjs/types/agent.js.map +1 -1
  133. package/dist/cjs/types/ai.d.ts +3 -3
  134. package/dist/cjs/types/ai.d.ts.map +1 -1
  135. package/dist/cjs/types/errors.d.ts +15 -0
  136. package/dist/cjs/types/errors.d.ts.map +1 -0
  137. package/dist/cjs/types/errors.js +22 -0
  138. package/dist/cjs/types/errors.js.map +1 -0
  139. package/dist/cjs/types/flow.d.ts +513 -0
  140. package/dist/cjs/types/flow.d.ts.map +1 -0
  141. package/dist/cjs/types/{route.js → flow.js} +2 -2
  142. package/dist/cjs/types/flow.js.map +1 -0
  143. package/dist/cjs/types/index.d.ts +7 -6
  144. package/dist/cjs/types/index.d.ts.map +1 -1
  145. package/dist/cjs/types/index.js +6 -2
  146. package/dist/cjs/types/index.js.map +1 -1
  147. package/dist/cjs/types/persistence.d.ts +11 -7
  148. package/dist/cjs/types/persistence.d.ts.map +1 -1
  149. package/dist/cjs/types/routing.d.ts +1 -1
  150. package/dist/cjs/types/routing.d.ts.map +1 -1
  151. package/dist/cjs/types/session.d.ts +24 -23
  152. package/dist/cjs/types/session.d.ts.map +1 -1
  153. package/dist/cjs/types/signals.d.ts +248 -0
  154. package/dist/cjs/types/signals.d.ts.map +1 -0
  155. package/dist/cjs/types/signals.js +11 -0
  156. package/dist/cjs/types/signals.js.map +1 -0
  157. package/dist/cjs/types/template.d.ts +2 -8
  158. package/dist/cjs/types/template.d.ts.map +1 -1
  159. package/dist/cjs/types/tool.d.ts +36 -29
  160. package/dist/cjs/types/tool.d.ts.map +1 -1
  161. package/dist/cjs/types/tool.js +1 -1
  162. package/dist/cjs/types/tool.js.map +1 -1
  163. package/dist/cjs/utils/condition.d.ts +7 -1
  164. package/dist/cjs/utils/condition.d.ts.map +1 -1
  165. package/dist/cjs/utils/condition.js.map +1 -1
  166. package/dist/cjs/utils/id.d.ts +13 -5
  167. package/dist/cjs/utils/id.d.ts.map +1 -1
  168. package/dist/cjs/utils/id.js +24 -10
  169. package/dist/cjs/utils/id.js.map +1 -1
  170. package/dist/cjs/utils/index.d.ts +2 -2
  171. package/dist/cjs/utils/index.d.ts.map +1 -1
  172. package/dist/cjs/utils/index.js +7 -3
  173. package/dist/cjs/utils/index.js.map +1 -1
  174. package/dist/cjs/utils/session.d.ts +44 -5
  175. package/dist/cjs/utils/session.d.ts.map +1 -1
  176. package/dist/cjs/utils/session.js +197 -38
  177. package/dist/cjs/utils/session.js.map +1 -1
  178. package/dist/constants/index.d.ts +0 -9
  179. package/dist/constants/index.d.ts.map +1 -1
  180. package/dist/constants/index.js +3 -9
  181. package/dist/constants/index.js.map +1 -1
  182. package/dist/core/Agent.d.ts +119 -153
  183. package/dist/core/Agent.d.ts.map +1 -1
  184. package/dist/core/Agent.js +472 -325
  185. package/dist/core/Agent.js.map +1 -1
  186. package/dist/core/AutoChainExecutor.d.ts +107 -0
  187. package/dist/core/AutoChainExecutor.d.ts.map +1 -0
  188. package/dist/core/AutoChainExecutor.js +293 -0
  189. package/dist/core/AutoChainExecutor.js.map +1 -0
  190. package/dist/core/BranchEvaluator.d.ts +54 -0
  191. package/dist/core/BranchEvaluator.d.ts.map +1 -0
  192. package/dist/core/BranchEvaluator.js +126 -0
  193. package/dist/core/BranchEvaluator.js.map +1 -0
  194. package/dist/core/DirectiveBus.d.ts +88 -0
  195. package/dist/core/DirectiveBus.d.ts.map +1 -0
  196. package/dist/core/DirectiveBus.js +192 -0
  197. package/dist/core/DirectiveBus.js.map +1 -0
  198. package/dist/core/DirectiveChainTracker.d.ts +49 -0
  199. package/dist/core/DirectiveChainTracker.d.ts.map +1 -0
  200. package/dist/core/DirectiveChainTracker.js +117 -0
  201. package/dist/core/DirectiveChainTracker.js.map +1 -0
  202. package/dist/core/Flow.d.ts +186 -0
  203. package/dist/core/Flow.d.ts.map +1 -0
  204. package/dist/core/Flow.js +546 -0
  205. package/dist/core/Flow.js.map +1 -0
  206. package/dist/core/FlowRouter.d.ts +182 -0
  207. package/dist/core/FlowRouter.d.ts.map +1 -0
  208. package/dist/core/{RoutingEngine.js → FlowRouter.js} +322 -305
  209. package/dist/core/FlowRouter.js.map +1 -0
  210. package/dist/core/PersistenceManager.d.ts +2 -2
  211. package/dist/core/PersistenceManager.d.ts.map +1 -1
  212. package/dist/core/PersistenceManager.js +7 -7
  213. package/dist/core/PersistenceManager.js.map +1 -1
  214. package/dist/core/PromptComposer.d.ts +21 -8
  215. package/dist/core/PromptComposer.d.ts.map +1 -1
  216. package/dist/core/PromptComposer.js +183 -106
  217. package/dist/core/PromptComposer.js.map +1 -1
  218. package/dist/core/PromptSectionCache.d.ts +1 -1
  219. package/dist/core/PromptSectionCache.js +1 -1
  220. package/dist/core/ResponseEngine.d.ts +18 -8
  221. package/dist/core/ResponseEngine.d.ts.map +1 -1
  222. package/dist/core/ResponseEngine.js +38 -36
  223. package/dist/core/ResponseEngine.js.map +1 -1
  224. package/dist/core/ResponseModal.d.ts +73 -56
  225. package/dist/core/ResponseModal.d.ts.map +1 -1
  226. package/dist/core/ResponseModal.js +1198 -1017
  227. package/dist/core/ResponseModal.js.map +1 -1
  228. package/dist/core/ResponsePipeline.d.ts +124 -26
  229. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  230. package/dist/core/ResponsePipeline.js +524 -135
  231. package/dist/core/ResponsePipeline.js.map +1 -1
  232. package/dist/core/SignalEvaluator.d.ts +86 -0
  233. package/dist/core/SignalEvaluator.d.ts.map +1 -0
  234. package/dist/core/SignalEvaluator.js +326 -0
  235. package/dist/core/SignalEvaluator.js.map +1 -0
  236. package/dist/core/SignalProcessor.d.ts +152 -0
  237. package/dist/core/SignalProcessor.d.ts.map +1 -0
  238. package/dist/core/SignalProcessor.js +555 -0
  239. package/dist/core/SignalProcessor.js.map +1 -0
  240. package/dist/core/Step.d.ts +43 -32
  241. package/dist/core/Step.d.ts.map +1 -1
  242. package/dist/core/Step.js +220 -126
  243. package/dist/core/Step.js.map +1 -1
  244. package/dist/core/StreamingToolExecutor.d.ts +2 -2
  245. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  246. package/dist/core/StreamingToolExecutor.js.map +1 -1
  247. package/dist/core/ToolManager.d.ts +44 -13
  248. package/dist/core/ToolManager.d.ts.map +1 -1
  249. package/dist/core/ToolManager.js +174 -91
  250. package/dist/core/ToolManager.js.map +1 -1
  251. package/dist/core/createAgent.d.ts +35 -0
  252. package/dist/core/createAgent.d.ts.map +1 -0
  253. package/dist/core/createAgent.js +36 -0
  254. package/dist/core/createAgent.js.map +1 -0
  255. package/dist/core/flow-namespace.d.ts +49 -0
  256. package/dist/core/flow-namespace.d.ts.map +1 -0
  257. package/dist/core/flow-namespace.js +168 -0
  258. package/dist/core/flow-namespace.js.map +1 -0
  259. package/dist/index.d.ts +11 -14
  260. package/dist/index.d.ts.map +1 -1
  261. package/dist/index.js +9 -12
  262. package/dist/index.js.map +1 -1
  263. package/dist/providers/GeminiProvider.d.ts +3 -3
  264. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  265. package/dist/providers/GeminiProvider.js +16 -14
  266. package/dist/providers/GeminiProvider.js.map +1 -1
  267. package/dist/types/agent.d.ts +183 -54
  268. package/dist/types/agent.d.ts.map +1 -1
  269. package/dist/types/agent.js +0 -6
  270. package/dist/types/agent.js.map +1 -1
  271. package/dist/types/ai.d.ts +3 -3
  272. package/dist/types/ai.d.ts.map +1 -1
  273. package/dist/types/errors.d.ts +15 -0
  274. package/dist/types/errors.d.ts.map +1 -0
  275. package/dist/types/errors.js +18 -0
  276. package/dist/types/errors.js.map +1 -0
  277. package/dist/types/flow.d.ts +513 -0
  278. package/dist/types/flow.d.ts.map +1 -0
  279. package/dist/types/flow.js +5 -0
  280. package/dist/types/flow.js.map +1 -0
  281. package/dist/types/index.d.ts +7 -6
  282. package/dist/types/index.d.ts.map +1 -1
  283. package/dist/types/index.js +4 -1
  284. package/dist/types/index.js.map +1 -1
  285. package/dist/types/persistence.d.ts +11 -7
  286. package/dist/types/persistence.d.ts.map +1 -1
  287. package/dist/types/routing.d.ts +1 -1
  288. package/dist/types/routing.d.ts.map +1 -1
  289. package/dist/types/session.d.ts +24 -23
  290. package/dist/types/session.d.ts.map +1 -1
  291. package/dist/types/signals.d.ts +248 -0
  292. package/dist/types/signals.d.ts.map +1 -0
  293. package/dist/types/signals.js +10 -0
  294. package/dist/types/signals.js.map +1 -0
  295. package/dist/types/template.d.ts +2 -8
  296. package/dist/types/template.d.ts.map +1 -1
  297. package/dist/types/tool.d.ts +36 -29
  298. package/dist/types/tool.d.ts.map +1 -1
  299. package/dist/types/tool.js +1 -1
  300. package/dist/types/tool.js.map +1 -1
  301. package/dist/utils/condition.d.ts +7 -1
  302. package/dist/utils/condition.d.ts.map +1 -1
  303. package/dist/utils/condition.js.map +1 -1
  304. package/dist/utils/id.d.ts +13 -5
  305. package/dist/utils/id.d.ts.map +1 -1
  306. package/dist/utils/id.js +22 -9
  307. package/dist/utils/id.js.map +1 -1
  308. package/dist/utils/index.d.ts +2 -2
  309. package/dist/utils/index.d.ts.map +1 -1
  310. package/dist/utils/index.js +2 -2
  311. package/dist/utils/index.js.map +1 -1
  312. package/dist/utils/session.d.ts +44 -5
  313. package/dist/utils/session.d.ts.map +1 -1
  314. package/dist/utils/session.js +193 -37
  315. package/dist/utils/session.js.map +1 -1
  316. package/docs/README.md +15 -202
  317. package/docs/concepts/architecture.md +281 -0
  318. package/docs/concepts/directives.md +400 -0
  319. package/docs/concepts/pipeline.md +399 -0
  320. package/docs/guides/branching.md +263 -0
  321. package/docs/guides/compaction.md +163 -0
  322. package/docs/guides/conditions.md +167 -0
  323. package/docs/guides/error-handling.md +176 -0
  324. package/docs/guides/flow-control.md +409 -0
  325. package/docs/guides/instructions.md +210 -0
  326. package/docs/guides/persistence.md +182 -0
  327. package/docs/guides/streaming.md +137 -0
  328. package/docs/migration/README.md +15 -0
  329. package/docs/migration/route-to-flow.md +560 -0
  330. package/docs/migration/v1-to-v2.md +909 -0
  331. package/docs/reference/adapters.md +481 -0
  332. package/docs/reference/branches.md +241 -0
  333. package/docs/reference/create-agent.md +186 -0
  334. package/docs/reference/directive.md +243 -0
  335. package/docs/reference/errors.md +122 -0
  336. package/docs/reference/flow.md +238 -0
  337. package/docs/reference/instruction.md +177 -0
  338. package/docs/reference/pre-directive.md +131 -0
  339. package/docs/reference/providers.md +227 -0
  340. package/docs/reference/signals.md +356 -0
  341. package/docs/reference/step.md +339 -0
  342. package/docs/reference/tool.md +269 -0
  343. package/docs/start/01-install.md +81 -0
  344. package/docs/start/02-first-agent.md +196 -0
  345. package/docs/start/03-collect-data.md +222 -0
  346. package/docs/start/04-add-tools.md +276 -0
  347. package/docs/start/05-go-to-production.md +216 -0
  348. package/examples/01-quickstart.ts +20 -0
  349. package/examples/02-data-extraction.ts +90 -0
  350. package/examples/03-tools.ts +136 -0
  351. package/examples/04-instructions.ts +100 -0
  352. package/examples/05-branching.ts +140 -0
  353. package/examples/06-flow-control.ts +103 -0
  354. package/examples/07-streaming.ts +69 -0
  355. package/examples/08-persistence.ts +98 -0
  356. package/examples/09-signals.ts +144 -0
  357. package/examples/tsconfig.json +30 -0
  358. package/package.json +2 -1
  359. package/src/adapters/MemoryAdapter.ts +3 -3
  360. package/src/adapters/MongoAdapter.ts +3 -3
  361. package/src/adapters/OpenSearchAdapter.ts +10 -8
  362. package/src/adapters/PostgreSQLAdapter.ts +26 -10
  363. package/src/adapters/PrismaAdapter.ts +6 -6
  364. package/src/adapters/RedisAdapter.ts +3 -3
  365. package/src/adapters/SQLiteAdapter.ts +31 -12
  366. package/src/constants/index.ts +2 -10
  367. package/src/core/Agent.ts +585 -374
  368. package/src/core/AutoChainExecutor.ts +440 -0
  369. package/src/core/BranchEvaluator.ts +167 -0
  370. package/src/core/DirectiveBus.ts +248 -0
  371. package/src/core/DirectiveChainTracker.ts +144 -0
  372. package/src/core/Flow.ts +666 -0
  373. package/src/core/{RoutingEngine.ts → FlowRouter.ts} +385 -365
  374. package/src/core/PersistenceManager.ts +8 -8
  375. package/src/core/PromptComposer.ts +209 -140
  376. package/src/core/PromptSectionCache.ts +1 -1
  377. package/src/core/ResponseEngine.ts +61 -46
  378. package/src/core/ResponseModal.ts +1458 -1241
  379. package/src/core/ResponsePipeline.ts +675 -173
  380. package/src/core/SignalEvaluator.ts +420 -0
  381. package/src/core/SignalProcessor.ts +723 -0
  382. package/src/core/Step.ts +279 -176
  383. package/src/core/StreamingToolExecutor.ts +4 -4
  384. package/src/core/ToolManager.ts +200 -97
  385. package/src/core/createAgent.ts +40 -0
  386. package/src/core/flow-namespace.ts +219 -0
  387. package/src/index.ts +42 -36
  388. package/src/providers/GeminiProvider.ts +17 -15
  389. package/src/types/agent.ts +182 -53
  390. package/src/types/ai.ts +3 -3
  391. package/src/types/errors.ts +18 -0
  392. package/src/types/flow.ts +590 -0
  393. package/src/types/index.ts +43 -16
  394. package/src/types/persistence.ts +12 -8
  395. package/src/types/routing.ts +1 -1
  396. package/src/types/session.ts +26 -23
  397. package/src/types/signals.ts +321 -0
  398. package/src/types/template.ts +3 -11
  399. package/src/types/tool.ts +50 -42
  400. package/src/utils/condition.ts +13 -4
  401. package/src/utils/id.ts +27 -9
  402. package/src/utils/index.ts +6 -2
  403. package/src/utils/session.ts +238 -42
  404. package/dist/cjs/core/BatchExecutor.d.ts +0 -359
  405. package/dist/cjs/core/BatchExecutor.d.ts.map +0 -1
  406. package/dist/cjs/core/BatchExecutor.js +0 -861
  407. package/dist/cjs/core/BatchExecutor.js.map +0 -1
  408. package/dist/cjs/core/BatchPromptBuilder.d.ts +0 -89
  409. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +0 -1
  410. package/dist/cjs/core/BatchPromptBuilder.js +0 -223
  411. package/dist/cjs/core/BatchPromptBuilder.js.map +0 -1
  412. package/dist/cjs/core/Route.d.ts +0 -180
  413. package/dist/cjs/core/Route.d.ts.map +0 -1
  414. package/dist/cjs/core/Route.js +0 -542
  415. package/dist/cjs/core/Route.js.map +0 -1
  416. package/dist/cjs/core/RoutingEngine.d.ts +0 -185
  417. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  418. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  419. package/dist/cjs/types/route.d.ts +0 -336
  420. package/dist/cjs/types/route.d.ts.map +0 -1
  421. package/dist/cjs/types/route.js.map +0 -1
  422. package/dist/core/BatchExecutor.d.ts +0 -359
  423. package/dist/core/BatchExecutor.d.ts.map +0 -1
  424. package/dist/core/BatchExecutor.js +0 -856
  425. package/dist/core/BatchExecutor.js.map +0 -1
  426. package/dist/core/BatchPromptBuilder.d.ts +0 -89
  427. package/dist/core/BatchPromptBuilder.d.ts.map +0 -1
  428. package/dist/core/BatchPromptBuilder.js +0 -219
  429. package/dist/core/BatchPromptBuilder.js.map +0 -1
  430. package/dist/core/Route.d.ts +0 -180
  431. package/dist/core/Route.d.ts.map +0 -1
  432. package/dist/core/Route.js +0 -538
  433. package/dist/core/Route.js.map +0 -1
  434. package/dist/core/RoutingEngine.d.ts +0 -185
  435. package/dist/core/RoutingEngine.d.ts.map +0 -1
  436. package/dist/core/RoutingEngine.js.map +0 -1
  437. package/dist/types/route.d.ts +0 -336
  438. package/dist/types/route.d.ts.map +0 -1
  439. package/dist/types/route.js +0 -5
  440. package/dist/types/route.js.map +0 -1
  441. package/docs/CONTRIBUTING.md +0 -521
  442. package/docs/api/README.md +0 -3299
  443. package/docs/api/overview.md +0 -1410
  444. package/docs/architecture/data-extraction-flow.md +0 -360
  445. package/docs/architecture/multi-step-execution.md +0 -277
  446. package/docs/core/agent/README.md +0 -938
  447. package/docs/core/agent/context-management.md +0 -796
  448. package/docs/core/agent/rules-and-prohibitions.md +0 -113
  449. package/docs/core/agent/session-management.md +0 -693
  450. package/docs/core/ai-integration/prompt-composition.md +0 -355
  451. package/docs/core/ai-integration/providers.md +0 -515
  452. package/docs/core/ai-integration/response-processing.md +0 -433
  453. package/docs/core/conversation-flows/data-collection.md +0 -772
  454. package/docs/core/conversation-flows/route-dsl.md +0 -509
  455. package/docs/core/conversation-flows/routes.md +0 -249
  456. package/docs/core/conversation-flows/step-transitions.md +0 -731
  457. package/docs/core/conversation-flows/steps.md +0 -268
  458. package/docs/core/error-handling.md +0 -830
  459. package/docs/core/persistence/adapters.md +0 -255
  460. package/docs/core/persistence/session-storage.md +0 -656
  461. package/docs/core/routing/intelligent-routing.md +0 -470
  462. package/docs/core/tools/enhanced-tool.md +0 -186
  463. package/docs/core/tools/streaming-execution.md +0 -161
  464. package/docs/core/tools/tool-definition.md +0 -970
  465. package/docs/core/tools/tool-scoping.md +0 -819
  466. package/docs/guides/advanced-patterns/publishing.md +0 -186
  467. package/docs/guides/context-compaction.md +0 -96
  468. package/docs/guides/error-handling-patterns.md +0 -578
  469. package/docs/guides/getting-started/README.md +0 -795
  470. package/docs/guides/migration/README.md +0 -101
  471. package/docs/guides/migration/flexible-routing-conditions.md +0 -375
  472. package/docs/guides/migration/multi-step-execution.md +0 -393
  473. package/docs/guides/migration/response-modal-refactor.md +0 -518
  474. package/docs/guides/prompt-optimization.md +0 -164
  475. package/examples/advanced-patterns/context-compaction.ts +0 -223
  476. package/examples/advanced-patterns/knowledge-based-agent.ts +0 -735
  477. package/examples/advanced-patterns/persistent-onboarding.ts +0 -728
  478. package/examples/advanced-patterns/route-lifecycle-hooks.ts +0 -556
  479. package/examples/advanced-patterns/streaming-responses.ts +0 -656
  480. package/examples/ai-providers/anthropic-integration.ts +0 -388
  481. package/examples/ai-providers/openai-integration.ts +0 -228
  482. package/examples/condition-patterns/function-only-conditions.ts +0 -365
  483. package/examples/condition-patterns/mixed-array-conditions.ts +0 -477
  484. package/examples/condition-patterns/route-skipif-patterns.ts +0 -468
  485. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  486. package/examples/condition-patterns/string-only-conditions.ts +0 -296
  487. package/examples/conversation-flows/completion-transitions.ts +0 -318
  488. package/examples/core-concepts/basic-agent.ts +0 -503
  489. package/examples/core-concepts/modern-streaming-api.ts +0 -309
  490. package/examples/core-concepts/schema-driven-extraction.ts +0 -332
  491. package/examples/core-concepts/session-management.ts +0 -494
  492. package/examples/integrations/database-integration.ts +0 -631
  493. package/examples/integrations/healthcare-integration.ts +0 -595
  494. package/examples/integrations/search-integration.ts +0 -530
  495. package/examples/integrations/server-session-management.ts +0 -307
  496. package/examples/persistence/custom-adapter.ts +0 -526
  497. package/examples/persistence/database-persistence.ts +0 -583
  498. package/examples/persistence/memory-sessions.ts +0 -495
  499. package/examples/persistence/prisma-schema.example.prisma +0 -74
  500. package/examples/persistence/redis-persistence.ts +0 -488
  501. package/examples/tools/basic-tools.ts +0 -765
  502. package/examples/tools/data-enrichment-tools.ts +0 -593
  503. package/examples/tools/enhanced-tool-metadata.ts +0 -268
  504. package/examples/tools/streaming-tool-execution.ts +0 -283
  505. package/src/core/BatchExecutor.ts +0 -1187
  506. package/src/core/BatchPromptBuilder.ts +0 -299
  507. package/src/core/Route.ts +0 -678
  508. package/src/types/route.ts +0 -392
@@ -1,309 +0,0 @@
1
- /**
2
- * Example: Modern Streaming API
3
- *
4
- * This example demonstrates the new agent.stream() method introduced in the
5
- * ResponseModal refactor. The modern API provides automatic session management
6
- * and a simpler interface compared to the legacy respondStream() method.
7
- */
8
-
9
- import {
10
- Agent,
11
- AnthropicProvider,
12
- OpenAIProvider,
13
- } from "../../src/index";
14
-
15
- // Context type for our examples
16
- interface UserContext {
17
- userId: string;
18
- preferences: {
19
- language?: string;
20
- verbosity: "concise" | "detailed";
21
- };
22
- }
23
-
24
- async function basicModernStreaming() {
25
- console.log("\n🚀 Example 1: Basic Modern Streaming API\n");
26
-
27
- const provider = new AnthropicProvider({
28
- apiKey: process.env.ANTHROPIC_API_KEY || "",
29
- model: "claude-sonnet-4-5",
30
- });
31
-
32
- const agent = new Agent<UserContext, unknown>({
33
- name: "ModernStreamingAgent",
34
- description: "Demonstrates the new stream() API",
35
- context: {
36
- userId: "user123",
37
- preferences: {
38
- language: "English",
39
- verbosity: "concise",
40
- },
41
- },
42
- provider,
43
- });
44
-
45
- try {
46
- console.log("📤 Using modern stream() API...\n");
47
- console.log("Response: ");
48
-
49
- // NEW: Simple streaming with automatic session management
50
- for await (const chunk of agent.stream("What is machine learning?")) {
51
- if (chunk.delta) {
52
- process.stdout.write(chunk.delta);
53
- }
54
-
55
- if (chunk.done) {
56
- console.log("\n\n✅ Stream complete!");
57
- console.log(`📊 Session has ${agent.session.getHistory().length} messages`);
58
- console.log("💡 Session history was automatically managed!");
59
- }
60
- }
61
- } catch (error) {
62
- console.error("❌ Error:", error);
63
- }
64
- }
65
-
66
- async function streamingWithOptions() {
67
- console.log("\n🚀 Example 2: Streaming with Options\n");
68
-
69
- const provider = new OpenAIProvider({
70
- apiKey: process.env.OPENAI_API_KEY || "",
71
- model: "gpt-4",
72
- });
73
-
74
- const agent = new Agent<UserContext, unknown>({
75
- name: "OptionsStreamingAgent",
76
- description: "Demonstrates streaming with options",
77
- context: {
78
- userId: "user456",
79
- preferences: {
80
- language: "English",
81
- verbosity: "detailed",
82
- },
83
- },
84
- provider,
85
- });
86
-
87
- try {
88
- console.log("📤 Streaming with context override and abort signal...\n");
89
- console.log("Response: ");
90
-
91
- // Create abort controller for cancellation
92
- const abortController = new AbortController();
93
-
94
- // Cancel after 10 seconds
95
- setTimeout(() => {
96
- console.log("\n⚠️ Aborting stream...");
97
- abortController.abort();
98
- }, 10000);
99
-
100
- // Stream with options
101
- for await (const chunk of agent.stream("Explain quantum computing in detail", {
102
- contextOverride: {
103
- preferences: { verbosity: "concise" } // Override to be more concise
104
- },
105
- signal: abortController.signal
106
- })) {
107
- if (chunk.delta) {
108
- process.stdout.write(chunk.delta);
109
- }
110
-
111
- if (chunk.done) {
112
- console.log("\n\n✅ Stream complete!");
113
- console.log("💡 Context was overridden for this response only");
114
- clearTimeout();
115
- }
116
- }
117
- } catch (error) {
118
- if (error instanceof Error && error.name === "AbortError") {
119
- console.log("\n🛑 Stream was successfully aborted!");
120
- } else {
121
- console.error("❌ Error:", error);
122
- }
123
- }
124
- }
125
-
126
- async function conversationFlow() {
127
- console.log("\n🚀 Example 3: Multi-turn Conversation Flow\n");
128
-
129
- const provider = new AnthropicProvider({
130
- apiKey: process.env.ANTHROPIC_API_KEY || "",
131
- model: "claude-sonnet-4-5",
132
- });
133
-
134
- const agent = new Agent<UserContext, unknown>({
135
- name: "ConversationAgent",
136
- description: "Demonstrates multi-turn conversations",
137
- context: {
138
- userId: "user789",
139
- preferences: {
140
- language: "English",
141
- verbosity: "detailed",
142
- },
143
- },
144
- provider,
145
- });
146
-
147
- const messages = [
148
- "What is TypeScript?",
149
- "How is it different from JavaScript?",
150
- "Can you give me a simple example?",
151
- "Thank you for the explanation!"
152
- ];
153
-
154
- try {
155
- console.log("📤 Multi-turn conversation with automatic session management...\n");
156
-
157
- for (let i = 0; i < messages.length; i++) {
158
- console.log(`\n${"=".repeat(60)}`);
159
- console.log(`💬 Turn ${i + 1}: ${messages[i]}`);
160
- console.log(`${"=".repeat(60)}`);
161
- console.log("Response: ");
162
-
163
- // Each stream() call automatically manages the session
164
- for await (const chunk of agent.stream(messages[i])) {
165
- if (chunk.delta) {
166
- process.stdout.write(chunk.delta);
167
- }
168
-
169
- if (chunk.done) {
170
- console.log(`\n📊 Session now has ${agent.session.getHistory().length} messages`);
171
- }
172
- }
173
- }
174
-
175
- console.log("\n✅ Conversation complete!");
176
- console.log("💡 All session management was handled automatically");
177
- console.log(`📊 Final session has ${agent.session.getHistory().length} messages`);
178
-
179
- } catch (error) {
180
- console.error("❌ Error:", error);
181
- }
182
- }
183
-
184
- async function migrationComparison() {
185
- console.log("\n🚀 Example 4: Migration from respondStream() to stream()\n");
186
-
187
- const provider = new AnthropicProvider({
188
- apiKey: process.env.ANTHROPIC_API_KEY || "",
189
- model: "claude-sonnet-4-5",
190
- });
191
-
192
- const agent = new Agent<UserContext, unknown>({
193
- name: "MigrationAgent",
194
- description: "Shows migration from old to new API",
195
- context: {
196
- userId: "migration-user",
197
- preferences: {
198
- language: "English",
199
- verbosity: "concise",
200
- },
201
- },
202
- provider,
203
- });
204
-
205
- const userMessage = "What are the benefits of TypeScript?";
206
-
207
- try {
208
- // ========================================================================
209
- // OLD WAY: respondStream() - Manual session management
210
- // ========================================================================
211
- console.log("🔸 OLD WAY: Using respondStream() with manual session management");
212
- console.log("Code: agent.respondStream({ history: agent.session.getHistory() })");
213
- console.log("Response: ");
214
-
215
- // Manual session management required
216
- await agent.session.addMessage("user", userMessage);
217
-
218
- let oldResponse = "";
219
- for await (const chunk of agent.respondStream({
220
- history: agent.session.getHistory()
221
- })) {
222
- if (chunk.delta) {
223
- process.stdout.write(chunk.delta);
224
- oldResponse += chunk.delta;
225
- }
226
-
227
- if (chunk.done) {
228
- // Manual history update required
229
- await agent.session.addMessage("assistant", oldResponse);
230
- console.log("\n ✅ Manual session update completed");
231
- }
232
- }
233
-
234
- console.log("\n" + "=".repeat(60));
235
-
236
- // ========================================================================
237
- // NEW WAY: stream() - Automatic session management
238
- // ========================================================================
239
- console.log("🔸 NEW WAY: Using stream() with automatic session management");
240
- console.log("Code: agent.stream('message')");
241
- console.log("Response: ");
242
-
243
- // Automatic session management - just pass the message!
244
- for await (const chunk of agent.stream("Can you elaborate on the type safety benefits?")) {
245
- if (chunk.delta) {
246
- process.stdout.write(chunk.delta);
247
- }
248
-
249
- if (chunk.done) {
250
- console.log("\n ✅ Automatic session update - no manual work needed!");
251
- }
252
- }
253
-
254
- console.log("\n📊 Migration Benefits:");
255
- console.log(" ✅ Simpler API: agent.stream('message') vs complex parameters");
256
- console.log(" ✅ Automatic session management - no manual addMessage() calls");
257
- console.log(" ✅ Same performance and features as respondStream()");
258
- console.log(" ✅ Backward compatibility - respondStream() still works");
259
- console.log(" ✅ Consistent with chat() API patterns");
260
-
261
- console.log(`\n📊 Final session has ${agent.session.getHistory().length} messages`);
262
-
263
- } catch (error) {
264
- console.error("❌ Error:", error);
265
- }
266
- }
267
-
268
- async function main() {
269
- console.log("🚀 Modern Streaming API Examples");
270
- console.log("=".repeat(60));
271
-
272
- const examples = [
273
- { name: "Basic Modern Streaming", fn: basicModernStreaming },
274
- { name: "Streaming with Options", fn: streamingWithOptions },
275
- { name: "Multi-turn Conversation", fn: conversationFlow },
276
- { name: "Migration Comparison", fn: migrationComparison },
277
- ];
278
-
279
- console.log("\nAvailable Examples:");
280
- examples.forEach((ex, i) => {
281
- console.log(` ${i + 1}. ${ex.name}`);
282
- });
283
-
284
- console.log("\n💡 Key Benefits of Modern stream() API:");
285
- console.log(" - Simple interface: agent.stream('message')");
286
- console.log(" - Automatic session management");
287
- console.log(" - No manual history updates needed");
288
- console.log(" - Same performance as respondStream()");
289
- console.log(" - Full backward compatibility maintained");
290
-
291
- console.log("\n" + "=".repeat(60));
292
-
293
- // Run examples if API key is available
294
- if (process.env.ANTHROPIC_API_KEY || process.env.OPENAI_API_KEY) {
295
- await basicModernStreaming();
296
- await migrationComparison();
297
- } else {
298
- console.log(
299
- "\n⚠️ Set ANTHROPIC_API_KEY or OPENAI_API_KEY to run examples."
300
- );
301
- }
302
- }
303
-
304
- // Run if executed directly
305
- if (import.meta.url === `file://${process.argv[1]}`) {
306
- main().catch(console.error);
307
- }
308
-
309
- export { main };
@@ -1,332 +0,0 @@
1
- /**
2
- * Schema-Driven Data Extraction Example
3
- *
4
- * This example demonstrates how to use JSON Schema to define data contracts
5
- * and extract structured data reliably from conversations.
6
- *
7
- * Key concepts:
8
- * - Schema-first data definition
9
- * - Type-safe data extraction
10
- * - Automatic validation
11
- * - NEW: Flexible ConditionTemplate patterns for routing and step control:
12
- * - String-only conditions: "user wants to register" (AI context only)
13
- * - Function-only conditions: (ctx) => ctx.data?.complete (programmatic only)
14
- * - Mixed arrays: ["user provided info", (ctx) => !!ctx.data?.name] (hybrid)
15
- * - Enhanced skipIf conditions for smart flow control
16
- */
17
-
18
- import { Agent, GeminiProvider, type Tool } from "../../src/index";
19
-
20
- // Define the data structure we want to collect
21
- interface UserProfileData {
22
- name: string;
23
- email: string;
24
- age: number;
25
- interests: string[];
26
- preferredContact: "email" | "phone" | "sms";
27
- newsletterOptIn: boolean;
28
- }
29
-
30
- // Define a tool that uses the collected data - using unified Tool interface
31
- const saveUserProfileTool: Tool<unknown, UserProfileData> = {
32
- id: "save_user_profile",
33
- description: "Save the collected user profile information",
34
- parameters: {
35
- type: "object",
36
- properties: {},
37
- },
38
- handler: async (context, args) => {
39
- console.log("Saving user profile:", context.data);
40
-
41
- // Simulate saving to database
42
- console.log("Profile data:", context.data);
43
-
44
- return {
45
- data: `Profile saved successfully! Welcome ${context.data?.name}!`,
46
- };
47
- },
48
- };
49
-
50
- // Define the schema for data validation and extraction
51
- const userProfileSchema = {
52
- type: "object",
53
- properties: {
54
- name: {
55
- type: "string",
56
- description: "The user's full name",
57
- minLength: 2,
58
- maxLength: 100,
59
- },
60
- email: {
61
- type: "string",
62
- format: "email",
63
- description: "The user's email address",
64
- },
65
- age: {
66
- type: "number",
67
- description: "The user's age in years",
68
- minimum: 13,
69
- maximum: 120,
70
- },
71
- interests: {
72
- type: "array",
73
- items: { type: "string" },
74
- description: "User's interests and hobbies",
75
- minItems: 1,
76
- maxItems: 10,
77
- },
78
- preferredContact: {
79
- type: "string",
80
- enum: ["email", "phone", "sms"],
81
- description: "Preferred contact method",
82
- default: "email",
83
- },
84
- newsletterOptIn: {
85
- type: "boolean",
86
- description: "Whether user wants to receive newsletters",
87
- default: false,
88
- },
89
- },
90
- required: ["name", "email"],
91
- };
92
-
93
- // Create the agent with agent-level schema
94
- const agent = new Agent<unknown, UserProfileData>({
95
- name: "ProfileBot",
96
- description:
97
- "A bot that collects user profile information using schema-driven extraction",
98
- provider: new GeminiProvider({
99
- apiKey: process.env.GEMINI_API_KEY!,
100
- model: "models/gemini-2.5-flash",
101
- }),
102
- // NEW: Agent-level schema definition
103
- schema: userProfileSchema,
104
- });
105
-
106
- // Add tool using unified interface
107
- agent.addTool(saveUserProfileTool);
108
-
109
- // Create a route that collects profile information step by step
110
- agent.createRoute({
111
- title: "User Profile Collection",
112
- description: "Collect comprehensive user profile information",
113
- // Mixed condition: AI context + programmatic validation
114
- when: [
115
- "user wants to create a profile or register",
116
- (ctx) => {
117
- const message = ctx.helpers.getLastUserMessage()?.toLowerCase() || '';
118
- return message.includes('profile') || message.includes('register') || message.includes('sign up');
119
- }
120
- ],
121
- // Skip if user already has a complete profile
122
- skipIf: (ctx) => Boolean(ctx.data?.name && ctx.data?.email && ctx.data?.age),
123
- // NEW: Required fields for route completion (instead of schema)
124
- requiredFields: ["name", "email"],
125
- // NEW: Optional fields that enhance the experience
126
- optionalFields: ["age", "interests", "preferredContact", "newsletterOptIn"],
127
- // Use sequential steps for a linear flow with smart skipIf conditions
128
- steps: [
129
- {
130
- id: "ask_name",
131
- description: "Ask for user's name",
132
- prompt: "Hi! I'd like to create a profile for you. What's your name?",
133
- collect: ["name"],
134
- // String-only skipIf for AI context
135
- skipIf: "user already provided their name",
136
- },
137
- {
138
- id: "ask_email",
139
- description: "Ask for user's email",
140
- prompt: "What's your email address?",
141
- collect: ["email"],
142
- requires: ["name"],
143
- // Function-only skipIf for programmatic logic
144
- skipIf: (ctx) => !!ctx.data?.email,
145
- },
146
- {
147
- id: "ask_age",
148
- description: "Ask for user's age (optional)",
149
- prompt: "How old are you? (optional)",
150
- collect: ["age"],
151
- requires: ["name", "email"],
152
- // Mixed skipIf: AI context + programmatic check
153
- skipIf: [
154
- "age already collected",
155
- (ctx) => ctx.data?.age !== undefined
156
- ],
157
- },
158
- {
159
- id: "ask_interests",
160
- description: "Ask for user's interests (optional)",
161
- prompt: "What are your interests or hobbies? (optional)",
162
- collect: ["interests"],
163
- requires: ["name", "email"],
164
- // Mixed skipIf with complex logic
165
- skipIf: [
166
- "interests already provided",
167
- (ctx) => !!(ctx.data?.interests && ctx.data.interests.length > 0)
168
- ],
169
- },
170
- {
171
- id: "ask_contact_preference",
172
- description: "Ask for preferred contact method",
173
- prompt: "What's your preferred contact method?",
174
- collect: ["preferredContact"],
175
- requires: ["name", "email"],
176
- // Function-only skipIf
177
- skipIf: (ctx) => !!ctx.data?.preferredContact,
178
- },
179
- {
180
- id: "ask_newsletter",
181
- description: "Ask about newsletter subscription",
182
- prompt: "Would you like to subscribe to our newsletter?",
183
- collect: ["newsletterOptIn"],
184
- requires: ["name", "email"],
185
- // String-only skipIf for simple cases
186
- skipIf: "newsletter preference already collected",
187
- },
188
- {
189
- id: "save_profile",
190
- description: "Save the collected profile",
191
- prompt:
192
- "Thanks for providing your information! Let me save your profile.",
193
- tools: ["save_user_profile"], // Reference by ID
194
- requires: ["name", "email"],
195
- },
196
- ],
197
- });
198
-
199
- // Example conversation demonstrating schema-driven extraction
200
- async function demonstrateSchemaExtraction() {
201
- console.log("=== Schema-Driven Data Extraction Demo ===\n");
202
-
203
- // First message - user provides name and email
204
- console.log("User: Hi, I'm John Doe and my email is john@example.com");
205
- const response1 = await agent.respond({
206
- history: [
207
- {
208
- role: "user",
209
- content: "Hi, I'm John Doe and my email is john@example.com",
210
- name: "John",
211
- },
212
- ],
213
- });
214
-
215
- console.log("Bot:", response1.message);
216
- console.log(
217
- "Collected data:",
218
- JSON.stringify(response1.session?.data as Partial<UserProfileData>, null, 2)
219
- );
220
-
221
- // Second message - user provides more information
222
- console.log(
223
- "\nUser: I'm 30 years old and I like hiking, reading, and photography"
224
- );
225
- const response2 = await agent.respond({
226
- history: [
227
- {
228
- role: "user",
229
- content: "Hi, I'm John Doe and my email is john@example.com",
230
- name: "John",
231
- },
232
- {
233
- role: "assistant",
234
- content: response1.message,
235
- },
236
- {
237
- role: "user",
238
- content: "I'm 30 years old and I like hiking, reading, and photography",
239
- name: "John",
240
- },
241
- ],
242
- session: response1.session,
243
- });
244
-
245
- console.log("Bot:", response2.message);
246
- console.log(
247
- "Collected data:",
248
- JSON.stringify(response2.session?.data as Partial<UserProfileData>, null, 2)
249
- );
250
-
251
- // Third message - user provides contact preference and completes profile
252
- console.log(
253
- "\nUser: Please contact me by email and yes, I'd like the newsletter"
254
- );
255
- const response3 = await agent.respond({
256
- history: [
257
- {
258
- role: "user",
259
- content: "Hi, I'm John Doe and my email is john@example.com",
260
- name: "John",
261
- },
262
- {
263
- role: "assistant",
264
- content: response1.message,
265
- },
266
- {
267
- role: "user",
268
- content: "I'm 30 years old and I like hiking, reading, and photography",
269
- name: "John",
270
- },
271
- {
272
- role: "assistant",
273
- content: response2.message,
274
- },
275
- {
276
- role: "user",
277
- content: "Please contact me by email and yes, I'd like the newsletter",
278
- name: "John",
279
- },
280
- ],
281
- session: response2.session,
282
- });
283
-
284
- console.log("Bot:", response3.message);
285
- console.log(
286
- "Final collected data:",
287
- JSON.stringify(response3.session?.data as Partial<UserProfileData>, null, 2)
288
- );
289
- console.log("Route complete:", response3.isRouteComplete);
290
- }
291
-
292
- // Demonstrate with a single comprehensive message
293
- async function demonstrateSmartSkipping() {
294
- console.log("\n=== Smart Skipping Demo ===\n");
295
-
296
- console.log("User provides everything in one message:");
297
- console.log(
298
- "User: I'm Sarah Johnson, sarah@email.com, 28 years old. I enjoy cooking, travel, and music. Contact me by phone and yes to newsletter."
299
- );
300
-
301
- const response = await agent.respond({
302
- history: [
303
- {
304
- role: "user",
305
- content:
306
- "I'm Sarah Johnson, sarah@email.com, 28 years old. I enjoy cooking, travel, and music. Contact me by phone and yes to newsletter.",
307
- name: "Sarah",
308
- },
309
- ],
310
- });
311
-
312
- console.log("Bot:", response.message);
313
- console.log(
314
- "Collected data:",
315
- JSON.stringify(response.session?.data as Partial<UserProfileData>, null, 2)
316
- );
317
- console.log("Route complete:", response.isRouteComplete);
318
- }
319
-
320
- // Run the demonstrations
321
- async function main() {
322
- try {
323
- await demonstrateSchemaExtraction();
324
- await demonstrateSmartSkipping();
325
- } catch (error) {
326
- console.error("Error:", error);
327
- }
328
- }
329
-
330
- if (import.meta.url === `file://${process.argv[1]}`) {
331
- main().catch(console.error);
332
- }