@falai/agent 2.7.0 → 3.1.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 (559) hide show
  1. package/README.md +1 -1
  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 +3 -3
  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 +3 -3
  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 +1 -1
  23. package/dist/adapters/RedisAdapter.d.ts.map +1 -1
  24. package/dist/adapters/RedisAdapter.js +3 -3
  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 +3 -3
  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 +1 -1
  35. package/dist/adapters/sessionRow.d.ts.map +1 -1
  36. package/dist/cjs/adapters/MemoryAdapter.d.ts +1 -1
  37. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -1
  38. package/dist/cjs/adapters/MemoryAdapter.js +14 -14
  39. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  40. package/dist/cjs/adapters/MongoAdapter.d.ts +1 -1
  41. package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -1
  42. package/dist/cjs/adapters/MongoAdapter.js +4 -4
  43. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  44. package/dist/cjs/adapters/OpenSearchAdapter.d.ts +1 -1
  45. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  46. package/dist/cjs/adapters/OpenSearchAdapter.js +6 -6
  47. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  48. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +1 -1
  49. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  50. package/dist/cjs/adapters/PostgreSQLAdapter.js +12 -12
  51. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  52. package/dist/cjs/adapters/PrismaAdapter.d.ts +1 -1
  53. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -1
  54. package/dist/cjs/adapters/PrismaAdapter.js +7 -7
  55. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  56. package/dist/cjs/adapters/RedisAdapter.d.ts +1 -1
  57. package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
  58. package/dist/cjs/adapters/RedisAdapter.js +13 -13
  59. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  60. package/dist/cjs/adapters/SQLiteAdapter.d.ts +1 -1
  61. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  62. package/dist/cjs/adapters/SQLiteAdapter.js +8 -8
  63. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  64. package/dist/cjs/adapters/index.d.ts +13 -13
  65. package/dist/cjs/adapters/index.d.ts.map +1 -1
  66. package/dist/cjs/adapters/index.js +14 -14
  67. package/dist/cjs/adapters/index.js.map +1 -1
  68. package/dist/cjs/adapters/sessionRow.d.ts +1 -1
  69. package/dist/cjs/adapters/sessionRow.d.ts.map +1 -1
  70. package/dist/cjs/core/Agent.d.ts +11 -11
  71. package/dist/cjs/core/Agent.d.ts.map +1 -1
  72. package/dist/cjs/core/Agent.js +65 -65
  73. package/dist/cjs/core/Agent.js.map +1 -1
  74. package/dist/cjs/core/AutoChainExecutor.d.ts +5 -5
  75. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -1
  76. package/dist/cjs/core/AutoChainExecutor.js +26 -26
  77. package/dist/cjs/core/AutoChainExecutor.js.map +1 -1
  78. package/dist/cjs/core/BranchEvaluator.d.ts +4 -4
  79. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -1
  80. package/dist/cjs/core/BranchEvaluator.js +6 -6
  81. package/dist/cjs/core/BranchEvaluator.js.map +1 -1
  82. package/dist/cjs/core/CompactionEngine.d.ts +2 -2
  83. package/dist/cjs/core/CompactionEngine.d.ts.map +1 -1
  84. package/dist/cjs/core/DirectiveChainTracker.d.ts +1 -1
  85. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -1
  86. package/dist/cjs/core/DirectiveChainTracker.js +5 -5
  87. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -1
  88. package/dist/cjs/core/Events.d.ts +1 -1
  89. package/dist/cjs/core/Events.d.ts.map +1 -1
  90. package/dist/cjs/core/Events.js +15 -15
  91. package/dist/cjs/core/Events.js.map +1 -1
  92. package/dist/cjs/core/Flow.d.ts +4 -4
  93. package/dist/cjs/core/Flow.d.ts.map +1 -1
  94. package/dist/cjs/core/Flow.js +15 -15
  95. package/dist/cjs/core/Flow.js.map +1 -1
  96. package/dist/cjs/core/FlowRouter.d.ts +4 -4
  97. package/dist/cjs/core/FlowRouter.d.ts.map +1 -1
  98. package/dist/cjs/core/FlowRouter.js +64 -64
  99. package/dist/cjs/core/FlowRouter.js.map +1 -1
  100. package/dist/cjs/core/PersistenceManager.d.ts +1 -1
  101. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  102. package/dist/cjs/core/PersistenceManager.js +10 -10
  103. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  104. package/dist/cjs/core/PromptComposer.d.ts +4 -4
  105. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  106. package/dist/cjs/core/PromptComposer.js +13 -13
  107. package/dist/cjs/core/PromptComposer.js.map +1 -1
  108. package/dist/cjs/core/PromptSectionCache.d.ts +2 -2
  109. package/dist/cjs/core/PromptSectionCache.d.ts.map +1 -1
  110. package/dist/cjs/core/ResponseEngine.d.ts +4 -4
  111. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  112. package/dist/cjs/core/ResponseEngine.js +7 -7
  113. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  114. package/dist/cjs/core/ResponseModal.d.ts +10 -10
  115. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  116. package/dist/cjs/core/ResponseModal.js +69 -69
  117. package/dist/cjs/core/ResponseModal.js.map +1 -1
  118. package/dist/cjs/core/ResponsePipeline.d.ts +15 -7
  119. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  120. package/dist/cjs/core/ResponsePipeline.js +99 -91
  121. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  122. package/dist/cjs/core/SessionFinalizer.d.ts +4 -4
  123. package/dist/cjs/core/SessionFinalizer.d.ts.map +1 -1
  124. package/dist/cjs/core/SessionFinalizer.js +12 -12
  125. package/dist/cjs/core/SessionFinalizer.js.map +1 -1
  126. package/dist/cjs/core/SessionManager.d.ts +5 -5
  127. package/dist/cjs/core/SessionManager.d.ts.map +1 -1
  128. package/dist/cjs/core/SessionManager.js +8 -8
  129. package/dist/cjs/core/SessionManager.js.map +1 -1
  130. package/dist/cjs/core/SignalCoordinator.d.ts +5 -5
  131. package/dist/cjs/core/SignalCoordinator.d.ts.map +1 -1
  132. package/dist/cjs/core/SignalCoordinator.js +12 -12
  133. package/dist/cjs/core/SignalCoordinator.js.map +1 -1
  134. package/dist/cjs/core/SignalEvaluator.d.ts +4 -4
  135. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -1
  136. package/dist/cjs/core/SignalEvaluator.js +6 -6
  137. package/dist/cjs/core/SignalEvaluator.js.map +1 -1
  138. package/dist/cjs/core/SignalProcessor.d.ts +6 -6
  139. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -1
  140. package/dist/cjs/core/SignalProcessor.js +14 -14
  141. package/dist/cjs/core/SignalProcessor.js.map +1 -1
  142. package/dist/cjs/core/Step.d.ts +5 -5
  143. package/dist/cjs/core/Step.d.ts.map +1 -1
  144. package/dist/cjs/core/Step.js +17 -17
  145. package/dist/cjs/core/Step.js.map +1 -1
  146. package/dist/cjs/core/StepLifecycle.d.ts +3 -3
  147. package/dist/cjs/core/StepLifecycle.d.ts.map +1 -1
  148. package/dist/cjs/core/StepLifecycle.js +10 -10
  149. package/dist/cjs/core/StepLifecycle.js.map +1 -1
  150. package/dist/cjs/core/StreamingToolExecutor.d.ts +1 -1
  151. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  152. package/dist/cjs/core/StreamingToolExecutor.js +5 -5
  153. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  154. package/dist/cjs/core/ToolLoopExecutor.d.ts +4 -4
  155. package/dist/cjs/core/ToolLoopExecutor.d.ts.map +1 -1
  156. package/dist/cjs/core/ToolLoopExecutor.js +51 -51
  157. package/dist/cjs/core/ToolLoopExecutor.js.map +1 -1
  158. package/dist/cjs/core/ToolManager.d.ts +5 -5
  159. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  160. package/dist/cjs/core/ToolManager.js +66 -66
  161. package/dist/cjs/core/ToolManager.js.map +1 -1
  162. package/dist/cjs/core/createAgent.d.ts +2 -2
  163. package/dist/cjs/core/createAgent.d.ts.map +1 -1
  164. package/dist/cjs/core/createAgent.js +2 -2
  165. package/dist/cjs/core/createAgent.js.map +1 -1
  166. package/dist/cjs/core/flow-namespace.d.ts +2 -2
  167. package/dist/cjs/core/flow-namespace.d.ts.map +1 -1
  168. package/dist/cjs/core/flow-namespace.js +4 -4
  169. package/dist/cjs/core/flow-namespace.js.map +1 -1
  170. package/dist/cjs/core/toolGates.d.ts +1 -1
  171. package/dist/cjs/core/toolGates.d.ts.map +1 -1
  172. package/dist/cjs/core/toolGates.js +3 -3
  173. package/dist/cjs/core/toolGates.js.map +1 -1
  174. package/dist/cjs/index.d.ts +50 -48
  175. package/dist/cjs/index.d.ts.map +1 -1
  176. package/dist/cjs/index.js +96 -91
  177. package/dist/cjs/index.js.map +1 -1
  178. package/dist/cjs/providers/AnthropicProvider.d.ts +25 -42
  179. package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
  180. package/dist/cjs/providers/AnthropicProvider.js +32 -408
  181. package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
  182. package/dist/cjs/providers/DeepSeekProvider.d.ts +13 -34
  183. package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
  184. package/dist/cjs/providers/DeepSeekProvider.js +17 -51
  185. package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
  186. package/dist/cjs/providers/GeminiProvider.d.ts +24 -83
  187. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  188. package/dist/cjs/providers/GeminiProvider.js +33 -514
  189. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  190. package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
  191. package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
  192. package/dist/cjs/providers/GenericOpenAICompatibleProvider.js +14 -20
  193. package/dist/cjs/providers/GenericOpenAICompatibleProvider.js.map +1 -1
  194. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +26 -144
  195. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  196. package/dist/cjs/providers/OpenAICompatibleProvider.js +42 -523
  197. package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -1
  198. package/dist/cjs/providers/OpenAIProvider.d.ts +14 -20
  199. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  200. package/dist/cjs/providers/OpenAIProvider.js +20 -27
  201. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  202. package/dist/cjs/providers/OpenRouterProvider.d.ts +20 -24
  203. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  204. package/dist/cjs/providers/OpenRouterProvider.js +22 -38
  205. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  206. package/dist/cjs/providers/ProviderAdapter.d.ts +102 -0
  207. package/dist/cjs/providers/ProviderAdapter.d.ts.map +1 -0
  208. package/dist/cjs/providers/ProviderAdapter.js +257 -0
  209. package/dist/cjs/providers/ProviderAdapter.js.map +1 -0
  210. package/dist/cjs/providers/index.d.ts +21 -18
  211. package/dist/cjs/providers/index.d.ts.map +1 -1
  212. package/dist/cjs/providers/index.js +23 -21
  213. package/dist/cjs/providers/index.js.map +1 -1
  214. package/dist/cjs/types/agent.d.ts +11 -11
  215. package/dist/cjs/types/agent.d.ts.map +1 -1
  216. package/dist/cjs/types/ai.d.ts +11 -21
  217. package/dist/cjs/types/ai.d.ts.map +1 -1
  218. package/dist/cjs/types/compaction.d.ts +2 -2
  219. package/dist/cjs/types/compaction.d.ts.map +1 -1
  220. package/dist/cjs/types/errors.d.ts +16 -20
  221. package/dist/cjs/types/errors.d.ts.map +1 -1
  222. package/dist/cjs/types/errors.js +17 -18
  223. package/dist/cjs/types/errors.js.map +1 -1
  224. package/dist/cjs/types/flow.d.ts +7 -7
  225. package/dist/cjs/types/flow.d.ts.map +1 -1
  226. package/dist/cjs/types/history.d.ts +1 -1
  227. package/dist/cjs/types/history.d.ts.map +1 -1
  228. package/dist/cjs/types/index.d.ts +17 -17
  229. package/dist/cjs/types/index.d.ts.map +1 -1
  230. package/dist/cjs/types/index.js +14 -14
  231. package/dist/cjs/types/index.js.map +1 -1
  232. package/dist/cjs/types/persistence.d.ts +2 -2
  233. package/dist/cjs/types/persistence.d.ts.map +1 -1
  234. package/dist/cjs/types/session.d.ts +4 -4
  235. package/dist/cjs/types/session.d.ts.map +1 -1
  236. package/dist/cjs/types/signals.d.ts +3 -3
  237. package/dist/cjs/types/signals.d.ts.map +1 -1
  238. package/dist/cjs/types/template.d.ts +2 -2
  239. package/dist/cjs/types/template.d.ts.map +1 -1
  240. package/dist/cjs/types/tool.d.ts +2 -2
  241. package/dist/cjs/types/tool.d.ts.map +1 -1
  242. package/dist/cjs/utils/condition.d.ts +1 -1
  243. package/dist/cjs/utils/condition.d.ts.map +1 -1
  244. package/dist/cjs/utils/condition.js +6 -6
  245. package/dist/cjs/utils/condition.js.map +1 -1
  246. package/dist/cjs/utils/event.d.ts +1 -1
  247. package/dist/cjs/utils/event.d.ts.map +1 -1
  248. package/dist/cjs/utils/event.js +2 -2
  249. package/dist/cjs/utils/event.js.map +1 -1
  250. package/dist/cjs/utils/history.d.ts +2 -2
  251. package/dist/cjs/utils/history.d.ts.map +1 -1
  252. package/dist/cjs/utils/history.js +15 -15
  253. package/dist/cjs/utils/history.js.map +1 -1
  254. package/dist/cjs/utils/index.d.ts +11 -13
  255. package/dist/cjs/utils/index.d.ts.map +1 -1
  256. package/dist/cjs/utils/index.js +57 -67
  257. package/dist/cjs/utils/index.js.map +1 -1
  258. package/dist/cjs/utils/serialize.d.ts +2 -2
  259. package/dist/cjs/utils/serialize.d.ts.map +1 -1
  260. package/dist/cjs/utils/session.d.ts +3 -3
  261. package/dist/cjs/utils/session.d.ts.map +1 -1
  262. package/dist/cjs/utils/session.js +4 -4
  263. package/dist/cjs/utils/session.js.map +1 -1
  264. package/dist/cjs/utils/template.d.ts +3 -3
  265. package/dist/cjs/utils/template.d.ts.map +1 -1
  266. package/dist/cjs/utils/template.js +5 -5
  267. package/dist/cjs/utils/template.js.map +1 -1
  268. package/dist/constants/index.d.ts +1 -0
  269. package/dist/constants/index.js +1 -1
  270. package/dist/core/Agent.d.ts +11 -11
  271. package/dist/core/Agent.d.ts.map +1 -1
  272. package/dist/core/Agent.js +13 -13
  273. package/dist/core/Agent.js.map +1 -1
  274. package/dist/core/AutoChainExecutor.d.ts +5 -5
  275. package/dist/core/AutoChainExecutor.d.ts.map +1 -1
  276. package/dist/core/AutoChainExecutor.js +5 -5
  277. package/dist/core/AutoChainExecutor.js.map +1 -1
  278. package/dist/core/BranchEvaluator.d.ts +4 -4
  279. package/dist/core/BranchEvaluator.d.ts.map +1 -1
  280. package/dist/core/BranchEvaluator.js +2 -2
  281. package/dist/core/BranchEvaluator.js.map +1 -1
  282. package/dist/core/CompactionEngine.d.ts +2 -2
  283. package/dist/core/CompactionEngine.d.ts.map +1 -1
  284. package/dist/core/DirectiveChainTracker.d.ts +1 -1
  285. package/dist/core/DirectiveChainTracker.d.ts.map +1 -1
  286. package/dist/core/DirectiveChainTracker.js +2 -2
  287. package/dist/core/DirectiveChainTracker.js.map +1 -1
  288. package/dist/core/Events.d.ts +1 -1
  289. package/dist/core/Events.d.ts.map +1 -1
  290. package/dist/core/Events.js +1 -1
  291. package/dist/core/Events.js.map +1 -1
  292. package/dist/core/Flow.d.ts +4 -4
  293. package/dist/core/Flow.d.ts.map +1 -1
  294. package/dist/core/Flow.js +3 -3
  295. package/dist/core/Flow.js.map +1 -1
  296. package/dist/core/FlowRouter.d.ts +4 -4
  297. package/dist/core/FlowRouter.d.ts.map +1 -1
  298. package/dist/core/FlowRouter.js +4 -4
  299. package/dist/core/FlowRouter.js.map +1 -1
  300. package/dist/core/PersistenceManager.d.ts +1 -1
  301. package/dist/core/PersistenceManager.d.ts.map +1 -1
  302. package/dist/core/PersistenceManager.js +3 -3
  303. package/dist/core/PersistenceManager.js.map +1 -1
  304. package/dist/core/PromptComposer.d.ts +4 -4
  305. package/dist/core/PromptComposer.d.ts.map +1 -1
  306. package/dist/core/PromptComposer.js +3 -3
  307. package/dist/core/PromptComposer.js.map +1 -1
  308. package/dist/core/PromptSectionCache.d.ts +2 -2
  309. package/dist/core/PromptSectionCache.d.ts.map +1 -1
  310. package/dist/core/ResponseEngine.d.ts +4 -4
  311. package/dist/core/ResponseEngine.d.ts.map +1 -1
  312. package/dist/core/ResponseEngine.js +2 -2
  313. package/dist/core/ResponseEngine.js.map +1 -1
  314. package/dist/core/ResponseModal.d.ts +10 -10
  315. package/dist/core/ResponseModal.d.ts.map +1 -1
  316. package/dist/core/ResponseModal.js +14 -14
  317. package/dist/core/ResponseModal.js.map +1 -1
  318. package/dist/core/ResponsePipeline.d.ts +15 -7
  319. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  320. package/dist/core/ResponsePipeline.js +25 -17
  321. package/dist/core/ResponsePipeline.js.map +1 -1
  322. package/dist/core/SessionFinalizer.d.ts +4 -4
  323. package/dist/core/SessionFinalizer.d.ts.map +1 -1
  324. package/dist/core/SessionFinalizer.js +3 -3
  325. package/dist/core/SessionFinalizer.js.map +1 -1
  326. package/dist/core/SessionManager.d.ts +5 -5
  327. package/dist/core/SessionManager.d.ts.map +1 -1
  328. package/dist/core/SessionManager.js +3 -3
  329. package/dist/core/SessionManager.js.map +1 -1
  330. package/dist/core/SignalCoordinator.d.ts +5 -5
  331. package/dist/core/SignalCoordinator.d.ts.map +1 -1
  332. package/dist/core/SignalCoordinator.js +2 -2
  333. package/dist/core/SignalCoordinator.js.map +1 -1
  334. package/dist/core/SignalEvaluator.d.ts +4 -4
  335. package/dist/core/SignalEvaluator.d.ts.map +1 -1
  336. package/dist/core/SignalEvaluator.js +2 -2
  337. package/dist/core/SignalEvaluator.js.map +1 -1
  338. package/dist/core/SignalProcessor.d.ts +6 -6
  339. package/dist/core/SignalProcessor.d.ts.map +1 -1
  340. package/dist/core/SignalProcessor.js +3 -3
  341. package/dist/core/SignalProcessor.js.map +1 -1
  342. package/dist/core/Step.d.ts +5 -5
  343. package/dist/core/Step.d.ts.map +1 -1
  344. package/dist/core/Step.js +4 -4
  345. package/dist/core/Step.js.map +1 -1
  346. package/dist/core/StepLifecycle.d.ts +3 -3
  347. package/dist/core/StepLifecycle.d.ts.map +1 -1
  348. package/dist/core/StepLifecycle.js +2 -2
  349. package/dist/core/StepLifecycle.js.map +1 -1
  350. package/dist/core/StreamingToolExecutor.d.ts +1 -1
  351. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  352. package/dist/core/StreamingToolExecutor.js +2 -2
  353. package/dist/core/StreamingToolExecutor.js.map +1 -1
  354. package/dist/core/ToolLoopExecutor.d.ts +4 -4
  355. package/dist/core/ToolLoopExecutor.d.ts.map +1 -1
  356. package/dist/core/ToolLoopExecutor.js +3 -3
  357. package/dist/core/ToolLoopExecutor.js.map +1 -1
  358. package/dist/core/ToolManager.d.ts +5 -5
  359. package/dist/core/ToolManager.d.ts.map +1 -1
  360. package/dist/core/ToolManager.js +4 -4
  361. package/dist/core/ToolManager.js.map +1 -1
  362. package/dist/core/createAgent.d.ts +2 -2
  363. package/dist/core/createAgent.d.ts.map +1 -1
  364. package/dist/core/createAgent.js +1 -1
  365. package/dist/core/createAgent.js.map +1 -1
  366. package/dist/core/flow-namespace.d.ts +2 -2
  367. package/dist/core/flow-namespace.d.ts.map +1 -1
  368. package/dist/core/flow-namespace.js +1 -1
  369. package/dist/core/flow-namespace.js.map +1 -1
  370. package/dist/core/toolGates.d.ts +1 -1
  371. package/dist/core/toolGates.d.ts.map +1 -1
  372. package/dist/core/toolGates.js +1 -1
  373. package/dist/core/toolGates.js.map +1 -1
  374. package/dist/index.d.ts +50 -48
  375. package/dist/index.d.ts.map +1 -1
  376. package/dist/index.js +34 -31
  377. package/dist/index.js.map +1 -1
  378. package/dist/providers/AnthropicProvider.d.ts +25 -42
  379. package/dist/providers/AnthropicProvider.d.ts.map +1 -1
  380. package/dist/providers/AnthropicProvider.js +32 -405
  381. package/dist/providers/AnthropicProvider.js.map +1 -1
  382. package/dist/providers/DeepSeekProvider.d.ts +13 -34
  383. package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
  384. package/dist/providers/DeepSeekProvider.js +16 -47
  385. package/dist/providers/DeepSeekProvider.js.map +1 -1
  386. package/dist/providers/GeminiProvider.d.ts +24 -83
  387. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  388. package/dist/providers/GeminiProvider.js +33 -514
  389. package/dist/providers/GeminiProvider.js.map +1 -1
  390. package/dist/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
  391. package/dist/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
  392. package/dist/providers/GenericOpenAICompatibleProvider.js +13 -16
  393. package/dist/providers/GenericOpenAICompatibleProvider.js.map +1 -1
  394. package/dist/providers/OpenAICompatibleProvider.d.ts +26 -144
  395. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  396. package/dist/providers/OpenAICompatibleProvider.js +41 -522
  397. package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
  398. package/dist/providers/OpenAIProvider.d.ts +14 -20
  399. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  400. package/dist/providers/OpenAIProvider.js +19 -23
  401. package/dist/providers/OpenAIProvider.js.map +1 -1
  402. package/dist/providers/OpenRouterProvider.d.ts +20 -24
  403. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  404. package/dist/providers/OpenRouterProvider.js +21 -34
  405. package/dist/providers/OpenRouterProvider.js.map +1 -1
  406. package/dist/providers/ProviderAdapter.d.ts +102 -0
  407. package/dist/providers/ProviderAdapter.d.ts.map +1 -0
  408. package/dist/providers/ProviderAdapter.js +251 -0
  409. package/dist/providers/ProviderAdapter.js.map +1 -0
  410. package/dist/providers/index.d.ts +21 -18
  411. package/dist/providers/index.d.ts.map +1 -1
  412. package/dist/providers/index.js +13 -10
  413. package/dist/providers/index.js.map +1 -1
  414. package/dist/types/agent.d.ts +11 -11
  415. package/dist/types/agent.d.ts.map +1 -1
  416. package/dist/types/ai.d.ts +11 -21
  417. package/dist/types/ai.d.ts.map +1 -1
  418. package/dist/types/compaction.d.ts +2 -2
  419. package/dist/types/compaction.d.ts.map +1 -1
  420. package/dist/types/errors.d.ts +16 -20
  421. package/dist/types/errors.d.ts.map +1 -1
  422. package/dist/types/errors.js +15 -16
  423. package/dist/types/errors.js.map +1 -1
  424. package/dist/types/flow.d.ts +7 -7
  425. package/dist/types/flow.d.ts.map +1 -1
  426. package/dist/types/history.d.ts +1 -1
  427. package/dist/types/history.d.ts.map +1 -1
  428. package/dist/types/index.d.ts +17 -17
  429. package/dist/types/index.d.ts.map +1 -1
  430. package/dist/types/index.js +4 -4
  431. package/dist/types/index.js.map +1 -1
  432. package/dist/types/persistence.d.ts +2 -2
  433. package/dist/types/persistence.d.ts.map +1 -1
  434. package/dist/types/session.d.ts +4 -4
  435. package/dist/types/session.d.ts.map +1 -1
  436. package/dist/types/signals.d.ts +3 -3
  437. package/dist/types/signals.d.ts.map +1 -1
  438. package/dist/types/template.d.ts +2 -2
  439. package/dist/types/template.d.ts.map +1 -1
  440. package/dist/types/tool.d.ts +2 -2
  441. package/dist/types/tool.d.ts.map +1 -1
  442. package/dist/utils/condition.d.ts +1 -1
  443. package/dist/utils/condition.d.ts.map +1 -1
  444. package/dist/utils/condition.js +2 -2
  445. package/dist/utils/condition.js.map +1 -1
  446. package/dist/utils/event.d.ts +1 -1
  447. package/dist/utils/event.d.ts.map +1 -1
  448. package/dist/utils/event.js +1 -1
  449. package/dist/utils/event.js.map +1 -1
  450. package/dist/utils/history.d.ts +2 -2
  451. package/dist/utils/history.d.ts.map +1 -1
  452. package/dist/utils/history.js +1 -1
  453. package/dist/utils/history.js.map +1 -1
  454. package/dist/utils/index.d.ts +11 -13
  455. package/dist/utils/index.d.ts.map +1 -1
  456. package/dist/utils/index.js +11 -12
  457. package/dist/utils/index.js.map +1 -1
  458. package/dist/utils/serialize.d.ts +2 -2
  459. package/dist/utils/serialize.d.ts.map +1 -1
  460. package/dist/utils/session.d.ts +3 -3
  461. package/dist/utils/session.d.ts.map +1 -1
  462. package/dist/utils/session.js +2 -2
  463. package/dist/utils/session.js.map +1 -1
  464. package/dist/utils/template.d.ts +3 -3
  465. package/dist/utils/template.d.ts.map +1 -1
  466. package/dist/utils/template.js +1 -1
  467. package/dist/utils/template.js.map +1 -1
  468. package/docs/reference/branches.md +2 -0
  469. package/docs/reference/errors.md +5 -5
  470. package/docs/reference/providers.md +42 -43
  471. package/examples/01-quickstart.ts +1 -1
  472. package/examples/04-instructions.ts +1 -1
  473. package/examples/05-branching.ts +2 -2
  474. package/examples/08-persistence.ts +1 -1
  475. package/examples/tsconfig.json +6 -3
  476. package/package.json +11 -8
  477. package/src/adapters/MemoryAdapter.ts +4 -4
  478. package/src/adapters/MongoAdapter.ts +3 -3
  479. package/src/adapters/OpenSearchAdapter.ts +4 -4
  480. package/src/adapters/PostgreSQLAdapter.ts +4 -4
  481. package/src/adapters/PrismaAdapter.ts +4 -4
  482. package/src/adapters/RedisAdapter.ts +4 -4
  483. package/src/adapters/SQLiteAdapter.ts +4 -4
  484. package/src/adapters/index.ts +13 -13
  485. package/src/adapters/sessionRow.ts +1 -1
  486. package/src/core/Agent.ts +18 -18
  487. package/src/core/AutoChainExecutor.ts +9 -9
  488. package/src/core/BranchEvaluator.ts +5 -5
  489. package/src/core/CompactionEngine.ts +2 -2
  490. package/src/core/DirectiveChainTracker.ts +3 -3
  491. package/src/core/Events.ts +2 -2
  492. package/src/core/Flow.ts +9 -9
  493. package/src/core/FlowRouter.ts +8 -8
  494. package/src/core/PersistenceManager.ts +4 -4
  495. package/src/core/PromptComposer.ts +8 -8
  496. package/src/core/PromptSectionCache.ts +2 -2
  497. package/src/core/ResponseEngine.ts +6 -6
  498. package/src/core/ResponseModal.ts +24 -24
  499. package/src/core/ResponsePipeline.ts +43 -23
  500. package/src/core/SessionFinalizer.ts +7 -7
  501. package/src/core/SessionManager.ts +7 -7
  502. package/src/core/SignalCoordinator.ts +7 -7
  503. package/src/core/SignalEvaluator.ts +6 -6
  504. package/src/core/SignalProcessor.ts +9 -9
  505. package/src/core/Step.ts +9 -9
  506. package/src/core/StepLifecycle.ts +6 -6
  507. package/src/core/StreamingToolExecutor.ts +4 -4
  508. package/src/core/ToolLoopExecutor.ts +7 -7
  509. package/src/core/ToolManager.ts +9 -9
  510. package/src/core/createAgent.ts +2 -2
  511. package/src/core/flow-namespace.ts +3 -3
  512. package/src/core/toolGates.ts +2 -2
  513. package/src/index.ts +59 -48
  514. package/src/providers/AnthropicProvider.ts +46 -548
  515. package/src/providers/DeepSeekProvider.ts +27 -92
  516. package/src/providers/GeminiProvider.ts +44 -680
  517. package/src/providers/GenericOpenAICompatibleProvider.ts +19 -27
  518. package/src/providers/OpenAICompatibleProvider.ts +60 -763
  519. package/src/providers/OpenAIProvider.ts +31 -55
  520. package/src/providers/OpenRouterProvider.ts +40 -70
  521. package/src/providers/ProviderAdapter.ts +377 -0
  522. package/src/providers/index.ts +21 -23
  523. package/src/types/agent.ts +11 -11
  524. package/src/types/ai.ts +11 -21
  525. package/src/types/compaction.ts +2 -2
  526. package/src/types/errors.ts +17 -35
  527. package/src/types/flow.ts +7 -7
  528. package/src/types/history.ts +1 -1
  529. package/src/types/index.ts +17 -17
  530. package/src/types/persistence.ts +2 -2
  531. package/src/types/session.ts +4 -4
  532. package/src/types/signals.ts +3 -3
  533. package/src/types/template.ts +2 -2
  534. package/src/types/tool.ts +2 -2
  535. package/src/utils/condition.ts +3 -3
  536. package/src/utils/event.ts +1 -1
  537. package/src/utils/history.ts +3 -3
  538. package/src/utils/index.ts +11 -31
  539. package/src/utils/serialize.ts +2 -2
  540. package/src/utils/session.ts +6 -6
  541. package/src/utils/template.ts +3 -3
  542. package/dist/cjs/providers/errorClassification.d.ts +0 -68
  543. package/dist/cjs/providers/errorClassification.d.ts.map +0 -1
  544. package/dist/cjs/providers/errorClassification.js +0 -150
  545. package/dist/cjs/providers/errorClassification.js.map +0 -1
  546. package/dist/cjs/utils/retry.d.ts +0 -165
  547. package/dist/cjs/utils/retry.d.ts.map +0 -1
  548. package/dist/cjs/utils/retry.js +0 -338
  549. package/dist/cjs/utils/retry.js.map +0 -1
  550. package/dist/providers/errorClassification.d.ts +0 -68
  551. package/dist/providers/errorClassification.d.ts.map +0 -1
  552. package/dist/providers/errorClassification.js +0 -142
  553. package/dist/providers/errorClassification.js.map +0 -1
  554. package/dist/utils/retry.d.ts +0 -165
  555. package/dist/utils/retry.d.ts.map +0 -1
  556. package/dist/utils/retry.js +0 -327
  557. package/dist/utils/retry.js.map +0 -1
  558. package/src/providers/errorClassification.ts +0 -206
  559. package/src/utils/retry.ts +0 -523
