@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,573 +1,71 @@
1
1
  /**
2
- * Anthropic (Claude) provider implementation with retry and backup models
2
+ * Anthropic (Claude).
3
+ *
4
+ * Anthropic has no native schema mode, so a structured request carries the
5
+ * schema as an extra system block — placed after the cached one, where a
6
+ * per-call schema cannot invalidate the system prompt's cache. That, the
7
+ * thinking budget, its 529, and its cache-token accounting all live in
8
+ * `@providerkit/core`; this file is the constructor.
3
9
  */
4
10
 
5
- import Anthropic from "@anthropic-ai/sdk";
6
- import type {
7
- MessageCreateParamsNonStreaming,
8
- Tool,
9
- } from "@anthropic-ai/sdk/resources/messages";
11
+ import { createAnthropicProvider } from "@providerkit/core";
10
12
 
11
- import type {
12
- AiProvider,
13
- GenerateMessageInput,
14
- GenerateMessageOutput,
15
- GenerateMessageStreamChunk,
16
- AgentStructuredResponse,
17
- } from "../types";
18
- import type { ProviderCapabilities } from "../types/ai";
19
- import type { HistoryItem } from "../types/history";
20
- import { withTimeoutAndRetry, withStreamRetry, withBackupFallback, streamWithBackupFallback, backupFallbackLogging, resolveRetryConfig, logger, assertUsableCompletion, combineAbortSignals } from "../utils";
21
- import {
22
- classifyProviderError,
23
- isBackupEligible,
24
- isRetriableProviderError,
25
- toProviderError,
26
- type ErrorClassificationOptions,
27
- } from "./errorClassification";
13
+ import type { ProviderCapabilities } from "../types/ai.js";
14
+ import { ProviderAdapter, type RequestConfig } from "./ProviderAdapter.js";
28
15
 
29
- /**
30
- * Configuration options for Anthropic provider
31
- * Uses types from @anthropic-ai/sdk package
32
- */
33
16
  export interface AnthropicProviderOptions {
34
- /** Anthropic API key. Optional when `client` is injected (tests). */
35
- apiKey?: string;
36
- /** Model to use (required) - e.g., "claude-sonnet-5", "claude-opus-5" */
17
+ /** Anthropic API key */
18
+ apiKey: string;
19
+ /** Model to use (required) e.g. "claude-sonnet-5", "claude-opus-5" */
37
20
  model: string;
38
- /** Backup models to try if primary fails (default: []) */
21
+ /** Backup models to try if the primary fails (default: []) */
39
22
  backupModels?: string[];
40
- /** Default parameters - uses MessageCreateParamsNonStreaming from @anthropic-ai/sdk */
41
- config?: Partial<Omit<MessageCreateParamsNonStreaming, "model" | "messages">>;
42
- /** Retry configuration */
43
- retryConfig?: {
44
- timeout?: number;
45
- retries?: number;
46
- };
23
+ /** Any endpoint speaking the Anthropic Messages dialect. */
24
+ baseUrl?: string;
25
+ /** Request defaults sent with every call */
26
+ config?: RequestConfig;
27
+ /** Idle-stream deadline and retry budget */
28
+ retryConfig?: { timeout?: number; retries?: number };
47
29
  /**
48
- * Pre-configured SDK client. Overrides the internally-constructed one.
49
- * Intended for tests injecting scripted transports; production callers
50
- * should pass `apiKey` instead.
30
+ * Replacement `fetch`, for tests that script the wire.
31
+ *
32
+ * v3 note: this replaces the injected SDK client. There is no SDK now, so a
33
+ * test drives the same bytes the provider really receives rather than an
34
+ * SDK's idea of them.
51
35
  */
52
- client?: Anthropic;
36
+ fetchImpl?: typeof fetch;
53
37
  }
54
38
 
