kagent-ts 0.1.3 → 0.1.5

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 (349) hide show
  1. package/LICENSE +68 -21
  2. package/README.md +27 -371
  3. package/dist/compression/progressive-compressor.d.ts +66 -0
  4. package/dist/compression/progressive-compressor.d.ts.map +1 -0
  5. package/dist/compression/progressive-compressor.js +367 -0
  6. package/dist/compression/progressive-compressor.js.map +1 -0
  7. package/dist/compression/types.d.ts +1 -5
  8. package/dist/compression/types.d.ts.map +1 -1
  9. package/dist/context/context-manager.d.ts +34 -15
  10. package/dist/context/context-manager.d.ts.map +1 -1
  11. package/dist/context/context-manager.js +78 -28
  12. package/dist/context/context-manager.js.map +1 -1
  13. package/dist/context/types.d.ts +20 -4
  14. package/dist/context/types.d.ts.map +1 -1
  15. package/dist/core/agent.d.ts +407 -35
  16. package/dist/core/agent.d.ts.map +1 -1
  17. package/dist/core/agent.js +685 -70
  18. package/dist/core/agent.js.map +1 -1
  19. package/dist/core/fusion-agent.d.ts +207 -0
  20. package/dist/core/fusion-agent.d.ts.map +1 -0
  21. package/dist/core/fusion-agent.js +769 -0
  22. package/dist/core/fusion-agent.js.map +1 -0
  23. package/dist/core/hooks.d.ts +19 -7
  24. package/dist/core/hooks.d.ts.map +1 -1
  25. package/dist/core/plan-solve-agent.d.ts +1 -15
  26. package/dist/core/plan-solve-agent.d.ts.map +1 -1
  27. package/dist/core/plan-solve-agent.js +144 -117
  28. package/dist/core/plan-solve-agent.js.map +1 -1
  29. package/dist/core/react-agent.d.ts +0 -13
  30. package/dist/core/react-agent.d.ts.map +1 -1
  31. package/dist/core/react-agent.js +128 -101
  32. package/dist/core/react-agent.js.map +1 -1
  33. package/dist/core/response-schema.d.ts +65 -0
  34. package/dist/core/response-schema.d.ts.map +1 -1
  35. package/dist/core/response-schema.js +174 -1
  36. package/dist/core/response-schema.js.map +1 -1
  37. package/dist/core/system-prompts.d.ts +27 -0
  38. package/dist/core/system-prompts.d.ts.map +1 -0
  39. package/dist/core/system-prompts.js +112 -0
  40. package/dist/core/system-prompts.js.map +1 -0
  41. package/dist/eval/benchmark.d.ts +81 -0
  42. package/dist/eval/benchmark.d.ts.map +1 -0
  43. package/dist/eval/benchmark.js +292 -0
  44. package/dist/eval/benchmark.js.map +1 -0
  45. package/dist/eval/eval-runner.d.ts +79 -0
  46. package/dist/eval/eval-runner.d.ts.map +1 -0
  47. package/dist/eval/eval-runner.js +252 -0
  48. package/dist/eval/eval-runner.js.map +1 -0
  49. package/dist/eval/index.d.ts +7 -0
  50. package/dist/eval/index.d.ts.map +1 -0
  51. package/dist/eval/index.js +13 -0
  52. package/dist/eval/index.js.map +1 -0
  53. package/dist/eval/tool-call-evaluator.d.ts +72 -0
  54. package/dist/eval/tool-call-evaluator.d.ts.map +1 -0
  55. package/dist/eval/tool-call-evaluator.js +265 -0
  56. package/dist/eval/tool-call-evaluator.js.map +1 -0
  57. package/dist/eval/types.d.ts +219 -0
  58. package/dist/eval/types.d.ts.map +1 -0
  59. package/dist/eval/types.js +3 -0
  60. package/dist/eval/types.js.map +1 -0
  61. package/dist/index.d.ts +61 -14
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +121 -8
  64. package/dist/index.js.map +1 -1
  65. package/dist/llm/anthropic-provider.d.ts +141 -0
  66. package/dist/llm/anthropic-provider.d.ts.map +1 -0
  67. package/dist/llm/anthropic-provider.js +486 -0
  68. package/dist/llm/anthropic-provider.js.map +1 -0
  69. package/dist/llm/errors.d.ts +26 -0
  70. package/dist/llm/errors.d.ts.map +1 -0
  71. package/dist/llm/errors.js +19 -0
  72. package/dist/llm/errors.js.map +1 -0
  73. package/dist/llm/factory.d.ts +73 -0
  74. package/dist/llm/factory.d.ts.map +1 -0
  75. package/dist/llm/factory.js +77 -0
  76. package/dist/llm/factory.js.map +1 -0
  77. package/dist/llm/fallback-provider.d.ts +47 -0
  78. package/dist/llm/fallback-provider.d.ts.map +1 -0
  79. package/dist/llm/fallback-provider.js +91 -0
  80. package/dist/llm/fallback-provider.js.map +1 -0
  81. package/dist/llm/interface.d.ts +54 -11
  82. package/dist/llm/interface.d.ts.map +1 -1
  83. package/dist/llm/interface.js +34 -0
  84. package/dist/llm/interface.js.map +1 -1
  85. package/dist/llm/model-router.d.ts +126 -0
  86. package/dist/llm/model-router.d.ts.map +1 -0
  87. package/dist/llm/model-router.js +178 -0
  88. package/dist/llm/model-router.js.map +1 -0
  89. package/dist/llm/openai-provider.d.ts +8 -32
  90. package/dist/llm/openai-provider.d.ts.map +1 -1
  91. package/dist/llm/openai-provider.js +27 -60
  92. package/dist/llm/openai-provider.js.map +1 -1
  93. package/dist/llm/rate-limiter.d.ts +41 -0
  94. package/dist/llm/rate-limiter.d.ts.map +1 -0
  95. package/dist/llm/rate-limiter.js +93 -0
  96. package/dist/llm/rate-limiter.js.map +1 -0
  97. package/dist/llm/retry.d.ts +26 -0
  98. package/dist/llm/retry.d.ts.map +1 -0
  99. package/dist/llm/retry.js +44 -0
  100. package/dist/llm/retry.js.map +1 -0
  101. package/dist/llm/token-budget.d.ts +97 -0
  102. package/dist/llm/token-budget.d.ts.map +1 -0
  103. package/dist/llm/token-budget.js +115 -0
  104. package/dist/llm/token-budget.js.map +1 -0
  105. package/dist/logging/index.d.ts +2 -0
  106. package/dist/logging/index.d.ts.map +1 -0
  107. package/dist/logging/index.js +7 -0
  108. package/dist/logging/index.js.map +1 -0
  109. package/dist/logging/logger.d.ts +38 -0
  110. package/dist/logging/logger.d.ts.map +1 -0
  111. package/dist/logging/logger.js +34 -0
  112. package/dist/logging/logger.js.map +1 -0
  113. package/dist/mcp/index.d.ts +4 -0
  114. package/dist/mcp/index.d.ts.map +1 -0
  115. package/dist/mcp/index.js +8 -0
  116. package/dist/mcp/index.js.map +1 -0
  117. package/dist/mcp/mcp-client-manager.d.ts +72 -0
  118. package/dist/mcp/mcp-client-manager.d.ts.map +1 -0
  119. package/dist/mcp/mcp-client-manager.js +235 -0
  120. package/dist/mcp/mcp-client-manager.js.map +1 -0
  121. package/dist/mcp/mcp-types.d.ts +58 -0
  122. package/dist/mcp/mcp-types.d.ts.map +1 -0
  123. package/dist/mcp/mcp-types.js +20 -0
  124. package/dist/mcp/mcp-types.js.map +1 -0
  125. package/dist/memory/index.d.ts +3 -0
  126. package/dist/memory/index.d.ts.map +1 -0
  127. package/dist/memory/index.js +6 -0
  128. package/dist/memory/index.js.map +1 -0
  129. package/dist/memory/memory-manager.d.ts +119 -0
  130. package/dist/memory/memory-manager.d.ts.map +1 -0
  131. package/dist/memory/memory-manager.js +334 -0
  132. package/dist/memory/memory-manager.js.map +1 -0
  133. package/dist/messages/types.d.ts +2 -0
  134. package/dist/messages/types.d.ts.map +1 -1
  135. package/dist/orchestrator/index.d.ts +5 -0
  136. package/dist/orchestrator/index.d.ts.map +1 -0
  137. package/dist/orchestrator/index.js +13 -0
  138. package/dist/orchestrator/index.js.map +1 -0
  139. package/dist/orchestrator/json-extractor.d.ts +18 -0
  140. package/dist/orchestrator/json-extractor.d.ts.map +1 -0
  141. package/dist/orchestrator/json-extractor.js +111 -0
  142. package/dist/orchestrator/json-extractor.js.map +1 -0
  143. package/dist/orchestrator/orchestrator-agent.d.ts +152 -0
  144. package/dist/orchestrator/orchestrator-agent.d.ts.map +1 -0
  145. package/dist/orchestrator/orchestrator-agent.js +675 -0
  146. package/dist/orchestrator/orchestrator-agent.js.map +1 -0
  147. package/dist/orchestrator/orchestrator-response.d.ts +40 -0
  148. package/dist/orchestrator/orchestrator-response.d.ts.map +1 -0
  149. package/dist/orchestrator/orchestrator-response.js +275 -0
  150. package/dist/orchestrator/orchestrator-response.js.map +1 -0
  151. package/dist/orchestrator/orchestrator-types.d.ts +116 -0
  152. package/dist/orchestrator/orchestrator-types.d.ts.map +1 -0
  153. package/dist/orchestrator/orchestrator-types.js +3 -0
  154. package/dist/orchestrator/orchestrator-types.js.map +1 -0
  155. package/dist/preferences/preference-manager.d.ts +8 -3
  156. package/dist/preferences/preference-manager.d.ts.map +1 -1
  157. package/dist/preferences/preference-manager.js +17 -4
  158. package/dist/preferences/preference-manager.js.map +1 -1
  159. package/dist/rag/chroma-store.d.ts +52 -0
  160. package/dist/rag/chroma-store.d.ts.map +1 -0
  161. package/dist/rag/chroma-store.js +110 -0
  162. package/dist/rag/chroma-store.js.map +1 -0
  163. package/dist/rag/document-loader.d.ts +21 -0
  164. package/dist/rag/document-loader.d.ts.map +1 -0
  165. package/dist/rag/document-loader.js +129 -0
  166. package/dist/rag/document-loader.js.map +1 -0
  167. package/dist/rag/embedding-provider.d.ts +36 -0
  168. package/dist/rag/embedding-provider.d.ts.map +1 -0
  169. package/dist/rag/embedding-provider.js +74 -0
  170. package/dist/rag/embedding-provider.js.map +1 -0
  171. package/dist/rag/index.d.ts +17 -0
  172. package/dist/rag/index.d.ts.map +1 -0
  173. package/dist/rag/index.js +27 -0
  174. package/dist/rag/index.js.map +1 -0
  175. package/dist/rag/keyword-index.d.ts +53 -0
  176. package/dist/rag/keyword-index.d.ts.map +1 -0
  177. package/dist/rag/keyword-index.js +161 -0
  178. package/dist/rag/keyword-index.js.map +1 -0
  179. package/dist/rag/llm-reranker.d.ts +36 -0
  180. package/dist/rag/llm-reranker.d.ts.map +1 -0
  181. package/dist/rag/llm-reranker.js +95 -0
  182. package/dist/rag/llm-reranker.js.map +1 -0
  183. package/dist/rag/rag-manager.d.ts +54 -0
  184. package/dist/rag/rag-manager.d.ts.map +1 -0
  185. package/dist/rag/rag-manager.js +179 -0
  186. package/dist/rag/rag-manager.js.map +1 -0
  187. package/dist/rag/rag-types.d.ts +143 -0
  188. package/dist/rag/rag-types.d.ts.map +1 -0
  189. package/dist/rag/rag-types.js +9 -0
  190. package/dist/rag/rag-types.js.map +1 -0
  191. package/dist/rag/rrf.d.ts +47 -0
  192. package/dist/rag/rrf.d.ts.map +1 -0
  193. package/dist/rag/rrf.js +70 -0
  194. package/dist/rag/rrf.js.map +1 -0
  195. package/dist/rag/search-knowledge.d.ts +24 -0
  196. package/dist/rag/search-knowledge.d.ts.map +1 -0
  197. package/dist/rag/search-knowledge.js +86 -0
  198. package/dist/rag/search-knowledge.js.map +1 -0
  199. package/dist/rag/text-splitter.d.ts +25 -0
  200. package/dist/rag/text-splitter.d.ts.map +1 -0
  201. package/dist/rag/text-splitter.js +136 -0
  202. package/dist/rag/text-splitter.js.map +1 -0
  203. package/dist/rag/vector-store.d.ts +34 -0
  204. package/dist/rag/vector-store.d.ts.map +1 -0
  205. package/dist/rag/vector-store.js +73 -0
  206. package/dist/rag/vector-store.js.map +1 -0
  207. package/dist/reflection/error-notebook.d.ts +125 -0
  208. package/dist/reflection/error-notebook.d.ts.map +1 -0
  209. package/dist/reflection/error-notebook.js +368 -0
  210. package/dist/reflection/error-notebook.js.map +1 -0
  211. package/dist/reflection/index.d.ts +8 -0
  212. package/dist/reflection/index.d.ts.map +1 -0
  213. package/dist/reflection/index.js +12 -0
  214. package/dist/reflection/index.js.map +1 -0
  215. package/dist/reflection/memory-reflector.d.ts +97 -0
  216. package/dist/reflection/memory-reflector.d.ts.map +1 -0
  217. package/dist/reflection/memory-reflector.js +215 -0
  218. package/dist/reflection/memory-reflector.js.map +1 -0
  219. package/dist/reflection/reflection-agent.d.ts +105 -0
  220. package/dist/reflection/reflection-agent.d.ts.map +1 -0
  221. package/dist/reflection/reflection-agent.js +234 -0
  222. package/dist/reflection/reflection-agent.js.map +1 -0
  223. package/dist/reflection/reflection-hook.d.ts +50 -0
  224. package/dist/reflection/reflection-hook.d.ts.map +1 -0
  225. package/dist/reflection/reflection-hook.js +108 -0
  226. package/dist/reflection/reflection-hook.js.map +1 -0
  227. package/dist/rules/project-rules.d.ts +47 -0
  228. package/dist/rules/project-rules.d.ts.map +1 -0
  229. package/dist/rules/project-rules.js +166 -0
  230. package/dist/rules/project-rules.js.map +1 -0
  231. package/dist/security/boundaries.d.ts +81 -0
  232. package/dist/security/boundaries.d.ts.map +1 -0
  233. package/dist/security/boundaries.js +158 -0
  234. package/dist/security/boundaries.js.map +1 -0
  235. package/dist/security/index.d.ts +2 -0
  236. package/dist/security/index.d.ts.map +1 -0
  237. package/dist/security/index.js +11 -0
  238. package/dist/security/index.js.map +1 -0
  239. package/dist/session/session-types.d.ts +25 -4
  240. package/dist/session/session-types.d.ts.map +1 -1
  241. package/dist/skills/file-skill-loader.d.ts +9 -20
  242. package/dist/skills/file-skill-loader.d.ts.map +1 -1
  243. package/dist/skills/file-skill-loader.js +35 -164
  244. package/dist/skills/file-skill-loader.js.map +1 -1
  245. package/dist/skills/index.d.ts +1 -1
  246. package/dist/skills/index.d.ts.map +1 -1
  247. package/dist/skills/index.js +1 -2
  248. package/dist/skills/index.js.map +1 -1
  249. package/dist/skills/skill-manager.d.ts +22 -29
  250. package/dist/skills/skill-manager.d.ts.map +1 -1
  251. package/dist/skills/skill-manager.js +63 -85
  252. package/dist/skills/skill-manager.js.map +1 -1
  253. package/dist/skills/types.d.ts +4 -16
  254. package/dist/skills/types.d.ts.map +1 -1
  255. package/dist/subagent/index.d.ts +4 -0
  256. package/dist/subagent/index.d.ts.map +1 -0
  257. package/dist/subagent/index.js +8 -0
  258. package/dist/subagent/index.js.map +1 -0
  259. package/dist/subagent/subagent-loader.d.ts +53 -0
  260. package/dist/subagent/subagent-loader.d.ts.map +1 -0
  261. package/dist/subagent/subagent-loader.js +155 -0
  262. package/dist/subagent/subagent-loader.js.map +1 -0
  263. package/dist/subagent/subagent-manager.d.ts +161 -0
  264. package/dist/subagent/subagent-manager.d.ts.map +1 -0
  265. package/dist/subagent/subagent-manager.js +468 -0
  266. package/dist/subagent/subagent-manager.js.map +1 -0
  267. package/dist/subagent/subagent-types.d.ts +77 -0
  268. package/dist/subagent/subagent-types.d.ts.map +1 -0
  269. package/dist/subagent/subagent-types.js +3 -0
  270. package/dist/subagent/subagent-types.js.map +1 -0
  271. package/dist/tools/builtin/bash.d.ts +3 -0
  272. package/dist/tools/builtin/bash.d.ts.map +1 -0
  273. package/dist/tools/builtin/bash.js +87 -0
  274. package/dist/tools/builtin/bash.js.map +1 -0
  275. package/dist/tools/builtin/edit-file.d.ts.map +1 -1
  276. package/dist/tools/builtin/edit-file.js +1 -0
  277. package/dist/tools/builtin/edit-file.js.map +1 -1
  278. package/dist/tools/builtin/index.d.ts +14 -0
  279. package/dist/tools/builtin/index.d.ts.map +1 -1
  280. package/dist/tools/builtin/index.js +45 -1
  281. package/dist/tools/builtin/index.js.map +1 -1
  282. package/dist/tools/builtin/list-errors.d.ts +7 -0
  283. package/dist/tools/builtin/list-errors.d.ts.map +1 -0
  284. package/dist/tools/builtin/list-errors.js +64 -0
  285. package/dist/tools/builtin/list-errors.js.map +1 -0
  286. package/dist/tools/builtin/list-subagents.d.ts +7 -0
  287. package/dist/tools/builtin/list-subagents.d.ts.map +1 -0
  288. package/dist/tools/builtin/list-subagents.js +21 -0
  289. package/dist/tools/builtin/list-subagents.js.map +1 -0
  290. package/dist/tools/builtin/recall.d.ts +11 -0
  291. package/dist/tools/builtin/recall.d.ts.map +1 -0
  292. package/dist/tools/builtin/recall.js +60 -0
  293. package/dist/tools/builtin/recall.js.map +1 -0
  294. package/dist/tools/builtin/remember.d.ts +12 -0
  295. package/dist/tools/builtin/remember.d.ts.map +1 -0
  296. package/dist/tools/builtin/remember.js +72 -0
  297. package/dist/tools/builtin/remember.js.map +1 -0
  298. package/dist/tools/builtin/skill.d.ts +14 -0
  299. package/dist/tools/builtin/skill.d.ts.map +1 -0
  300. package/dist/tools/builtin/skill.js +71 -0
  301. package/dist/tools/builtin/skill.js.map +1 -0
  302. package/dist/tools/builtin/spawn-subagent.d.ts +7 -0
  303. package/dist/tools/builtin/spawn-subagent.d.ts.map +1 -0
  304. package/dist/tools/builtin/spawn-subagent.js +43 -0
  305. package/dist/tools/builtin/spawn-subagent.js.map +1 -0
  306. package/dist/tools/builtin/web-fetch.d.ts +3 -0
  307. package/dist/tools/builtin/web-fetch.d.ts.map +1 -0
  308. package/dist/tools/builtin/web-fetch.js +101 -0
  309. package/dist/tools/builtin/web-fetch.js.map +1 -0
  310. package/dist/tools/builtin/write-file.d.ts.map +1 -1
  311. package/dist/tools/builtin/write-file.js +1 -0
  312. package/dist/tools/builtin/write-file.js.map +1 -1
  313. package/dist/tools/circuit-breaker.d.ts +19 -10
  314. package/dist/tools/circuit-breaker.d.ts.map +1 -1
  315. package/dist/tools/circuit-breaker.js +22 -11
  316. package/dist/tools/circuit-breaker.js.map +1 -1
  317. package/dist/tools/error-tracker.d.ts +28 -44
  318. package/dist/tools/error-tracker.d.ts.map +1 -1
  319. package/dist/tools/error-tracker.js +39 -156
  320. package/dist/tools/error-tracker.js.map +1 -1
  321. package/dist/tools/tool-filter.d.ts +70 -0
  322. package/dist/tools/tool-filter.d.ts.map +1 -0
  323. package/dist/tools/tool-filter.js +92 -0
  324. package/dist/tools/tool-filter.js.map +1 -0
  325. package/dist/tools/tool-output-truncator.d.ts +36 -0
  326. package/dist/tools/tool-output-truncator.d.ts.map +1 -0
  327. package/dist/tools/tool-output-truncator.js +117 -0
  328. package/dist/tools/tool-output-truncator.js.map +1 -0
  329. package/dist/tools/tool-registry.d.ts +25 -9
  330. package/dist/tools/tool-registry.d.ts.map +1 -1
  331. package/dist/tools/tool-registry.js +77 -28
  332. package/dist/tools/tool-registry.js.map +1 -1
  333. package/dist/tools/tool-validator.d.ts +13 -0
  334. package/dist/tools/tool-validator.d.ts.map +1 -0
  335. package/dist/tools/tool-validator.js +116 -0
  336. package/dist/tools/tool-validator.js.map +1 -0
  337. package/dist/tools/types.d.ts +86 -3
  338. package/dist/tools/types.d.ts.map +1 -1
  339. package/dist/tools/types.js +51 -2
  340. package/dist/tools/types.js.map +1 -1
  341. package/dist/trace/trace-logger.d.ts +30 -4
  342. package/dist/trace/trace-logger.d.ts.map +1 -1
  343. package/dist/trace/trace-logger.js +83 -7
  344. package/dist/trace/trace-logger.js.map +1 -1
  345. package/package.json +14 -4
  346. package/dist/compression/sliding-window.d.ts +0 -21
  347. package/dist/compression/sliding-window.d.ts.map +0 -1
  348. package/dist/compression/sliding-window.js +0 -44
  349. package/dist/compression/sliding-window.js.map +0 -1
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLLMProvider = createLLMProvider;
4
+ const openai_provider_1 = require("./openai-provider");
5
+ const anthropic_provider_1 = require("./anthropic-provider");
6
+ // ─── Detection ───────────────────────────────────────────────────────────────
7
+ /**
8
+ * Determine which provider to use.
9
+ *
10
+ * Detection rules:
11
+ * 1. If `explicitProvider` is `"openai"` or `"anthropic"`, use that.
12
+ * 2. If `"auto"` or `undefined`, inspect `baseURL`:
13
+ * - Contains "anthropic" (case-insensitive) → Anthropic
14
+ * - Otherwise → OpenAI (default / backward compatible)
15
+ */
16
+ function detectProvider(explicitProvider, baseURL) {
17
+ if (explicitProvider === "openai")
18
+ return "openai";
19
+ if (explicitProvider === "anthropic")
20
+ return "anthropic";
21
+ // `"auto"` or `undefined`: detect from baseURL
22
+ if (baseURL && /anthropic/i.test(baseURL)) {
23
+ return "anthropic";
24
+ }
25
+ return "openai"; // default
26
+ }
27
+ // ─── Factory ─────────────────────────────────────────────────────────────────
28
+ /**
29
+ * Create an LLM provider instance, auto-detecting the backend from `baseURL`.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * // Auto-detect: baseURL contains "anthropic" → AnthropicProvider
34
+ * const llm = createLLMProvider({
35
+ * apiKey: process.env.ANTHROPIC_API_KEY!,
36
+ * model: "claude-sonnet-4-6",
37
+ * baseURL: "https://api.anthropic.com",
38
+ * });
39
+ *
40
+ * // Explicit provider selection
41
+ * const llm = createLLMProvider({
42
+ * apiKey: process.env.OPENAI_API_KEY!,
43
+ * model: "gpt-4o",
44
+ * provider: "openai",
45
+ * });
46
+ *
47
+ * // Backward-compatible: no baseURL → OpenAI
48
+ * const llm = createLLMProvider({
49
+ * apiKey: process.env.OPENAI_API_KEY!,
50
+ * model: "gpt-4o",
51
+ * });
52
+ * ```
53
+ */
54
+ function createLLMProvider(config) {
55
+ const provider = detectProvider(config.provider, config.baseURL);
56
+ if (provider === "anthropic") {
57
+ return new anthropic_provider_1.AnthropicProvider({
58
+ apiKey: config.apiKey,
59
+ model: config.model,
60
+ temperature: config.temperature,
61
+ maxTokens: config.maxTokens,
62
+ baseURL: config.baseURL,
63
+ retry: config.retry,
64
+ timeout: config.timeout,
65
+ });
66
+ }
67
+ return new openai_provider_1.OpenAIProvider({
68
+ apiKey: config.apiKey,
69
+ model: config.model,
70
+ temperature: config.temperature,
71
+ maxTokens: config.maxTokens,
72
+ baseURL: config.baseURL,
73
+ retry: config.retry,
74
+ timeout: config.timeout,
75
+ });
76
+ }
77
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/llm/factory.ts"],"names":[],"mappings":";;AA4GA,8CAwBC;AAnID,uDAAmD;AACnD,6DAAyD;AAoDzD,gFAAgF;AAEhF;;;;;;;;GAQG;AACH,SAAS,cAAc,CACrB,gBAA0C,EAC1C,OAA2B;IAE3B,IAAI,gBAAgB,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACnD,IAAI,gBAAgB,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IAEzD,+CAA+C;IAC/C,IAAI,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,OAAO,QAAQ,CAAC,CAAC,UAAU;AAC7B,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,SAAgB,iBAAiB,CAAC,MAAyB;IACzD,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAEjE,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,OAAO,IAAI,sCAAiB,CAAC;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,gCAAc,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { LLMProvider, LLMResponse, LLMStreamEvent } from "./interface";
2
+ import { MessageData } from "../messages/types";
3
+ import { Tool } from "../tools/types";
4
+ import { Logger } from "../logging/logger";
5
+ /**
6
+ * Configuration for the FallbackProvider.
7
+ */
8
+ export interface FallbackProviderConfig {
9
+ /** Primary provider (tried first). */
10
+ primary: LLMProvider;
11
+ /** Fallback providers (tried in order if the primary fails with a network error). */
12
+ fallbacks: LLMProvider[];
13
+ /** Logger instance (defaults to ConsoleLogger). */
14
+ logger?: Logger;
15
+ }
16
+ /**
17
+ * LLMProvider that automatically falls back to a backup model when the
18
+ * primary fails with a network error.
19
+ *
20
+ * Flow:
21
+ * 1. Try `primary.chat()`.
22
+ * 2. If it succeeds → return the response.
23
+ * 3. If it throws `LLMNetworkError` → log warning, try `fallbacks[0].chat()`.
24
+ * 4. Repeat until a provider succeeds or all are exhausted.
25
+ * 5. Non-network errors (auth, bad request) propagate immediately.
26
+ *
27
+ * Usage:
28
+ * ```ts
29
+ * const provider = new FallbackProvider({
30
+ * primary: new OpenAIProvider({ apiKey, model: "gpt-4o" }),
31
+ * fallbacks: [
32
+ * new AnthropicProvider({ apiKey, model: "claude-haiku-4-5-20251001" }),
33
+ * ],
34
+ * });
35
+ * const agent = new ReActAgent({ llm: provider });
36
+ * ```
37
+ */
38
+ export declare class FallbackProvider implements LLMProvider {
39
+ private providers;
40
+ private logger;
41
+ constructor(config: FallbackProviderConfig);
42
+ get model(): string;
43
+ chat(messages: MessageData[], tools?: Tool[], signal?: AbortSignal): Promise<LLMResponse>;
44
+ chatStream(messages: MessageData[], tools?: Tool[], signal?: AbortSignal): AsyncIterable<LLMStreamEvent>;
45
+ getTokenCount(text: string, model?: string): number;
46
+ }
47
+ //# sourceMappingURL=fallback-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-provider.d.ts","sourceRoot":"","sources":["../../src/llm/fallback-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAiB,MAAM,mBAAmB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,sCAAsC;IACtC,OAAO,EAAE,WAAW,CAAC;IACrB,qFAAqF;IACrF,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,sBAAsB;IAS1C,IAAI,KAAK,IAAI,MAAM,CAElB;IAEK,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAiCxF,UAAU,CACf,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,IAAI,EAAE,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,aAAa,CAAC,cAAc,CAAC;IAwBhC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;CAGpD"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FallbackProvider = void 0;
4
+ const errors_1 = require("./errors");
5
+ const logger_1 = require("../logging/logger");
6
+ /**
7
+ * LLMProvider that automatically falls back to a backup model when the
8
+ * primary fails with a network error.
9
+ *
10
+ * Flow:
11
+ * 1. Try `primary.chat()`.
12
+ * 2. If it succeeds → return the response.
13
+ * 3. If it throws `LLMNetworkError` → log warning, try `fallbacks[0].chat()`.
14
+ * 4. Repeat until a provider succeeds or all are exhausted.
15
+ * 5. Non-network errors (auth, bad request) propagate immediately.
16
+ *
17
+ * Usage:
18
+ * ```ts
19
+ * const provider = new FallbackProvider({
20
+ * primary: new OpenAIProvider({ apiKey, model: "gpt-4o" }),
21
+ * fallbacks: [
22
+ * new AnthropicProvider({ apiKey, model: "claude-haiku-4-5-20251001" }),
23
+ * ],
24
+ * });
25
+ * const agent = new ReActAgent({ llm: provider });
26
+ * ```
27
+ */
28
+ class FallbackProvider {
29
+ providers;
30
+ logger;
31
+ constructor(config) {
32
+ this.providers = [config.primary, ...config.fallbacks];
33
+ this.logger = config.logger ?? new logger_1.ConsoleLogger();
34
+ if (this.providers.length === 0) {
35
+ throw new Error("FallbackProvider: at least one provider is required.");
36
+ }
37
+ }
38
+ get model() {
39
+ return this.providers[0].model;
40
+ }
41
+ async chat(messages, tools, signal) {
42
+ let lastError;
43
+ for (let i = 0; i < this.providers.length; i++) {
44
+ const provider = this.providers[i];
45
+ try {
46
+ const response = await provider.chat(messages, tools, signal);
47
+ if (i > 0) {
48
+ this.logger.info("Fallback", `Recovered via fallback provider "${provider.model}" (attempt ${i + 1}/${this.providers.length}).`);
49
+ }
50
+ return response;
51
+ }
52
+ catch (err) {
53
+ // Non-network errors propagate immediately
54
+ if (!(err instanceof errors_1.LLMNetworkError))
55
+ throw err;
56
+ lastError = err;
57
+ this.logger.warn("Fallback", `Provider "${provider.model}" failed: ${err.message}. ` +
58
+ (i < this.providers.length - 1
59
+ ? `Trying next provider...`
60
+ : `All providers exhausted.`));
61
+ }
62
+ }
63
+ // All providers exhausted
64
+ throw lastError;
65
+ }
66
+ async *chatStream(messages, tools, signal) {
67
+ let lastError;
68
+ for (let i = 0; i < this.providers.length; i++) {
69
+ const provider = this.providers[i];
70
+ try {
71
+ const stream = provider.chatStream(messages, tools, signal);
72
+ if (i > 0) {
73
+ this.logger.info("Fallback", `Stream recovered via fallback provider "${provider.model}".`);
74
+ }
75
+ yield* stream;
76
+ return;
77
+ }
78
+ catch (err) {
79
+ if (!(err instanceof errors_1.LLMNetworkError))
80
+ throw err;
81
+ lastError = err;
82
+ }
83
+ }
84
+ throw lastError;
85
+ }
86
+ getTokenCount(text, model) {
87
+ return this.providers[0].getTokenCount(text, model);
88
+ }
89
+ }
90
+ exports.FallbackProvider = FallbackProvider;
91
+ //# sourceMappingURL=fallback-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-provider.js","sourceRoot":"","sources":["../../src/llm/fallback-provider.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,64 @@
1
1
  import { Tool } from "../tools/types";