@@ -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.6", "gpt-5.4-mini" */
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.6' or 'gpt-5.5'");
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,377 @@
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 Effort,
32
+ type JsonObjectSchema,
33
+ type Provider,
34
+ type ProviderChunk,
35
+ type StreamOptions,
36
+ type ToolDefinition,
37
+ } from "@providerkit/core";
38
+
39
+ import type {
40
+ AgentStructuredResponse,
41
+ AiProvider,
42
+ GenerateMessageInput,
43
+ GenerateMessageOutput,
44
+ GenerateMessageStreamChunk,
45
+ ProviderCapabilities,
46
+ } from "../types/ai.js";
47
+ import type { HistoryItem } from "../types/history.js";
48
+ import { assertUsableCompletion } from "../utils/completion.js";
49
+ import { logger } from "../utils/logger.js";
50
+
51
+ /** Provider timeout (ms) + retry count, after defaults are applied. */
52
+ export interface RetryConfig {
53
+ /**
54
+ * How long a stream may stay SILENT before it is considered wedged.
55
+ *
56
+ * In v2 this was a total wall-clock cap on a non-streaming call, so a healthy
57
+ * but long generation died at the one-minute mark. It now bounds silence
58
+ * instead: time to the first byte, and the gap between any two after it. A
59
+ * request that never gets a reply still fails at the same moment; one that is
60
+ * steadily producing tokens is left alone.
61
+ */
62
+ timeout: number;
63
+ /** Retries AFTER the first attempt, so `0` still performs one call. */
64
+ retries: number;
65
+ }
66
+
67
+ const DEFAULT_RETRY_CONFIG: RetryConfig = { timeout: 60_000, retries: 3 };
68
+
69
+ /**
70
+ * Normalize a provider's optional retry config against the defaults. `timeout`
71
+ * uses `||` (a 0ms timeout is degenerate — it would abort every call before it
72
+ * began), while `retries` uses `??` so an explicit `retries: 0` is honored
73
+ * rather than treated as unset.
74
+ */
75
+ export function resolveRetryConfig(input?: { timeout?: number; retries?: number }): RetryConfig {
76
+ return {
77
+ timeout: input?.timeout || DEFAULT_RETRY_CONFIG.timeout,
78
+ retries: input?.retries ?? DEFAULT_RETRY_CONFIG.retries,
79
+ };
80
+ }
81
+
82
+ /**
83
+ * Request defaults sent with every call.
84
+ *
85
+ * Only the fields every supported shape has. In v2 each provider took its own
86
+ * vendor's SDK parameter type here — which is how one vendor's package ended
87
+ * up in the dependency tree of consumers who used a different vendor, and how
88
+ * a field set on one provider silently vanished on another.
89
+ */
90
+ export interface RequestConfig {
91
+ temperature?: number;
92
+ topP?: number;
93
+ maxTokens?: number;
94
+ stopSequences?: string[];
95
+ /**
96
+ * How hard the model thinks, bound as this provider's default. Absent means
97
+ * the model's own dynamic thinking, which is what every shape does when the
98
+ * field is never sent — so `"none"` is the only way to say *don't*, and it
99
+ * matters most under a small `maxTokens`, where thinking tokens come out of
100
+ * the same budget as the answer and can consume all of it.
101
+ */
102
+ effort?: Effort;
103
+ }
104
+
105
+ export interface ProviderAdapterInit {
106
+ /** The `@providerkit/core` provider this adapter drives. */
107
+ provider: Provider;
108
+ model: string;
109
+ /**
110
+ * Sampling defaults for every call, overridden by anything the caller sets
111
+ * per turn. Only the fields every supported shape has: a knob one vendor
112
+ * alone understands belongs to that vendor's own client, not to a seam four
113
+ * of them share.
114
+ */
115
+ defaults?: RequestConfig;
116
+ /** Tried in order after the primary. */
117
+ backupModels?: string[];
118
+ retryConfig?: { timeout?: number; retries?: number };
119
+ }
120
+
121
+ /**
122
+ * A model id the endpoint will not serve is grounds to try the next model on
123
+ * the list — that is what the list is FOR. Core's default is deliberately
124
+ * narrower (a throttle and an overload only), because there a typo'd model
125
+ * should fail loudly rather than quietly answer from a different one. Here the
126
+ * backup list is explicit and per-provider, so the wider reading is the right
127
+ * one: a gateway that has deprecated or cannot currently route the primary is
128
+ * routine, and falling through is exactly the intent.
129
+ */
130
+ function shouldTryBackup(error: unknown): boolean {
131
+ const kind = classify(error);
132
+ return isBackupEligible(kind) || kind === "model";
133
+ }
134
+
135
+ /** History plus the composed prompt, as the seam's messages. */
136
+ export function toMessages(history: HistoryItem[], prompt: string): ChatMessage[] {
137
+ const out: ChatMessage[] = [];
138
+ for (const item of history) {
139
+ switch (item.role) {
140
+ case "system":
141
+ out.push({ role: "system", content: item.content });
142
+ break;
143
+ case "user":
144
+ out.push({ role: "user", content: item.content });
145
+ break;
146
+ case "assistant":
147
+ out.push({
148
+ role: "assistant",
149
+ content: item.content ?? "",
150
+ ...(item.tool_calls?.length
151
+ ? {
152
+ toolCalls: item.tool_calls.map((call) => ({
153
+ id: call.id,
154
+ name: call.name,
155
+ // The seam carries raw JSON: arguments arrive in fragments and
156
+ // can be truncated mid-stream, so parsing is the consumer's.
157
+ arguments: JSON.stringify(call.arguments),
158
+ })),
159
+ }
160
+ : {}),
161
+ });
162
+ break;
163
+ case "tool":
164
+ out.push({
165
+ role: "tool",
166
+ toolCallId: item.tool_call_id,
167
+ name: item.name,
168
+ content: typeof item.content === "string" ? item.content : JSON.stringify(item.content),
169
+ });
170
+ break;
171
+ }
172
+ }
173
+ out.push({ role: "user", content: prompt });
174
+ return out;
175
+ }
176
+
177
+ function toTools(tools: GenerateMessageInput<unknown>["tools"]): ToolDefinition[] {
178
+ return (tools ?? []).map((tool) => ({
179
+ name: tool.name || tool.id,
180
+ description: tool.description ?? "",
181
+ inputSchema: (tool.parameters ?? { type: "object" }) as JsonObjectSchema,
182
+ }));
183
+ }
184
+
185
+ /**
186
+ * A schema with nothing in it is not a request for JSON — it is a caller who
187
+ * has no schema. Sent as one it becomes a `json_schema` block with no `type`,
188
+ * which is a flat 400 on the shapes that enforce schemas.
189
+ */
190
+ function toJsonOutput(input: GenerateMessageInput<unknown>): StreamOptions["json"] {
191
+ const schema = input.parameters?.jsonSchema;
192
+ if (!schema || Object.keys(schema).length === 0) return undefined;
193
+ return {
194
+ name: input.parameters?.schemaName || "structured_output",
195
+ schema: schema as JsonObjectSchema,
196
+ };
197
+ }
198
+
199
+ /** What a turn accumulates into as its chunks arrive. */
200
+ interface Accumulator {
201
+ text: string;
202
+ model: string;
203
+ finishReason?: string;
204
+ promptTokens?: number;
205
+ completionTokens?: number;
206
+ cachedInputTokens?: number;
207
+ calls: Map<number, { name: string; arguments: string }>;
208
+ }
209
+
210
+ function fold(acc: Accumulator, chunk: ProviderChunk): string {
211
+ if (chunk.usage) {
212
+ acc.promptTokens = chunk.usage.inputTokens;
213
+ acc.completionTokens = chunk.usage.outputTokens;
214
+ acc.cachedInputTokens = chunk.usage.cachedInputTokens;
215
+ }
216
+ if (chunk.finishReason) acc.finishReason = chunk.finishReason;
217
+ for (const call of chunk.toolCalls ?? []) {
218
+ const entry = acc.calls.get(call.index) ?? { name: "", arguments: "" };
219
+ if (call.name) entry.name = call.name;
220
+ if (call.arguments) entry.arguments += call.arguments;
221
+ acc.calls.set(call.index, entry);
222
+ }
223
+ if (!chunk.content) return "";
224
+ acc.text += chunk.content;
225
+ return chunk.content;
226
+ }
227
+
228
+ type ToolCallList = NonNullable<AgentStructuredResponse["toolCalls"]>;
229
+
230
+ function toolCallsOf(acc: Accumulator, label: string): ToolCallList {
231
+ const out: ToolCallList = [];
232
+ for (const [, entry] of [...acc.calls.entries()].sort(([a], [b]) => a - b)) {
233
+ if (!entry.name) continue;
234
+ let args: Record<string, unknown> = {};
235
+ try {
236
+ if (entry.arguments) args = JSON.parse(entry.arguments) as Record<string, unknown>;
237
+ } catch (error) {
238
+ logger.warn(`[${label}] Failed to parse tool call arguments:`, error);
239
+ }
240
+ out.push({ toolName: entry.name, arguments: args });
241
+ }
242
+ return out;
243
+ }
244
+
245
+ export abstract class ProviderAdapter implements AiProvider {
246
+ public abstract readonly name: string;
247
+ public abstract readonly capabilities: ProviderCapabilities;
248
+
249
+ protected readonly provider: Provider;
250
+ protected readonly primaryModel: string;
251
+ protected readonly backupModels: string[];
252
+ protected readonly retryConfig: RetryConfig;
253
+ private readonly defaults: ProviderAdapterInit["defaults"];
254
+
255
+ protected constructor(init: ProviderAdapterInit) {
256
+ this.defaults = init.defaults;
257
+ this.provider = init.provider;
258
+ this.primaryModel = init.model;
259
+ this.backupModels = init.backupModels ?? [];
260
+ this.retryConfig = resolveRetryConfig(init.retryConfig);
261
+ }
262
+
263
+ async generateMessage<TContext = unknown, TStructured = AgentStructuredResponse>(
264
+ input: GenerateMessageInput<TContext>,
265
+ ): Promise<GenerateMessageOutput<TStructured>> {
266
+ let last: GenerateMessageStreamChunk<TStructured> | undefined;
267
+ for await (const chunk of this.generateMessageStream<TContext, TStructured>(input)) {
268
+ last = chunk;
269
+ }
270
+ // The stream always ends on its terminal chunk, and the empty-completion
271
+ // guard has already thrown if there was nothing in it.
272
+ if (!last) throw new ProviderError(this.name, "overload", `${this.name}: no response`);
273
+ return { message: last.accumulated, metadata: last.metadata, structured: last.structured };
274
+ }
275
+
276
+ async *generateMessageStream<TContext = unknown, TStructured = AgentStructuredResponse>(
277
+ input: GenerateMessageInput<TContext>,
278
+ ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
279
+ const messages = toMessages(input.history, input.prompt);
280
+ const tools = toTools(input.tools);
281
+ const json = toJsonOutput(input);
282
+ const acc: Accumulator = { text: "", model: this.primaryModel, calls: new Map() };
283
+
284
+ const opts: StreamOptions = {
285
+ ...this.defaults,
286
+ ...(input.parameters?.maxOutputTokens !== undefined
287
+ ? { maxTokens: input.parameters.maxOutputTokens }
288
+ : {}),
289
+ ...(input.parameters?.reasoning?.effort ? { effort: input.parameters.reasoning.effort } : {}),
290
+ ...(json ? { json } : {}),
291
+ };
292
+
293
+ const attempt = (model: string) =>
294
+ withStreamRetry<ProviderChunk>(
295
+ (signal) => {
296
+ acc.model = model;
297
+ const watch = streamWatch({
298
+ provider: this.name,
299
+ idleMs: this.retryConfig.timeout,
300
+ signal,
301
+ });
302
+ return requireContent(
303
+ this.name,
304
+ watchChunks(
305
+ watch,
306
+ this.provider.createStream(messages, tools, {
307
+ ...opts,
308
+ model,
309
+ signal: watch.signal,
310
+ }),
311
+ ),
312
+ );
313
+ },
314
+ {
315
+ maxAttempts: this.retryConfig.retries + 1,
316
+ ...(input.signal ? { signal: input.signal } : {}),
317
+ onRetry: ({ error, attempt: n }) =>
318
+ logger.warn(`[${this.name}] ${model} attempt ${n} failed, retrying:`, error),
319
+ },
320
+ );
321
+
322
+ const stream = streamWithBackupModels<ProviderChunk>(attempt, {
323
+ models: [this.primaryModel, ...this.backupModels],
324
+ shouldTryNext: shouldTryBackup,
325
+ onFallback: ({ model, position, total }) =>
326
+ logger.warn(`[${this.name}] falling back to ${model} (${position}/${total})`),
327
+ });
328
+
329
+ for await (const chunk of stream) {
330
+ const delta = fold(acc, chunk);
331
+ if (delta) yield { delta, accumulated: acc.text, done: false };
332
+ }
333
+
334
+ const toolCalls = toolCallsOf(acc, this.name);
335
+ let structured: TStructured | undefined;
336
+ if (json && acc.text) {
337
+ try {
338
+ structured = JSON.parse(acc.text) as TStructured;
339
+ } catch (error) {
340
+ logger.warn(`[${this.name}] Failed to parse JSON response:`, error);
341
+ }
342
+ }
343
+ if (toolCalls.length > 0) {
344
+ structured = {
345
+ ...(structured ?? {}),
346
+ message: (structured as AgentStructuredResponse | undefined)?.message || acc.text,
347
+ toolCalls,
348
+ } as TStructured;
349
+ }
350
+
351
+ // A parsed-but-blank message with no tool calls is as empty as no text. The
352
+ // stream guard upstream only knows about chunks; this one knows what the
353
+ // turn was FOR, and a turn that produced `{"message":""}` did not do it.
354
+ assertUsableCompletion(structured, acc.text, toolCalls.length, this.name);
355
+
356
+ yield {
357
+ delta: "",
358
+ accumulated: acc.text,
359
+ done: true,
360
+ metadata: {
361
+ model: acc.model,
362
+ ...(acc.finishReason ? { finishReason: acc.finishReason } : {}),
363
+ ...(acc.promptTokens !== undefined
364
+ ? {
365
+ tokensUsed: acc.promptTokens + (acc.completionTokens ?? 0),
366
+ promptTokens: acc.promptTokens,
367
+ completionTokens: acc.completionTokens,
368
+ // New in v3: the cache-hit subset of the prompt, which the old
369
+ // adapters never read and which is billed far cheaper.
370
+ cachedInputTokens: acc.cachedInputTokens,
371
+ }
372
+ : {}),
373
+ },
374
+ structured,
375
+ };
376
+ }
377
+ }
@@ -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";