@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
@@ -1,41 +1,29 @@
1
1
  /**
2
- * OpenAI provider implementation with retry and backup models
2
+ * OpenAI provider. Structured output goes out on the Responses API, which
3
+ * enforces the schema natively.
3
4
  */
4
5
 
5
- import OpenAI from "openai";
6
+ import type { ProviderCapabilities } from "../types/ai.js";
7
+ import { OpenAICompatibleProvider } from "./OpenAICompatibleProvider.js";
8
+ import type { RequestConfig } from "./ProviderAdapter.js";
6
9
 
7
- import type { ProviderCapabilities } from "../types/ai";
8
- import {
9
- OpenAICompatibleProvider,
10
- type OpenAICompatibleRequestConfig,
11
- } from "./OpenAICompatibleProvider";
12
-
13
- /**
14
- * Configuration options for OpenAI provider
15
- * Uses types from openai package
16
- */
17
10
  export interface OpenAIProviderOptions {
18
11
  /** OpenAI API key */
19
12
  apiKey: string;
20
- /** Organization ID (optional) */
21
- organization?: string;
22
- /** Model to use (required) - e.g., "gpt-5.5", "gpt-5.4" */
13
+ /** Model to use (required) — e.g. "gpt-5.6", "gpt-5.4-mini" */
23
14
  model: string;
24
- /** Backup models to try if primary fails (default: []) */
15
+ /** Backup models to try if the primary fails (default: []) */
25
16
  backupModels?: string[];
26
- /** Default parameters - uses ChatCompletionCreateParamsNonStreaming from openai package */
27
- config?: OpenAICompatibleRequestConfig;
28
- /** Retry configuration */
29
- retryConfig?: {
30
- timeout?: number;
31
- retries?: number;
32
- };
17
+ /** Organization id, sent as the `OpenAI-Organization` header */
18
+ organization?: string;
19
+ /** Request defaults sent with every call */
20
+ config?: RequestConfig;
21
+ /** Idle-stream deadline and retry budget */
22
+ retryConfig?: { timeout?: number; retries?: number };
23
+ /** Replacement `fetch`, for tests that script the wire. */
24
+ fetchImpl?: typeof fetch;
33
25
  }
34
26
 
