@falai/agent 2.6.1 → 3.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 (611) hide show
  1. package/README.md +2 -2
  2. package/dist/adapters/MemoryAdapter.d.ts +1 -1
  3. package/dist/adapters/MemoryAdapter.d.ts.map +1 -1
  4. package/dist/adapters/MemoryAdapter.js +32 -36
  5. package/dist/adapters/MemoryAdapter.js.map +1 -1
  6. package/dist/adapters/MongoAdapter.d.ts +1 -1
  7. package/dist/adapters/MongoAdapter.d.ts.map +1 -1
  8. package/dist/adapters/MongoAdapter.js +2 -2
  9. package/dist/adapters/MongoAdapter.js.map +1 -1
  10. package/dist/adapters/OpenSearchAdapter.d.ts +1 -1
  11. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  12. package/dist/adapters/OpenSearchAdapter.js +3 -3
  13. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  14. package/dist/adapters/PostgreSQLAdapter.d.ts +1 -1
  15. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  16. package/dist/adapters/PostgreSQLAdapter.js +18 -13
  17. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  18. package/dist/adapters/PrismaAdapter.d.ts +1 -1
  19. package/dist/adapters/PrismaAdapter.d.ts.map +1 -1
  20. package/dist/adapters/PrismaAdapter.js +3 -3
  21. package/dist/adapters/PrismaAdapter.js.map +1 -1
  22. package/dist/adapters/RedisAdapter.d.ts +2 -1
  23. package/dist/adapters/RedisAdapter.d.ts.map +1 -1
  24. package/dist/adapters/RedisAdapter.js +77 -27
  25. package/dist/adapters/RedisAdapter.js.map +1 -1
  26. package/dist/adapters/SQLiteAdapter.d.ts +1 -1
  27. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  28. package/dist/adapters/SQLiteAdapter.js +9 -31
  29. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  30. package/dist/adapters/index.d.ts +13 -13
  31. package/dist/adapters/index.d.ts.map +1 -1
  32. package/dist/adapters/index.js +7 -7
  33. package/dist/adapters/index.js.map +1 -1
  34. package/dist/adapters/sessionRow.d.ts +22 -0
  35. package/dist/adapters/sessionRow.d.ts.map +1 -0
  36. package/dist/adapters/sessionRow.js +48 -0
  37. package/dist/adapters/sessionRow.js.map +1 -0
  38. package/dist/cjs/adapters/MemoryAdapter.d.ts +1 -1
  39. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -1
  40. package/dist/cjs/adapters/MemoryAdapter.js +39 -43
  41. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  42. package/dist/cjs/adapters/MongoAdapter.d.ts +1 -1
  43. package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -1
  44. package/dist/cjs/adapters/MongoAdapter.js +4 -4
  45. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  46. package/dist/cjs/adapters/OpenSearchAdapter.d.ts +1 -1
  47. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  48. package/dist/cjs/adapters/OpenSearchAdapter.js +6 -6
  49. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  50. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +1 -1
  51. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  52. package/dist/cjs/adapters/PostgreSQLAdapter.js +20 -15
  53. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  54. package/dist/cjs/adapters/PrismaAdapter.d.ts +1 -1
  55. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -1
  56. package/dist/cjs/adapters/PrismaAdapter.js +7 -7
  57. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  58. package/dist/cjs/adapters/RedisAdapter.d.ts +2 -1
  59. package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
  60. package/dist/cjs/adapters/RedisAdapter.js +81 -31
  61. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  62. package/dist/cjs/adapters/SQLiteAdapter.d.ts +1 -1
  63. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  64. package/dist/cjs/adapters/SQLiteAdapter.js +11 -33
  65. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  66. package/dist/cjs/adapters/index.d.ts +13 -13
  67. package/dist/cjs/adapters/index.d.ts.map +1 -1
  68. package/dist/cjs/adapters/index.js +14 -14
  69. package/dist/cjs/adapters/index.js.map +1 -1
  70. package/dist/cjs/adapters/sessionRow.d.ts +22 -0
  71. package/dist/cjs/adapters/sessionRow.d.ts.map +1 -0
  72. package/dist/cjs/adapters/sessionRow.js +52 -0
  73. package/dist/cjs/adapters/sessionRow.js.map +1 -0
  74. package/dist/cjs/core/Agent.d.ts +19 -11
  75. package/dist/cjs/core/Agent.d.ts.map +1 -1
  76. package/dist/cjs/core/Agent.js +102 -64
  77. package/dist/cjs/core/Agent.js.map +1 -1
  78. package/dist/cjs/core/AutoChainExecutor.d.ts +12 -22
  79. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -1
  80. package/dist/cjs/core/AutoChainExecutor.js +46 -49
  81. package/dist/cjs/core/AutoChainExecutor.js.map +1 -1
  82. package/dist/cjs/core/BranchEvaluator.d.ts +4 -4
  83. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -1
  84. package/dist/cjs/core/BranchEvaluator.js +6 -6
  85. package/dist/cjs/core/BranchEvaluator.js.map +1 -1
  86. package/dist/cjs/core/CompactionEngine.d.ts +16 -3
  87. package/dist/cjs/core/CompactionEngine.d.ts.map +1 -1
  88. package/dist/cjs/core/CompactionEngine.js +30 -6
  89. package/dist/cjs/core/CompactionEngine.js.map +1 -1
  90. package/dist/cjs/core/DirectiveChainTracker.d.ts +1 -1
  91. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -1
  92. package/dist/cjs/core/DirectiveChainTracker.js +5 -5
  93. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -1
  94. package/dist/cjs/core/Events.d.ts +1 -1
  95. package/dist/cjs/core/Events.d.ts.map +1 -1
  96. package/dist/cjs/core/Events.js +15 -15
  97. package/dist/cjs/core/Events.js.map +1 -1
  98. package/dist/cjs/core/Flow.d.ts +4 -4
  99. package/dist/cjs/core/Flow.d.ts.map +1 -1
  100. package/dist/cjs/core/Flow.js +15 -15
  101. package/dist/cjs/core/Flow.js.map +1 -1
  102. package/dist/cjs/core/FlowRouter.d.ts +4 -4
  103. package/dist/cjs/core/FlowRouter.d.ts.map +1 -1
  104. package/dist/cjs/core/FlowRouter.js +92 -70
  105. package/dist/cjs/core/FlowRouter.js.map +1 -1
  106. package/dist/cjs/core/PersistenceManager.d.ts +1 -1
  107. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  108. package/dist/cjs/core/PersistenceManager.js +10 -10
  109. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  110. package/dist/cjs/core/PromptComposer.d.ts +4 -4
  111. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  112. package/dist/cjs/core/PromptComposer.js +13 -13
  113. package/dist/cjs/core/PromptComposer.js.map +1 -1
  114. package/dist/cjs/core/PromptSectionCache.d.ts +2 -2
  115. package/dist/cjs/core/PromptSectionCache.d.ts.map +1 -1
  116. package/dist/cjs/core/ResponseEngine.d.ts +4 -4
  117. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  118. package/dist/cjs/core/ResponseEngine.js +7 -7
  119. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  120. package/dist/cjs/core/ResponseGenerationError.d.ts.map +1 -1
  121. package/dist/cjs/core/ResponseGenerationError.js +3 -5
  122. package/dist/cjs/core/ResponseGenerationError.js.map +1 -1
  123. package/dist/cjs/core/ResponseModal.d.ts +39 -10
  124. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  125. package/dist/cjs/core/ResponseModal.js +195 -72
  126. package/dist/cjs/core/ResponseModal.js.map +1 -1
  127. package/dist/cjs/core/ResponsePipeline.d.ts +50 -12
  128. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  129. package/dist/cjs/core/ResponsePipeline.js +301 -158
  130. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  131. package/dist/cjs/core/SessionFinalizer.d.ts +4 -4
  132. package/dist/cjs/core/SessionFinalizer.d.ts.map +1 -1
  133. package/dist/cjs/core/SessionFinalizer.js +36 -9
  134. package/dist/cjs/core/SessionFinalizer.js.map +1 -1
  135. package/dist/cjs/core/SessionManager.d.ts +15 -6
  136. package/dist/cjs/core/SessionManager.d.ts.map +1 -1
  137. package/dist/cjs/core/SessionManager.js +49 -22
  138. package/dist/cjs/core/SessionManager.js.map +1 -1
  139. package/dist/cjs/core/SignalCoordinator.d.ts +5 -5
  140. package/dist/cjs/core/SignalCoordinator.d.ts.map +1 -1
  141. package/dist/cjs/core/SignalCoordinator.js +12 -12
  142. package/dist/cjs/core/SignalCoordinator.js.map +1 -1
  143. package/dist/cjs/core/SignalEvaluator.d.ts +4 -4
  144. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -1
  145. package/dist/cjs/core/SignalEvaluator.js +6 -6
  146. package/dist/cjs/core/SignalEvaluator.js.map +1 -1
  147. package/dist/cjs/core/SignalProcessor.d.ts +6 -6
  148. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -1
  149. package/dist/cjs/core/SignalProcessor.js +17 -89
  150. package/dist/cjs/core/SignalProcessor.js.map +1 -1
  151. package/dist/cjs/core/Step.d.ts +5 -5
  152. package/dist/cjs/core/Step.d.ts.map +1 -1
  153. package/dist/cjs/core/Step.js +65 -17
  154. package/dist/cjs/core/Step.js.map +1 -1
  155. package/dist/cjs/core/StepLifecycle.d.ts +18 -8
  156. package/dist/cjs/core/StepLifecycle.d.ts.map +1 -1
  157. package/dist/cjs/core/StepLifecycle.js +103 -20
  158. package/dist/cjs/core/StepLifecycle.js.map +1 -1
  159. package/dist/cjs/core/StreamingToolExecutor.d.ts +1 -1
  160. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  161. package/dist/cjs/core/StreamingToolExecutor.js +30 -6
  162. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  163. package/dist/cjs/core/ToolLoopExecutor.d.ts +8 -4
  164. package/dist/cjs/core/ToolLoopExecutor.d.ts.map +1 -1
  165. package/dist/cjs/core/ToolLoopExecutor.js +189 -97
  166. package/dist/cjs/core/ToolLoopExecutor.js.map +1 -1
  167. package/dist/cjs/core/ToolManager.d.ts +6 -6
  168. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  169. package/dist/cjs/core/ToolManager.js +102 -79
  170. package/dist/cjs/core/ToolManager.js.map +1 -1
  171. package/dist/cjs/core/createAgent.d.ts +2 -2
  172. package/dist/cjs/core/createAgent.d.ts.map +1 -1
  173. package/dist/cjs/core/createAgent.js +2 -2
  174. package/dist/cjs/core/createAgent.js.map +1 -1
  175. package/dist/cjs/core/flow-namespace.d.ts +16 -1
  176. package/dist/cjs/core/flow-namespace.d.ts.map +1 -1
  177. package/dist/cjs/core/flow-namespace.js +26 -4
  178. package/dist/cjs/core/flow-namespace.js.map +1 -1
  179. package/dist/cjs/core/toolGates.d.ts +1 -1
  180. package/dist/cjs/core/toolGates.d.ts.map +1 -1
  181. package/dist/cjs/core/toolGates.js +3 -3
  182. package/dist/cjs/core/toolGates.js.map +1 -1
  183. package/dist/cjs/index.d.ts +50 -45
  184. package/dist/cjs/index.d.ts.map +1 -1
  185. package/dist/cjs/index.js +96 -88
  186. package/dist/cjs/index.js.map +1 -1
  187. package/dist/cjs/providers/AnthropicProvider.d.ts +25 -35
  188. package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
  189. package/dist/cjs/providers/AnthropicProvider.js +30 -426
  190. package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
  191. package/dist/cjs/providers/DeepSeekProvider.d.ts +13 -34
  192. package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
  193. package/dist/cjs/providers/DeepSeekProvider.js +17 -51
  194. package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
  195. package/dist/cjs/providers/GeminiProvider.d.ts +22 -75
  196. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  197. package/dist/cjs/providers/GeminiProvider.js +32 -558
  198. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  199. package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
  200. package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
  201. package/dist/cjs/providers/GenericOpenAICompatibleProvider.js +14 -20
  202. package/dist/cjs/providers/GenericOpenAICompatibleProvider.js.map +1 -1
  203. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +26 -135
  204. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  205. package/dist/cjs/providers/OpenAICompatibleProvider.js +40 -496
  206. package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -1
  207. package/dist/cjs/providers/OpenAIProvider.d.ts +14 -20
  208. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  209. package/dist/cjs/providers/OpenAIProvider.js +21 -28
  210. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  211. package/dist/cjs/providers/OpenRouterProvider.d.ts +20 -24
  212. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  213. package/dist/cjs/providers/OpenRouterProvider.js +22 -38
  214. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  215. package/dist/cjs/providers/ProviderAdapter.d.ts +94 -0
  216. package/dist/cjs/providers/ProviderAdapter.d.ts.map +1 -0
  217. package/dist/cjs/providers/ProviderAdapter.js +257 -0
  218. package/dist/cjs/providers/ProviderAdapter.js.map +1 -0
  219. package/dist/cjs/providers/index.d.ts +21 -18
  220. package/dist/cjs/providers/index.d.ts.map +1 -1
  221. package/dist/cjs/providers/index.js +23 -21
  222. package/dist/cjs/providers/index.js.map +1 -1
  223. package/dist/cjs/types/agent.d.ts +37 -11
  224. package/dist/cjs/types/agent.d.ts.map +1 -1
  225. package/dist/cjs/types/ai.d.ts +11 -21
  226. package/dist/cjs/types/ai.d.ts.map +1 -1
  227. package/dist/cjs/types/compaction.d.ts +2 -2
  228. package/dist/cjs/types/compaction.d.ts.map +1 -1
  229. package/dist/cjs/types/errors.d.ts +16 -20
  230. package/dist/cjs/types/errors.d.ts.map +1 -1
  231. package/dist/cjs/types/errors.js +17 -18
  232. package/dist/cjs/types/errors.js.map +1 -1
  233. package/dist/cjs/types/flow.d.ts +56 -39
  234. package/dist/cjs/types/flow.d.ts.map +1 -1
  235. package/dist/cjs/types/history.d.ts +1 -1
  236. package/dist/cjs/types/history.d.ts.map +1 -1
  237. package/dist/cjs/types/index.d.ts +17 -17
  238. package/dist/cjs/types/index.d.ts.map +1 -1
  239. package/dist/cjs/types/index.js +14 -14
  240. package/dist/cjs/types/index.js.map +1 -1
  241. package/dist/cjs/types/persistence.d.ts +2 -2
  242. package/dist/cjs/types/persistence.d.ts.map +1 -1
  243. package/dist/cjs/types/session.d.ts +4 -4
  244. package/dist/cjs/types/session.d.ts.map +1 -1
  245. package/dist/cjs/types/signals.d.ts +3 -3
  246. package/dist/cjs/types/signals.d.ts.map +1 -1
  247. package/dist/cjs/types/template.d.ts +2 -2
  248. package/dist/cjs/types/template.d.ts.map +1 -1
  249. package/dist/cjs/types/tool.d.ts +4 -2
  250. package/dist/cjs/types/tool.d.ts.map +1 -1
  251. package/dist/cjs/types/tool.js.map +1 -1
  252. package/dist/cjs/utils/condition.d.ts +1 -1
  253. package/dist/cjs/utils/condition.d.ts.map +1 -1
  254. package/dist/cjs/utils/condition.js +6 -6
  255. package/dist/cjs/utils/condition.js.map +1 -1
  256. package/dist/cjs/utils/event.d.ts +1 -1
  257. package/dist/cjs/utils/event.d.ts.map +1 -1
  258. package/dist/cjs/utils/event.js +2 -2
  259. package/dist/cjs/utils/event.js.map +1 -1
  260. package/dist/cjs/utils/history.d.ts +2 -2
  261. package/dist/cjs/utils/history.d.ts.map +1 -1
  262. package/dist/cjs/utils/history.js +15 -15
  263. package/dist/cjs/utils/history.js.map +1 -1
  264. package/dist/cjs/utils/index.d.ts +11 -13
  265. package/dist/cjs/utils/index.d.ts.map +1 -1
  266. package/dist/cjs/utils/index.js +57 -58
  267. package/dist/cjs/utils/index.js.map +1 -1
  268. package/dist/cjs/utils/serialize.d.ts +17 -0
  269. package/dist/cjs/utils/serialize.d.ts.map +1 -1
  270. package/dist/cjs/utils/serialize.js +33 -0
  271. package/dist/cjs/utils/serialize.js.map +1 -1
  272. package/dist/cjs/utils/session.d.ts +23 -3
  273. package/dist/cjs/utils/session.d.ts.map +1 -1
  274. package/dist/cjs/utils/session.js +40 -8
  275. package/dist/cjs/utils/session.js.map +1 -1
  276. package/dist/cjs/utils/template.d.ts +3 -3
  277. package/dist/cjs/utils/template.d.ts.map +1 -1
  278. package/dist/cjs/utils/template.js +5 -5
  279. package/dist/cjs/utils/template.js.map +1 -1
  280. package/dist/constants/index.d.ts +1 -0
  281. package/dist/constants/index.js +1 -1
  282. package/dist/core/Agent.d.ts +19 -11
  283. package/dist/core/Agent.d.ts.map +1 -1
  284. package/dist/core/Agent.js +53 -15
  285. package/dist/core/Agent.js.map +1 -1
  286. package/dist/core/AutoChainExecutor.d.ts +12 -22
  287. package/dist/core/AutoChainExecutor.d.ts.map +1 -1
  288. package/dist/core/AutoChainExecutor.js +27 -30
  289. package/dist/core/AutoChainExecutor.js.map +1 -1
  290. package/dist/core/BranchEvaluator.d.ts +4 -4
  291. package/dist/core/BranchEvaluator.d.ts.map +1 -1
  292. package/dist/core/BranchEvaluator.js +2 -2
  293. package/dist/core/BranchEvaluator.js.map +1 -1
  294. package/dist/core/CompactionEngine.d.ts +16 -3
  295. package/dist/core/CompactionEngine.d.ts.map +1 -1
  296. package/dist/core/CompactionEngine.js +30 -6
  297. package/dist/core/CompactionEngine.js.map +1 -1
  298. package/dist/core/DirectiveChainTracker.d.ts +1 -1
  299. package/dist/core/DirectiveChainTracker.d.ts.map +1 -1
  300. package/dist/core/DirectiveChainTracker.js +2 -2
  301. package/dist/core/DirectiveChainTracker.js.map +1 -1
  302. package/dist/core/Events.d.ts +1 -1
  303. package/dist/core/Events.d.ts.map +1 -1
  304. package/dist/core/Events.js +1 -1
  305. package/dist/core/Events.js.map +1 -1
  306. package/dist/core/Flow.d.ts +4 -4
  307. package/dist/core/Flow.d.ts.map +1 -1
  308. package/dist/core/Flow.js +3 -3
  309. package/dist/core/Flow.js.map +1 -1
  310. package/dist/core/FlowRouter.d.ts +4 -4
  311. package/dist/core/FlowRouter.d.ts.map +1 -1
  312. package/dist/core/FlowRouter.js +36 -14
  313. package/dist/core/FlowRouter.js.map +1 -1
  314. package/dist/core/PersistenceManager.d.ts +1 -1
  315. package/dist/core/PersistenceManager.d.ts.map +1 -1
  316. package/dist/core/PersistenceManager.js +3 -3
  317. package/dist/core/PersistenceManager.js.map +1 -1
  318. package/dist/core/PromptComposer.d.ts +4 -4
  319. package/dist/core/PromptComposer.d.ts.map +1 -1
  320. package/dist/core/PromptComposer.js +3 -3
  321. package/dist/core/PromptComposer.js.map +1 -1
  322. package/dist/core/PromptSectionCache.d.ts +2 -2
  323. package/dist/core/PromptSectionCache.d.ts.map +1 -1
  324. package/dist/core/ResponseEngine.d.ts +4 -4
  325. package/dist/core/ResponseEngine.d.ts.map +1 -1
  326. package/dist/core/ResponseEngine.js +2 -2
  327. package/dist/core/ResponseEngine.js.map +1 -1
  328. package/dist/core/ResponseGenerationError.d.ts.map +1 -1
  329. package/dist/core/ResponseGenerationError.js +3 -5
  330. package/dist/core/ResponseGenerationError.js.map +1 -1
  331. package/dist/core/ResponseModal.d.ts +39 -10
  332. package/dist/core/ResponseModal.d.ts.map +1 -1
  333. package/dist/core/ResponseModal.js +152 -29
  334. package/dist/core/ResponseModal.js.map +1 -1
  335. package/dist/core/ResponsePipeline.d.ts +50 -12
  336. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  337. package/dist/core/ResponsePipeline.js +232 -89
  338. package/dist/core/ResponsePipeline.js.map +1 -1
  339. package/dist/core/SessionFinalizer.d.ts +4 -4
  340. package/dist/core/SessionFinalizer.d.ts.map +1 -1
  341. package/dist/core/SessionFinalizer.js +32 -5
  342. package/dist/core/SessionFinalizer.js.map +1 -1
  343. package/dist/core/SessionManager.d.ts +15 -6
  344. package/dist/core/SessionManager.d.ts.map +1 -1
  345. package/dist/core/SessionManager.js +46 -19
  346. package/dist/core/SessionManager.js.map +1 -1
  347. package/dist/core/SignalCoordinator.d.ts +5 -5
  348. package/dist/core/SignalCoordinator.d.ts.map +1 -1
  349. package/dist/core/SignalCoordinator.js +2 -2
  350. package/dist/core/SignalCoordinator.js.map +1 -1
  351. package/dist/core/SignalEvaluator.d.ts +4 -4
  352. package/dist/core/SignalEvaluator.d.ts.map +1 -1
  353. package/dist/core/SignalEvaluator.js +2 -2
  354. package/dist/core/SignalEvaluator.js.map +1 -1
  355. package/dist/core/SignalProcessor.d.ts +6 -6
  356. package/dist/core/SignalProcessor.d.ts.map +1 -1
  357. package/dist/core/SignalProcessor.js +7 -79
  358. package/dist/core/SignalProcessor.js.map +1 -1
  359. package/dist/core/Step.d.ts +5 -5
  360. package/dist/core/Step.d.ts.map +1 -1
  361. package/dist/core/Step.js +53 -5
  362. package/dist/core/Step.js.map +1 -1
  363. package/dist/core/StepLifecycle.d.ts +18 -8
  364. package/dist/core/StepLifecycle.d.ts.map +1 -1
  365. package/dist/core/StepLifecycle.js +98 -15
  366. package/dist/core/StepLifecycle.js.map +1 -1
  367. package/dist/core/StreamingToolExecutor.d.ts +1 -1
  368. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  369. package/dist/core/StreamingToolExecutor.js +29 -5
  370. package/dist/core/StreamingToolExecutor.js.map +1 -1
  371. package/dist/core/ToolLoopExecutor.d.ts +8 -4
  372. package/dist/core/ToolLoopExecutor.d.ts.map +1 -1
  373. package/dist/core/ToolLoopExecutor.js +157 -65
  374. package/dist/core/ToolLoopExecutor.js.map +1 -1
  375. package/dist/core/ToolManager.d.ts +6 -6
  376. package/dist/core/ToolManager.d.ts.map +1 -1
  377. package/dist/core/ToolManager.js +44 -21
  378. package/dist/core/ToolManager.js.map +1 -1
  379. package/dist/core/createAgent.d.ts +2 -2
  380. package/dist/core/createAgent.d.ts.map +1 -1
  381. package/dist/core/createAgent.js +1 -1
  382. package/dist/core/createAgent.js.map +1 -1
  383. package/dist/core/flow-namespace.d.ts +16 -1
  384. package/dist/core/flow-namespace.d.ts.map +1 -1
  385. package/dist/core/flow-namespace.js +23 -1
  386. package/dist/core/flow-namespace.js.map +1 -1
  387. package/dist/core/toolGates.d.ts +1 -1
  388. package/dist/core/toolGates.d.ts.map +1 -1
  389. package/dist/core/toolGates.js +1 -1
  390. package/dist/core/toolGates.js.map +1 -1
  391. package/dist/index.d.ts +50 -45
  392. package/dist/index.d.ts.map +1 -1
  393. package/dist/index.js +34 -30
  394. package/dist/index.js.map +1 -1
  395. package/dist/providers/AnthropicProvider.d.ts +25 -35
  396. package/dist/providers/AnthropicProvider.d.ts.map +1 -1
  397. package/dist/providers/AnthropicProvider.js +30 -423
  398. package/dist/providers/AnthropicProvider.js.map +1 -1
  399. package/dist/providers/DeepSeekProvider.d.ts +13 -34
  400. package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
  401. package/dist/providers/DeepSeekProvider.js +16 -47
  402. package/dist/providers/DeepSeekProvider.js.map +1 -1
  403. package/dist/providers/GeminiProvider.d.ts +22 -75
  404. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  405. package/dist/providers/GeminiProvider.js +32 -558
  406. package/dist/providers/GeminiProvider.js.map +1 -1
  407. package/dist/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
  408. package/dist/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
  409. package/dist/providers/GenericOpenAICompatibleProvider.js +13 -16
  410. package/dist/providers/GenericOpenAICompatibleProvider.js.map +1 -1
  411. package/dist/providers/OpenAICompatibleProvider.d.ts +26 -135
  412. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  413. package/dist/providers/OpenAICompatibleProvider.js +39 -495
  414. package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
  415. package/dist/providers/OpenAIProvider.d.ts +14 -20
  416. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  417. package/dist/providers/OpenAIProvider.js +20 -24
  418. package/dist/providers/OpenAIProvider.js.map +1 -1
  419. package/dist/providers/OpenRouterProvider.d.ts +20 -24
  420. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  421. package/dist/providers/OpenRouterProvider.js +21 -34
  422. package/dist/providers/OpenRouterProvider.js.map +1 -1
  423. package/dist/providers/ProviderAdapter.d.ts +94 -0
  424. package/dist/providers/ProviderAdapter.d.ts.map +1 -0
  425. package/dist/providers/ProviderAdapter.js +251 -0
  426. package/dist/providers/ProviderAdapter.js.map +1 -0
  427. package/dist/providers/index.d.ts +21 -18
  428. package/dist/providers/index.d.ts.map +1 -1
  429. package/dist/providers/index.js +13 -10
  430. package/dist/providers/index.js.map +1 -1
  431. package/dist/types/agent.d.ts +37 -11
  432. package/dist/types/agent.d.ts.map +1 -1
  433. package/dist/types/ai.d.ts +11 -21
  434. package/dist/types/ai.d.ts.map +1 -1
  435. package/dist/types/compaction.d.ts +2 -2
  436. package/dist/types/compaction.d.ts.map +1 -1
  437. package/dist/types/errors.d.ts +16 -20
  438. package/dist/types/errors.d.ts.map +1 -1
  439. package/dist/types/errors.js +15 -16
  440. package/dist/types/errors.js.map +1 -1
  441. package/dist/types/flow.d.ts +56 -39
  442. package/dist/types/flow.d.ts.map +1 -1
  443. package/dist/types/history.d.ts +1 -1
  444. package/dist/types/history.d.ts.map +1 -1
  445. package/dist/types/index.d.ts +17 -17
  446. package/dist/types/index.d.ts.map +1 -1
  447. package/dist/types/index.js +4 -4
  448. package/dist/types/index.js.map +1 -1
  449. package/dist/types/persistence.d.ts +2 -2
  450. package/dist/types/persistence.d.ts.map +1 -1
  451. package/dist/types/session.d.ts +4 -4
  452. package/dist/types/session.d.ts.map +1 -1
  453. package/dist/types/signals.d.ts +3 -3
  454. package/dist/types/signals.d.ts.map +1 -1
  455. package/dist/types/template.d.ts +2 -2
  456. package/dist/types/template.d.ts.map +1 -1
  457. package/dist/types/tool.d.ts +4 -2
  458. package/dist/types/tool.d.ts.map +1 -1
  459. package/dist/types/tool.js.map +1 -1
  460. package/dist/utils/condition.d.ts +1 -1
  461. package/dist/utils/condition.d.ts.map +1 -1
  462. package/dist/utils/condition.js +2 -2
  463. package/dist/utils/condition.js.map +1 -1
  464. package/dist/utils/event.d.ts +1 -1
  465. package/dist/utils/event.d.ts.map +1 -1
  466. package/dist/utils/event.js +1 -1
  467. package/dist/utils/event.js.map +1 -1
  468. package/dist/utils/history.d.ts +2 -2
  469. package/dist/utils/history.d.ts.map +1 -1
  470. package/dist/utils/history.js +1 -1
  471. package/dist/utils/history.js.map +1 -1
  472. package/dist/utils/index.d.ts +11 -13
  473. package/dist/utils/index.d.ts.map +1 -1
  474. package/dist/utils/index.js +11 -12
  475. package/dist/utils/index.js.map +1 -1
  476. package/dist/utils/serialize.d.ts +17 -0
  477. package/dist/utils/serialize.d.ts.map +1 -1
  478. package/dist/utils/serialize.js +31 -0
  479. package/dist/utils/serialize.js.map +1 -1
  480. package/dist/utils/session.d.ts +23 -3
  481. package/dist/utils/session.d.ts.map +1 -1
  482. package/dist/utils/session.js +35 -6
  483. package/dist/utils/session.js.map +1 -1
  484. package/dist/utils/template.d.ts +3 -3
  485. package/dist/utils/template.d.ts.map +1 -1
  486. package/dist/utils/template.js +1 -1
  487. package/dist/utils/template.js.map +1 -1
  488. package/docs/concepts/architecture.md +3 -3
  489. package/docs/concepts/directives.md +1 -1
  490. package/docs/guides/error-handling.md +46 -45
  491. package/docs/guides/flow-control.md +8 -1
  492. package/docs/guides/instructions.md +15 -6
  493. package/docs/guides/persistence.md +12 -5
  494. package/docs/guides/streaming.md +10 -0
  495. package/docs/migration/README.md +4 -0
  496. package/docs/migration/v2-3-to-v2-4.md +4 -0
  497. package/docs/migration/v2-6-to-v2-7.md +246 -0
  498. package/docs/reference/adapters.md +15 -1
  499. package/docs/reference/branches.md +2 -0
  500. package/docs/reference/create-agent.md +28 -0
  501. package/docs/reference/directive.md +1 -1
  502. package/docs/reference/errors.md +30 -32
  503. package/docs/reference/providers.md +63 -60
  504. package/docs/reference/step.md +28 -21
  505. package/docs/reference/tool.md +14 -5
  506. package/docs/start/02-first-agent.md +8 -4
  507. package/docs/start/03-collect-data.md +19 -10
  508. package/examples/01-quickstart.ts +2 -2
  509. package/examples/02-data-extraction.ts +1 -1
  510. package/examples/03-tools.ts +1 -1
  511. package/examples/04-instructions.ts +2 -2
  512. package/examples/05-branching.ts +3 -3
  513. package/examples/06-flow-control.ts +3 -3
  514. package/examples/07-streaming.ts +1 -1
  515. package/examples/08-persistence.ts +2 -2
  516. package/examples/09-signals.ts +1 -1
  517. package/examples/tsconfig.json +6 -3
  518. package/package.json +9 -7
  519. package/src/adapters/MemoryAdapter.ts +33 -37
  520. package/src/adapters/MongoAdapter.ts +3 -3
  521. package/src/adapters/OpenSearchAdapter.ts +4 -4
  522. package/src/adapters/PostgreSQLAdapter.ts +26 -21
  523. package/src/adapters/PrismaAdapter.ts +4 -4
  524. package/src/adapters/RedisAdapter.ts +84 -37
  525. package/src/adapters/SQLiteAdapter.ts +13 -34
  526. package/src/adapters/index.ts +13 -13
  527. package/src/adapters/sessionRow.ts +57 -0
  528. package/src/core/Agent.ts +64 -18
  529. package/src/core/AutoChainExecutor.ts +44 -57
  530. package/src/core/BranchEvaluator.ts +5 -5
  531. package/src/core/CompactionEngine.ts +42 -8
  532. package/src/core/DirectiveChainTracker.ts +3 -3
  533. package/src/core/Events.ts +2 -2
  534. package/src/core/Flow.ts +9 -9
  535. package/src/core/FlowRouter.ts +46 -20
  536. package/src/core/PersistenceManager.ts +4 -4
  537. package/src/core/PromptComposer.ts +8 -8
  538. package/src/core/PromptSectionCache.ts +2 -2
  539. package/src/core/ResponseEngine.ts +6 -6
  540. package/src/core/ResponseGenerationError.ts +3 -6
  541. package/src/core/ResponseModal.ts +205 -39
  542. package/src/core/ResponsePipeline.ts +301 -107
  543. package/src/core/SessionFinalizer.ts +40 -10
  544. package/src/core/SessionManager.ts +61 -27
  545. package/src/core/SignalCoordinator.ts +7 -7
  546. package/src/core/SignalEvaluator.ts +6 -6
  547. package/src/core/SignalProcessor.ts +13 -93
  548. package/src/core/Step.ts +87 -10
  549. package/src/core/StepLifecycle.ts +129 -26
  550. package/src/core/StreamingToolExecutor.ts +33 -8
  551. package/src/core/ToolLoopExecutor.ts +206 -80
  552. package/src/core/ToolManager.ts +53 -26
  553. package/src/core/createAgent.ts +2 -2
  554. package/src/core/flow-namespace.ts +31 -2
  555. package/src/core/toolGates.ts +2 -2
  556. package/src/index.ts +59 -45
  557. package/src/providers/AnthropicProvider.ts +44 -595
  558. package/src/providers/DeepSeekProvider.ts +27 -92
  559. package/src/providers/GeminiProvider.ts +41 -752
  560. package/src/providers/GenericOpenAICompatibleProvider.ts +19 -27
  561. package/src/providers/OpenAICompatibleProvider.ts +58 -764
  562. package/src/providers/OpenAIProvider.ts +31 -55
  563. package/src/providers/OpenRouterProvider.ts +40 -70
  564. package/src/providers/ProviderAdapter.ts +368 -0
  565. package/src/providers/index.ts +21 -23
  566. package/src/types/agent.ts +36 -11
  567. package/src/types/ai.ts +11 -21
  568. package/src/types/compaction.ts +2 -2
  569. package/src/types/errors.ts +17 -35
  570. package/src/types/flow.ts +44 -46
  571. package/src/types/history.ts +1 -1
  572. package/src/types/index.ts +18 -17
  573. package/src/types/persistence.ts +2 -2
  574. package/src/types/session.ts +4 -4
  575. package/src/types/signals.ts +3 -3
  576. package/src/types/template.ts +2 -2
  577. package/src/types/tool.ts +4 -2
  578. package/src/utils/condition.ts +3 -3
  579. package/src/utils/event.ts +1 -1
  580. package/src/utils/history.ts +3 -3
  581. package/src/utils/index.ts +14 -15
  582. package/src/utils/serialize.ts +38 -0
  583. package/src/utils/session.ts +46 -9
  584. package/src/utils/template.ts +3 -3
  585. package/dist/cjs/core/DirectiveBus.d.ts +0 -88
  586. package/dist/cjs/core/DirectiveBus.d.ts.map +0 -1
  587. package/dist/cjs/core/DirectiveBus.js +0 -196
  588. package/dist/cjs/core/DirectiveBus.js.map +0 -1
  589. package/dist/cjs/providers/errorClassification.d.ts +0 -61
  590. package/dist/cjs/providers/errorClassification.d.ts.map +0 -1
  591. package/dist/cjs/providers/errorClassification.js +0 -123
  592. package/dist/cjs/providers/errorClassification.js.map +0 -1
  593. package/dist/cjs/utils/retry.d.ts +0 -67
  594. package/dist/cjs/utils/retry.d.ts.map +0 -1
  595. package/dist/cjs/utils/retry.js +0 -201
  596. package/dist/cjs/utils/retry.js.map +0 -1
  597. package/dist/core/DirectiveBus.d.ts +0 -88
  598. package/dist/core/DirectiveBus.d.ts.map +0 -1
  599. package/dist/core/DirectiveBus.js +0 -192
  600. package/dist/core/DirectiveBus.js.map +0 -1
  601. package/dist/providers/errorClassification.d.ts +0 -61
  602. package/dist/providers/errorClassification.d.ts.map +0 -1
  603. package/dist/providers/errorClassification.js +0 -116
  604. package/dist/providers/errorClassification.js.map +0 -1
  605. package/dist/utils/retry.d.ts +0 -67
  606. package/dist/utils/retry.d.ts.map +0 -1
  607. package/dist/utils/retry.js +0 -193
  608. package/dist/utils/retry.js.map +0 -1
  609. package/src/core/DirectiveBus.ts +0 -248
  610. package/src/providers/errorClassification.ts +0 -172
  611. package/src/utils/retry.ts +0 -274
