@falai/agent 2.2.4 → 2.4.2

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 (397) hide show
  1. package/README.md +2 -2
  2. package/dist/adapters/MemoryAdapter.d.ts.map +1 -1
  3. package/dist/adapters/MemoryAdapter.js +10 -1
  4. package/dist/adapters/MemoryAdapter.js.map +1 -1
  5. package/dist/adapters/MongoAdapter.d.ts.map +1 -1
  6. package/dist/adapters/MongoAdapter.js +33 -2
  7. package/dist/adapters/MongoAdapter.js.map +1 -1
  8. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  9. package/dist/adapters/OpenSearchAdapter.js +15 -1
  10. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  11. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  12. package/dist/adapters/PostgreSQLAdapter.js +35 -5
  13. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  14. package/dist/adapters/PrismaAdapter.d.ts.map +1 -1
  15. package/dist/adapters/PrismaAdapter.js +58 -15
  16. package/dist/adapters/PrismaAdapter.js.map +1 -1
  17. package/dist/adapters/RedisAdapter.d.ts.map +1 -1
  18. package/dist/adapters/RedisAdapter.js +10 -1
  19. package/dist/adapters/RedisAdapter.js.map +1 -1
  20. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  21. package/dist/adapters/SQLiteAdapter.js +38 -6
  22. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  23. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -1
  24. package/dist/cjs/adapters/MemoryAdapter.js +10 -1
  25. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  26. package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -1
  27. package/dist/cjs/adapters/MongoAdapter.js +33 -2
  28. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  29. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  30. package/dist/cjs/adapters/OpenSearchAdapter.js +15 -1
  31. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  32. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  33. package/dist/cjs/adapters/PostgreSQLAdapter.js +35 -5
  34. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  35. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -1
  36. package/dist/cjs/adapters/PrismaAdapter.js +58 -15
  37. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  38. package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
  39. package/dist/cjs/adapters/RedisAdapter.js +10 -1
  40. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  41. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  42. package/dist/cjs/adapters/SQLiteAdapter.js +38 -6
  43. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  44. package/dist/cjs/core/Agent.d.ts +28 -18
  45. package/dist/cjs/core/Agent.d.ts.map +1 -1
  46. package/dist/cjs/core/Agent.js +58 -68
  47. package/dist/cjs/core/Agent.js.map +1 -1
  48. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -1
  49. package/dist/cjs/core/AutoChainExecutor.js +14 -20
  50. package/dist/cjs/core/AutoChainExecutor.js.map +1 -1
  51. package/dist/cjs/core/BranchEvaluator.d.ts +4 -3
  52. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -1
  53. package/dist/cjs/core/BranchEvaluator.js +18 -23
  54. package/dist/cjs/core/BranchEvaluator.js.map +1 -1
  55. package/dist/cjs/core/Flow.d.ts +2 -1
  56. package/dist/cjs/core/Flow.d.ts.map +1 -1
  57. package/dist/cjs/core/Flow.js +10 -3
  58. package/dist/cjs/core/Flow.js.map +1 -1
  59. package/dist/cjs/core/FlowRouter.d.ts +1 -0
  60. package/dist/cjs/core/FlowRouter.d.ts.map +1 -1
  61. package/dist/cjs/core/FlowRouter.js +28 -5
  62. package/dist/cjs/core/FlowRouter.js.map +1 -1
  63. package/dist/cjs/core/PersistenceManager.d.ts +3 -0
  64. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  65. package/dist/cjs/core/PersistenceManager.js +57 -5
  66. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  67. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  68. package/dist/cjs/core/PromptComposer.js +24 -10
  69. package/dist/cjs/core/PromptComposer.js.map +1 -1
  70. package/dist/cjs/core/ResponseGenerationError.d.ts +30 -0
  71. package/dist/cjs/core/ResponseGenerationError.d.ts.map +1 -0
  72. package/dist/cjs/core/ResponseGenerationError.js +37 -0
  73. package/dist/cjs/core/ResponseGenerationError.js.map +1 -0
  74. package/dist/cjs/core/ResponseModal.d.ts +43 -102
  75. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  76. package/dist/cjs/core/ResponseModal.js +178 -1194
  77. package/dist/cjs/core/ResponseModal.js.map +1 -1
  78. package/dist/cjs/core/ResponsePipeline.d.ts +58 -152
  79. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  80. package/dist/cjs/core/ResponsePipeline.js +408 -457
  81. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  82. package/dist/cjs/core/SessionFinalizer.d.ts +34 -0
  83. package/dist/cjs/core/SessionFinalizer.d.ts.map +1 -0
  84. package/dist/cjs/core/SessionFinalizer.js +61 -0
  85. package/dist/cjs/core/SessionFinalizer.js.map +1 -0
  86. package/dist/cjs/core/SessionManager.d.ts +1 -1
  87. package/dist/cjs/core/SessionManager.d.ts.map +1 -1
  88. package/dist/cjs/core/SessionManager.js +18 -7
  89. package/dist/cjs/core/SessionManager.js.map +1 -1
  90. package/dist/cjs/core/SignalCoordinator.d.ts +103 -0
  91. package/dist/cjs/core/SignalCoordinator.d.ts.map +1 -0
  92. package/dist/cjs/core/SignalCoordinator.js +207 -0
  93. package/dist/cjs/core/SignalCoordinator.js.map +1 -0
  94. package/dist/cjs/core/SignalEvaluator.d.ts +2 -2
  95. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -1
  96. package/dist/cjs/core/SignalEvaluator.js +11 -26
  97. package/dist/cjs/core/SignalEvaluator.js.map +1 -1
  98. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -1
  99. package/dist/cjs/core/SignalProcessor.js +28 -11
  100. package/dist/cjs/core/SignalProcessor.js.map +1 -1
  101. package/dist/cjs/core/Step.d.ts +3 -1
  102. package/dist/cjs/core/Step.d.ts.map +1 -1
  103. package/dist/cjs/core/Step.js +10 -3
  104. package/dist/cjs/core/Step.js.map +1 -1
  105. package/dist/cjs/core/StepLifecycle.d.ts +33 -0
  106. package/dist/cjs/core/StepLifecycle.d.ts.map +1 -0
  107. package/dist/cjs/core/StepLifecycle.js +97 -0
  108. package/dist/cjs/core/StepLifecycle.js.map +1 -0
  109. package/dist/cjs/core/ToolLoopExecutor.d.ts +104 -0
  110. package/dist/cjs/core/ToolLoopExecutor.d.ts.map +1 -0
  111. package/dist/cjs/core/ToolLoopExecutor.js +391 -0
  112. package/dist/cjs/core/ToolLoopExecutor.js.map +1 -0
  113. package/dist/cjs/core/ToolManager.d.ts +1 -1
  114. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  115. package/dist/cjs/core/ToolManager.js.map +1 -1
  116. package/dist/cjs/index.d.ts +4 -5
  117. package/dist/cjs/index.d.ts.map +1 -1
  118. package/dist/cjs/index.js +7 -6
  119. package/dist/cjs/index.js.map +1 -1
  120. package/dist/cjs/providers/AnthropicProvider.d.ts +2 -0
  121. package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
  122. package/dist/cjs/providers/AnthropicProvider.js +28 -56
  123. package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
  124. package/dist/cjs/providers/DeepSeekProvider.d.ts +25 -21
  125. package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
  126. package/dist/cjs/providers/DeepSeekProvider.js +48 -407
  127. package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
  128. package/dist/cjs/providers/GeminiProvider.d.ts +2 -0
  129. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  130. package/dist/cjs/providers/GeminiProvider.js +27 -56
  131. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  132. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +129 -0
  133. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -0
  134. package/dist/cjs/providers/OpenAICompatibleProvider.js +485 -0
  135. package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -0
  136. package/dist/cjs/providers/OpenAIProvider.d.ts +9 -28
  137. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  138. package/dist/cjs/providers/OpenAIProvider.js +23 -417
  139. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  140. package/dist/cjs/providers/OpenRouterProvider.d.ts +10 -27
  141. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  142. package/dist/cjs/providers/OpenRouterProvider.js +28 -417
  143. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  144. package/dist/cjs/providers/errorClassification.d.ts +61 -0
  145. package/dist/cjs/providers/errorClassification.d.ts.map +1 -0
  146. package/dist/cjs/providers/errorClassification.js +123 -0
  147. package/dist/cjs/providers/errorClassification.js.map +1 -0
  148. package/dist/cjs/providers/index.d.ts +4 -0
  149. package/dist/cjs/providers/index.d.ts.map +1 -1
  150. package/dist/cjs/providers/index.js +7 -1
  151. package/dist/cjs/providers/index.js.map +1 -1
  152. package/dist/cjs/types/agent.d.ts +2 -1
  153. package/dist/cjs/types/agent.d.ts.map +1 -1
  154. package/dist/cjs/types/ai.d.ts +20 -0
  155. package/dist/cjs/types/ai.d.ts.map +1 -1
  156. package/dist/cjs/types/errors.d.ts +33 -0
  157. package/dist/cjs/types/errors.d.ts.map +1 -1
  158. package/dist/cjs/types/errors.js +37 -1
  159. package/dist/cjs/types/errors.js.map +1 -1
  160. package/dist/cjs/types/flow.d.ts +10 -5
  161. package/dist/cjs/types/flow.d.ts.map +1 -1
  162. package/dist/cjs/types/history.d.ts +1 -1
  163. package/dist/cjs/types/history.d.ts.map +1 -1
  164. package/dist/cjs/types/index.d.ts +5 -4
  165. package/dist/cjs/types/index.d.ts.map +1 -1
  166. package/dist/cjs/types/index.js +3 -1
  167. package/dist/cjs/types/index.js.map +1 -1
  168. package/dist/cjs/types/persistence.d.ts +43 -2
  169. package/dist/cjs/types/persistence.d.ts.map +1 -1
  170. package/dist/cjs/types/session.d.ts +8 -0
  171. package/dist/cjs/types/session.d.ts.map +1 -1
  172. package/dist/cjs/types/signals.d.ts +18 -2
  173. package/dist/cjs/types/signals.d.ts.map +1 -1
  174. package/dist/cjs/types/template.d.ts +3 -1
  175. package/dist/cjs/types/template.d.ts.map +1 -1
  176. package/dist/cjs/types/tool.d.ts +4 -4
  177. package/dist/cjs/types/tool.d.ts.map +1 -1
  178. package/dist/cjs/utils/condition.d.ts +19 -0
  179. package/dist/cjs/utils/condition.d.ts.map +1 -1
  180. package/dist/cjs/utils/condition.js +86 -15
  181. package/dist/cjs/utils/condition.js.map +1 -1
  182. package/dist/cjs/utils/session.d.ts +1 -0
  183. package/dist/cjs/utils/session.d.ts.map +1 -1
  184. package/dist/cjs/utils/session.js +1 -0
  185. package/dist/cjs/utils/session.js.map +1 -1
  186. package/dist/core/Agent.d.ts +28 -18
  187. package/dist/core/Agent.d.ts.map +1 -1
  188. package/dist/core/Agent.js +58 -68
  189. package/dist/core/Agent.js.map +1 -1
  190. package/dist/core/AutoChainExecutor.d.ts.map +1 -1
  191. package/dist/core/AutoChainExecutor.js +14 -20
  192. package/dist/core/AutoChainExecutor.js.map +1 -1
  193. package/dist/core/BranchEvaluator.d.ts +4 -3
  194. package/dist/core/BranchEvaluator.d.ts.map +1 -1
  195. package/dist/core/BranchEvaluator.js +18 -23
  196. package/dist/core/BranchEvaluator.js.map +1 -1
  197. package/dist/core/Flow.d.ts +2 -1
  198. package/dist/core/Flow.d.ts.map +1 -1
  199. package/dist/core/Flow.js +10 -3
  200. package/dist/core/Flow.js.map +1 -1
  201. package/dist/core/FlowRouter.d.ts +1 -0
  202. package/dist/core/FlowRouter.d.ts.map +1 -1
  203. package/dist/core/FlowRouter.js +28 -5
  204. package/dist/core/FlowRouter.js.map +1 -1
  205. package/dist/core/PersistenceManager.d.ts +3 -0
  206. package/dist/core/PersistenceManager.d.ts.map +1 -1
  207. package/dist/core/PersistenceManager.js +58 -6
  208. package/dist/core/PersistenceManager.js.map +1 -1
  209. package/dist/core/PromptComposer.d.ts.map +1 -1
  210. package/dist/core/PromptComposer.js +24 -10
  211. package/dist/core/PromptComposer.js.map +1 -1
  212. package/dist/core/ResponseGenerationError.d.ts +30 -0
  213. package/dist/core/ResponseGenerationError.d.ts.map +1 -0
  214. package/dist/core/ResponseGenerationError.js +33 -0
  215. package/dist/core/ResponseGenerationError.js.map +1 -0
  216. package/dist/core/ResponseModal.d.ts +43 -102
  217. package/dist/core/ResponseModal.d.ts.map +1 -1
  218. package/dist/core/ResponseModal.js +171 -1186
  219. package/dist/core/ResponseModal.js.map +1 -1
  220. package/dist/core/ResponsePipeline.d.ts +58 -152
  221. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  222. package/dist/core/ResponsePipeline.js +409 -458
  223. package/dist/core/ResponsePipeline.js.map +1 -1
  224. package/dist/core/SessionFinalizer.d.ts +34 -0
  225. package/dist/core/SessionFinalizer.d.ts.map +1 -0
  226. package/dist/core/SessionFinalizer.js +57 -0
  227. package/dist/core/SessionFinalizer.js.map +1 -0
  228. package/dist/core/SessionManager.d.ts +1 -1
  229. package/dist/core/SessionManager.d.ts.map +1 -1
  230. package/dist/core/SessionManager.js +18 -7
  231. package/dist/core/SessionManager.js.map +1 -1
  232. package/dist/core/SignalCoordinator.d.ts +103 -0
  233. package/dist/core/SignalCoordinator.d.ts.map +1 -0
  234. package/dist/core/SignalCoordinator.js +203 -0
  235. package/dist/core/SignalCoordinator.js.map +1 -0
  236. package/dist/core/SignalEvaluator.d.ts +2 -2
  237. package/dist/core/SignalEvaluator.d.ts.map +1 -1
  238. package/dist/core/SignalEvaluator.js +11 -26
  239. package/dist/core/SignalEvaluator.js.map +1 -1
  240. package/dist/core/SignalProcessor.d.ts.map +1 -1
  241. package/dist/core/SignalProcessor.js +28 -11
  242. package/dist/core/SignalProcessor.js.map +1 -1
  243. package/dist/core/Step.d.ts +3 -1
  244. package/dist/core/Step.d.ts.map +1 -1
  245. package/dist/core/Step.js +10 -3
  246. package/dist/core/Step.js.map +1 -1
  247. package/dist/core/StepLifecycle.d.ts +33 -0
  248. package/dist/core/StepLifecycle.d.ts.map +1 -0
  249. package/dist/core/StepLifecycle.js +93 -0
  250. package/dist/core/StepLifecycle.js.map +1 -0
  251. package/dist/core/ToolLoopExecutor.d.ts +104 -0
  252. package/dist/core/ToolLoopExecutor.d.ts.map +1 -0
  253. package/dist/core/ToolLoopExecutor.js +387 -0
  254. package/dist/core/ToolLoopExecutor.js.map +1 -0
  255. package/dist/core/ToolManager.d.ts +1 -1
  256. package/dist/core/ToolManager.d.ts.map +1 -1
  257. package/dist/core/ToolManager.js.map +1 -1
  258. package/dist/index.d.ts +4 -5
  259. package/dist/index.d.ts.map +1 -1
  260. package/dist/index.js +3 -3
  261. package/dist/index.js.map +1 -1
  262. package/dist/providers/AnthropicProvider.d.ts +2 -0
  263. package/dist/providers/AnthropicProvider.d.ts.map +1 -1
  264. package/dist/providers/AnthropicProvider.js +22 -50
  265. package/dist/providers/AnthropicProvider.js.map +1 -1
  266. package/dist/providers/DeepSeekProvider.d.ts +25 -21
  267. package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
  268. package/dist/providers/DeepSeekProvider.js +49 -408
  269. package/dist/providers/DeepSeekProvider.js.map +1 -1
  270. package/dist/providers/GeminiProvider.d.ts +2 -0
  271. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  272. package/dist/providers/GeminiProvider.js +21 -50
  273. package/dist/providers/GeminiProvider.js.map +1 -1
  274. package/dist/providers/OpenAICompatibleProvider.d.ts +129 -0
  275. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -0
  276. package/dist/providers/OpenAICompatibleProvider.js +481 -0
  277. package/dist/providers/OpenAICompatibleProvider.js.map +1 -0
  278. package/dist/providers/OpenAIProvider.d.ts +9 -28
  279. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  280. package/dist/providers/OpenAIProvider.js +23 -417
  281. package/dist/providers/OpenAIProvider.js.map +1 -1
  282. package/dist/providers/OpenRouterProvider.d.ts +10 -27
  283. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  284. package/dist/providers/OpenRouterProvider.js +28 -417
  285. package/dist/providers/OpenRouterProvider.js.map +1 -1
  286. package/dist/providers/errorClassification.d.ts +61 -0
  287. package/dist/providers/errorClassification.d.ts.map +1 -0
  288. package/dist/providers/errorClassification.js +116 -0
  289. package/dist/providers/errorClassification.js.map +1 -0
  290. package/dist/providers/index.d.ts +4 -0
  291. package/dist/providers/index.d.ts.map +1 -1
  292. package/dist/providers/index.js +2 -0
  293. package/dist/providers/index.js.map +1 -1
  294. package/dist/types/agent.d.ts +2 -1
  295. package/dist/types/agent.d.ts.map +1 -1
  296. package/dist/types/ai.d.ts +20 -0
  297. package/dist/types/ai.d.ts.map +1 -1
  298. package/dist/types/errors.d.ts +33 -0
  299. package/dist/types/errors.d.ts.map +1 -1
  300. package/dist/types/errors.js +34 -0
  301. package/dist/types/errors.js.map +1 -1
  302. package/dist/types/flow.d.ts +10 -5
  303. package/dist/types/flow.d.ts.map +1 -1
  304. package/dist/types/history.d.ts +1 -1
  305. package/dist/types/history.d.ts.map +1 -1
  306. package/dist/types/index.d.ts +5 -4
  307. package/dist/types/index.d.ts.map +1 -1
  308. package/dist/types/index.js +1 -1
  309. package/dist/types/index.js.map +1 -1
  310. package/dist/types/persistence.d.ts +43 -2
  311. package/dist/types/persistence.d.ts.map +1 -1
  312. package/dist/types/session.d.ts +8 -0
  313. package/dist/types/session.d.ts.map +1 -1
  314. package/dist/types/signals.d.ts +18 -2
  315. package/dist/types/signals.d.ts.map +1 -1
  316. package/dist/types/template.d.ts +3 -1
  317. package/dist/types/template.d.ts.map +1 -1
  318. package/dist/types/tool.d.ts +4 -4
  319. package/dist/types/tool.d.ts.map +1 -1
  320. package/dist/utils/condition.d.ts +19 -0
  321. package/dist/utils/condition.d.ts.map +1 -1
  322. package/dist/utils/condition.js +84 -15
  323. package/dist/utils/condition.js.map +1 -1
  324. package/dist/utils/session.d.ts +1 -0
  325. package/dist/utils/session.d.ts.map +1 -1
  326. package/dist/utils/session.js +1 -0
  327. package/dist/utils/session.js.map +1 -1
  328. package/docs/README.md +1 -1
  329. package/docs/guides/branching.md +1 -1
  330. package/docs/guides/compaction.md +12 -5
  331. package/docs/guides/conditions.md +15 -2
  332. package/docs/guides/error-handling.md +59 -9
  333. package/docs/guides/instructions.md +2 -2
  334. package/docs/guides/persistence.md +69 -2
  335. package/docs/guides/streaming.md +2 -0
  336. package/docs/migration/README.md +5 -1
  337. package/docs/migration/v2-3-to-v2-4.md +316 -0
  338. package/docs/reference/adapters.md +55 -7
  339. package/docs/reference/branches.md +2 -2
  340. package/docs/reference/create-agent.md +3 -3
  341. package/docs/reference/errors.md +66 -1
  342. package/docs/reference/flow.md +1 -1
  343. package/docs/reference/instruction.md +4 -4
  344. package/docs/reference/providers.md +100 -3
  345. package/docs/reference/signals.md +14 -3
  346. package/docs/reference/step.md +2 -2
  347. package/docs/reference/tool.md +3 -1
  348. package/docs/start/05-go-to-production.md +3 -0
  349. package/package.json +1 -1
  350. package/src/adapters/MemoryAdapter.ts +15 -1
  351. package/src/adapters/MongoAdapter.ts +41 -2
  352. package/src/adapters/OpenSearchAdapter.ts +24 -1
  353. package/src/adapters/PostgreSQLAdapter.ts +45 -5
  354. package/src/adapters/PrismaAdapter.ts +82 -16
  355. package/src/adapters/RedisAdapter.ts +19 -1
  356. package/src/adapters/SQLiteAdapter.ts +47 -5
  357. package/src/core/Agent.ts +70 -85
  358. package/src/core/AutoChainExecutor.ts +27 -57
  359. package/src/core/BranchEvaluator.ts +24 -30
  360. package/src/core/Flow.ts +10 -3
  361. package/src/core/FlowRouter.ts +36 -4
  362. package/src/core/PersistenceManager.ts +79 -10
  363. package/src/core/PromptComposer.ts +25 -12
  364. package/src/core/ResponseGenerationError.ts +56 -0
  365. package/src/core/ResponseModal.ts +233 -1482
  366. package/src/core/ResponsePipeline.ts +492 -662
  367. package/src/core/SessionFinalizer.ts +78 -0
  368. package/src/core/SessionManager.ts +21 -9
  369. package/src/core/SignalCoordinator.ts +263 -0
  370. package/src/core/SignalEvaluator.ts +12 -29
  371. package/src/core/SignalProcessor.ts +34 -11
  372. package/src/core/Step.ts +11 -3
  373. package/src/core/StepLifecycle.ts +139 -0
  374. package/src/core/ToolLoopExecutor.ts +492 -0
  375. package/src/core/ToolManager.ts +2 -1
  376. package/src/index.ts +7 -5
  377. package/src/providers/AnthropicProvider.ts +30 -72
  378. package/src/providers/DeepSeekProvider.ts +74 -586
  379. package/src/providers/GeminiProvider.ts +29 -70
  380. package/src/providers/OpenAICompatibleProvider.ts +738 -0
  381. package/src/providers/OpenAIProvider.ts +29 -602
  382. package/src/providers/OpenRouterProvider.ts +38 -596
  383. package/src/providers/errorClassification.ts +172 -0
  384. package/src/providers/index.ts +13 -0
  385. package/src/types/agent.ts +2 -1
  386. package/src/types/ai.ts +22 -0
  387. package/src/types/errors.ts +57 -0
  388. package/src/types/flow.ts +10 -5
  389. package/src/types/history.ts +1 -2
  390. package/src/types/index.ts +5 -1
  391. package/src/types/persistence.ts +50 -2
  392. package/src/types/session.ts +9 -0
  393. package/src/types/signals.ts +20 -2
  394. package/src/types/template.ts +3 -1
  395. package/src/types/tool.ts +10 -10
  396. package/src/utils/condition.ts +115 -18
  397. package/src/utils/session.ts +2 -0