2
- import { MessageData } from "../messages/types";
2
+ import { MessageData, ToolCall } from "../messages/types";
3
+ export type { ToolCall };
4
+ /**
5
+ * Standardised error / quality codes for LLM responses.
6
+ *
7
+ * Unlike `LLMNetworkError` (thrown when the API call itself fails),
8
+ * these codes describe issues with a successfully-received response
9
+ * that may affect agent behaviour — truncated content, missing output, etc.
10
+ */
11
+ export declare enum LLMResponseErrorCode {
12
+ /** No issues detected. */
13
+ OK = "ok",
14
+ /**
15
+ * The response was truncated because `max_tokens` was reached.
16
+ * Tool call arguments or final answer may be incomplete.
17
+ */
18
+ MAX_TOKENS = "max_tokens",
19
+ /**
20
+ * The response content is empty (no text, no tool calls).
21
+ * Typically indicates a model-side issue or extreme truncation.
22
+ */
23
+ EMPTY = "empty",
24
+ /**
25
+ * The structured JSON in the response content could not be parsed.
26
+ * This is set by the agent after attempting to parse the LLM output.
27
+ */
28
+ INVALID_JSON = "invalid_json",
29
+ /**
30
+ * A non-specific quality issue — `stop_reason` is unusual or
31
+ * the response otherwise looks degraded.
32
+ */
33
+ UNKNOWN = "unknown"
34
+ }
3
35
  /**
4
36
  * Response returned by an LLM provider after a chat call.
5
37
  */