@@ -11,15 +11,17 @@ order: 10
11
11
 
12
12
  Providers are the strategy plug between an `Agent` and a model vendor. Every provider implements the same `AiProvider` interface, so the Agent itself stays vendor-agnostic. Pass an instance to `createAgent({ provider })` and the agent talks to that vendor for every turn (and for compaction, if you wire it in).
13
13
 
14
- `@falai/agent` ships five built-in providers. All five accept an `apiKey` and a required `model`, support `backupModels` for automatic failover on overload or 5xx, and accept a vendor-typed `config` object that flows through to the underlying SDK.
14
+ `@falai/agent` ships five built-in providers. All five accept an `apiKey` and a required `model`, support `backupModels` for automatic failover, and take the same neutral `RequestConfig` for sampling defaults.
15
15
 
16
- | Provider | Class | Options | SDK |
17
- |----------|-------|---------|-----|
18
- | Google Gemini | `GeminiProvider` | `GeminiProviderOptions` | `@google/genai` |
19
- | OpenAI | `OpenAIProvider` | `OpenAIProviderOptions` | `openai` |
20
- | Anthropic Claude | `AnthropicProvider` | `AnthropicProviderOptions` | `@anthropic-ai/sdk` |
21
- | OpenRouter | `OpenRouterProvider` | `OpenRouterProviderOptions` | `openai` (compat) |
22
- | DeepSeek | `DeepSeekProvider` | `DeepSeekProviderOptions` | `openai` (compat) |
16
+ There are no vendor SDKs behind them. Every provider is a thin binding over [`@providerkit/core`](https://www.npmjs.com/package/@providerkit/core), which speaks each vendor's REST API over `fetch` — so installing this package does not install one vendor's SDK for a consumer who uses another.
17
+
18
+ | Provider | Class | Options | Wire |
19
+ |----------|-------|---------|------|
20
+ | Google Gemini | `GeminiProvider` | `GeminiProviderOptions` | `generateContent` (SSE) |
21
+ | OpenAI | `OpenAIProvider` | `OpenAIProviderOptions` | Responses API |
22
+ | Anthropic Claude | `AnthropicProvider` | `AnthropicProviderOptions` | Messages API |
23
+ | OpenRouter | `OpenRouterProvider` | `OpenRouterProviderOptions` | chat completions |
24
+ | DeepSeek | `DeepSeekProvider` | `DeepSeekProviderOptions` | chat completions |
23
25
 
24
26
  ## Capabilities
25
27
 
@@ -63,11 +65,11 @@ import {
63
65
 
64
66
  const provider =
65
67
  process.env.PROVIDER === "openai"
66
- ? new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY!, model: "gpt-5.5" })
68
+ ? new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY!, model: "gpt-5.6" })
67
69
  : process.env.PROVIDER === "anthropic"