@@ -5,24 +5,23 @@
5
5
  */
6
6
 
7
7
  import OpenAI from "openai";
8
- import type { ChatCompletionCreateParamsNonStreaming } from "openai/resources/chat/completions";
9
- import { FunctionParameters } from "openai/resources/shared.mjs";
8
+ import type {
9
+ ChatCompletionChunk,
10
+ ChatCompletionCreateParamsNonStreaming,
11
+ ChatCompletionCreateParamsStreaming,
12
+ } from "openai/resources/chat/completions";
10
13
 
11
14
  import type {
12
- AiProvider,
13
15
  GenerateMessageInput,
14
16
  GenerateMessageOutput,
15
- GenerateMessageStreamChunk,
16
- AgentStructuredResponse,
17
17
  StructuredSchema,
18
18
  } from "../types";
19
- import type { HistoryItem } from "../types/history";
20
- import { withTimeoutAndRetry, logger } from "../utils";
21
-
22
- const DEFAULT_RETRY_CONFIG = {
23
- timeout: 60000,
24
- retries: 3,
25
- };
19
+ import type { ProviderCapabilities } from "../types/ai";
20
+ import { logger } from "../utils";
21
+ import {
22
+ OpenAICompatibleProvider,
23
+ type OpenAICompatibleRequestConfig,
24
+ } from "./OpenAICompatibleProvider";
26
25
 