6
38
  export interface LLMResponse {
7
39
  content: string;
8
- tool_calls?: Array<{
9
- id: string;
10
- type: "function";
11
- function: {
12
- name: string;
13
- arguments: string;
14
- };
15
- }>;
40
+ tool_calls?: ToolCall[];
16
41
  usage?: {
17
42
  prompt_tokens: number;
18
43
  completion_tokens: number;
19
44
  total_tokens: number;
20
45
  };
46
+ /**
47
+ * The reason the model stopped generating.
48
+ * Examples: "end_turn", "tool_use", "max_tokens", "stop", "length".
49
+ * Useful for detecting truncated output or tool-use signalling.
50
+ */
51
+ stop_reason?: string;
52
+ /**
53
+ * Response-level error / quality flag.
54
+ * Set by the LLM provider when the response shows signs of degradation
55
+ * (e.g., max_tokens truncation). Agents should check this before acting
56
+ * on tool calls or final answers.
57
+ */
58
+ responseError?: {
59
+ code: LLMResponseErrorCode;
60
+ message: string;
61
+ };
21
62
  }
22
63
  /**
23
64
  * A streaming chunk from the LLM, containing partial content or tool call data.
@@ -63,8 +104,9 @@ export interface LLMProvider {
63
104
  * Send a chat completion request (non-streaming).
64
105
  * @param messages The conversation messages so far.
65
106
  * @param tools Optional tool definitions for function calling.
107
+ * @param signal Optional AbortSignal for cancellation.
66
108
  */