68
- ? new AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY!, model: "claude-sonnet-4-6" })
70
+ ? new AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY!, model: "claude-sonnet-5" })
69
71
  : process.env.PROVIDER === "openrouter"
70
- ? new OpenRouterProvider({ apiKey: process.env.OPENROUTER_API_KEY!, model: "anthropic/claude-sonnet-4.6" })
72
+ ? new OpenRouterProvider({ apiKey: process.env.OPENROUTER_API_KEY!, model: "anthropic/claude-sonnet-5" })
71
73
  : process.env.PROVIDER === "deepseek"
72
74
  ? new DeepSeekProvider({ apiKey: process.env.DEEPSEEK_API_KEY!, model: "deepseek-chat" })
73
75
  : new GeminiProvider({ apiKey: process.env.GEMINI_API_KEY!, model: "gemini-3.1-pro-preview" });
@@ -86,8 +88,10 @@ interface GeminiProviderOptions {
86
88
  apiKey: string;
87
89
  model: string;
88
90
  backupModels?: string[];
89
- config?: Partial<GenerateContentConfig>; // from @google/genai
91
+ baseUrl?: string;
92
+ config?: RequestConfig; // temperature, topP, maxTokens, stopSequences
90
93
  retryConfig?: { timeout?: number; retries?: number };
94
+ fetchImpl?: typeof fetch; // scripted wire, for tests
91
95
  }