55
- /**
56
- * Anthropic-specific error classification signals (HTTP 529 plus
57
- * overloaded_error/api_error types and the "overloaded" code).
58
- */
59
- const CLASSIFICATION_OPTIONS: ErrorClassificationOptions = {
60
- overloadedStatuses: [529],
61
- overloadedTypes: ["overloaded_error", "api_error"],
62
- overloadedCodes: ["overloaded"],
63
- };
64
-
65
- /**
66
- * Determines if an error should trigger backup model usage.
67
- * Derived from the normalized error classification.
68
- */
69
- const shouldUseBackupModel = (error: unknown): boolean =>
70
- isBackupEligible(classifyProviderError(error, CLASSIFICATION_OPTIONS));
71
-
72
- /**
73
- * Anthropic provider implementation with backup models and retry logic
74
- */
75
- export class AnthropicProvider implements AiProvider {
39
+ export class AnthropicProvider extends ProviderAdapter {
76
40
  public readonly name = "anthropic";
77
41
  public readonly capabilities: ProviderCapabilities = {
78
42
  supportsTools: true,
79
- supportsNativeJsonSchema: false, // JSON output is enforced via a prompt instruction, not a native schema mode
43
+ supportsNativeJsonSchema: false,
80
44
  supportsStreaming: true,
81
45
  supportsStreamingToolCalls: true,
82
- // No cache_control is attached to any request yet — reporting true would
83
- // make consumers believe repeated system prompts are cached when they are
84
- // not. Flip this when caching is actually implemented.
85
- supportsPromptCaching: false,
46
+ supportsPromptCaching: true,
86
47
  };
87
- private client: Anthropic;
88
- private primaryModel: string;
89
- private backupModels: string[];
90
- private config?: Partial<
91
- Omit<MessageCreateParamsNonStreaming, "model" | "messages">
92
- >;
93
- private retryConfig: { timeout: number; retries: number };
94
48
 
95
49
  constructor(options: AnthropicProviderOptions) {
96
- const { apiKey, model, backupModels = [], config, retryConfig, client } = options;
97
-
98
- if (!client && !apiKey) {
99
- throw new Error("Anthropic API key is required");
100
- }
101
-
102
- if (!model) {
103
- throw new Error("Model is required. Example: 'claude-sonnet-5'");
104
- }
105
-
106
- this.client = client ?? new Anthropic({
107
- apiKey,
108
- });
109
- this.primaryModel = model;
110
- this.backupModels = backupModels;
111
- this.config = config;
112
- this.retryConfig = resolveRetryConfig(retryConfig);
113
- }
114
-
115
- /**
116
- * Build Anthropic-formatted messages from HistoryItem[] array.
117
- * System messages are extracted separately (Anthropic uses a `system` param).
118
- * Tool results are mapped to Anthropic's tool_result content blocks.
119
- * Assistant tool_calls are mapped to tool_use content blocks.
120
- */
121
- private buildAnthropicMessages(history: HistoryItem[]): {
122
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
123
- messages: any[];
124
- systemMessages: string[];
125
- } {
126
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
127
- const messages: any[] = [];
128
- const systemMessages: string[] = [];
129
-
130
- for (const item of history) {
131
- switch (item.role) {
132
- case "system":
133
- systemMessages.push(item.content);
134
- break;
135
- case "user":
136
- messages.push({ role: "user", content: item.content });
137
- break;
138
- case "assistant":
139
- if (item.tool_calls && item.tool_calls.length > 0) {
140
- const content: Array<Record<string, unknown>> = [];
141
- if (item.content) {
142
- content.push({ type: "text", text: item.content });
143
- }
144
- for (const tc of item.tool_calls) {
145
- content.push({
146
- type: "tool_use",
147
- id: tc.id,
148
- name: tc.name,
149
- input: tc.arguments,
150
- });
151
- }
152
- messages.push({ role: "assistant", content });
153
- } else {
154
- messages.push({ role: "assistant", content: item.content || "" });
155
- }
156
- break;
157
- case "tool":
158
- // Anthropic tool results are sent as user messages with tool_result content blocks
159
- messages.push({
160
- role: "user",
161
- content: [
162
- {
163
- type: "tool_result",
164
- tool_use_id: item.tool_call_id,
165
- content: typeof item.content === "string" ? item.content : JSON.stringify(item.content),
166
- },
167
- ],
168
- });
169
- break;
170
- }
171
- }
172
-
173
- return { messages, systemMessages };
174
- }
175
-
176
- async generateMessage<
177
- TContext = unknown,
178
- TStructured = AgentStructuredResponse
179
- >(
180
- input: GenerateMessageInput<TContext>
181
- ): Promise<GenerateMessageOutput<TStructured>> {
182
- return this.generateWithBackup<TContext, TStructured>(input);
183
- }
184
-
185
- async *generateMessageStream<
186
- TContext = unknown,
187
- TStructured = AgentStructuredResponse
188
- >(
189
- input: GenerateMessageInput<TContext>
190
- ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
191
- yield* this.generateStreamWithBackup<TContext, TStructured>(input);
192
- }
193
-
194
- private async generateWithBackup<
195
- TContext = unknown,
196
- TStructured = AgentStructuredResponse
197
- >(
198
- input: GenerateMessageInput<TContext>
199
- ): Promise<GenerateMessageOutput<TStructured>> {
200
- const observer = backupFallbackLogging("[ANTHROPIC]", shouldUseBackupModel);
201
-
202
- try {
203
- return await withBackupFallback({
204
- models: [this.primaryModel, ...this.backupModels],
205
- attempt: (model) =>
206
- this.generateWithModel<TContext, TStructured>(model, input),
207
- shouldTryBackup: shouldUseBackupModel,
208
- ...observer.callbacks,
209
- });
210
- } catch (error: unknown) {
211
- observer.logExhausted(error);
212
- throw toProviderError(error, this.name, CLASSIFICATION_OPTIONS);
213
- }
214
- }
215
-
216
- private async generateWithModel<
217
- TContext = unknown,
218
- TStructured = AgentStructuredResponse
219
- >(
220
- model: string,
221
- input: GenerateMessageInput<TContext>
222
- ): Promise<GenerateMessageOutput<TStructured>> {
223
- const operation = async (signal: AbortSignal): Promise<GenerateMessageOutput> => {
224
- // Anthropic requires max_tokens to be specified
225
- const maxTokens = input.parameters?.maxOutputTokens || 4096;
226
-
227
- // Build messages from history
228
- const { messages: historyMessages, systemMessages } = this.buildAnthropicMessages(input.history);
229
-
230
- // Append the current prompt as the final user message
231
- historyMessages.push({
232
- role: "user",
233
- content: input.prompt,
234
- });
235
-
236
- const params: MessageCreateParamsNonStreaming = {
237
- model,
238
- max_tokens: maxTokens,
239
- messages: historyMessages,
240
- ...this.config,
241
- };
242
-
243
- // Set system messages from history if present
244
- if (systemMessages.length > 0) {
245
- if (typeof this.config?.system === "string") {
246
- params.system = `${this.config.system}\n\n${systemMessages.join("\n\n")}`;
247
- } else if (Array.isArray(this.config?.system)) {
248
- params.system = [
249
- ...this.config.system,
250
- ...systemMessages.map(s => ({ type: "text" as const, text: s })),
251
- ];
252
- } else {
253
- params.system = systemMessages.join("\n\n");
254
- }
255
- }
256
-
257
- // Add tools if provided
258
- if (input.tools && input.tools.length > 0) {
259
- params.tools = input.tools.map((tool) => ({
260
- name: tool.name || tool.id,
261
- description: tool.description || "",
262
- input_schema: tool.parameters as Tool["input_schema"], // JSON schema
263
- }));
264
- }
265
-
266
- // Handle schema: Anthropic doesn't have a native schema mode, so embed constraints
267
- if (input.parameters?.jsonSchema) {
268
- const systemPrompt =
269
- "You must respond with valid JSON only and it MUST match the provided schema.";
270
-
271
- // Merge with existing system if present
272
- if (typeof this.config?.system === "string") {
273
- params.system = `${this.config.system}\n\n${systemPrompt}`;
274
- } else if (Array.isArray(this.config?.system)) {
275
- params.system = [
276
- ...this.config.system,
277
- {
278
- type: "text" as const,
279
- text: systemPrompt,
280
- },
281
- ];
282
- } else {
283
- params.system = systemPrompt;
284
- }
285
- }
286
-
287
- const response = await this.client.messages.create(params, {
288
- signal: combineAbortSignals(input.signal, signal),
289
- });
290
-
291
- // Extract text and tool calls from response
292
- const textContent = response.content.find(
293
- (block) => block.type === "text"
294
- );
295
- const message = textContent?.type === "text" ? textContent.text : "";
296
-
297
- // Extract tool calls from response
298
- const toolCalls: Array<{
299
- toolName: string;
300
- arguments: Record<string, unknown>;
301
- }> = [];
302
-
303
- // Check for tool_use content blocks
304
- for (const block of response.content) {
305
- if (block.type === "tool_use") {
306
- toolCalls.push({
307
- toolName: block.name,
308
- arguments: block.input as Record<string, unknown>,
309
- });
310
- }
311
- }
312
-
313
- // Only throw error if we have no text AND no function calls
314
- if (!message && toolCalls.length === 0) {
315
- throw new Error("No response from Anthropic");
316
- }
317
-
318
- // Parse JSON response if schema was provided
319
- let structured: AgentStructuredResponse | undefined;
320
- if (input.parameters?.jsonSchema) {
321
- try {
322
- structured = JSON.parse(message) as AgentStructuredResponse;
323
- } catch (error) {
324
- logger.warn("[ANTHROPIC] Failed to parse JSON response:", error);
325
- // Fall back to treating the message as plain text
326
- }
327
- }
328
-
329
- // If tools were used, include them in structured response
330
- if (toolCalls.length > 0) {
331
- structured = {
332
- ...(structured || {}),
333
- message: structured?.message || message,
334
- toolCalls,
335
- } as AgentStructuredResponse;
336
- }
337
-
338
- // A parsed-but-blank message with no tool calls is as empty as no text;
339
- // the shared guard throws so withTimeoutAndRetry retries instead of
340
- // returning {"message":""}.
341
- assertUsableCompletion(structured, message, toolCalls.length, "Anthropic");
342
-
343
- return {
344
- message,
345
- metadata: {
346
- model: response.model,
347
- stopReason: response.stop_reason,
348
- tokensUsed:
349
- response.usage.input_tokens + response.usage.output_tokens,
350
- promptTokens: response.usage.input_tokens,
351
- completionTokens: response.usage.output_tokens,
352
- },
353
- structured,
354
- };
355
- };
356
-
357
- return withTimeoutAndRetry(
358
- operation,
359
- this.retryConfig.timeout,
360
- this.retryConfig.retries,
361
- `Anthropic ${model}`,
362
- (error) => isRetriableProviderError(error, CLASSIFICATION_OPTIONS)
363
- ) as Promise<GenerateMessageOutput<TStructured>>;
364
- }
365
-
366
- private async *generateStreamWithBackup<
367
- TContext = unknown,
368
- TStructured = AgentStructuredResponse
369
- >(
370
- input: GenerateMessageInput<TContext>
371
- ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
372
- const observer = backupFallbackLogging("[ANTHROPIC]", shouldUseBackupModel, { streaming: true });
373
-
374
- try {
375
- yield* streamWithBackupFallback({
376
- models: [this.primaryModel, ...this.backupModels],
377
- attempt: (model) =>
378
- withStreamRetry(
379
- (signal) => this.generateStreamWithModel<TContext, TStructured>(model, input, signal),
380
- { maxRetries: this.retryConfig.retries, firstChunkTimeoutMs: this.retryConfig.timeout, operationName: `Anthropic ${model} stream`, isRetriable: (error) => isRetriableProviderError(error, CLASSIFICATION_OPTIONS) }
381
- ),
382
- shouldTryBackup: shouldUseBackupModel,
383
- ...observer.callbacks,
384
- });
385
- } catch (error: unknown) {
386
- observer.logExhausted(error);
387
- throw toProviderError(error, this.name, CLASSIFICATION_OPTIONS);
50
+ if (!options.apiKey) throw new Error("Anthropic API key is required");
51
+ if (!options.model) {
52
+ throw new Error("Model is required. Example: 'claude-sonnet-5' or 'claude-opus-5'");
388
53
  }
389
- }
390
-
391
- private async *generateStreamWithModel<
392
- TContext = unknown,
393
- TStructured = AgentStructuredResponse
394
- >(
395
- model: string,
396
- input: GenerateMessageInput<TContext>,
397
- attemptSignal?: AbortSignal
398
- ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
399
- // Anthropic requires max_tokens to be specified
400
- const maxTokens = input.parameters?.maxOutputTokens || 4096;
401
-
402
- // Build messages from history
403
- const { messages: historyMessages, systemMessages } = this.buildAnthropicMessages(input.history);
404
54
 
405
- // Append the current prompt as the final user message
406
- historyMessages.push({
407
- role: "user" as const,
408
- content: input.prompt,
55
+ super({
56
+ provider: createAnthropicProvider({
57
+ apiKey: options.apiKey,
58
+ model: options.model,
59
+ id: "anthropic",
60
+ ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
61
+ ...(options.config?.maxTokens ? { maxTokens: options.config.maxTokens } : {}),
62
+ ...(options.config?.effort ? { effort: options.config.effort } : {}),
63
+ ...(options.fetchImpl ? { fetchImpl: options.fetchImpl } : {}),
64
+ }),
65
+ model: options.model,
66
+ ...(options.config ? { defaults: options.config } : {}),
67
+ ...(options.backupModels ? { backupModels: options.backupModels } : {}),
68
+ ...(options.retryConfig ? { retryConfig: options.retryConfig } : {}),
409
69
  });
410
-
411
- const params = {
412
- model,
413
- max_tokens: maxTokens,
414
- messages: historyMessages,
415
- stream: true,
416
- ...this.config,
417
- };
418
-
419
- // Set system messages from history if present
420
- if (systemMessages.length > 0) {
421
- if (typeof this.config?.system === "string") {
422
- params.system = `${this.config.system}\n\n${systemMessages.join("\n\n")}`;
423
- } else if (Array.isArray(this.config?.system)) {
424
- params.system = [
425
- ...this.config.system,
426
- ...systemMessages.map(s => ({ type: "text" as const, text: s })),
427
- ];
428
- } else {
429
- params.system = systemMessages.join("\n\n");
430
- }
431
- }
432
-
433
- // Add tools if provided
434
- if (input.tools && input.tools.length > 0) {
435
- params.tools = input.tools.map((tool) => ({
436
- name: tool.name || tool.id,
437
- description: tool.description || "",
438
- input_schema: tool.parameters as Tool["input_schema"], // JSON schema
439
- }));
440
- }
441
-
442
- // Handle schema in streaming: embed constraint
443
- if (input.parameters?.jsonSchema) {
444
- const systemPrompt =
445
- "You must respond with valid JSON only and it MUST match the provided schema.";
446
-
447
- if (typeof this.config?.system === "string") {
448
- params.system = `${this.config.system}\n\n${systemPrompt}`;
449
- } else if (Array.isArray(this.config?.system)) {
450
- params.system = [
451
- ...this.config.system,
452
- {
453
- type: "text" as const,
454
- text: systemPrompt,
455
- },
456
- ];
457
- } else {
458
- params.system = systemPrompt;
459
- }
460
- }
461
-
462
- const stream = this.client.messages.stream(params, {
463
- signal: combineAbortSignals(input.signal, attemptSignal),
464
- });
465
-
466
- let accumulated = "";
467
- let currentModel = model;
468
- let stopReason: string | undefined;
469
- let inputTokens = 0;
470
- let outputTokens = 0;
471
- // Tool_use blocks arrive empty: content_block_start carries `input: {}`,
472
- // the real arguments stream in later as input_json_delta partial_json
473
- // fragments. Accumulate per block index and parse once at stream end.
474
- const pendingToolBlocks = new Map<
475
- number,
476
- { toolName: string; argumentsBuffer: string }
477
- >();
478
-
479
- for await (const chunk of stream) {
480
- if (chunk.type === "message_start") {
481
- currentModel = chunk.message.model;
482
- inputTokens = chunk.message.usage.input_tokens;
483
- } else if (chunk.type === "content_block_start") {
484
- if (chunk.content_block.type === "tool_use") {
485
- pendingToolBlocks.set(chunk.index, {
486
- toolName: chunk.content_block.name,
487
- argumentsBuffer: "",
488
- });
489
- }
490
- } else if (chunk.type === "content_block_delta") {
491
- if (chunk.delta.type === "text_delta") {
492
- const delta = chunk.delta.text;
493
- accumulated += delta;
494
- yield {
495
- delta,
496
- accumulated,
497
- done: false,
498
- } as GenerateMessageStreamChunk<TStructured>;
499
- } else if (chunk.delta.type === "input_json_delta") {
500
- const block = pendingToolBlocks.get(chunk.index);
501
- if (block) {
502
- block.argumentsBuffer += chunk.delta.partial_json;
503
- }
504
- }
505
- } else if (chunk.type === "message_delta") {
506
- stopReason = chunk.delta.stop_reason || undefined;
507
- outputTokens = chunk.usage.output_tokens;
508
- }
509
- }
510
-
511
- const toolCalls: Array<{
512
- toolName: string;
513
- arguments: Record<string, unknown>;
514
- }> = [];
515
- for (const [, block] of [...pendingToolBlocks.entries()].sort(
516
- ([a], [b]) => a - b
517
- )) {
518
- let args: Record<string, unknown> = {};
519
- if (block.argumentsBuffer) {
520
- try {
521
- args = JSON.parse(block.argumentsBuffer) as Record<string, unknown>;
522
- } catch (error) {
523
- logger.warn(
524
- "[ANTHROPIC] Failed to parse streamed tool call arguments:",
525
- error
526
- );
527
- }
528
- }
529
- toolCalls.push({ toolName: block.toolName, arguments: args });
530
- }
531
-
532
- // Parse JSON response if schema was provided
533
- let structured: AgentStructuredResponse | undefined;
534
- if (input.parameters?.jsonSchema && accumulated) {
535
- try {
536
- structured = JSON.parse(accumulated) as AgentStructuredResponse;
537
- } catch (error) {
538
- logger.warn(
539
- "[ANTHROPIC] Failed to parse JSON response in stream:",
540
- error
541
- );
542
- }
543
- }
544
-
545
- // If tools were used, include them in structured response
546
- if (toolCalls.length > 0) {
547
- structured = {
548
- ...(structured || {}),
549
- message: structured?.message || accumulated,
550
- toolCalls,
551
- } as AgentStructuredResponse;
552
- }
553
-
554
- // Empty-completion guard — same definition as the non-streaming path, so the
555
- // stream retries / falls back to backup instead of emitting an empty message.
556
- assertUsableCompletion(structured, accumulated, toolCalls.length, "Anthropic");
557
-
558
- // Yield final chunk
559
- yield {
560
- delta: "",
561
- accumulated,
562
- done: true,
563
- metadata: {
564
- model: currentModel,
565
- stopReason,
566
- tokensUsed: inputTokens + outputTokens,
567
- promptTokens: inputTokens,
568
- completionTokens: outputTokens,
569
- },
570
- structured: structured as TStructured,
571
- };
572
70
  }
573
71
  }