27
26
  /**
28
27
  * Configuration options for DeepSeek provider
@@ -38,9 +37,7 @@ export interface DeepSeekProviderOptions {
38
37
  /** Custom base URL (default: "https://api.deepseek.com") */
39
38
  baseURL?: string;
40
39
  /** Default parameters - uses ChatCompletionCreateParamsNonStreaming from openai package */
41
- config?: Partial<
42
- Omit<ChatCompletionCreateParamsNonStreaming, "model" | "messages">
43
- >;
40
+ config?: OpenAICompatibleRequestConfig;
44
41
  /** Retry configuration */
45
42
  retryConfig?: {
46
43
  timeout?: number;
@@ -48,98 +45,33 @@ export interface DeepSeekProviderOptions {
48
45
  };
49
46
  }
50
47
 
51
- /**
52
- * Type guard for errors with status/code properties
53
- */
54
- interface ErrorWithStatus {
55
- status?: number;
56
- code?: string;
57
- message?: string;
58
- type?: string;
59
- }
60
-
61
- /**
62
- * Type guard to check if error is ErrorWithStatus
63
- */
64
- function isErrorWithStatus(error: unknown): error is ErrorWithStatus {
65
- return (
66
- typeof error === "object" &&
67
- error !== null &&
68
- ("status" in error || "code" in error || "message" in error)
69
- );
70
- }
71
-
72
- /**
73
- * Safely extract error message
74
- */
75
- function getErrorMessage(error: unknown): string {
76
- if (error instanceof Error) {
77
- return error.message;
78
- }
79
- if (isErrorWithStatus(error) && error.message) {
80
- return error.message;
81
- }
82
- return String(error);
83
- }
84
-
85
- /**
86
- * Determines if an error should trigger backup model usage
87
- */
88
- const shouldUseBackupModel = (error: unknown): boolean => {
89
- if (!isErrorWithStatus(error)) {
90
- return false;
91
- }
92
-
93
- // Server errors
94
- if (error.status === 500 || error.status === 503) {
95
- return true;
96
- }
97
-
98
- // Rate limiting
99
- if (error.status === 429) {
100
- return true;
101
- }
102
-
103
- // Model overloaded or unavailable
104
- if (error.code === "model_not_found" || error.code === "model_overloaded") {
105
- return true;
106
- }
107
-
108
- const message = getErrorMessage(error);
109
- if (
110
- message.includes("overloaded") ||
111
- message.includes("unavailable") ||
112
- message.includes("internal error") ||
113
- message.includes("Internal error")
114
- ) {
115
- return true;
116
- }
117
-
118
- return false;
119
- };
120
-
121
48
  /**
122
49
  * DeepSeek provider implementation using the OpenAI-compatible API.
123
50
  * Supports deepseek-chat and deepseek-reasoner with optional thinking mode.
124
51
  *
125
52
  * DeepSeek streams reasoning content via `delta.reasoning_content` when
126
53
  * thinking mode is enabled. Tool calls follow the standard OpenAI format.
54
+ * Structured output uses chat completions with a json_schema response
55
+ * format (DeepSeek does not expose the responses.parse API).
127
56
  */