92
96
  ```
93
97
 
@@ -95,12 +99,13 @@ interface GeminiProviderOptions {
95
99
 
96
100
  | Field | Type | Required | Default | Notes |
97
101
  |-------|------|----------|---------|-------|
98
- | `apiKey` | `string` | yes | — | Throws if empty. |
102
+ | `apiKey` | `string` | yes* | — | Throws if empty (unless `client` is set). |
99
103
  | `model` | `string` | yes | — | Use the model id, e.g. `"gemini-3.1-pro-preview"`. |
100
- | `backupModels` | `string[]` | no | `[]` | Tried in order on 429/500/503/overload errors. |
104
+ | `backupModels` | `string[]` | no | `[]` | Tried in order on retriable failures (rate limits, overload, timeouts, network). |
101
105
  | `config` | `Partial<GenerateContentConfig>` | no | — | Vendor-typed defaults (e.g. `temperature`, `systemInstruction`). |
102
- | `retryConfig.timeout` | `number` | no | `60000` | Per-attempt timeout in ms. |
106
+ | `retryConfig.timeout` | `number` | no | `60000` | Per-attempt timeout in ms. On streams it also bounds time-to-first-token. |
103
107
  | `retryConfig.retries` | `number` | no | `3` | Total attempts before giving up. |
108
+ | `client` | `GoogleGenAI` | no | — | Pre-configured SDK client; overrides the internally-constructed one. Intended for tests injecting scripted transports; production callers should pass `apiKey`. |
104
109
 
105
110
  ### Example
106
111
 
@@ -136,9 +141,9 @@ interface OpenAIProviderOptions {
136
141
  |-------|------|----------|---------|-------|
137
142
  | `apiKey` | `string` | yes | — | Throws if empty. |
138
143
  | `organization` | `string` | no | — | Forwarded as `OpenAI-Organization`. |
139
- | `model` | `string` | yes | — | e.g. `"gpt-5.5"`, `"gpt-5.4"`. |
144
+ | `model` | `string` | yes | — | e.g. `"gpt-5.6"`, `"gpt-5.4-mini"`. |
140
145
  | `backupModels` | `string[]` | no | `[]` | Tried in order on overload/rate-limit errors. |
141
- | `config` | OpenAI params | no | — | Defaults for `temperature`, `top_p`, etc. |
146
+ | `config` | `RequestConfig` | no | — | Defaults for `temperature`, `topP`, `maxTokens`, `stopSequences`. |
142
147
  | `retryConfig.timeout` | `number` | no | `60000` | Per-attempt timeout in ms. |
143
148
  | `retryConfig.retries` | `number` | no | `3` | Total attempts. |
144
149
 
@@ -147,7 +152,7 @@ interface OpenAIProviderOptions {
147
152
  ```typescript