67
- chat(messages: MessageData[], tools?: Tool[]): Promise<LLMResponse>;
109
+ chat(messages: MessageData[], tools?: Tool[], signal?: AbortSignal): Promise<LLMResponse>;
68
110
  /**
69
111
  * Send a chat completion request and yield events as they arrive.
70
112
  *
@@ -73,8 +115,9 @@ export interface LLMProvider {
73
115
  *
74
116
  * @param messages The conversation messages so far.
75
117
  * @param tools Optional tool definitions for function calling.
118
+ * @param signal Optional AbortSignal for cancellation.
76
119
  */
77
- chatStream(messages: MessageData[], tools?: Tool[]): AsyncIterable<LLMStreamEvent>;
120
+ chatStream(messages: MessageData[], tools?: Tool[], signal?: AbortSignal): AsyncIterable<LLMStreamEvent>;
78
121
  /**
79
122
  * Count tokens in a text string.
80
123
  * Uses tiktoken (by model name) when available, falling back to heuristic estimation.
@@ -1 +1 @@
1
- {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/llm/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,UAAU,CAAC;QACjB,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC,CAAC;IACH,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,6EAA6E;QAC7E,KAAK,EAAE,MAAM,CAAC;QACd,kFAAkF;QAClF,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE;YACT,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,gDAAgD;AAChD,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,aAAa,CAAC;AAE5D;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEpE;;;;;;;;OAQG;IACH,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IAEnF;;;;;;OAMG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACrD"}
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/llm/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE1D,YAAY,EAAE,QAAQ,EAAE,CAAC;AAIzB;;;;;;GAMG;AACH,oBAAY,oBAAoB;IAC9B,0BAA0B;IAC1B,EAAE,OAAO;IACT;;;OAGG;IACH,UAAU,eAAe;IACzB;;;OAGG;IACH,KAAK,UAAU;IACf;;;OAGG;IACH,YAAY,iBAAiB;IAC7B;;;OAGG;IACH,OAAO,YAAY;CACpB;AAID;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,oBAAoB,CAAC;QAC3B,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,6EAA6E;QAC7E,KAAK,EAAE,MAAM,CAAC;QACd,kFAAkF;QAClF,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE;YACT,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,gDAAgD;AAChD,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,aAAa,CAAC;AAE5D;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAE1F;;;;;;;;;OASG;IACH,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IAEzG;;;;;;OAMG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACrD"}
@@ -1,3 +1,37 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LLMResponseErrorCode = void 0;
4
+ // ─── LLM Response Error Codes ────────────────────────────────────────────────
5
+ /**
6
+ * Standardised error / quality codes for LLM responses.
7
+ *
8
+ * Unlike `LLMNetworkError` (thrown when the API call itself fails),
9
+ * these codes describe issues with a successfully-received response
10
+ * that may affect agent behaviour — truncated content, missing output, etc.
11
+ */
12
+ var LLMResponseErrorCode;
13
+ (function (LLMResponseErrorCode) {
14
+ /** No issues detected. */
15
+ LLMResponseErrorCode["OK"] = "ok";
16
+ /**
17
+ * The response was truncated because `max_tokens` was reached.
18
+ * Tool call arguments or final answer may be incomplete.
19
+ */
20
+ LLMResponseErrorCode["MAX_TOKENS"] = "max_tokens";
21
+ /**
22
+ * The response content is empty (no text, no tool calls).
23
+ * Typically indicates a model-side issue or extreme truncation.
24
+ */
25
+ LLMResponseErrorCode["EMPTY"] = "empty";
26
+ /**
27
+ * The structured JSON in the response content could not be parsed.
28
+ * This is set by the agent after attempting to parse the LLM output.
29
+ */
30
+ LLMResponseErrorCode["INVALID_JSON"] = "invalid_json";
31
+ /**
32
+ * A non-specific quality issue — `stop_reason` is unusual or
33
+ * the response otherwise looks degraded.
34
+ */
35
+ LLMResponseErrorCode["UNKNOWN"] = "unknown";
36
+ })(LLMResponseErrorCode || (exports.LLMResponseErrorCode = LLMResponseErrorCode = {}));
3
37
  //# sourceMappingURL=interface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/llm/interface.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/llm/interface.ts"],"names":[],"mappings":";;;AAKA,gFAAgF;AAEhF;;;;;;GAMG;AACH,IAAY,oBAuBX;AAvBD,WAAY,oBAAoB;IAC9B,0BAA0B;IAC1B,iCAAS,CAAA;IACT;;;OAGG;IACH,iDAAyB,CAAA;IACzB;;;OAGG;IACH,uCAAe,CAAA;IACf;;;OAGG;IACH,qDAA6B,CAAA;IAC7B;;;OAGG;IACH,2CAAmB,CAAA;AACrB,CAAC,EAvBW,oBAAoB,oCAApB,oBAAoB,QAuB/B"}
