@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,785 +1,82 @@
1
1
  /**
2
- * Shared base class for OpenAI-compatible chat-completions providers
3
- * (OpenAI, DeepSeek, OpenRouter).
2
+ * Shared base for OpenAI-compatible chat-completions providers (OpenAI,
3
+ * DeepSeek, OpenRouter, and anything else speaking the dialect).
4
4
  *
5
- * Handles message/history building, tool-call parsing, streaming chunk
6
- * handling, backup-model fallback, retry wiring, schema passthrough and
7
- * normalized error wrapping. Subclasses supply the configured client,
8
- * naming, capabilities and any genuinely provider-specific behavior via
9
- * the protected hooks.
5
+ * Everything that used to live here — message building, tool-call assembly,
6
+ * streaming, retry, backup models, error wrapping is now in
7
+ * `@providerkit/core` and `ProviderAdapter`. What is left is the one decision
8
+ * this layer still owns: which wire a structured request goes out on.
10
9
  */
11
10
 
12
- import OpenAI from "openai";
13
- import type {
14
- ChatCompletionChunk,
15
- ChatCompletionCreateParamsNonStreaming,
16
- ChatCompletionCreateParamsStreaming,
17
- } from "openai/resources/chat/completions";
18
- import { FunctionParameters } from "openai/resources/shared.mjs";
11
+ import { createOpenAIProvider, createResponsesProvider, type Provider } from "@providerkit/core";
19
12
 
20
- import type {
21
- AiProvider,
22
- GenerateMessageInput,
23
- GenerateMessageOutput,
24
- GenerateMessageStreamChunk,
25
- AgentStructuredResponse,
26
- StructuredSchema,
27
- } from "../types";
28
- import type { ProviderCapabilities } from "../types/ai";
29
- import type { HistoryItem } from "../types/history";
30
- import type { ResponseInput } from "openai/resources/responses/responses";
31
- import { withTimeoutAndRetry, withStreamRetry, withBackupFallback, streamWithBackupFallback, backupFallbackLogging, resolveRetryConfig, logger, assertUsableCompletion, combineAbortSignals } from "../utils";
32
- import {
33
- classifyProviderError,
34
- getErrorMessage,
35
- isBackupEligible,
36
- isRetriableProviderError,
37
- toProviderError,
38
- type ErrorClassificationOptions,
39
- } from "./errorClassification";
40
-
41
- /**
42
- * Default request parameters shared by OpenAI-compatible providers
43
- */
44
- export type OpenAICompatibleRequestConfig = Partial<
45
- Omit<ChatCompletionCreateParamsNonStreaming, "model" | "messages">
46
- >;
13
+ import { ProviderAdapter, type ProviderAdapterInit, type RequestConfig } from "./ProviderAdapter.js";
47
14
 
48
15
  /**
49
16
  * How structured (JSON-schema) output is requested from the endpoint:
50
- * - `"responses_parse"` (default) — OpenAI's native `responses.parse` API
51
- * (OpenAI, OpenRouter). Most compatible endpoints do not implement it.
52
- * - `"json_schema"` — chat completions with a `json_schema` response_format.
53
- * The broadest enforced mode (DeepSeek, Groq, Together, Fireworks, vLLM, Azure…).
54
- * - `"json_object"` — chat completions with a `json_object` response_format,
55
- * for servers that lack json_schema enforcement (parsed at the end).
17
+ * - `"responses_parse"` — OpenAI's Responses API, which enforces the schema
18
+ * natively. Most compatible endpoints do not implement it.
19
+ * - `"json_schema"` — chat completions with a `json_schema` response format.
20
+ * The broadest enforced mode (DeepSeek, Groq, Together, Fireworks, vLLM…).
21
+ * - `"json_object"` — chat completions with plain JSON mode, for servers with
22
+ * no schema enforcement at all. The caller validates.
56
23
  */
57
24
  export type StructuredOutputMode = "responses_parse" | "json_schema" | "json_object";
58
25
 