148
153
  const openai = new OpenAIProvider({
149
154
  apiKey: process.env.OPENAI_API_KEY!,
150
- model: "gpt-5.5",
155
+ model: "gpt-5.6",
151
156
  organization: "org_abc",
152
157
  config: { temperature: 0.2 },
153
158
  });
@@ -166,6 +171,7 @@ interface AnthropicProviderOptions {
166
171
  backupModels?: string[];
167
172
  config?: Partial<Omit<MessageCreateParamsNonStreaming, "model" | "messages">>;
168
173
  retryConfig?: { timeout?: number; retries?: number };
174
+ client?: Anthropic; // pre-configured SDK client override
169
175
  }
170
176
  ```
171
177
 
@@ -173,20 +179,21 @@ interface AnthropicProviderOptions {
173
179
 
174
180
  | Field | Type | Required | Default | Notes |
175
181
  |-------|------|----------|---------|-------|
176
- | `apiKey` | `string` | yes | — | Throws if empty. |
177
- | `model` | `string` | yes | — | e.g. `"claude-sonnet-4-6"`, `"claude-opus-4-7"`. |
178
- | `backupModels` | `string[]` | no | `[]` | Tried in order on 429/500/503/529/overload. |
179
- | `config` | Anthropic params | no | — | Defaults for `max_tokens`, `system`, etc. The provider sets `max_tokens=4096` if neither `config.max_tokens` nor `parameters.maxOutputTokens` is set. |
180
- | `retryConfig.timeout` | `number` | no | `60000` | Per-attempt timeout in ms. |
182
+ | `apiKey` | `string` | yes* | — | Throws if empty (unless `client` is set). |
183
+ | `model` | `string` | yes | — | e.g. `"claude-sonnet-5"`, `"claude-opus-5"`. |
184
+ | `backupModels` | `string[]` | no | `[]` | Tried in order on retriable failures (rate limits, overload incl. 529, timeouts, network). |
185
+ | `config` | `RequestConfig` | no | — | Defaults for `temperature`, `topP`, `maxTokens`, `stopSequences`. `maxTokens` falls back to 4096 if neither it nor `parameters.maxOutputTokens` is set. |
186
+ | `retryConfig.timeout` | `number` | no | `60000` | Per-attempt timeout in ms. On streams it also bounds time-to-first-token. |
181
187
  | `retryConfig.retries` | `number` | no | `3` | Total attempts. |
188
+ | `client` | `Anthropic` | no | — | Pre-configured SDK client; overrides the internally-constructed one. Intended for tests injecting scripted transports; production callers should pass `apiKey`. |
182
189
 
183
190
  ### Example
184
191
 
185
192
  ```typescript
186
193
  const anthropic = new AnthropicProvider({
187
194
  apiKey: process.env.ANTHROPIC_API_KEY!,
188
- model: "claude-sonnet-4-6",
189
- config: { max_tokens: 8192 },
195
+ model: "claude-sonnet-5",
196
+ config: { maxTokens: 8192 },
190
197
  });
191
198
  ```
192
199
 
@@ -215,7 +222,7 @@ interface OpenRouterProviderOptions {
215
222
  | Field | Type | Required | Default | Notes |
216
223
  |-------|------|----------|---------|-------|
217
224
  | `apiKey` | `string` | yes | — | Throws if empty. |
218
- | `model` | `string` | yes | — | OpenRouter model id, e.g. `"anthropic/claude-sonnet-4.6"`. See [openrouter.ai/models](https://openrouter.ai/models). |
225
+ | `model` | `string` | yes | — | OpenRouter model id, e.g. `"anthropic/claude-sonnet-5"`. See [openrouter.ai/models](https://openrouter.ai/models). |
219
226
  | `backupModels` | `string[]` | no | `[]` | Tried in order on overload/capacity errors. |
220
227
  | `siteUrl` | `string` | no | `""` | Sent as `HTTP-Referer` for OpenRouter rankings. |
221
228
  | `siteName` | `string` | no | `""` | Sent as `X-Title` for OpenRouter rankings. |
@@ -228,8 +235,8 @@ interface OpenRouterProviderOptions {
228
235
  ```typescript
229
236
  const openrouter = new OpenRouterProvider({
230
237
  apiKey: process.env.OPENROUTER_API_KEY!,
231
- model: "anthropic/claude-sonnet-4.6",
232
- backupModels: ["openai/gpt-5.5", "google/gemini-3.1-pro-preview"],
238
+ model: "anthropic/claude-sonnet-5",
239
+ backupModels: ["openai/gpt-5.6", "google/gemini-3.1-pro-preview"],
233
240
  siteName: "My App",
234
241
  });