128
- export class DeepSeekProvider implements AiProvider {
57
+ export class DeepSeekProvider extends OpenAICompatibleProvider {
129
58
  public readonly name = "deepseek";
130
- private client: OpenAI;
131
- private primaryModel: string;
132
- private backupModels: string[];
133
- private config?: Partial<
134
- Omit<ChatCompletionCreateParamsNonStreaming, "model" | "messages">
135
- >;
136
- private retryConfig: { timeout: number; retries: number };
59
+ public readonly capabilities: ProviderCapabilities = {
60
+ supportsTools: true,
61
+ supportsNativeJsonSchema: true,
62
+ supportsStreaming: true,
63
+ supportsStreamingToolCalls: true,
64
+ supportsPromptCaching: false,
65
+ };
66
+
67
+ protected readonly logLabel = "DEEPSEEK";
68
+ protected readonly displayName = "DeepSeek";
137
69
 
138
70
  constructor(options: DeepSeekProviderOptions) {
139
71
  const {
140
72
  apiKey,
141
73
  model,
142
- backupModels = [],
74
+ backupModels,
143
75
  baseURL = "https://api.deepseek.com",
144
76
  config,
145
77
  retryConfig,
@@ -155,512 +87,68 @@ export class DeepSeekProvider implements AiProvider {
155
87
  );
156
88
  }
157
89
 
158
- this.client = new OpenAI({
159
- apiKey,
160
- baseURL,
90
+ super({
91
+ client: new OpenAI({
92
+ apiKey,
93
+ baseURL,
94
+ }),
95
+ model,
96
+ backupModels,
97
+ config,
98
+ retryConfig,
161
99
  });
162
- this.primaryModel = model;
163
- this.backupModels = backupModels;
164
- this.config = config;
165
- this.retryConfig = {
166
- timeout: retryConfig?.timeout || DEFAULT_RETRY_CONFIG.timeout,
167
- retries: retryConfig?.retries || DEFAULT_RETRY_CONFIG.retries,
168
- };
169
100
  }
170
101
 
171
102
  /**
172
- * Build OpenAI-formatted messages from HistoryItem[] array.
173
- * DeepSeek uses OpenAI-compatible message format.
103
+ * DeepSeek has no responses.parse API; structured output goes through
104
+ * chat completions with a json_schema response_format.
174
105
  */
175
- private buildMessages(history: HistoryItem[]): Array<unknown> {
176
- const messages: Array<unknown> = [];
177
-
178
- for (const item of history) {
179
- switch (item.role) {
180
- case "system":
181
- messages.push({ role: "system", content: item.content });
182
- break;
183
- case "user":
184
- messages.push({ role: "user", content: item.content });
185
- break;
186
- case "assistant":
187
- if (item.tool_calls && item.tool_calls.length > 0) {
188
- messages.push({
189
- role: "assistant",
190
- content: item.content || null,
191
- tool_calls: item.tool_calls.map((tc) => ({
192
- id: tc.id,
193
- type: "function",
194
- function: {
195
- name: tc.name,
196
- arguments: JSON.stringify(tc.arguments),
197
- },
198
- })),
199
- });
200
- } else {
201
- messages.push({ role: "assistant", content: item.content || "" });
202
- }
203
- break;
204
- case "tool":
205
- messages.push({
206
- role: "tool",
207
- tool_call_id: item.tool_call_id,
208
- content:
209
- typeof item.content === "string"
210
- ? item.content
211
- : JSON.stringify(item.content),
212
- });
213
- break;
214
- }
215
- }
216
-
217
- return messages;
106
+ protected override async executeStructuredGenerate(
107
+ model: string,
108
+ input: GenerateMessageInput<unknown>,
109
+ _jsonSchema: StructuredSchema
110
+ ): Promise<GenerateMessageOutput> {
111
+ return this.executeChatCompletion(model, input);
218
112
  }
219
113
 
220
114
  /**
221
- * Adapt common schema format to DeepSeek's format.
222
- * DeepSeek is OpenAI-compatible and uses standard JSON Schema.
115
+ * DeepSeek supports native json_schema enforcement in chat completions
116
+ * (both streaming and non-streaming).
223
117
  */
224
- private adaptSchema(schema: StructuredSchema): Record<string, unknown> {
225
- return schema as Record<string, unknown>;
226
- }
227
-
228
- async generateMessage<
229
- TContext = unknown,
230
- TStructured = AgentStructuredResponse,
231
- >(
232
- input: GenerateMessageInput<TContext>
233
- ): Promise<GenerateMessageOutput<TStructured>> {
234
- return this.generateWithBackup<TContext, TStructured>(input);
235
- }
236
-
237
- async *generateMessageStream<
238
- TContext = unknown,
239
- TStructured = AgentStructuredResponse,
240
- >(
241
- input: GenerateMessageInput<TContext>
242
- ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
243
- yield* this.generateStreamWithBackup<TContext, TStructured>(input);
244
- }
245
-
246
- private async generateWithBackup<
247
- TContext = unknown,
248
- TStructured = AgentStructuredResponse,
249
- >(
250
- input: GenerateMessageInput<TContext>
251
- ): Promise<GenerateMessageOutput<TStructured>> {
252
- try {
253
- return await this.generateWithModel<TContext, TStructured>(
254
- this.primaryModel,
255
- input
256
- );
257
- } catch (primaryError: unknown) {
258
- const primaryErrMsg = getErrorMessage(primaryError);
259
- logger.warn(
260
- `[DEEPSEEK] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
261
- );
262
-
263
- if (!shouldUseBackupModel(primaryError)) {
264
- throw primaryError;
265
- }
266
-
267
- logger.debug(`[DEEPSEEK] Trying backup models`);
268
-
269
- let lastBackupError: unknown = primaryError;
270
-
271
- for (let i = 0; i < this.backupModels.length; i++) {
272
- const backupModel = this.backupModels[i];
273
- logger.debug(
274
- `[DEEPSEEK] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`
275
- );
276
-
277
- try {
278
- const result = await this.generateWithModel(backupModel, input);
279
- logger.debug(`[DEEPSEEK] Backup model ${backupModel} succeeded`);
280
- return result as GenerateMessageOutput<TStructured>;
281
- } catch (backupError: unknown) {
282
- const backupErrMsg = getErrorMessage(backupError);
283
- logger.warn(
284
- `[DEEPSEEK] Backup model ${backupModel} failed: ${backupErrMsg}`
285
- );
286
- lastBackupError = backupError;
287
-
288
- if (
289
- !shouldUseBackupModel(backupError) &&
290
- i < this.backupModels.length - 1
291
- ) {
292
- logger.debug(
293
- `[DEEPSEEK] Backup model error doesn't qualify for further attempts`
294
- );
295
- break;
296
- }
297
- }
298
- }
299
-
300
- const lastBackupErrMsg = getErrorMessage(lastBackupError);
301
- logger.error(
302
- `[DEEPSEEK] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
303
- );
304
- throw lastBackupError;
305
- }
306
- }
307
-
308
- private async generateWithModel<
309
- TContext = unknown,
310
- TStructured = AgentStructuredResponse,
311
- >(
312
- model: string,
313
- input: GenerateMessageInput<TContext>
314
- ): Promise<GenerateMessageOutput<TStructured>> {
315
- const operation = async (): Promise<GenerateMessageOutput> => {
316
- const historyMessages = this.buildMessages(input.history);
317
- historyMessages.push({ role: "user", content: input.prompt });
318
-
319
- const params: ChatCompletionCreateParamsNonStreaming = {
320
- model,
321
- messages:
322
- historyMessages as ChatCompletionCreateParamsNonStreaming["messages"],
323
- ...this.config,
324
- };
325
-
326
- // Override with input parameters if provided
327
- if (input.parameters?.maxOutputTokens !== undefined) {
328
- params.max_tokens = input.parameters.maxOutputTokens;
329
- }
330
-
331
- // Add tools if provided
332
- if (input.tools && input.tools.length > 0) {
333
- params.tools = input.tools.map((tool) => ({
334
- type: "function" as const,
335
- function: {
336
- name: tool.name || tool.id,
337
- description: tool.description,
338
- parameters: tool.parameters as FunctionParameters,
339
- },
340
- }));
341
- params.tool_choice = "auto";
342
- }
343
-
344
- // Use structured output if JSON schema is provided
345
- if (input.parameters?.jsonSchema) {
346
- params.response_format = {
347
- type: "json_schema" as const,
348
- json_schema: {
349
- name: input.parameters.schemaName || "structured_output",
350
- schema: this.adaptSchema(input.parameters.jsonSchema),
351
- },
352
- } as ChatCompletionCreateParamsNonStreaming["response_format"];
353
- }
354
-
355
- const response = await this.client.chat.completions.create(params);
356
-
357
- const message = response.choices[0]?.message?.content || "";
358
-
359
- let toolCalls: Array<{
360
- toolName: string;
361
- arguments: Record<string, unknown>;
362
- }> = [];
363
- if (response.choices?.[0]?.message?.tool_calls) {
364
- toolCalls = response.choices[0].message.tool_calls
365
- .filter((toolCall) => toolCall.type === "function")
366
- .map((toolCall) => {
367
- let toolCallArguments: Record<string, unknown> = {};
368
- try {
369
- toolCallArguments = JSON.parse(
370
- toolCall.function.arguments
371
- ) as Record<string, unknown>;
372
- } catch (error) {
373
- logger.warn(
374
- `[DEEPSEEK] Failed to parse tool call arguments: ${getErrorMessage(error)}`
375
- );
376
- toolCallArguments = {};
377
- }
378
- return {
379
- toolName: toolCall.function.name,
380
- arguments: toolCallArguments,
381
- };
382
- });
383
- }
384
-
385
- // Only throw error if we have no text AND no function calls
386
- if (!message && toolCalls.length === 0) {
387
- throw new Error("No response from DeepSeek");
388
- }
389
-
390
- // Parse structured output if schema was provided
391
- let structured: AgentStructuredResponse | undefined;
392
- if (input.parameters?.jsonSchema && message) {
393
- try {
394
- structured = JSON.parse(message) as AgentStructuredResponse;
395
- } catch (error) {
396
- logger.warn("[DEEPSEEK] Failed to parse JSON response:", error);
397
- }
398
- }
399
-
400
- // If tools were used, include them in structured response
401
- if (toolCalls.length > 0) {
402
- structured = {
403
- ...(structured || {}),
404
- message: structured?.message || message,
405
- toolCalls,
406
- } as AgentStructuredResponse;
407
- }
408
-
409
- return {
410
- message,
411
- metadata: {
412
- model: response.model,
413
- finishReason: response.choices[0]?.finish_reason,
414
- tokensUsed: response.usage?.total_tokens,
415
- promptTokens: response.usage?.prompt_tokens,
416
- completionTokens: response.usage?.completion_tokens,
417
- },
418
- structured,
419
- };
118
+ protected override structuredResponseFormat(
119
+ jsonSchema: StructuredSchema,
120
+ schemaName: string | undefined
121
+ ): ChatCompletionCreateParamsNonStreaming["response_format"] {
122
+ return {
123
+ type: "json_schema" as const,
124
+ json_schema: {
125
+ name: schemaName || "structured_output",
126
+ schema: this.adaptSchema(jsonSchema),
127
+ },
420
128
  };
421
-
422
- return withTimeoutAndRetry(
423
- operation,
424
- this.retryConfig.timeout,
425
- this.retryConfig.retries,
426
- `DeepSeek ${model}`
427
- ) as Promise<GenerateMessageOutput<TStructured>>;
428
129
  }
429
130
 
430
- private async *generateStreamWithBackup<
431
- TContext = unknown,
432
- TStructured = AgentStructuredResponse,
433
- >(
434
- input: GenerateMessageInput<TContext>
435
- ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
436
- try {
437
- yield* this.generateStreamWithModel<TContext, TStructured>(
438
- this.primaryModel,
439
- input
440
- );
441
- } catch (primaryError: unknown) {
442
- const primaryErrMsg = getErrorMessage(primaryError);
443
- logger.warn(
444
- `[DEEPSEEK] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
445
- );
446
-
447
- if (!shouldUseBackupModel(primaryError)) {
448
- throw primaryError;
449
- }
450
-
451
- logger.debug(`[DEEPSEEK] Trying backup models for streaming`);
452
-
453
- let lastBackupError: unknown = primaryError;
454
-
455
- for (let i = 0; i < this.backupModels.length; i++) {
456
- const backupModel = this.backupModels[i];
457
- logger.debug(
458
- `[DEEPSEEK] Trying backup model ${i + 1}/${this.backupModels.length}: ${backupModel}`
459
- );
460
-
461
- try {
462
- yield* this.generateStreamWithModel<TContext, TStructured>(
463
- backupModel,
464
- input
465
- );
466
- logger.debug(`[DEEPSEEK] Backup model ${backupModel} succeeded`);
467
- return;
468
- } catch (backupError: unknown) {
469
- const backupErrMsg = getErrorMessage(backupError);
470
- logger.warn(
471
- `[DEEPSEEK] Backup model ${backupModel} failed: ${backupErrMsg}`
472
- );
473
- lastBackupError = backupError;
474
-
475
- if (
476
- !shouldUseBackupModel(backupError) &&
477
- i < this.backupModels.length - 1
478
- ) {
479
- logger.debug(
480
- `[DEEPSEEK] Backup model error doesn't qualify for further attempts`
481
- );
482
- break;
483
- }
484
- }
485
- }
486
-
487
- const lastBackupErrMsg = getErrorMessage(lastBackupError);
488
- logger.error(
489
- `[DEEPSEEK] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
490
- );
491
- throw lastBackupError;
492
- }
131
+ /**
132
+ * DeepSeek reports usage in streaming chunks when explicitly requested.
133
+ */
134
+ protected override configureStreamParams(
135
+ params: ChatCompletionCreateParamsStreaming
136
+ ): void {
137
+ params.stream_options = { include_usage: true };
493
138
  }
494
139
 
495
- private async *generateStreamWithModel<
496
- TContext = unknown,
497
- TStructured = AgentStructuredResponse,
498
- >(
499
- model: string,
500
- input: GenerateMessageInput<TContext>
501
- ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
502
- const historyMessages = this.buildMessages(input.history);
503
- historyMessages.push({ role: "user" as const, content: input.prompt });
504
-
505
- const params = {
506
- ...this.config,
507
- model,
508
- messages:
509
- historyMessages as ChatCompletionCreateParamsNonStreaming["messages"],
510
- stream: true as const,
511
- stream_options: { include_usage: true },
512
- };
513
-
514
- // Override with input parameters if provided
515
- if (input.parameters?.maxOutputTokens !== undefined) {
516
- params.max_tokens = input.parameters.maxOutputTokens;
517
- }
518
-
519
- // Add tools if provided
520
- if (input.tools && input.tools.length > 0) {
521
- params.tools = input.tools.map((tool) => ({
522
- type: "function" as const,
523
- function: {
524
- name: tool.name || tool.id,
525
- description: tool.description,
526
- parameters: tool.parameters as FunctionParameters,
527
- },
528
- }));
529
- params.tool_choice = "auto";
530
- }
531
-
532
- // Request JSON schema output if schema is provided
533
- if (input.parameters?.jsonSchema) {
534
- params.response_format = {
535
- type: "json_schema" as const,
536
- json_schema: {
537
- name: input.parameters.schemaName || "structured_output",
538
- schema: this.adaptSchema(input.parameters.jsonSchema),
539
- },
540
- } as ChatCompletionCreateParamsNonStreaming["response_format"];
541
- }
542
-
543
- const stream = await this.client.chat.completions.create(params);
544
-
545
- let accumulated = "";
546
- let currentModel = model;
547
- let finishReason: string | undefined;
548
- let promptTokens: number | undefined;
549
- let completionTokens: number | undefined;
550
- let totalTokens: number | undefined;
551
- const toolCalls: Array<{
552
- toolName: string;
553
- arguments: Record<string, unknown>;
554
- }> = [];
555
-
556
- for await (const chunk of stream) {
557
- currentModel = chunk.model;
558
- const choice = chunk.choices?.[0];
559
-
560
- // DeepSeek may include usage in chunks with include_usage
561
- if (chunk.usage) {
562
- promptTokens = chunk.usage.prompt_tokens;
563
- completionTokens = chunk.usage.completion_tokens;
564
- totalTokens = chunk.usage.total_tokens;
565
- }
566
-
567
- if (!choice) continue;
568
-
569
- const delta = choice.delta as Record<string, unknown>;
570
-
571
- // Extract tool calls from delta
572
- const deltaToolCalls = delta?.tool_calls as
573
- | Array<{
574
- index: number;
575
- id?: string;
576
- function?: { name?: string; arguments?: string };
577
- }>
578
- | undefined;
579
-
580
- if (deltaToolCalls) {
581
- for (const toolCall of deltaToolCalls) {
582
- if (toolCall.function) {
583
- let toolCallArguments: Record<string, unknown> = {};
584
- try {
585
- toolCallArguments = toolCall.function.arguments
586
- ? (JSON.parse(toolCall.function.arguments) as Record<
587
- string,
588
- unknown
589
- >)
590
- : {};
591
- } catch (error) {
592
- logger.warn(
593
- `[DEEPSEEK] Failed to parse tool call arguments in stream: ${getErrorMessage(error)}`
594
- );
595
- toolCallArguments = {};
596
- }
597
- toolCalls.push({
598
- toolName: toolCall.function.name || "",
599
- arguments: toolCallArguments,
600
- });
601
- }
602
- }
603
- }
604
-
605
- // DeepSeek streams reasoning via `reasoning_content` on the delta
606
- const reasoning =
607
- (delta?.reasoning_content as string | undefined) ?? undefined;
608
- if (reasoning) {
609
- logger.debug(`[DEEPSEEK] Reasoning: ${reasoning}`);
610
- }
611
-
612
- const content = (delta?.content as string | undefined) ?? "";
613
- if (content) {
614
- accumulated += content;
615
- yield {
616
- delta: content,
617
- accumulated,
618
- done: false,
619
- };
620
- }
621
-
622
- if (choice.finish_reason) {
623
- finishReason = choice.finish_reason;
624
- }
625
- }
626
-
627
- // Parse JSON response if schema was provided
628
- let structured: TStructured | undefined;
629
- if (input.parameters?.jsonSchema && accumulated) {
630
- try {
631
- structured = JSON.parse(accumulated) as TStructured;
632
- } catch (error) {
633
- logger.warn(
634
- "[DEEPSEEK] Failed to parse JSON response in stream:",
635
- error
636
- );
637
- }
638
- }
639
-
640
- // Include tool calls in structured response
641
- if (toolCalls.length > 0) {
642
- structured = {
643
- ...(structured || {}),
644
- message:
645
- (structured as AgentStructuredResponse | undefined)?.message ||
646
- accumulated,
647
- toolCalls,
648
- } as TStructured;
140
+ /**
141
+ * DeepSeek streams reasoning via `reasoning_content` on the delta.
142
+ */
143
+ protected override onStreamDelta(
144
+ delta: ChatCompletionChunk.Choice.Delta
145
+ ): void {
146
+ const reasoning =
147
+ ((delta as Record<string, unknown>).reasoning_content as
148
+ | string
149
+ | undefined) ?? undefined;
150
+ if (reasoning) {
151
+ logger.debug(`[${this.logLabel}] Reasoning: ${reasoning}`);
649
152
  }
650
-
651
- // Yield final chunk
652
- yield {
653
- delta: "",
654
- accumulated,
655
- done: true,
656
- metadata: {
657
- model: currentModel,
658
- finishReason,
659
- tokensUsed: totalTokens,
660
- promptTokens,
661
- completionTokens,
662
- },
663
- structured,
664
- };
665
153
  }
666
154
  }