35
- /**
36
- * OpenAI provider implementation with backup models and retry logic.
37
- * Structured output uses the responses.parse API (native JSON schema).
38
- */
39
27
  export class OpenAIProvider extends OpenAICompatibleProvider {
40
28
  public readonly name = "openai";
41
29
  public readonly capabilities: ProviderCapabilities = {
@@ -43,39 +31,27 @@ export class OpenAIProvider extends OpenAICompatibleProvider {
43
31
  supportsNativeJsonSchema: true,
44
32
  supportsStreaming: true,
45
33
  supportsStreamingToolCalls: true,
46
- supportsPromptCaching: false,
34
+ // v3: the shape auto-caches repeated prefixes and now reports the hit
35
+ // count, which the old adapter never read.
36
+ supportsPromptCaching: true,
47
37
  };
48
38
 
49
- protected readonly logLabel = "OPENAI";
50
- protected readonly displayName = "OpenAI";
51
-
52
39
  constructor(options: OpenAIProviderOptions) {
53
- const {
54
- apiKey,
55
- organization,
56
- model,
57
- backupModels,
58
- config,
59
- retryConfig,
60
- } = options;
61
-
62
- if (!apiKey) {
63
- throw new Error("OpenAI API key is required");
64
- }
65
-
66
- if (!model) {
67
- throw new Error("Model is required. Example: 'gpt-5.5' or 'gpt-5.4'");
68
- }
40
+ if (!options.apiKey) throw new Error("OpenAI API key is required");
41
+ if (!options.model) throw new Error("Model is required. Example: 'gpt-5.6' or 'gpt-5.5'");
69
42
 
70
43
  super({
71
- client: new OpenAI({
72
- apiKey,
73
- organization,
74
- }),
75
- model,
76
- backupModels,
77
- config,
78
- retryConfig,
44
+ id: "openai",
45
+ apiKey: options.apiKey,
46
+ model: options.model,
47
+ structuredOutput: "responses_parse",
48
+ ...(options.organization
49
+ ? { headers: { "OpenAI-Organization": options.organization } }
50
+ : {}),
51
+ ...(options.backupModels ? { backupModels: options.backupModels } : {}),
52
+ ...(options.config ? { config: options.config } : {}),
53
+ ...(options.retryConfig ? { retryConfig: options.retryConfig } : {}),
54
+ ...(options.fetchImpl ? { fetchImpl: options.fetchImpl } : {}),
79
55
  });
80
56
  }
81
57
  }
@@ -1,45 +1,37 @@
1
1
  /**
2
- * OpenRouter provider implementation
3
- * OpenRouter provides access to multiple AI models through a unified OpenAI-compatible API
2
+ * OpenRouter one OpenAI-compatible endpoint in front of many models.
4
3
  */
5
4
 
6
- import OpenAI from "openai";
5
+ import type { ProviderCapabilities } from "../types/ai.js";
6
+ import { OpenAICompatibleProvider } from "./OpenAICompatibleProvider.js";
7
+ import type { RequestConfig } from "./ProviderAdapter.js";
7
8
 
8
- import type { ProviderCapabilities } from "../types/ai";
9
- import type { ErrorClassificationOptions } from "./errorClassification";
10
- import {
11
- OpenAICompatibleProvider,
12
- type OpenAICompatibleRequestConfig,
13
- } from "./OpenAICompatibleProvider";
14
-
15
- /**
16
- * Configuration options for OpenRouter provider
17
- * Uses types from openai package (OpenRouter is OpenAI-compatible)
18
- */
19
9
  export interface OpenRouterProviderOptions {
20
10
  /** OpenRouter API key */
21
11
  apiKey: string;
22
- /** Model to use (required) - see https://openrouter.ai/models */
12
+ /** Model to use (required) see https://openrouter.ai/models */
23
13
  model: string;
24
- /** Backup models to try if primary fails (default: []) */
14
+ /** Backup models to try if the primary fails (default: []) */
25
15
  backupModels?: string[];
26
- /** Optional site URL for OpenRouter rankings */
16
+ /** Site URL for OpenRouter's rankings */
27
17
  siteUrl?: string;
28
- /** Optional app name for OpenRouter rankings */
18
+ /** App name for OpenRouter's rankings */
29
19
  siteName?: string;
30
- /** Default parameters - uses ChatCompletionCreateParamsNonStreaming from openai package */
31
- config?: OpenAICompatibleRequestConfig;
32
- /** Retry configuration */
33
- retryConfig?: {
34
- timeout?: number;
35
- retries?: number;
36
- };
20
+ /**
21
+ * Preferred upstream hosts, in order. OpenRouter's prompt cache lives on the
22
+ * upstream host's account and default routing hops between them, so every hop
23
+ * is a cold cache — worse latency and a higher effective input cost across a
24
+ * conversation's rounds. Fallbacks stay on: this is a preference, not a lock.
25
+ */
26
+ providerOrder?: string[];
27
+ /** Request defaults sent with every call */
28
+ config?: RequestConfig;
29
+ /** Idle-stream deadline and retry budget */
30
+ retryConfig?: { timeout?: number; retries?: number };
31
+ /** Replacement `fetch`, for tests that script the wire. */
32
+ fetchImpl?: typeof fetch;
37
33
  }
38
34
 
39
- /**
40
- * OpenRouter provider implementation
41
- * Provides access to multiple AI models through OpenRouter's unified API
42
- */
43
35
  export class OpenRouterProvider extends OpenAICompatibleProvider {
44
36
  public readonly name = "openrouter";
45
37
  public readonly capabilities: ProviderCapabilities = {
@@ -47,52 +39,30 @@ export class OpenRouterProvider extends OpenAICompatibleProvider {
47
39
  supportsNativeJsonSchema: true,
48
40
  supportsStreaming: true,
49
41
  supportsStreamingToolCalls: true,
50
- supportsPromptCaching: false,
42
+ supportsPromptCaching: true,
51
43
  };
52
44
 
53
- protected readonly logLabel = "OPENROUTER";
54
- protected readonly displayName = "OpenRouter";
55
-
56
- /** OpenRouter additionally reports capacity issues in error messages */
57
- protected override readonly classificationOptions: ErrorClassificationOptions =
58
- {
59
- overloadedCodes: ["model_not_found", "model_overloaded"],
60
- overloadedMessages: ["capacity"],
61
- };
62
-
63
45
  constructor(options: OpenRouterProviderOptions) {
64
- const {
65
- apiKey,
66
- model,
67
- backupModels,
68
- siteUrl,
69
- siteName,
70
- config,
71
- retryConfig,
72
- } = options;
73
-
74
- if (!apiKey) {
75
- throw new Error("OpenRouter API key is required");
76
- }
77
-
78
- if (!model) {
79
- throw new Error("Model is required. See https://openrouter.ai/models");
80
- }
46
+ if (!options.apiKey) throw new Error("OpenRouter API key is required");
47
+ if (!options.model) throw new Error("Model is required. See https://openrouter.ai/models");
81
48
 
82
- // Initialize OpenAI client with OpenRouter base URL
83
49
  super({
84
- client: new OpenAI({
85
- apiKey,
86
- baseURL: "https://openrouter.ai/api/v1",
87
- defaultHeaders: {
88
- "HTTP-Referer": siteUrl || "",
89
- "X-Title": siteName || "",
90
- },
91
- }),
92
- model,
93
- backupModels,
94
- config,
95
- retryConfig,
50
+ id: "openrouter",
51
+ apiKey: options.apiKey,
52
+ baseUrl: "https://openrouter.ai/api",
53
+ model: options.model,
54
+ // Chat completions rather than the Responses API: this gateway's
55
+ // json_schema passthrough is what its models actually support.
56
+ structuredOutput: "json_schema",
57
+ headers: {
58
+ ...(options.siteUrl ? { "HTTP-Referer": options.siteUrl } : {}),
59
+ ...(options.siteName ? { "X-Title": options.siteName } : {}),
60
+ },
61
+ ...(options.providerOrder ? { providerOrder: options.providerOrder } : {}),
62
+ ...(options.backupModels ? { backupModels: options.backupModels } : {}),
63
+ ...(options.config ? { config: options.config } : {}),
64
+ ...(options.retryConfig ? { retryConfig: options.retryConfig } : {}),
65
+ ...(options.fetchImpl ? { fetchImpl: options.fetchImpl } : {}),
96
66
  });
97
67
  }
98
68
  }
@@ -0,0 +1,368 @@
1
+ /**
2
+ * The bridge between this framework's provider seam and `@providerkit/core`.
3
+ *
4
+ * The two seams are different shapes on purpose. Core speaks in normalized
5
+ * chunks — `createStream(messages, tools, opts)` — because that is the only
6
+ * shape every vendor's wire actually is. This framework speaks in whole turns:
7
+ * `generateMessage(input)` takes a composed prompt plus history and hands back
8
+ * a parsed structured response, because that is what a flow step needs.
9
+ *
10
+ * Everything vendor-specific now lives one layer down, so what is left here is
11
+ * exactly the translation and nothing else: history to messages, tools to tool
12
+ * definitions, chunks to an accumulated turn.
13
+ *
14
+ * Both entry points run the SAME pipeline. `generateMessage` is
15
+ * `generateMessageStream` drained — one code path for the streaming and
16
+ * non-streaming APIs, where there used to be two of everything per vendor and
17
+ * the pair drifted (the streaming path silently lost native schema enforcement
18
+ * because only the non-streaming one could reach `responses.parse`).
19
+ */
20
+
21
+ import {
22
+ ProviderError,
23
+ classify,
24
+ isBackupEligible,
25
+ requireContent,
26
+ streamWatch,
27
+ streamWithBackupModels,
28
+ watchChunks,
29
+ withStreamRetry,
30
+ type ChatMessage,
31
+ type JsonObjectSchema,
32
+ type Provider,
33
+ type ProviderChunk,
34
+ type StreamOptions,
35
+ type ToolDefinition,
36
+ } from "@providerkit/core";
37
+
38
+ import type {
39
+ AgentStructuredResponse,
40
+ AiProvider,
41
+ GenerateMessageInput,
42
+ GenerateMessageOutput,
43
+ GenerateMessageStreamChunk,
44
+ ProviderCapabilities,
45
+ } from "../types/ai.js";
46
+ import type { HistoryItem } from "../types/history.js";
47
+ import { assertUsableCompletion } from "../utils/completion.js";
48
+ import { logger } from "../utils/logger.js";
49
+
50
+ /** Provider timeout (ms) + retry count, after defaults are applied. */
51
+ export interface RetryConfig {
52
+ /**
53
+ * How long a stream may stay SILENT before it is considered wedged.
54
+ *
55
+ * In v2 this was a total wall-clock cap on a non-streaming call, so a healthy
56
+ * but long generation died at the one-minute mark. It now bounds silence
57
+ * instead: time to the first byte, and the gap between any two after it. A
58
+ * request that never gets a reply still fails at the same moment; one that is
59
+ * steadily producing tokens is left alone.
60
+ */
61
+ timeout: number;
62
+ /** Retries AFTER the first attempt, so `0` still performs one call. */
63
+ retries: number;
64
+ }
65
+
66
+ const DEFAULT_RETRY_CONFIG: RetryConfig = { timeout: 60_000, retries: 3 };
67
+
68
+ /**
69
+ * Normalize a provider's optional retry config against the defaults. `timeout`
70
+ * uses `||` (a 0ms timeout is degenerate — it would abort every call before it
71
+ * began), while `retries` uses `??` so an explicit `retries: 0` is honored
72
+ * rather than treated as unset.
73
+ */
74
+ export function resolveRetryConfig(input?: { timeout?: number; retries?: number }): RetryConfig {
75
+ return {
76
+ timeout: input?.timeout || DEFAULT_RETRY_CONFIG.timeout,
77
+ retries: input?.retries ?? DEFAULT_RETRY_CONFIG.retries,
78
+ };
79
+ }
80
+
81
+ /**
82
+ * Request defaults sent with every call.
83
+ *
84
+ * Only the fields every supported shape has. In v2 each provider took its own
85
+ * vendor's SDK parameter type here — which is how one vendor's package ended
86
+ * up in the dependency tree of consumers who used a different vendor, and how
87
+ * a field set on one provider silently vanished on another.
88
+ */
89
+ export interface RequestConfig {
90
+ temperature?: number;
91
+ topP?: number;
92
+ maxTokens?: number;
93
+ stopSequences?: string[];
94
+ }
95
+
96
+ export interface ProviderAdapterInit {
97
+ /** The `@providerkit/core` provider this adapter drives. */
98
+ provider: Provider;
99
+ model: string;
100
+ /**
101
+ * Sampling defaults for every call, overridden by anything the caller sets
102
+ * per turn. Only the fields every supported shape has: a knob one vendor
103
+ * alone understands belongs to that vendor's own client, not to a seam four
104
+ * of them share.
105
+ */
106
+ defaults?: RequestConfig;
107
+ /** Tried in order after the primary. */
108
+ backupModels?: string[];
109
+ retryConfig?: { timeout?: number; retries?: number };
110
+ }
111
+
112
+ /**
113
+ * A model id the endpoint will not serve is grounds to try the next model on
114
+ * the list — that is what the list is FOR. Core's default is deliberately
115
+ * narrower (a throttle and an overload only), because there a typo'd model
116
+ * should fail loudly rather than quietly answer from a different one. Here the
117
+ * backup list is explicit and per-provider, so the wider reading is the right
118
+ * one: a gateway that has deprecated or cannot currently route the primary is
119
+ * routine, and falling through is exactly the intent.
120
+ */
121
+ function shouldTryBackup(error: unknown): boolean {
122
+ const kind = classify(error);
123
+ return isBackupEligible(kind) || kind === "model";
124
+ }
125
+
126
+ /** History plus the composed prompt, as the seam's messages. */
127
+ export function toMessages(history: HistoryItem[], prompt: string): ChatMessage[] {
128
+ const out: ChatMessage[] = [];
129
+ for (const item of history) {
130
+ switch (item.role) {
131
+ case "system":
132
+ out.push({ role: "system", content: item.content });
133
+ break;
134
+ case "user":
135
+ out.push({ role: "user", content: item.content });
136
+ break;
137
+ case "assistant":
138
+ out.push({
139
+ role: "assistant",
140
+ content: item.content ?? "",
141
+ ...(item.tool_calls?.length
142
+ ? {
143
+ toolCalls: item.tool_calls.map((call) => ({
144
+ id: call.id,
145
+ name: call.name,
146
+ // The seam carries raw JSON: arguments arrive in fragments and
147
+ // can be truncated mid-stream, so parsing is the consumer's.
148
+ arguments: JSON.stringify(call.arguments),
149
+ })),
150
+ }
151
+ : {}),
152
+ });
153
+ break;
154
+ case "tool":
155
+ out.push({
156
+ role: "tool",
157
+ toolCallId: item.tool_call_id,
158
+ name: item.name,
159
+ content: typeof item.content === "string" ? item.content : JSON.stringify(item.content),
160
+ });
161
+ break;
162
+ }
163
+ }
164
+ out.push({ role: "user", content: prompt });
165
+ return out;
166
+ }
167
+
168
+ function toTools(tools: GenerateMessageInput<unknown>["tools"]): ToolDefinition[] {
169
+ return (tools ?? []).map((tool) => ({
170
+ name: tool.name || tool.id,
171
+ description: tool.description ?? "",
172
+ inputSchema: (tool.parameters ?? { type: "object" }) as JsonObjectSchema,
173
+ }));
174
+ }
175
+
176
+ /**
177
+ * A schema with nothing in it is not a request for JSON — it is a caller who
178
+ * has no schema. Sent as one it becomes a `json_schema` block with no `type`,
179
+ * which is a flat 400 on the shapes that enforce schemas.
180
+ */
181
+ function toJsonOutput(input: GenerateMessageInput<unknown>): StreamOptions["json"] {
182
+ const schema = input.parameters?.jsonSchema;
183
+ if (!schema || Object.keys(schema).length === 0) return undefined;
184
+ return {
185
+ name: input.parameters?.schemaName || "structured_output",
186
+ schema: schema as JsonObjectSchema,
187
+ };
188
+ }
189
+
190
+ /** What a turn accumulates into as its chunks arrive. */
191
+ interface Accumulator {
192
+ text: string;
193
+ model: string;
194
+ finishReason?: string;
195
+ promptTokens?: number;
196
+ completionTokens?: number;
197
+ cachedInputTokens?: number;
198
+ calls: Map<number, { name: string; arguments: string }>;
199
+ }
200
+
201
+ function fold(acc: Accumulator, chunk: ProviderChunk): string {
202
+ if (chunk.usage) {
203
+ acc.promptTokens = chunk.usage.inputTokens;
204
+ acc.completionTokens = chunk.usage.outputTokens;
205
+ acc.cachedInputTokens = chunk.usage.cachedInputTokens;
206
+ }
207
+ if (chunk.finishReason) acc.finishReason = chunk.finishReason;
208
+ for (const call of chunk.toolCalls ?? []) {
209
+ const entry = acc.calls.get(call.index) ?? { name: "", arguments: "" };
210
+ if (call.name) entry.name = call.name;
211
+ if (call.arguments) entry.arguments += call.arguments;
212
+ acc.calls.set(call.index, entry);
213
+ }
214
+ if (!chunk.content) return "";
215
+ acc.text += chunk.content;
216
+ return chunk.content;
217
+ }
218
+
219
+ type ToolCallList = NonNullable<AgentStructuredResponse["toolCalls"]>;
220
+
221
+ function toolCallsOf(acc: Accumulator, label: string): ToolCallList {
222
+ const out: ToolCallList = [];
223
+ for (const [, entry] of [...acc.calls.entries()].sort(([a], [b]) => a - b)) {
224
+ if (!entry.name) continue;
225
+ let args: Record<string, unknown> = {};
226
+ try {
227
+ if (entry.arguments) args = JSON.parse(entry.arguments) as Record<string, unknown>;
228
+ } catch (error) {
229
+ logger.warn(`[${label}] Failed to parse tool call arguments:`, error);
230
+ }
231
+ out.push({ toolName: entry.name, arguments: args });
232
+ }
233
+ return out;
234
+ }
235
+
236
+ export abstract class ProviderAdapter implements AiProvider {
237
+ public abstract readonly name: string;
238
+ public abstract readonly capabilities: ProviderCapabilities;
239
+
240
+ protected readonly provider: Provider;
241
+ protected readonly primaryModel: string;
242
+ protected readonly backupModels: string[];
243
+ protected readonly retryConfig: RetryConfig;
244
+ private readonly defaults: ProviderAdapterInit["defaults"];
245
+
246
+ protected constructor(init: ProviderAdapterInit) {
247
+ this.defaults = init.defaults;
248
+ this.provider = init.provider;
249
+ this.primaryModel = init.model;
250
+ this.backupModels = init.backupModels ?? [];
251
+ this.retryConfig = resolveRetryConfig(init.retryConfig);
252
+ }
253
+
254
+ async generateMessage<TContext = unknown, TStructured = AgentStructuredResponse>(
255
+ input: GenerateMessageInput<TContext>,
256
+ ): Promise<GenerateMessageOutput<TStructured>> {
257
+ let last: GenerateMessageStreamChunk<TStructured> | undefined;
258
+ for await (const chunk of this.generateMessageStream<TContext, TStructured>(input)) {
259
+ last = chunk;
260
+ }
261
+ // The stream always ends on its terminal chunk, and the empty-completion
262
+ // guard has already thrown if there was nothing in it.
263
+ if (!last) throw new ProviderError(this.name, "overload", `${this.name}: no response`);
264
+ return { message: last.accumulated, metadata: last.metadata, structured: last.structured };
265
+ }
266
+
267
+ async *generateMessageStream<TContext = unknown, TStructured = AgentStructuredResponse>(
268
+ input: GenerateMessageInput<TContext>,
269
+ ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
270
+ const messages = toMessages(input.history, input.prompt);
271
+ const tools = toTools(input.tools);
272
+ const json = toJsonOutput(input);
273
+ const acc: Accumulator = { text: "", model: this.primaryModel, calls: new Map() };
274
+
275
+ const opts: StreamOptions = {
276
+ ...this.defaults,
277
+ ...(input.parameters?.maxOutputTokens !== undefined
278
+ ? { maxTokens: input.parameters.maxOutputTokens }
279
+ : {}),
280
+ ...(input.parameters?.reasoning?.effort ? { effort: input.parameters.reasoning.effort } : {}),
281
+ ...(json ? { json } : {}),
282
+ };
283
+
284
+ const attempt = (model: string) =>
285
+ withStreamRetry<ProviderChunk>(
286
+ (signal) => {
287
+ acc.model = model;
288
+ const watch = streamWatch({
289
+ provider: this.name,
290
+ idleMs: this.retryConfig.timeout,
291
+ signal,
292
+ });
293
+ return requireContent(
294
+ this.name,
295
+ watchChunks(
296
+ watch,
297
+ this.provider.createStream(messages, tools, {
298
+ ...opts,
299
+ model,
300
+ signal: watch.signal,
301
+ }),
302
+ ),
303
+ );
304
+ },
305
+ {
306
+ maxAttempts: this.retryConfig.retries + 1,
307
+ ...(input.signal ? { signal: input.signal } : {}),
308
+ onRetry: ({ error, attempt: n }) =>
309
+ logger.warn(`[${this.name}] ${model} attempt ${n} failed, retrying:`, error),
310
+ },
311
+ );
312
+
313
+ const stream = streamWithBackupModels<ProviderChunk>(attempt, {
314
+ models: [this.primaryModel, ...this.backupModels],
315
+ shouldTryNext: shouldTryBackup,
316
+ onFallback: ({ model, position, total }) =>
317
+ logger.warn(`[${this.name}] falling back to ${model} (${position}/${total})`),
318
+ });
319
+
320
+ for await (const chunk of stream) {
321
+ const delta = fold(acc, chunk);
322
+ if (delta) yield { delta, accumulated: acc.text, done: false };
323
+ }
324
+
325
+ const toolCalls = toolCallsOf(acc, this.name);
326
+ let structured: TStructured | undefined;
327
+ if (json && acc.text) {
328
+ try {
329
+ structured = JSON.parse(acc.text) as TStructured;
330
+ } catch (error) {
331
+ logger.warn(`[${this.name}] Failed to parse JSON response:`, error);
332
+ }
333
+ }
334
+ if (toolCalls.length > 0) {
335
+ structured = {
336
+ ...(structured ?? {}),
337
+ message: (structured as AgentStructuredResponse | undefined)?.message || acc.text,
338
+ toolCalls,
339
+ } as TStructured;
340
+ }
341
+
342
+ // A parsed-but-blank message with no tool calls is as empty as no text. The
343
+ // stream guard upstream only knows about chunks; this one knows what the
344
+ // turn was FOR, and a turn that produced `{"message":""}` did not do it.
345
+ assertUsableCompletion(structured, acc.text, toolCalls.length, this.name);
346
+
347
+ yield {
348
+ delta: "",
349
+ accumulated: acc.text,
350
+ done: true,
351
+ metadata: {
352
+ model: acc.model,
353
+ ...(acc.finishReason ? { finishReason: acc.finishReason } : {}),
354
+ ...(acc.promptTokens !== undefined
355
+ ? {
356
+ tokensUsed: acc.promptTokens + (acc.completionTokens ?? 0),
357
+ promptTokens: acc.promptTokens,
358
+ completionTokens: acc.completionTokens,
359
+ // New in v3: the cache-hit subset of the prompt, which the old
360
+ // adapters never read and which is billed far cheaper.
361
+ cachedInputTokens: acc.cachedInputTokens,
362
+ }
363
+ : {}),
364
+ },
365
+ structured,
366
+ };
367
+ }
368
+ }
@@ -1,36 +1,34 @@
1
1
  /**
2
- * AI Provider exports
3
- * Centralized export point for all AI provider implementations
2
+ * AI provider exports.
3
+ *
4
+ * Every provider here is a thin binding over `@providerkit/core`: the vendor
5
+ * knowledge lives in that package, and these classes supply the naming,
6
+ * capabilities and construction this framework's seam expects.
4
7
  */
5
8
 
6
- export { AnthropicProvider } from "./AnthropicProvider";
7
- export type { AnthropicProviderOptions } from "./AnthropicProvider";
9
+ export { AnthropicProvider } from "./AnthropicProvider.js";
10
+ export type { AnthropicProviderOptions } from "./AnthropicProvider.js";
8
11
 
9
- export { GeminiProvider } from "./GeminiProvider";
10
- export type { GeminiProviderOptions } from "./GeminiProvider";
12
+ export { GeminiProvider } from "./GeminiProvider.js";
13
+ export type { GeminiProviderOptions } from "./GeminiProvider.js";
11
14
 
12
- export { OpenAIProvider } from "./OpenAIProvider";
13
- export type { OpenAIProviderOptions } from "./OpenAIProvider";
15
+ export { OpenAIProvider } from "./OpenAIProvider.js";
16
+ export type { OpenAIProviderOptions } from "./OpenAIProvider.js";
14
17
 
15
- export { OpenRouterProvider } from "./OpenRouterProvider";
16
- export type { OpenRouterProviderOptions } from "./OpenRouterProvider";
18
+ export { OpenRouterProvider } from "./OpenRouterProvider.js";
19
+ export type { OpenRouterProviderOptions } from "./OpenRouterProvider.js";
17
20
 
18
- export { DeepSeekProvider } from "./DeepSeekProvider";
19
- export type { DeepSeekProviderOptions } from "./DeepSeekProvider";
21
+ export { DeepSeekProvider } from "./DeepSeekProvider.js";
22
+ export type { DeepSeekProviderOptions } from "./DeepSeekProvider.js";
20
23
 
21
- export { OpenAICompatibleProvider } from "./OpenAICompatibleProvider";
24
+ export { OpenAICompatibleProvider } from "./OpenAICompatibleProvider.js";
22
25
  export type {
23
26
  OpenAICompatibleProviderInit,
24
- OpenAICompatibleRequestConfig,
25
27
  StructuredOutputMode,
26
- } from "./OpenAICompatibleProvider";
28
+ } from "./OpenAICompatibleProvider.js";
27
29
 
28
- export { createOpenAICompatibleProvider } from "./GenericOpenAICompatibleProvider";
29
- export type { OpenAICompatibleOptions } from "./GenericOpenAICompatibleProvider";
30
+ export { createOpenAICompatibleProvider } from "./GenericOpenAICompatibleProvider.js";
31
+ export type { OpenAICompatibleOptions } from "./GenericOpenAICompatibleProvider.js";
30
32
 
31
- export {
32
- classifyProviderError,
33
- isBackupEligible,
34
- toProviderError,
35
- } from "./errorClassification";
36
- export type { ErrorClassificationOptions } from "./errorClassification";
33
+ export { ProviderAdapter, resolveRetryConfig } from "./ProviderAdapter.js";
34
+ export type { ProviderAdapterInit, RequestConfig, RetryConfig } from "./ProviderAdapter.js";