235
242
  ```
@@ -278,12 +285,11 @@ const deepseek = new DeepSeekProvider({
278
285
 
279
286
  ## Building a custom OpenAI-compatible provider
280
287
 
281
- Many vendors (Groq, Together, Fireworks, …) expose OpenAI-compatible chat-completions APIs. Instead of implementing `AiProvider` from scratch, subclass the exported `OpenAICompatibleProvider` base class — it handles message/history building, tool-call parsing, streaming chunks, backup-model fallback, retries, schema passthrough, and normalized `ProviderError` wrapping. `OpenAIProvider`, `OpenRouterProvider`, and `DeepSeekProvider` are themselves thin subclasses.
288
+ Many vendors (Groq, Together, Fireworks, …) expose OpenAI-compatible chat-completions APIs. Instead of implementing `AiProvider` from scratch, subclass the exported `OpenAICompatibleProvider` base class — history and tool translation, streaming, tool-call assembly, backup-model fallback, retries and normalized `ProviderError`s all come with it. `OpenAIProvider`, `OpenRouterProvider`, and `DeepSeekProvider` are themselves thin subclasses.
282
289
 
283
- A minimal subclass supplies the configured client, naming, and capabilities:
290
+ A minimal subclass supplies the endpoint, naming, and capabilities:
284
291
 
285
292
  ```typescript
286
- import OpenAI from "openai";
287
293
  import {
288
294
  OpenAICompatibleProvider,
289
295
  type ProviderCapabilities,
@@ -299,23 +305,20 @@ export class GroqProvider extends OpenAICompatibleProvider {
299
305
  supportsPromptCaching: false,
300
306
  };
301
307
 
302
- protected readonly logLabel = "GROQ"; // tag in log lines
303
- protected readonly displayName = "Groq"; // name in retry/error messages
304
-
305
308
  constructor(options: { apiKey: string; model: string; backupModels?: string[] }) {
306
309
  super({
307
- client: new OpenAI({
308
- apiKey: options.apiKey,
309
- baseURL: "https://api.groq.com/openai/v1",
310
- }),
310
+ id: "groq",
311
+ apiKey: options.apiKey,
312
+ baseUrl: "https://api.groq.com/openai",
311
313
  model: options.model,
314
+ structuredOutput: "json_schema",
312
315
  backupModels: options.backupModels,
313
316
  });
314
317
  }
315
318
  }
316
319
  ```
317
320
 
318
- That is a complete, working provider. For genuinely vendor-specific behavior, override the protected hooks `DeepSeekProvider` is the reference pattern: it overrides `executeStructuredGenerate` (no `responses.parse` API), `structuredResponseFormat` (native `json_schema` enforcement), `configureStreamParams` (usage in stream chunks), and `onStreamDelta` (reasoning content on the delta).
321
+ That is a complete, working provider. Vendor-specific wire behaviour is not this layer's job any more: it lives in `@providerkit/core`, which the provider classes are thin bindings over. `DeepSeekProvider` is the reference pattern for what is left here — an id, a base URL, the structured-output mode the endpoint actually supports, and its capabilities. To bind a core provider this package does not ship a class for, subclass `ProviderAdapter` directly.
319
322
 
320
323
  ## Errors
321
324
 
@@ -326,10 +329,14 @@ All five providers share the same construction-time guards and runtime failure m
326
329
  | `apiKey` is empty or missing | `Error("<vendor> API key is required")` | Thrown from the constructor. |
327
330
  | `model` is empty or missing | `Error("Model is required. ...")` | Thrown from the constructor. |
328
331
  | Vendor returns no text and no tool calls | `Error("No response from <vendor>")` | Surfaces as a `ResponseGenerationError` once it bubbles through the agent. |
329
- | Primary and every backup model fail | `ProviderError` with a normalized `code` | After exhausting retries and `backupModels`. The agent wraps it in `ResponseGenerationError`. |
332
+ | Primary and every backup model fail | `ProviderError` with a normalized `code` | After exhausting retries and `backupModels`. Propagates bare out of `respond()`. |
330
333
  | Anthropic streaming with `system: undefined` | Vendor 400 | Set `config.system` or rely on history-derived system messages. |
331
334
 
332
- The retry/backup logic only kicks in for transient errors: HTTP 429 / 500 / 503 (and 529 for Anthropic), `overloaded`-style codes, or messages containing `overloaded`, `unavailable`, `internal error`, or (OpenRouter only) `capacity`. Other errors fail fast.
335
+ The retry/backup logic only kicks in for **transient** errors: rate limits, overload and availability, timeouts, and network faults. Deterministic failures a wrong key, an exhausted balance, an invalid request, a caller's abort fail fast without burning the retry budget. Classification reads the response BODY before its status, because vendors file the same cause under whatever status they like.
336
+
337
+ Only failures *before the first chunk* are retried: past that the stream is committed, and a retry would replay text the reader has already seen. The same rule governs the walk to a backup model. `retryConfig.timeout` is the silence deadline — the wait allowed before the first byte, and between any two after it — so a stream that opens and stalls is treated as failed while a long, healthy one is left alone.
338
+
339
+ A model the endpoint will not serve also walks to the next model on the list, which is what the list is for.
333
340
 
334
341
  ### `ProviderError`
335
342
 
@@ -338,27 +345,23 @@ Terminal failures — after retries and backup models are exhausted — throw th
338
345
  ```typescript
339
346
  import { ProviderError } from "@falai/agent";
340
347
 