59
- /**
60
- * Initialization values supplied by subclasses
61
- */
62
- export interface OpenAICompatibleProviderInit {
63
- /** Configured OpenAI SDK client (subclass sets API key, base URL, headers) */
64
- client: OpenAI;
65
- /** Primary model */
66
- model: string;
67
- /** Backup models to try if primary fails (default: []) */
68
- backupModels?: string[];
69
- /** Default request parameters */
70
- config?: OpenAICompatibleRequestConfig;
71
- /** Retry configuration */
72
- retryConfig?: {
73
- timeout?: number;
74
- retries?: number;
75
- };
76
- /**
77
- * How structured output is requested (default `"responses_parse"`). Lifts the
78
- * strategy that used to be a per-subclass override into shared config.
79
- */
26
+ export interface OpenAICompatibleProviderInit
27
+ extends Omit<ProviderAdapterInit, "provider"> {
28
+ apiKey: string;
29
+ baseUrl?: string;
30
+ /** Names the provider in errors, and picks core's effort dialect. */
31
+ id: string;
32
+ headers?: Record<string, string>;
33
+ config?: RequestConfig;
80
34
  structuredOutput?: StructuredOutputMode;
35
+ /** OpenRouter upstream-host pin, to keep a conversation's prompt cache warm. */
36
+ providerOrder?: string[];
37
+ /** Replacement `fetch`, for tests that script the wire. */
38
+ fetchImpl?: typeof fetch;
81
39
  }
82
40
 
83
- /**
84
- * Base implementation of AiProvider for OpenAI-compatible APIs with
85
- * backup models and retry logic.
86
- */
87
- export abstract class OpenAICompatibleProvider implements AiProvider {
88
- public abstract readonly name: string;
89
- public abstract readonly capabilities: ProviderCapabilities;
90
-
91
- /** Uppercase tag used in log lines, e.g. "OPENAI" */
92
- protected abstract readonly logLabel: string;
93
- /** Human-readable name used in retry/error messages, e.g. "OpenAI" */
94
- protected abstract readonly displayName: string;
95
-
96
- protected readonly client: OpenAI;
97
- protected readonly primaryModel: string;
98
- protected readonly backupModels: string[];
99
- protected readonly config?: OpenAICompatibleRequestConfig;
100
- protected readonly retryConfig: { timeout: number; retries: number };
101
- /** Structured-output strategy; see {@link StructuredOutputMode}. */
102
- protected readonly structuredOutput: StructuredOutputMode;
103
-
104
- /**
105
- * Provider-specific error classification signals.
106
- * model_not_found/model_overloaded historically triggered backup models.
107
- */
108
- protected readonly classificationOptions: ErrorClassificationOptions = {
109
- overloadedCodes: ["model_not_found", "model_overloaded"],
110
- };
41
+ export abstract class OpenAICompatibleProvider extends ProviderAdapter {
42
+ protected readonly config?: RequestConfig;
111
43
 
112
44
  protected constructor(init: OpenAICompatibleProviderInit) {
113
- this.client = init.client;
114
- this.primaryModel = init.model;
115
- this.backupModels = init.backupModels ?? [];
116
- this.config = init.config;
117
- this.retryConfig = resolveRetryConfig(init.retryConfig);
118
- this.structuredOutput = init.structuredOutput ?? "responses_parse";
119
- }
120
-
121
- // ---------------------------------------------------------------------
122
- // Public API
123
- // ---------------------------------------------------------------------
124
-
125
- async generateMessage<
126
- TContext = unknown,
127
- TStructured = AgentStructuredResponse
128
- >(
129
- input: GenerateMessageInput<TContext>
130
- ): Promise<GenerateMessageOutput<TStructured>> {
131
- return this.generateWithBackup<TContext, TStructured>(input);
132
- }
133
-
134
- async *generateMessageStream<
135
- TContext = unknown,
136
- TStructured = AgentStructuredResponse
137
- >(
138
- input: GenerateMessageInput<TContext>
139
- ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
140
- yield* this.generateStreamWithBackup<TContext, TStructured>(input);
141
- }
142
-
143
- // ---------------------------------------------------------------------
144
- // Provider-specific hooks
145
- // ---------------------------------------------------------------------
146
-
147
- /**
148
- * Map interaction history onto Responses-API input items so structured
149
- * generations carry the same context as chat completions: plain messages
150
- * pass through as easy-input messages, and tool exchanges map to
151
- * function_call / function_call_output pairs keyed by the original ids.
152
- * The prompt is appended as the final user turn, mirroring how the
153
- * chat-completions path builds its messages array.
154
- */
155
- private buildResponsesInput(history: HistoryItem[], prompt: string): ResponseInput {
156
- const items: ResponseInput = [];
157
-
158
- for (const item of history) {
159
- switch (item.role) {
160
- case "system":
161
- items.push({ role: "system", content: item.content });
162
- break;
163
- case "user":
164
- items.push({ role: "user", content: item.content });
165
- break;
166
- case "assistant": {
167
- if (item.content) {
168
- items.push({ role: "assistant", content: item.content });
169
- }
170
- for (const toolCall of item.tool_calls ?? []) {
171
- items.push({
172
- type: "function_call",
173
- call_id: toolCall.id,
174
- name: toolCall.name,
175
- arguments: JSON.stringify(toolCall.arguments),
176
- });
177
- }
178
- break;
179
- }
180
- case "tool":
181
- items.push({
182
- type: "function_call_output",
183
- call_id: item.tool_call_id,
184
- output:
185
- typeof item.content === "string"
186
- ? item.content
187
- : JSON.stringify(item.content),
188
- });
189
- break;
190
- }
191
- }
192
-
193
- items.push({ role: "user", content: prompt });
194
- return items;
195
- }
196
-
197
- /**
198
- * Generate a structured (JSON schema) response. Default uses the
199
- * responses.parse API (OpenAI, OpenRouter). Subclasses whose API lacks
200
- * responses.parse (e.g. DeepSeek) override this to use chat completions
201
- * with a structured response_format instead.
202
- */
203
- protected async executeStructuredGenerate(
204
- model: string,
205
- input: GenerateMessageInput<unknown>,
206
- jsonSchema: StructuredSchema
207
- ): Promise<GenerateMessageOutput> {
208
- // Non-native modes go through chat completions, where
209
- // `structuredResponseFormat` selects the response_format.
210
- if (this.structuredOutput !== "responses_parse") {
211
- return this.executeChatCompletion(model, input);
212
- }
213
-
214
- const response = await this.client.responses.parse(
215
- {
216
- model,
217
- // Full conversation context: mapped history plus the prompt as the
218
- // final user turn. This used to send only `instructions` with an empty
219
- // `input`, leaving every structured turn without conversation memory.
220
- input: this.buildResponsesInput(input.history, input.prompt),
221
- reasoning: {
222
- effort: input.parameters?.reasoning?.effort || "low",
223
- },
224
- text: {
225
- format: {
226
- type: "json_schema",
227
- name: input.parameters?.schemaName || "structured_output",
228
- // Adapt common schema format to the provider's format
229
- schema: this.adaptSchema(jsonSchema),
230
- },
231
- },
232
- },
233
- { signal: input.signal }
234
- );
235
-
236
- if (!response.output_parsed) {
237
- throw new Error(`No parsed output returned from ${this.displayName}`);
238
- }
239
-
240
- const structured = response.output_parsed as AgentStructuredResponse;
241
- const message = structured.message;
242
-
243
- return {
244
- message,
245
- metadata: {
246
- model: response.model,
247
- tokensUsed: response.usage?.total_tokens,
248
- promptTokens: response.usage?.input_tokens,
249
- completionTokens: response.usage?.output_tokens,
250
- },
251
- structured,
252
- };
253
- }
254
-
255
- /**
256
- * response_format applied to chat-completions requests when a JSON schema is
257
- * present, selected by {@link StructuredOutputMode}: `"json_schema"` for native
258
- * enforcement, else a generic JSON object parsed at the end. (`"responses_parse"`
259
- * never reaches chat completions for non-streaming, but streaming has no parse
260
- * API, so it falls back to `json_object` here.)
261
- */
262
- protected structuredResponseFormat(
263
- jsonSchema: StructuredSchema,
264
- schemaName: string | undefined
265
- ): ChatCompletionCreateParamsNonStreaming["response_format"] {
266
- if (this.structuredOutput === "json_schema") {
267
- return {
268
- type: "json_schema" as const,
269
- json_schema: {
270
- name: schemaName || "structured_output",
271
- schema: this.adaptSchema(jsonSchema),
272
- },
273
- };
274
- }
275
- return { type: "json_object" };
276
- }
277
-
278
- /**
279
- * Hook for provider-specific streaming request parameters
280
- * (e.g. DeepSeek's stream_options.include_usage).
281
- */
282
- protected configureStreamParams(
283
- _params: ChatCompletionCreateParamsStreaming
284
- ): void {
285
- // Default: no extra parameters
286
- }
287
-
288
- /**
289
- * Hook for provider-specific stream delta handling
290
- * (e.g. DeepSeek's reasoning_content).
291
- */
292
- protected onStreamDelta(_delta: ChatCompletionChunk.Choice.Delta): void {
293
- // Default: no extra handling
294
- }
295
-
296
- // ---------------------------------------------------------------------
297
- // Shared building blocks
298
- // ---------------------------------------------------------------------
299
-
300
- /**
301
- * Adapt common schema format to the provider's format.
302
- * OpenAI-compatible APIs use standard JSON Schema, so this is a
303
- * passthrough.
304
- */
305
- protected adaptSchema(schema: StructuredSchema): Record<string, unknown> {
306
- // Our StructuredSchema is already JSON Schema compatible
307
- return schema;
308
- }
309
-
310
- /**
311
- * Build OpenAI-formatted messages from HistoryItem[] array.
312
- * Maps directly to ChatCompletionMessageParam format.
313
- */
314
- protected buildChatMessages(history: HistoryItem[]): Array<unknown> {
315
- const messages: Array<unknown> = [];
316
-
317
- for (const item of history) {
318
- switch (item.role) {
319
- case "system":
320
- messages.push({ role: "system", content: item.content });
321
- break;
322
- case "user":
323
- messages.push({ role: "user", content: item.content });
324
- break;
325
- case "assistant":
326
- if (item.tool_calls && item.tool_calls.length > 0) {
327
- messages.push({
328
- role: "assistant",
329
- content: item.content || null,
330
- tool_calls: item.tool_calls.map((tc) => ({
331
- id: tc.id,
332
- type: "function",
333
- function: {
334
- name: tc.name,
335
- arguments: JSON.stringify(tc.arguments),
336
- },
337
- })),
338
- });
339
- } else {
340
- messages.push({ role: "assistant", content: item.content || "" });
341
- }
342
- break;
343
- case "tool":
344
- messages.push({
345
- role: "tool",
346
- tool_call_id: item.tool_call_id,
347
- content:
348
- typeof item.content === "string"
349
- ? item.content
350
- : JSON.stringify(item.content),
351
- });
352
- break;
353
- }
354
- }
355
-
356
- return messages;
357
- }
358
-
359
- /**
360
- * Map framework tool definitions to OpenAI function tools.
361
- */
362
- private buildToolParams(
363
- tools: NonNullable<GenerateMessageInput<unknown>["tools"]>
364
- ): ChatCompletionCreateParamsNonStreaming["tools"] {
365
- return tools.map((tool) => ({
366
- type: "function" as const,
367
- function: {
368
- name: tool.name || tool.id,
369
- description: tool.description,
370
- parameters: tool.parameters as FunctionParameters, // JSON schema
371
- },
372
- }));
373
- }
374
-
375
- /**
376
- * Parse tool calls from a (complete or delta) tool_calls array,
377
- * tolerating malformed JSON arguments.
378
- */
379
- private parseToolCallArguments(
380
- rawArguments: string | undefined,
381
- streaming: boolean
382
- ): Record<string, unknown> {
383
- if (!rawArguments) {
384
- return {};
385
- }
386
- try {
387
- return JSON.parse(rawArguments) as Record<string, unknown>;
388
- } catch (error) {
389
- logger.warn(
390
- `[${this.logLabel}] Failed to parse tool call arguments${
391
- streaming ? " in stream" : ""
392
- }: ${getErrorMessage(error)}`
393
- );
394
- return {};
395
- }
396
- }
397
-
398
- /**
399
- * Determines if an error should trigger backup model usage.
400
- * Derived from the normalized error classification.
401
- */
402
- protected shouldUseBackupModel(error: unknown): boolean {
403
- return isBackupEligible(
404
- classifyProviderError(error, this.classificationOptions)
405
- );
406
- }
407
-
408
- /**
409
- * Wrap a terminal failure in a normalized ProviderError.
410
- */
411
- protected wrapTerminalError(error: unknown): Error {
412
- return toProviderError(error, this.name, this.classificationOptions);
413
- }
414
-
415
- // ---------------------------------------------------------------------
416
- // Generation with backup models
417
- // ---------------------------------------------------------------------
418
-
419
- private async generateWithBackup<
420
- TContext = unknown,
421
- TStructured = AgentStructuredResponse
422
- >(
423
- input: GenerateMessageInput<TContext>
424
- ): Promise<GenerateMessageOutput<TStructured>> {
425
- const observer = backupFallbackLogging(
426
- `[${this.logLabel}]`,
427
- (error) => this.shouldUseBackupModel(error)
428
- );
429
-
430
- try {
431
- return await withBackupFallback({
432
- models: [this.primaryModel, ...this.backupModels],
433
- attempt: (model) =>
434
- this.generateWithModel<TContext, TStructured>(model, input),
435
- shouldTryBackup: (error) => this.shouldUseBackupModel(error),
436
- ...observer.callbacks,
437
- });
438
- } catch (error: unknown) {
439
- observer.logExhausted(error);
440
- throw this.wrapTerminalError(error);
441
- }
442
- }
443
-
444
- private async *generateStreamWithBackup<
445
- TContext = unknown,
446
- TStructured = AgentStructuredResponse
447
- >(
448
- input: GenerateMessageInput<TContext>
449
- ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
450
- const observer = backupFallbackLogging(
451
- `[${this.logLabel}]`,
452
- (error) => this.shouldUseBackupModel(error),
453
- { streaming: true }
454
- );
455
-
456
- try {
457
- yield* streamWithBackupFallback({
458
- models: [this.primaryModel, ...this.backupModels],
459
- attempt: (model) =>
460
- withStreamRetry(
461
- (signal) => this.generateStreamWithModel<TContext, TStructured>(model, input, signal),
462
- { maxRetries: this.retryConfig.retries, firstChunkTimeoutMs: this.retryConfig.timeout, operationName: `${this.logLabel} ${model} stream`, isRetriable: (error) => isRetriableProviderError(error, this.classificationOptions) }
463
- ),
464
- shouldTryBackup: (error) => this.shouldUseBackupModel(error),
465
- ...observer.callbacks,
466
- });
467
- } catch (error: unknown) {
468
- observer.logExhausted(error);
469
- throw this.wrapTerminalError(error);
470
- }
471
- }
472
-
473
- // ---------------------------------------------------------------------
474
- // Non-streaming generation
475
- // ---------------------------------------------------------------------
476
-
477
- private async generateWithModel<
478
- TContext = unknown,
479
- TStructured = AgentStructuredResponse
480
- >(
481
- model: string,
482
- input: GenerateMessageInput<TContext>
483
- ): Promise<GenerateMessageOutput<TStructured>> {
484
- const operation = async (signal: AbortSignal): Promise<GenerateMessageOutput> => {
485
- // Thread the per-attempt timeout signal through input.signal so whichever
486
- // path runs — responses.parse (structured) or chat.completions — cancels
487
- // its upstream call when the deadline fires.
488
- const reqInput = { ...input, signal: combineAbortSignals(input.signal, signal) };
489
- // Use structured output path if JSON schema is provided
490
- if (reqInput.parameters?.jsonSchema) {
491
- return this.executeStructuredGenerate(
492
- model,
493
- reqInput,
494
- reqInput.parameters.jsonSchema
495
- );
496
- }
497
- return this.executeChatCompletion(model, reqInput);
498
- };
499
-
500
- return withTimeoutAndRetry(
501
- operation,
502
- this.retryConfig.timeout,
503
- this.retryConfig.retries,
504
- `${this.displayName} ${model}`,
505
- (error) => isRetriableProviderError(error, this.classificationOptions)
506
- ) as Promise<GenerateMessageOutput<TStructured>>;
507
- }
508
-
509
- /**
510
- * Non-streaming chat-completions request: builds messages/tools,
511
- * extracts text and tool calls, and merges structured output.
512
- */
513
- protected async executeChatCompletion(
514
- model: string,
515
- input: GenerateMessageInput<unknown>
516
- ): Promise<GenerateMessageOutput> {
517
- const historyMessages = this.buildChatMessages(input.history);
518
- historyMessages.push({ role: "user", content: input.prompt });
519
-
520
- const params: ChatCompletionCreateParamsNonStreaming = {
521
- model,
522
- messages:
523
- historyMessages as ChatCompletionCreateParamsNonStreaming["messages"],
524
- ...this.config,
525
- };
526
-
527
- // Override with input parameters if provided
528
- if (input.parameters?.maxOutputTokens !== undefined) {
529
- params.max_tokens = input.parameters.maxOutputTokens;
530
- }
531
-
532
- // Add tools if provided
533
- if (input.tools && input.tools.length > 0) {
534
- params.tools = this.buildToolParams(input.tools);
535
- params.tool_choice = "auto";
536
- }
537
-
538
- // Use structured output format if JSON schema is provided
539
- if (input.parameters?.jsonSchema) {
540
- params.response_format = this.structuredResponseFormat(
541
- input.parameters.jsonSchema,
542
- input.parameters.schemaName
543
- );
544
- }
545
-
546
- const response = await this.client.chat.completions.create(params, {
547
- signal: input.signal,
45
+ const mode = init.structuredOutput ?? "responses_parse";
46
+ super({
47
+ provider: buildProvider(init, mode),
48
+ model: init.model,
49
+ ...(init.config ? { defaults: init.config } : {}),
50
+ ...(init.backupModels ? { backupModels: init.backupModels } : {}),
51
+ ...(init.retryConfig ? { retryConfig: init.retryConfig } : {}),
548
52
  });
549
-
550
- const message = response.choices[0]?.message?.content || "";
551
-
552
- let toolCalls: Array<{
553
- toolName: string;
554
- arguments: Record<string, unknown>;
555
- }> = [];
556
- if (response.choices?.[0]?.message?.tool_calls) {
557
- toolCalls = response.choices[0].message.tool_calls
558
- .filter((toolCall) => toolCall.type === "function")
559
- .map((toolCall) => ({
560
- toolName: toolCall.function.name,
561
- arguments: this.parseToolCallArguments(
562
- toolCall.function.arguments,
563
- false
564
- ),
565
- }));
566
- }
567
-
568
- // Only throw error if we have no text AND no function calls
569
- if (!message && toolCalls.length === 0) {
570
- throw new Error(`No response from ${this.displayName}`);
571
- }
572
-
573
- // Parse structured output if schema was provided
574
- let structured: AgentStructuredResponse | undefined;
575
- if (input.parameters?.jsonSchema && message) {
576
- try {
577
- structured = JSON.parse(message) as AgentStructuredResponse;
578
- } catch (error) {
579
- logger.warn(`[${this.logLabel}] Failed to parse JSON response:`, error);
580
- }
581
- }
582
-
583
- // If tools were used, include them in structured response
584
- if (toolCalls.length > 0) {
585
- structured = {
586
- ...(structured || {}),
587
- message: structured?.message || message,
588
- toolCalls,
589
- } as AgentStructuredResponse;
590
- }
591
-
592
- // A parsed-but-blank message with no tool calls is as empty as no text;
593
- // the shared guard throws so withTimeoutAndRetry retries instead of
594
- // returning {"message":""}.
595
- assertUsableCompletion(structured, message, toolCalls.length, this.displayName);
596
-
597
- return {
598
- message,
599
- metadata: {
600
- model: response.model,
601
- finishReason: response.choices[0]?.finish_reason,
602
- tokensUsed: response.usage?.total_tokens,
603
- promptTokens: response.usage?.prompt_tokens,
604
- completionTokens: response.usage?.completion_tokens,
605
- },
606
- structured,
607
- };
53
+ this.config = init.config;
608
54
  }
55
+ }
609
56
 
610
- // ---------------------------------------------------------------------
611
- // Streaming generation
612
- // ---------------------------------------------------------------------
613
-
614
- private async *generateStreamWithModel<
615
- TContext = unknown,
616
- TStructured = AgentStructuredResponse
617
- >(
618
- model: string,
619
- input: GenerateMessageInput<TContext>,
620
- attemptSignal?: AbortSignal
621
- ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
622
- // Build messages from history and append prompt as final user message
623
- const historyMessages = this.buildChatMessages(input.history);
624
- historyMessages.push({ role: "user" as const, content: input.prompt });
625
-
626
- const params: ChatCompletionCreateParamsStreaming = {
627
- ...this.config,
628
- model,
629
- messages:
630
- historyMessages as ChatCompletionCreateParamsNonStreaming["messages"],
631
- stream: true as const,
632
- };
633
- this.configureStreamParams(params);
634
-
635
- // Override with input parameters if provided
636
- if (input.parameters?.maxOutputTokens !== undefined) {
637
- params.max_tokens = input.parameters.maxOutputTokens;
638
- }
639
-
640
- // Add tools if provided
641
- if (input.tools && input.tools.length > 0) {
642
- params.tools = this.buildToolParams(input.tools);
643
- params.tool_choice = "auto";
644
- }
645
-
646
- // Streaming path does not support responses.parse; if schema present,
647
- // request structured output and parse at the end.
648
- if (input.parameters?.jsonSchema) {
649
- params.response_format = this.structuredResponseFormat(
650
- input.parameters.jsonSchema,
651
- input.parameters.schemaName
652
- );
653
- }
654
-
655
- const stream = await this.client.chat.completions.create(params, {
656
- signal: combineAbortSignals(input.signal, attemptSignal),
57
+ function buildProvider(init: OpenAICompatibleProviderInit, mode: StructuredOutputMode): Provider {
58
+ if (mode === "responses_parse") {
59
+ return createResponsesProvider({
60
+ apiKey: init.apiKey,
61
+ model: init.model,
62
+ id: init.id,
63
+ ...(init.baseUrl ? { baseUrl: `${init.baseUrl}` } : {}),
64
+ ...(init.headers ? { headers: init.headers } : {}),
65
+ ...(init.config?.maxTokens ? { maxTokens: init.config.maxTokens } : {}),
66
+ ...(init.config?.effort ? { effort: init.config.effort } : {}),
67
+ ...(init.fetchImpl ? { fetchImpl: init.fetchImpl } : {}),
657
68
  });
658
-
659
- let accumulated = "";
660
- let currentModel = model;
661
- let finishReason: string | undefined;
662
- let promptTokens: number | undefined;
663
- let completionTokens: number | undefined;
664
- let totalTokens: number | undefined;
665
- // Tool calls arrive across MANY deltas: the first carries the id/name,
666
- // later ones carry argument-string fragments that must be concatenated.
667
- // Accumulate per call (keyed by `index`) and parse once at stream end —
668
- // parsing per fragment produced N broken entries for one real call.
669
- const pendingToolCalls = new Map<
670
- number,
671
- { toolName: string; argumentsBuffer: string }
672
- >();
673
- let lastSlot = 0;
674
-
675
- for await (const chunk of stream) {
676
- currentModel = chunk.model;
677
-
678
- // Some providers include usage in (possibly choice-less) chunks
679
- if (chunk.usage) {
680
- promptTokens = chunk.usage.prompt_tokens;
681
- completionTokens = chunk.usage.completion_tokens;
682
- totalTokens = chunk.usage.total_tokens;
683
- }
684
-
685
- const choice = chunk.choices?.[0];
686
- if (!choice) continue;
687
-
688
- // Accumulate streamed tool-call fragments by index
689
- if (choice.delta?.tool_calls) {
690
- for (const toolCall of choice.delta.tool_calls) {
691
- // Spec-compliant chunks carry `index`; servers that omit it send
692
- // one call's fragments sequentially, so keep appending to lastSlot.
693
- const slot =
694
- typeof toolCall.index === "number" ? toolCall.index : lastSlot;
695
- lastSlot = slot;
696
- const entry = pendingToolCalls.get(slot) ?? {
697
- toolName: "",
698
- argumentsBuffer: "",
699
- };
700
- if (toolCall.function?.name) {
701
- entry.toolName = toolCall.function.name;
702
- }
703
- if (toolCall.function?.arguments) {
704
- entry.argumentsBuffer += toolCall.function.arguments;
705
- }
706
- pendingToolCalls.set(slot, entry);
707
- }
708
- }
709
-
710
- // Provider-specific delta handling (e.g. DeepSeek reasoning_content)
711
- this.onStreamDelta(choice.delta);
712
-
713
- const delta = choice.delta?.content || "";
714
- if (delta) {
715
- accumulated += delta;
716
- yield {
717
- delta,
718
- accumulated,
719
- done: false,
720
- };
721
- }
722
-
723
- if (choice.finish_reason) {
724
- finishReason = choice.finish_reason;
725
- }
726
- }
727
-
728
- // Parse JSON response if schema was provided
729
- let structured: TStructured | undefined;
730
- if (input.parameters?.jsonSchema && accumulated) {
731
- try {
732
- structured = JSON.parse(accumulated) as TStructured;
733
- } catch (error) {
734
- logger.warn(
735
- `[${this.logLabel}] Failed to parse JSON response in stream:`,
736
- error
737
- );
738
- }
739
- }
740
-
741
- const toolCalls: Array<{
742
- toolName: string;
743
- arguments: Record<string, unknown>;
744
- }> = [];
745
- for (const [, entry] of [...pendingToolCalls.entries()].sort(
746
- ([a], [b]) => a - b
747
- )) {
748
- if (!entry.toolName) continue;
749
- toolCalls.push({
750
- toolName: entry.toolName,
751
- arguments: this.parseToolCallArguments(entry.argumentsBuffer, true),
752
- });
753
- }
754
-
755
- // Include tool calls in structured response (even without JSON schema)
756
- if (toolCalls.length > 0) {
757
- structured = {
758
- ...(structured || {}),
759
- message:
760
- (structured as AgentStructuredResponse | undefined)?.message ||
761
- accumulated,
762
- toolCalls,
763
- } as TStructured;
764
- }
765
-
766
- // Empty-completion guard — same definition as the non-streaming path, so the
767
- // stream retries / falls back to backup instead of emitting an empty message.
768
- assertUsableCompletion(structured, accumulated, toolCalls.length, this.displayName);
769
-
770
- // Yield final chunk
771
- yield {
772
- delta: "",
773
- accumulated,
774
- done: true,
775
- metadata: {
776
- model: currentModel,
777
- finishReason,
778
- tokensUsed: totalTokens,
779
- promptTokens,
780
- completionTokens,
781
- },
782
- structured,
783
- };
784
69
  }
70
+ return createOpenAIProvider({
71
+ apiKey: init.apiKey,
72
+ model: init.model,
73
+ id: init.id,
74
+ jsonMode: mode === "json_schema" ? "schema" : "object",
75
+ ...(init.baseUrl ? { baseUrl: init.baseUrl } : {}),
76
+ ...(init.headers ? { headers: init.headers } : {}),
77
+ ...(init.config?.maxTokens ? { maxTokens: init.config.maxTokens } : {}),
78
+ ...(init.config?.effort ? { effort: init.config.effort } : {}),
79
+ ...(init.providerOrder ? { providerOrder: init.providerOrder } : {}),
80
+ ...(init.fetchImpl ? { fetchImpl: init.fetchImpl } : {}),
81
+ });
785
82
  }