@@ -0,0 +1,126 @@
1
+ import { LLMProvider, LLMResponse, LLMStreamEvent } from "./interface";
2
+ import { MessageData } from "../messages/types";
3
+ import { Tool } from "../tools/types";
4
+ import { Logger } from "../logging/logger";
5
+ /**
6
+ * Task categories for model routing.
7
+ *
8
+ * Each category maps to a model provider. When a category has no explicit
9
+ * provider configured, it falls back to `main`.
10
+ */
11
+ export type ModelRoute = "main" | "subAgent" | "reflection" | "lightweight";
12
+ /**
13
+ * Configuration for the ModelRouter.
14
+ */
15
+ export interface ModelRouterConfig {
16
+ /** Primary model for the main reasoning loop (required). */
17
+ main: LLMProvider;
18
+ /**
19
+ * Model for sub-agents spawned by the main agent.
20
+ * Default: `main`.
21
+ */
22
+ subAgent?: LLMProvider;
23
+ /**
24
+ * Model for post-execution reflection / QA.
25
+ * Default: `main`.
26
+ * Using a different model here provides an independent review perspective.
27
+ */
28
+ reflection?: LLMProvider;
29
+ /**
30
+ * Model for lightweight tasks (memory operations, error listing, etc.).
31
+ * Default: `main`.
32
+ */
33
+ lightweight?: LLMProvider;
34
+ /**
35
+ * Shared fallback providers tried in order when the primary for
36
+ * any route fails with a network error.
37
+ *
38
+ * Each route wraps its primary + these fallbacks. Non-network errors
39
+ * (auth, bad request) propagate immediately.
40
+ *
41
+ * Default: none (network error = immediate failure).
42
+ */
43
+ fallbacks?: LLMProvider[];
44
+ /** Logger instance (defaults to ConsoleLogger). */
45
+ logger?: Logger;
46
+ }
47
+ /**
48
+ * ModelRouter — routes LLM calls to different providers based on task type.
49
+ *
50
+ * Implements `LLMProvider` so it drops in anywhere a plain provider is
51
+ * expected. The default route is `main` — call `.forSubAgent()`,
52
+ * `.forReflection()`, or `.forLightweight()` to get a task-specific
53
+ * provider handle.
54
+ *
55
+ * Each route automatically wraps its model in a fallback chain when
56
+ * `fallbacks` are configured.
57
+ *
58
+ * Usage:
59
+ * ```ts
60
+ * const router = new ModelRouter({
61
+ * main: new OpenAIProvider({ model: "gpt-4o" }),
62
+ * subAgent: new OpenAIProvider({ model: "gpt-4o-mini" }),
63
+ * reflection: new AnthropicProvider({ model: "claude-haiku-4-5-20251001" }),
64
+ * fallbacks: [new AnthropicProvider({ model: "claude-sonnet-4-6" })],
65
+ * });
66
+ *
67
+ * const agent = new ReActAgent({ llm: router, subAgentsDir: "./subagents" });
68
+ * // Main loop uses gpt-4o; sub-agents use gpt-4o-mini.
69
+ *
70
+ * // For reflection hook:
71
+ * const hook = createReflectionHook({
72
+ * llm: router.forReflection(),
73
+ * notebook: errorNotebook,
74
+ * });
75
+ * ```
76
+ */
77
+ export declare class ModelRouter implements LLMProvider {
78
+ private config;
79
+ private logger;
80
+ constructor(config: ModelRouterConfig);
81
+ /** The main model identifier. */
82
+ get model(): string;
83
+ chat(messages: MessageData[], tools?: Tool[], signal?: AbortSignal): Promise<LLMResponse>;
84
+ chatStream(messages: MessageData[], tools?: Tool[], signal?: AbortSignal): AsyncIterable<LLMStreamEvent>;
85
+ getTokenCount(text: string, model?: string): number;
86
+ /**
87
+ * Get the LLM provider for sub-agents.
88
+ *
89
+ * Delegates to `subAgent` when configured, otherwise falls back to `main`.
90
+ * Wraps the provider with any shared fallback chain.
91
+ */
92
+ forSubAgent(): LLMProvider;
93
+ /**
94
+ * Get the LLM provider for post-execution reflection / QA.
95
+ *
96
+ * Delegates to `reflection` when configured, otherwise falls back to `main`.
97
+ * Wraps the provider with any shared fallback chain.
98
+ */
99
+ forReflection(): LLMProvider;
100
+ /**
101
+ * Get the LLM provider for lightweight tasks.
102
+ *
103
+ * Delegates to `lightweight` when configured, otherwise falls back to `main`.
104
+ * Wraps the provider with any shared fallback chain.
105
+ */
106
+ forLightweight(): LLMProvider;
107
+ /**
108
+ * Resolve a route to its effective provider.
109
+ *
110
+ * Priority: route-specific provider → main.
111
+ * If fallbacks are configured, the provider is wrapped in a fallback chain.
112
+ */
113
+ private route;
114
+ /**
115
+ * Resolve the primary provider for a route.
116
+ */
117
+ private resolveRoute;
118
+ /**
119
+ * Create a lightweight inline fallback wrapper around a primary provider.
120
+ *
121
+ * This avoids importing FallbackProvider to keep the dependency graph
122
+ * clean. The inline wrapper behaves identically.
123
+ */
124
+ private createFallbackWrapper;
125
+ }
126
+ //# sourceMappingURL=model-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-router.d.ts","sourceRoot":"","sources":["../../src/llm/model-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAiB,MAAM,mBAAmB,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,IAAI,EAAE,WAAW,CAAC;IAElB;;;OAGG;IACH,QAAQ,CAAC,EAAE,WAAW,CAAC;IAEvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC;IAEzB;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAE1B,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,WAAY,YAAW,WAAW;IAC7C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,iBAAiB;IAUrC,iCAAiC;IACjC,IAAI,KAAK,IAAI,MAAM,CAElB;IAEK,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAIxF,UAAU,CACf,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,IAAI,EAAE,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,aAAa,CAAC,cAAc,CAAC;IAIhC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAMnD;;;;;OAKG;IACH,WAAW,IAAI,WAAW;IAI1B;;;;;OAKG;IACH,aAAa,IAAI,WAAW;IAI5B;;;;;OAKG;IACH,cAAc,IAAI,WAAW;IAM7B;;;;;OAKG;IACH,OAAO,CAAC,KAAK;IAYb;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;CA2E9B"}