341
- type ProviderErrorCode =
342
- | 'rate_limited' // 429-style throttling
343
- | 'overloaded' // capacity / 503 / 529
344
- | 'auth' // invalid or missing credentials
345
- | 'invalid_request' // vendor rejected the request shape
346
- | 'schema_rejected' // structured-output schema rejected
347
- | 'timeout' // per-attempt timeout exhausted
348
- | 'network' // connection-level failure
349
- | 'unknown'; // anything unclassified
350
-
351
- try {
352
- await provider.generateMessage(input);
353
- } catch (err) {
354
- if (err instanceof ProviderError) {
355
- console.error(err.provider, err.code); // e.g. "openai" "rate_limited"
356
- console.error(err.cause); // original SDK error
357
- }
358
- }
348
+ type ErrorKind =
349
+ | 'aborted' // the caller pressed Stop — never retried
350
+ | 'timeout' // our deadline, or a 408
351
+ | 'network' // never reached the provider
352
+ | 'overload' // theirs and temporary retry, and try another model
353
+ | 'rate' // per-minute throttle — wait, or rotate key or model
354
+ | 'quota' // balance or usage window exhausted — waiting will not fix it
355
+ | 'entitlement' // the plan never included this API
356
+ | 'auth' // the key is wrong, not the request
357
+ | 'model' // the model id is not served here
358
+ | 'context' // the prompt outgrew the window — send less
359
+ | 'content' // safety filter or refusal
360
+ | 'invalid' // any other 4xx — a bug in what we sent
361
+ | 'unknown'
359
362
  ```
360
363
 
361
- When the failure bubbles through `agent.respond(...)`, it is wrapped in `ResponseGenerationError` like every other turn failure the `ProviderError` is then on `details.originalError`. See [Errors](./errors.md).
364
+ When the failure surfaces through `agent.respond(...)`, the `ProviderError` propagates **bare** — catch it with `instanceof`, no unwrapping. (On streaming turns, errors arrive wrapped as `ResponseGenerationError` on the final chunk's `error` field, with the original on `.cause`.) See [Errors](./errors.md).
362
365
 
363
366
  ## Related
364
367
 
@@ -101,30 +101,33 @@ interface StepLifecycleHooks<TContext = unknown, TData = unknown> {
101
101
  | `skip` | `(ctx) => boolean \| Promise<boolean>` or array | no | — | Code-evaluated skip predicates (OR semantics). When any predicate returns `true`, the step is bypassed. Only code predicates — no AI strings. |
102
102
  | `tools` | `(string \| Tool<TContext, TData>)[]` | no | `[]` | Tools available during this step. Strings are resolved against the agent's tool registry; objects are inline tools. Stacked on top of agent and flow scopes. |
103
103
  | `instructions` | `Instruction<TContext, TData>[]` | no | `[]` | Step-scoped behavioural statements (`kind: 'must' \| 'never' \| 'should'`). Active only while this step is current. See [Instruction](./instruction.md). |
104
- | `prepare` | function, tool id, or `Tool` object | no | — | **Shorthand** pre-LLM hook. Receives `(context, data?)` and returns `void \| PrepareResult`. For full directive control, use `hooks.prepare` instead. |
105
- | `finalize` | function, tool id, or `Tool` object | no | — | **Shorthand** post-LLM hook. Same shape as `prepare`. For full directive control, use `hooks.finalize` instead. |
106
- | `hooks` | `StepLifecycleHooks<TContext, TData>` | no | — | Full lifecycle callbacks: `onEnter`, `prepare`, `finalize`, `onExit`. See the table below. |
104
+ | `prepare` | function, tool id, or `Tool` object | no | — | Pre-LLM hook. Receives `(context, data?)` and returns `void \| PrepareResult` (a Directive may be returned too). `PrepareResult` includes the pre-LLM augmentation fields `appendPrompt: string[]` and `injectTools: Tool[]` — honored by auto steps; other step kinds drop them with a loud warning. |
105
+ | `finalize` | function, tool id, or `Tool` object | no | — | Post-generation hook, runs before persistence. Same shape as `prepare`. A returned `goTo`/`goToStep`/`reset`/`complete` redirects the **next** turn; state writes land immediately. |
106
+ | `hooks` | `StepLifecycleHooks<TContext, TData>` | no | — | Alternative spelling of `prepare`/`finalize` (`hooks.prepare`, `hooks.finalize`). Both spellings run when declared together — shorthand first, then the hook, returns merged via Algorithm 4. |
107
107
  | `branches` | `BranchEntry<TContext, TData>[]` | no | — | Explicit source-local fork. Evaluated after `finalize`, before linear successor selection. The first entry whose `if`/`when` passes wins; its `then` resolves to a step id, a flow id, or a `Directive`. See [Branches](./branches.md). |
108
108
 
109
109
  ### Lifecycle hooks
110
110
 
111
- The lifecycle has four positions. Two of them `prepare` and
112
- `finalize` are also reachable through the top-level shorthand
113
- fields, with a smaller return type.
111
+ Two hook positions exist per step: `prepare` (before generation) and
112
+ `finalize` (after generation, before persistence). Each is reachable
113
+ through a top-level field, a `hooks.*` entry, or both — declaring both
114
+ runs them in sequence (shorthand first) with their returns merged by
115
+ Algorithm 4 (`flow.merge`).
114
116
 
115
- | Hook | When it fires | `hooks.<name>` returns | Top-level shorthand returns | Use it for |
116
- |------|---------------|------------------------|------------------------------|------------|
117
- | `onEnter` | Before any other work the first time the step becomes current. | `void \| Directive` | n/a (no shorthand) | Append per-turn prompt context, inject one-turn tools, or short-circuit with `halt + reply`. |
118
- | `prepare` | Right before the LLM call, after `onEnter`. | `void \| Directive` | `void \| PrepareResult` | Mutate session data, fetch external context, halt the LLM call. |
119
- | `finalize` | After the LLM call and tool loop complete. | `void \| Directive` | `void \| PrepareResult` | Validate collected data, redirect with `goTo` / `goToStep`, complete the flow. |
120
- | `onExit` | When the step is left (next step entered, flow completed, aborted). | `void` | n/a | Emit telemetry. Cannot influence flow control. |
117
+ | Position | When it fires | May return | Use it for |
118
+ |----------|---------------|------------|------------|
119
+ | `prepare` / `hooks.prepare` | Before routing on the step's turn (non-auto steps). | `void \| PrepareResult` | Write session/context state, redirect the current turn with `goToStep`/`goTo`/`reset` (queued as `pendingDirective` and applied by routing this turn). |
120
+ | `finalize` / `hooks.finalize` | After generation completes, BEFORE the session is persisted. | `void \| PrepareResult` | Validate collected data, write state, queue a redirect for the next turn (`pendingDirective`), e.g. `{ complete: { next: { goTo: 'Checkout' } } }`. |
121
121
 
122
- `PrepareResult` is the shorthand return a flat object with the
123
- common Directive fields (`dataUpdate`, `contextUpdate`, `goTo`,
124
- `goToStep`, `complete`, `halt`, `reply`). Use `hooks.<name>` when you
125
- need the full `HookContext` (with `session`, `history`, `dispatch`)
126
- or the full `Directive` surface (`appendPrompt`,
127
- `injectTools`, `abort`, `reset`).
122
+ Handler directives merge through the canonical algorithm and are
123
+ validated with `flow.validate`. State writes
124
+ (`dataUpdate`/`contextUpdate`) apply immediately to the turn session,
125
+ so auto-save captures them even if this is the conversation's last
126
+ turn.
127
+
128
+ Note for **auto steps**: their `prepare` runs inside the auto-chain,
129
+ where pre-LLM fields (`appendPrompt`, `injectTools`, `halt`, `reply`)
130
+ are honored directly.
128
131
 
129
132
  ### Resolution within a step
130
133
 
@@ -133,12 +136,12 @@ For one step, the engine walks this sequence per turn:
133
136
  1. Evaluate `if` (code, AND) and `when` (AI: positive OR, `!` exclusions inhibit) — fails skip the step entirely.
134
137
  2. Evaluate `skip` (code, OR) — true means bypass and fall through.
135
138
  3. Check `requires` — refuse entry if any required field is missing.
136
- 4. Run `onEnter`, then `prepare` / `hooks.prepare`. May emit a `Directive` (pre-LLM fields honored).
139
+ 4. Run `prepare` / `hooks.prepare`. Its merged directive applies state writes immediately; position fields queue as `pendingDirective` for this turn's routing.
137
140
  5. **LLM step**: call the LLM with the step's prompt, tools, and instructions; tool loop runs until completion. **Auto step**: skip the LLM call. **Reply step**: render `reply` as the verbatim assistant message.
138
- 6. Run `finalize` / `hooks.finalize`. May emit a `Directive`.
141
+ 6. Run `finalize` / `hooks.finalize` (before persistence). State writes land now; position fields queue for the next turn.
139
142
  7. Evaluate `branches`. The first entry whose `if`/`when` passes wins; its `then` resolves to a step id, a flow id, or a full `Directive`. If no entry matches, fall through.
140
143
  8. Linear successor / AI step selection.
141
- 9. Run `onExit` for the step we are leaving.
144
+ 9. Persist the session (auto-save) after finalize has run.
142
145
 
143
146
  ## Examples
144
147
 
@@ -317,6 +320,10 @@ following are thrown synchronously when the agent is built:
317
320
  `reset`).
318
321
  - `FlowConfigurationError` — a `branches[i].then` Directive contains
319
322
  an empty `goTo: {}`.
323
+ - `FlowConfigurationError` — a tool-based `prepare`/`finalize` (tool id
324
+ or `Tool` object) is combined with `hooks.prepare`/`hooks.finalize`.
325
+ A step can only have one handler per position — remove one or inline
326
+ the tool call inside a function.
320
327
 
321
328
  Runtime errors that surface from a step's hook execution include
322
329
  `DataValidationError` (invalid collected data), `ToolExecutionError`
@@ -251,15 +251,24 @@ export const bookHotel: Tool<Ctx, Data, { id: string }> = {
251
251
  };
252
252
  ```
253
253
 
254
+ ## Directive wiring and turn semantics
255
+
256
+ Tool-emitted directives work end-to-end: both `ctx.dispatch(directive)` calls and `{ directive }` returns are collected during execution, merged via Algorithm 4, and delivered to the engine in the same turn.
257
+
258
+ - **State fields** (`dataUpdate`, `contextUpdate`) apply immediately.
259
+ - **A `reply` directive short-circuits the tool loop** — its verbatim text becomes the final assistant message with no follow-up LLM call.
260
+ - **Control-flow fields** (`goTo`, `goToStep`, `reset`, …) queue on `session.pendingDirective` and steer the *next* turn (same deferred semantics as `agent.dispatch()`).
261
+
262
+ A handler that **throws** (or a call to an unregistered tool) never crashes the turn: the executor reports a failure result *to the model* — a `role: "tool"` message shaped `{"success":false,"error":"…"}` — so it can react to the failed call instead of the framework fabricating a success.
263
+
254
264
  ## Errors
255
265
 
256
- Misuse surfaces as typed errors from the executor:
266
+ Misuse surfaces as typed errors from registration-time validation; execution-time problems degrade to failed tool results rather than thrown errors:
257
267
 
258
- - `ToolExecutionError` — handler threw, returned `success: false`, exceeded `maxResultSizeChars` after compaction, or the tool was invoked with arguments that fail `validateInput` and cannot be corrected.
268
+ - `ToolCreationError` — invalid tool definition at registration (missing id/handler, duplicate id, bad schema).
259
269
  - `FlowConfigurationError` — a returned `directive` is malformed (e.g., two position fields set, or `goTo` references an unknown flow/step).
260
- - `DataValidationError` `dataUpdate` violates the agent schema.
261
-
262
- Permission denials (`checkPermissions` returning `allowed: false`) are surfaced as a structured tool result with `success: false` and `error: <reason>` rather than a thrown error — this keeps the AI's reasoning loop intact.
270
+ - Execution failures — a thrown handler, `success: false` return, permission denial, failed `validateInput`, timeout, or unknown tool name all become structured `success: false` tool results surfaced to the model, keeping the AI's reasoning loop intact.
271
+ - `DataValidationError` — `dataUpdate` violates the agent schema (logged; the call reports failure instead of applying the write).
263
272
 
264
273
  ## Related
265
274
 
@@ -32,7 +32,9 @@ const agent = createAgent({
32
32
  }],
33
33
  });
34
34
 
35
- const response = await agent.respond("Hi, I'm Alice");
35
+ const response = await agent.respond({
36
+ history: [{ role: "user", content: "Hi, I'm Alice" }],
37
+ });
36
38
  console.log(response.message);
37
39
  ```
38
40
 
@@ -110,14 +112,16 @@ requiredFields: ["name"],
110
112
 
111
113
  For this agent, completion happens on the first turn. For a longer flow, the gate would force more steps before the model wraps up.
112
114
 
113
- ### `agent.respond(message)`
115
+ ### `agent.respond(params)`
114
116
 
115
117
  ```typescript
116
- const response = await agent.respond("Hi, I'm Alice");
118
+ const response = await agent.respond({
119
+ history: [{ role: "user", content: "Hi, I'm Alice" }],
120
+ });
117
121
  console.log(response.message);
118
122
  ```
119
123
 
120
- `respond(message)` runs one turn end to end: load (or create) the session, route to a flow, extract data, walk auto-step chains, call the LLM, deliver the assistant message, persist. It returns an `AgentResponse` with the fields you usually want on hand:
124
+ `respond(params)` runs one turn end to end: route to a flow, extract data, walk auto-step chains, call the LLM, deliver the assistant message, persist. `params` takes `history` (required — the conversation so far as `{ role, content }[]`) and optionally `session`, `contextOverride`, and `signal`. When no session is passed, the agent manages one internally; pass an explicit session (see below) for server-side, multi-conversation use. It returns an `AgentResponse` with the fields you usually want on hand:
121
125
 
122
126
  | Field | Type | What it is |
123
127
  |-------|------|------------|
@@ -147,16 +147,15 @@ The pattern is consistent: the schema describes the universe of possible data, e
147
147
  Run the file with a single message that contains all three fields:
148
148
 
149
149
  ```typescript
150
- const session = { id: "demo-session" };
151
-
152
- const response = await agent.respond(
153
- "I want a hotel in Lisbon for two people next Friday.",
154
- session,
155
- );
150
+ const response = await agent.respond({
151
+ history: [
152
+ { role: "user", content: "I want a hotel in Lisbon for two people next Friday." },
153
+ ],
154
+ });
156
155
 
157
156
  console.log(response.message);
158
- console.log(response.data);
159
- console.log(response.currentStep?.id);
157
+ console.log(response.session?.data);
158
+ console.log(response.session?.currentStep?.id);
160
159
  ```
161
160
 
162
161
  The output is roughly:
@@ -176,7 +175,13 @@ Three things happened in one turn:
176
175
  Try a message with one missing field:
177
176
 
178
177
  ```typescript
179
- await agent.respond("Book me a hotel in Lisbon next Friday.", session);
178
+ await agent.respond({
179
+ history: [
180
+ { role: "user", content: "I want a hotel in Lisbon" },
181
+ { role: "assistant", content: "Sure — when do you travel?" },
182
+ { role: "user", content: "Book me a hotel in Lisbon next Friday." },
183
+ ],
184
+ });
180
185
  ```
181
186
 
182
187
  The extractor populates `city` and `checkIn`. `ask_city` and `ask_check_in` both skip — their `collect` keys are present. `ask_guests` does *not* skip — `guests` is undefined — so the engine enters it and the assistant asks how many people are travelling.
@@ -184,7 +189,11 @@ The extractor populates `city` and `checkIn`. `ask_city` and `ask_check_in` both
184
189
  Try the inverse: a message with only one field.
185
190
 
186
191
  ```typescript
187
- await agent.respond("I'd like to go to Lisbon.", session);
192
+ await agent.respond({
193
+ history: [
194
+ { role: "user", content: "I'd like to go to Lisbon." },
195
+ ],
196
+ });
188
197
  ```
189
198
 
190
199
  The extractor populates `city` only. `ask_city` skips, `ask_check_in` enters next (its `requires: ["city"]` is satisfied), and the assistant asks for the check-in date. Three turns later, the same `confirm` step runs.
@@ -1,13 +1,13 @@
1
1
  /** @intent Minimal agent: one flow, one step, one response.
2
2
  * @teaches createAgent, GeminiProvider, Flow, Step, respond
3
3
  * @readAfter docs/start/02-first-agent.md */
4
- import { createAgent, GeminiProvider } from "../src";
4
+ import { createAgent, GeminiProvider } from "../src/index.js";
5
5
 
6
6
  if (!process.env.GEMINI_API_KEY) throw new Error("Set GEMINI_API_KEY");
7
7
 
8
8
  const agent = createAgent({
9
9
  name: "Greeter",
10
- provider: new GeminiProvider({ apiKey: process.env.GEMINI_API_KEY, model: "gemini-3.1-flash-lite" }),
10
+ provider: new GeminiProvider({ apiKey: process.env.GEMINI_API_KEY, model: "gemini-3.5-flash-lite" }),
11
11
  schema: { type: "object", properties: { name: { type: "string" } } },
12
12
  flows: [{
13
13
  title: "Greet",
@@ -40,7 +40,7 @@ const agent = createAgent<Record<string, never>, BookingData>({
40
40
  name: "Booking Agent",
41
41
  provider: new GeminiProvider({
42
42
  apiKey: process.env.GEMINI_API_KEY!,
43
- model: "gemini-3.1-flash-lite",
43
+ model: "gemini-3.5-flash-lite",
44
44
  }),
45
45
  schema,
46
46
  flows: [
@@ -99,7 +99,7 @@ const agent = createAgent<AppContext, AppData>({
99
99
  name: "BookingAgent",
100
100
  provider: new GeminiProvider({
101
101
  apiKey: process.env.GEMINI_API_KEY!,
102
- model: "gemini-3.1-flash-lite",
102
+ model: "gemini-3.5-flash-lite",
103
103
  }),
104
104
  schema: {
105
105
  type: "object",
@@ -4,7 +4,7 @@
4
4
  * Read next: docs/guides/instructions.md
5
5
  */
6
6
 
7
- import { createAgent, GeminiProvider } from "../src";
7
+ import { createAgent, GeminiProvider } from "../src/index.js";
8
8
 
9
9
  if (!process.env.GEMINI_API_KEY) throw new Error("Set GEMINI_API_KEY");
10
10
 
@@ -22,7 +22,7 @@ const agent = createAgent<unknown, SupportData>({
22
22
  name: "SupportBot",
23
23
  provider: new GeminiProvider({
24
24
  apiKey: process.env.GEMINI_API_KEY,
25
- model: "gemini-3.1-flash-lite",
25
+ model: "gemini-3.5-flash-lite",
26
26
  }),
27
27
  schema: {
28
28
  type: "object",
@@ -1,8 +1,8 @@
1
1
  /** @intent Demonstrates step.branches — source-local forks with if, when, and Directive targets.
2
2
  * @teaches BranchEntry, BranchMap, if-only fork, when-only fork, combined if+when, mixed targets
3
3
  * @readAfter docs/guides/branching.md */
4
- import { createAgent, GeminiProvider } from "../src";
5
- import type { BranchMap, Directive, FlowOptions, StepOptions } from "../src";
4
+ import { createAgent, GeminiProvider } from "../src/index.js";
5
+ import type { BranchMap, Directive, FlowOptions, StepOptions } from "../src/index.js";
6
6
 
7
7
  // ─── Types ───────────────────────────────────────────────────────────────────
8
8
 
@@ -13,7 +13,7 @@ interface Data { intent: string; query: string; answer: string }
13
13
 
14
14
  const provider = new GeminiProvider({
15
15
  apiKey: process.env.GEMINI_API_KEY!,
16
- model: "gemini-3.1-flash-lite",
16
+ model: "gemini-3.5-flash-lite",
17
17
  });
18
18
 
19
19
  // ─── Steps with branches ─────────────────────────────────────────────────────
@@ -19,7 +19,7 @@ const agent = createAgent<{}, AppData>({
19
19
  name: "FlowControlDemo",
20
20
  provider: new GeminiProvider({
21
21
  apiKey: process.env.GEMINI_API_KEY!,
22
- model: "gemini-3.1-flash-lite",
22
+ model: "gemini-3.5-flash-lite",
23
23
  }),
24
24
  schema: {
25
25
  type: "object",
@@ -45,8 +45,8 @@ const agent = createAgent<{}, AppData>({
45
45
  // When the user confirms, complete with a chained directive
46
46
  // that moves to the "Checkout" flow.
47
47
  hooks: {
48
- finalize: ({ data }) => {
49
- if (data.confirmed) {
48
+ finalize: (_context, data) => {
49
+ if (data?.confirmed) {
50
50
  const d: Directive<{}, AppData> = {
51
51
  complete: { next: { goTo: "Checkout" }, reason: "User confirmed" },
52
52
  };
@@ -18,7 +18,7 @@ const agent = createAgent<{}, AppData>({
18
18
  name: "StreamingDemo",
19
19
  provider: new GeminiProvider({
20
20
  apiKey: process.env.GEMINI_API_KEY!,
21
- model: "gemini-3.1-flash-lite",
21
+ model: "gemini-3.5-flash-lite",
22
22
  }),
23
23
  schema: {
24
24
  type: "object",
@@ -1,13 +1,13 @@
1
1
  /** @intent Session persistence with MemoryAdapter: implicit default, explicit wiring, and sessionId for cross-turn continuity.
2
2
  * @teaches MemoryAdapter, PersistenceConfig, sessionId, session resumption
3
3
  * @readAfter docs/guides/persistence.md */
4
- import { createAgent, GeminiProvider, MemoryAdapter } from "../src";
4
+ import { createAgent, GeminiProvider, MemoryAdapter } from "../src/index.js";
5
5
 
6
6
  if (!process.env.GEMINI_API_KEY) throw new Error("Set GEMINI_API_KEY");
7
7
 
8
8
  const provider = new GeminiProvider({
9
9
  apiKey: process.env.GEMINI_API_KEY,
10
- model: "gemini-3.1-flash-lite",
10
+ model: "gemini-3.5-flash-lite",
11
11
  });
12
12
 
13
13
  const schema = {
@@ -100,7 +100,7 @@ const agent = createAgent<AppContext, AppData>({
100
100
  name: "SupportAgent",
101
101
  provider: new GeminiProvider({
102
102
  apiKey: process.env.GEMINI_API_KEY!,
103
- model: "gemini-3.1-flash-lite",
103
+ model: "gemini-3.5-flash-lite",
104
104
  }),
105
105
  context: { supportTier: "free" },
106
106
  schema: {
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  "target": "ES2022",
4
- "module": "ESNext",
4
+ "module": "node16",
5
5
  "lib": [
6
6
  "ES2022",
7
7
  "DOM"
8
8
  ],
9
- "moduleResolution": "bundler",
10
- "types": [],
9
+ "moduleResolution": "node16",
10
+ "types": [
11
+ "node"
12
+ ],
11
13
  "strict": true,
12
14
  "esModuleInterop": true,
13
15
  "skipLibCheck": true,
@@ -15,6 +17,7 @@
15
17
  "resolveJsonModule": true,
16
18
  "allowSyntheticDefaultImports": true,
17
19
  "noEmit": true,
20
+ "allowImportingTsExtensions": true,
18
21
  "paths": {
19
22
  "@falai/agent": [
20
23
  "../src/index.ts"