agent-nuvira 1.14.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 (379) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +891 -0
  3. package/dist/agent-sdk/src/agent.d.ts +118 -0
  4. package/dist/agent-sdk/src/agent.d.ts.map +1 -0
  5. package/dist/agent-sdk/src/agent.js +88 -0
  6. package/dist/agent-sdk/src/agent.js.map +1 -0
  7. package/dist/agent-sdk/src/index.d.ts +33 -0
  8. package/dist/agent-sdk/src/index.d.ts.map +1 -0
  9. package/dist/agent-sdk/src/index.js +32 -0
  10. package/dist/agent-sdk/src/index.js.map +1 -0
  11. package/dist/agent-sdk/src/register.d.ts +70 -0
  12. package/dist/agent-sdk/src/register.d.ts.map +1 -0
  13. package/dist/agent-sdk/src/register.js +181 -0
  14. package/dist/agent-sdk/src/register.js.map +1 -0
  15. package/dist/agent-sdk/src/scaffold.d.ts +50 -0
  16. package/dist/agent-sdk/src/scaffold.d.ts.map +1 -0
  17. package/dist/agent-sdk/src/scaffold.js +291 -0
  18. package/dist/agent-sdk/src/scaffold.js.map +1 -0
  19. package/dist/agent-sdk/src/testing.d.ts +187 -0
  20. package/dist/agent-sdk/src/testing.d.ts.map +1 -0
  21. package/dist/agent-sdk/src/testing.js +243 -0
  22. package/dist/agent-sdk/src/testing.js.map +1 -0
  23. package/dist/agent-sdk/src/types.d.ts +202 -0
  24. package/dist/agent-sdk/src/types.d.ts.map +1 -0
  25. package/dist/agent-sdk/src/types.js +11 -0
  26. package/dist/agent-sdk/src/types.js.map +1 -0
  27. package/dist/agents/agent.d.ts +132 -0
  28. package/dist/agents/agent.d.ts.map +1 -0
  29. package/dist/agents/agent.js +19 -0
  30. package/dist/agents/agent.js.map +1 -0
  31. package/dist/agents/agents/context-gatherer.d.ts +42 -0
  32. package/dist/agents/agents/context-gatherer.d.ts.map +1 -0
  33. package/dist/agents/agents/context-gatherer.js +366 -0
  34. package/dist/agents/agents/context-gatherer.js.map +1 -0
  35. package/dist/agents/agents/debugger.d.ts +58 -0
  36. package/dist/agents/agents/debugger.d.ts.map +1 -0
  37. package/dist/agents/agents/debugger.js +257 -0
  38. package/dist/agents/agents/debugger.js.map +1 -0
  39. package/dist/agents/agents/git-agent.d.ts +34 -0
  40. package/dist/agents/agents/git-agent.d.ts.map +1 -0
  41. package/dist/agents/agents/git-agent.js +200 -0
  42. package/dist/agents/agents/git-agent.js.map +1 -0
  43. package/dist/agents/agents/github-release-agent.d.ts +65 -0
  44. package/dist/agents/agents/github-release-agent.d.ts.map +1 -0
  45. package/dist/agents/agents/github-release-agent.js +439 -0
  46. package/dist/agents/agents/github-release-agent.js.map +1 -0
  47. package/dist/agents/agents/package-agent.d.ts +33 -0
  48. package/dist/agents/agents/package-agent.d.ts.map +1 -0
  49. package/dist/agents/agents/package-agent.js +233 -0
  50. package/dist/agents/agents/package-agent.js.map +1 -0
  51. package/dist/agents/agents/planner.d.ts +26 -0
  52. package/dist/agents/agents/planner.d.ts.map +1 -0
  53. package/dist/agents/agents/planner.js +222 -0
  54. package/dist/agents/agents/planner.js.map +1 -0
  55. package/dist/agents/agents/reviewer.d.ts +34 -0
  56. package/dist/agents/agents/reviewer.d.ts.map +1 -0
  57. package/dist/agents/agents/reviewer.js +159 -0
  58. package/dist/agents/agents/reviewer.js.map +1 -0
  59. package/dist/agents/agents/runner.d.ts +73 -0
  60. package/dist/agents/agents/runner.d.ts.map +1 -0
  61. package/dist/agents/agents/runner.js +299 -0
  62. package/dist/agents/agents/runner.js.map +1 -0
  63. package/dist/agents/agents/security-agent.d.ts +33 -0
  64. package/dist/agents/agents/security-agent.d.ts.map +1 -0
  65. package/dist/agents/agents/security-agent.js +184 -0
  66. package/dist/agents/agents/security-agent.js.map +1 -0
  67. package/dist/agents/agents/tester.d.ts +96 -0
  68. package/dist/agents/agents/tester.d.ts.map +1 -0
  69. package/dist/agents/agents/tester.js +410 -0
  70. package/dist/agents/agents/tester.js.map +1 -0
  71. package/dist/agents/agents/writer.d.ts +51 -0
  72. package/dist/agents/agents/writer.d.ts.map +1 -0
  73. package/dist/agents/agents/writer.js +384 -0
  74. package/dist/agents/agents/writer.js.map +1 -0
  75. package/dist/agents/context-vault.d.ts +49 -0
  76. package/dist/agents/context-vault.d.ts.map +1 -0
  77. package/dist/agents/context-vault.js +134 -0
  78. package/dist/agents/context-vault.js.map +1 -0
  79. package/dist/agents/orchestrator.d.ts +97 -0
  80. package/dist/agents/orchestrator.d.ts.map +1 -0
  81. package/dist/agents/orchestrator.js +696 -0
  82. package/dist/agents/orchestrator.js.map +1 -0
  83. package/dist/agents/utils/file-tree.d.ts +28 -0
  84. package/dist/agents/utils/file-tree.d.ts.map +1 -0
  85. package/dist/agents/utils/file-tree.js +93 -0
  86. package/dist/agents/utils/file-tree.js.map +1 -0
  87. package/dist/cli/agent.d.ts +25 -0
  88. package/dist/cli/agent.d.ts.map +1 -0
  89. package/dist/cli/agent.js +374 -0
  90. package/dist/cli/agent.js.map +1 -0
  91. package/dist/cli/benchmark.d.ts +24 -0
  92. package/dist/cli/benchmark.d.ts.map +1 -0
  93. package/dist/cli/benchmark.js +235 -0
  94. package/dist/cli/benchmark.js.map +1 -0
  95. package/dist/cli/cache.d.ts +12 -0
  96. package/dist/cli/cache.d.ts.map +1 -0
  97. package/dist/cli/cache.js +58 -0
  98. package/dist/cli/cache.js.map +1 -0
  99. package/dist/cli/chat.d.ts +37 -0
  100. package/dist/cli/chat.d.ts.map +1 -0
  101. package/dist/cli/chat.js +393 -0
  102. package/dist/cli/chat.js.map +1 -0
  103. package/dist/cli/commands.d.ts +24 -0
  104. package/dist/cli/commands.d.ts.map +1 -0
  105. package/dist/cli/commands.js +18 -0
  106. package/dist/cli/commands.js.map +1 -0
  107. package/dist/cli/config.d.ts +19 -0
  108. package/dist/cli/config.d.ts.map +1 -0
  109. package/dist/cli/config.js +162 -0
  110. package/dist/cli/config.js.map +1 -0
  111. package/dist/cli/dashboard.d.ts +34 -0
  112. package/dist/cli/dashboard.d.ts.map +1 -0
  113. package/dist/cli/dashboard.js +126 -0
  114. package/dist/cli/dashboard.js.map +1 -0
  115. package/dist/cli/doctor.d.ts +68 -0
  116. package/dist/cli/doctor.d.ts.map +1 -0
  117. package/dist/cli/doctor.js +585 -0
  118. package/dist/cli/doctor.js.map +1 -0
  119. package/dist/cli/edit.d.ts +11 -0
  120. package/dist/cli/edit.d.ts.map +1 -0
  121. package/dist/cli/edit.js +86 -0
  122. package/dist/cli/edit.js.map +1 -0
  123. package/dist/cli/execute.d.ts +25 -0
  124. package/dist/cli/execute.d.ts.map +1 -0
  125. package/dist/cli/execute.js +186 -0
  126. package/dist/cli/execute.js.map +1 -0
  127. package/dist/cli/federation.d.ts +31 -0
  128. package/dist/cli/federation.d.ts.map +1 -0
  129. package/dist/cli/federation.js +387 -0
  130. package/dist/cli/federation.js.map +1 -0
  131. package/dist/cli/history.d.ts +22 -0
  132. package/dist/cli/history.d.ts.map +1 -0
  133. package/dist/cli/history.js +140 -0
  134. package/dist/cli/history.js.map +1 -0
  135. package/dist/cli/init.d.ts +49 -0
  136. package/dist/cli/init.d.ts.map +1 -0
  137. package/dist/cli/init.js +423 -0
  138. package/dist/cli/init.js.map +1 -0
  139. package/dist/cli/learn.d.ts +31 -0
  140. package/dist/cli/learn.d.ts.map +1 -0
  141. package/dist/cli/learn.js +320 -0
  142. package/dist/cli/learn.js.map +1 -0
  143. package/dist/cli/memory.d.ts +38 -0
  144. package/dist/cli/memory.d.ts.map +1 -0
  145. package/dist/cli/memory.js +295 -0
  146. package/dist/cli/memory.js.map +1 -0
  147. package/dist/cli/model-picker.d.ts +18 -0
  148. package/dist/cli/model-picker.d.ts.map +1 -0
  149. package/dist/cli/model-picker.js +225 -0
  150. package/dist/cli/model-picker.js.map +1 -0
  151. package/dist/cli/models.d.ts +11 -0
  152. package/dist/cli/models.d.ts.map +1 -0
  153. package/dist/cli/models.js +132 -0
  154. package/dist/cli/models.js.map +1 -0
  155. package/dist/cli/plan.d.ts +11 -0
  156. package/dist/cli/plan.d.ts.map +1 -0
  157. package/dist/cli/plan.js +94 -0
  158. package/dist/cli/plan.js.map +1 -0
  159. package/dist/cli/plugins.d.ts +15 -0
  160. package/dist/cli/plugins.d.ts.map +1 -0
  161. package/dist/cli/plugins.js +123 -0
  162. package/dist/cli/plugins.js.map +1 -0
  163. package/dist/cli/router.d.ts +20 -0
  164. package/dist/cli/router.d.ts.map +1 -0
  165. package/dist/cli/router.js +142 -0
  166. package/dist/cli/router.js.map +1 -0
  167. package/dist/cli/run.d.ts +22 -0
  168. package/dist/cli/run.d.ts.map +1 -0
  169. package/dist/cli/run.js +110 -0
  170. package/dist/cli/run.js.map +1 -0
  171. package/dist/cli/sandbox.d.ts +27 -0
  172. package/dist/cli/sandbox.d.ts.map +1 -0
  173. package/dist/cli/sandbox.js +264 -0
  174. package/dist/cli/sandbox.js.map +1 -0
  175. package/dist/cli/sdk.d.ts +27 -0
  176. package/dist/cli/sdk.d.ts.map +1 -0
  177. package/dist/cli/sdk.js +204 -0
  178. package/dist/cli/sdk.js.map +1 -0
  179. package/dist/cli/stats.d.ts +18 -0
  180. package/dist/cli/stats.d.ts.map +1 -0
  181. package/dist/cli/stats.js +78 -0
  182. package/dist/cli/stats.js.map +1 -0
  183. package/dist/cli/team.d.ts +42 -0
  184. package/dist/cli/team.d.ts.map +1 -0
  185. package/dist/cli/team.js +473 -0
  186. package/dist/cli/team.js.map +1 -0
  187. package/dist/cli/workflow.d.ts +27 -0
  188. package/dist/cli/workflow.d.ts.map +1 -0
  189. package/dist/cli/workflow.js +347 -0
  190. package/dist/cli/workflow.js.map +1 -0
  191. package/dist/config/manager.d.ts +37 -0
  192. package/dist/config/manager.d.ts.map +1 -0
  193. package/dist/config/manager.js +147 -0
  194. package/dist/config/manager.js.map +1 -0
  195. package/dist/config/types.d.ts +53 -0
  196. package/dist/config/types.d.ts.map +1 -0
  197. package/dist/config/types.js +2 -0
  198. package/dist/config/types.js.map +1 -0
  199. package/dist/context/cache.d.ts +27 -0
  200. package/dist/context/cache.d.ts.map +1 -0
  201. package/dist/context/cache.js +116 -0
  202. package/dist/context/cache.js.map +1 -0
  203. package/dist/context/history.d.ts +87 -0
  204. package/dist/context/history.d.ts.map +1 -0
  205. package/dist/context/history.js +249 -0
  206. package/dist/context/history.js.map +1 -0
  207. package/dist/context/parser.d.ts +61 -0
  208. package/dist/context/parser.d.ts.map +1 -0
  209. package/dist/context/parser.js +194 -0
  210. package/dist/context/parser.js.map +1 -0
  211. package/dist/federation/client.d.ts +49 -0
  212. package/dist/federation/client.d.ts.map +1 -0
  213. package/dist/federation/client.js +239 -0
  214. package/dist/federation/client.js.map +1 -0
  215. package/dist/federation/protocol.d.ts +155 -0
  216. package/dist/federation/protocol.d.ts.map +1 -0
  217. package/dist/federation/protocol.js +57 -0
  218. package/dist/federation/protocol.js.map +1 -0
  219. package/dist/federation/server.d.ts +25 -0
  220. package/dist/federation/server.d.ts.map +1 -0
  221. package/dist/federation/server.js +401 -0
  222. package/dist/federation/server.js.map +1 -0
  223. package/dist/index.d.ts +67 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +93 -0
  226. package/dist/index.js.map +1 -0
  227. package/dist/inference/factory.d.ts +20 -0
  228. package/dist/inference/factory.d.ts.map +1 -0
  229. package/dist/inference/factory.js +46 -0
  230. package/dist/inference/factory.js.map +1 -0
  231. package/dist/inference/gemini-adapter.d.ts +17 -0
  232. package/dist/inference/gemini-adapter.d.ts.map +1 -0
  233. package/dist/inference/gemini-adapter.js +176 -0
  234. package/dist/inference/gemini-adapter.js.map +1 -0
  235. package/dist/inference/groq-adapter.d.ts +17 -0
  236. package/dist/inference/groq-adapter.d.ts.map +1 -0
  237. package/dist/inference/groq-adapter.js +103 -0
  238. package/dist/inference/groq-adapter.js.map +1 -0
  239. package/dist/inference/interface.d.ts +49 -0
  240. package/dist/inference/interface.d.ts.map +1 -0
  241. package/dist/inference/interface.js +2 -0
  242. package/dist/inference/interface.js.map +1 -0
  243. package/dist/inference/local-adapter.d.ts +35 -0
  244. package/dist/inference/local-adapter.d.ts.map +1 -0
  245. package/dist/inference/local-adapter.js +311 -0
  246. package/dist/inference/local-adapter.js.map +1 -0
  247. package/dist/inference/model-catalog.d.ts +53 -0
  248. package/dist/inference/model-catalog.d.ts.map +1 -0
  249. package/dist/inference/model-catalog.js +306 -0
  250. package/dist/inference/model-catalog.js.map +1 -0
  251. package/dist/inference/nim-adapter.d.ts +17 -0
  252. package/dist/inference/nim-adapter.d.ts.map +1 -0
  253. package/dist/inference/nim-adapter.js +103 -0
  254. package/dist/inference/nim-adapter.js.map +1 -0
  255. package/dist/inference/openrouter-adapter.d.ts +17 -0
  256. package/dist/inference/openrouter-adapter.d.ts.map +1 -0
  257. package/dist/inference/openrouter-adapter.js +105 -0
  258. package/dist/inference/openrouter-adapter.js.map +1 -0
  259. package/dist/inference/sse.d.ts +20 -0
  260. package/dist/inference/sse.d.ts.map +1 -0
  261. package/dist/inference/sse.js +91 -0
  262. package/dist/inference/sse.js.map +1 -0
  263. package/dist/learning/agent-stats.d.ts +109 -0
  264. package/dist/learning/agent-stats.d.ts.map +1 -0
  265. package/dist/learning/agent-stats.js +240 -0
  266. package/dist/learning/agent-stats.js.map +1 -0
  267. package/dist/learning/benchmark.d.ts +161 -0
  268. package/dist/learning/benchmark.d.ts.map +1 -0
  269. package/dist/learning/benchmark.js +589 -0
  270. package/dist/learning/benchmark.js.map +1 -0
  271. package/dist/learning/cost-tracker.d.ts +101 -0
  272. package/dist/learning/cost-tracker.d.ts.map +1 -0
  273. package/dist/learning/cost-tracker.js +224 -0
  274. package/dist/learning/cost-tracker.js.map +1 -0
  275. package/dist/learning/feedback.d.ts +88 -0
  276. package/dist/learning/feedback.d.ts.map +1 -0
  277. package/dist/learning/feedback.js +169 -0
  278. package/dist/learning/feedback.js.map +1 -0
  279. package/dist/learning/hybrid-router.d.ts +201 -0
  280. package/dist/learning/hybrid-router.d.ts.map +1 -0
  281. package/dist/learning/hybrid-router.js +450 -0
  282. package/dist/learning/hybrid-router.js.map +1 -0
  283. package/dist/learning/model-compare.d.ts +76 -0
  284. package/dist/learning/model-compare.d.ts.map +1 -0
  285. package/dist/learning/model-compare.js +252 -0
  286. package/dist/learning/model-compare.js.map +1 -0
  287. package/dist/learning/model-router.d.ts +68 -0
  288. package/dist/learning/model-router.d.ts.map +1 -0
  289. package/dist/learning/model-router.js +140 -0
  290. package/dist/learning/model-router.js.map +1 -0
  291. package/dist/learning/pattern-extractor.d.ts +99 -0
  292. package/dist/learning/pattern-extractor.d.ts.map +1 -0
  293. package/dist/learning/pattern-extractor.js +310 -0
  294. package/dist/learning/pattern-extractor.js.map +1 -0
  295. package/dist/learning/scorer.d.ts +51 -0
  296. package/dist/learning/scorer.d.ts.map +1 -0
  297. package/dist/learning/scorer.js +64 -0
  298. package/dist/learning/scorer.js.map +1 -0
  299. package/dist/learning/self-improver.d.ts +48 -0
  300. package/dist/learning/self-improver.d.ts.map +1 -0
  301. package/dist/learning/self-improver.js +161 -0
  302. package/dist/learning/self-improver.js.map +1 -0
  303. package/dist/memory/embedder.d.ts +65 -0
  304. package/dist/memory/embedder.d.ts.map +1 -0
  305. package/dist/memory/embedder.js +424 -0
  306. package/dist/memory/embedder.js.map +1 -0
  307. package/dist/memory/memory-integration.d.ts +56 -0
  308. package/dist/memory/memory-integration.d.ts.map +1 -0
  309. package/dist/memory/memory-integration.js +95 -0
  310. package/dist/memory/memory-integration.js.map +1 -0
  311. package/dist/memory/trajectory-store.d.ts +149 -0
  312. package/dist/memory/trajectory-store.d.ts.map +1 -0
  313. package/dist/memory/trajectory-store.js +476 -0
  314. package/dist/memory/trajectory-store.js.map +1 -0
  315. package/dist/memory/vector-store.d.ts +78 -0
  316. package/dist/memory/vector-store.d.ts.map +1 -0
  317. package/dist/memory/vector-store.js +186 -0
  318. package/dist/memory/vector-store.js.map +1 -0
  319. package/dist/plugins/agent-plugin.d.ts +73 -0
  320. package/dist/plugins/agent-plugin.d.ts.map +1 -0
  321. package/dist/plugins/agent-plugin.js +199 -0
  322. package/dist/plugins/agent-plugin.js.map +1 -0
  323. package/dist/plugins/registry.d.ts +61 -0
  324. package/dist/plugins/registry.d.ts.map +1 -0
  325. package/dist/plugins/registry.js +67 -0
  326. package/dist/plugins/registry.js.map +1 -0
  327. package/dist/sandbox/images.d.ts +31 -0
  328. package/dist/sandbox/images.d.ts.map +1 -0
  329. package/dist/sandbox/images.js +129 -0
  330. package/dist/sandbox/images.js.map +1 -0
  331. package/dist/sandbox/manager.d.ts +134 -0
  332. package/dist/sandbox/manager.d.ts.map +1 -0
  333. package/dist/sandbox/manager.js +470 -0
  334. package/dist/sandbox/manager.js.map +1 -0
  335. package/dist/sandbox/types.d.ts +113 -0
  336. package/dist/sandbox/types.d.ts.map +1 -0
  337. package/dist/sandbox/types.js +107 -0
  338. package/dist/sandbox/types.js.map +1 -0
  339. package/dist/security/scanner.d.ts +53 -0
  340. package/dist/security/scanner.d.ts.map +1 -0
  341. package/dist/security/scanner.js +271 -0
  342. package/dist/security/scanner.js.map +1 -0
  343. package/dist/team/config.d.ts +50 -0
  344. package/dist/team/config.d.ts.map +1 -0
  345. package/dist/team/config.js +108 -0
  346. package/dist/team/config.js.map +1 -0
  347. package/dist/team/memory.d.ts +63 -0
  348. package/dist/team/memory.d.ts.map +1 -0
  349. package/dist/team/memory.js +282 -0
  350. package/dist/team/memory.js.map +1 -0
  351. package/dist/team/review.d.ts +123 -0
  352. package/dist/team/review.d.ts.map +1 -0
  353. package/dist/team/review.js +293 -0
  354. package/dist/team/review.js.map +1 -0
  355. package/dist/utils/env.d.ts +19 -0
  356. package/dist/utils/env.d.ts.map +1 -0
  357. package/dist/utils/env.js +250 -0
  358. package/dist/utils/env.js.map +1 -0
  359. package/dist/utils/logger.d.ts +11 -0
  360. package/dist/utils/logger.d.ts.map +1 -0
  361. package/dist/utils/logger.js +45 -0
  362. package/dist/utils/logger.js.map +1 -0
  363. package/dist/web-dashboard/server.d.ts +59 -0
  364. package/dist/web-dashboard/server.d.ts.map +1 -0
  365. package/dist/web-dashboard/server.js +418 -0
  366. package/dist/web-dashboard/server.js.map +1 -0
  367. package/dist/workflow/registry.d.ts +127 -0
  368. package/dist/workflow/registry.d.ts.map +1 -0
  369. package/dist/workflow/registry.js +482 -0
  370. package/dist/workflow/registry.js.map +1 -0
  371. package/dist/workflow/templates.d.ts +93 -0
  372. package/dist/workflow/templates.d.ts.map +1 -0
  373. package/dist/workflow/templates.js +481 -0
  374. package/dist/workflow/templates.js.map +1 -0
  375. package/package.json +78 -0
  376. package/src/web-dashboard/public/assets/index-B08nDkSB.css +1 -0
  377. package/src/web-dashboard/public/assets/index-BKL8YOFD.js +135 -0
  378. package/src/web-dashboard/public/assets/index-BKL8YOFD.js.map +1 -0
  379. package/src/web-dashboard/public/index.html +13 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * ModelCompare — A/B comparison engine that connects benchmark results
3
+ * to model routing recommendations.
4
+ *
5
+ * Provides:
6
+ * - Side-by-side benchmark comparison for two models
7
+ * - Automatic best-model recommendation per agent type
8
+ * - Integration with the ModelRouter and AgentStats
9
+ * - Human-readable comparison reports
10
+ */
11
+ import type { BenchmarkRun, BenchmarkSummary } from './benchmark.js';
12
+ /** A comparison result between two models */
13
+ export interface ModelComparisonResult {
14
+ /** Model A details */
15
+ modelA: {
16
+ provider: string;
17
+ model: string;
18
+ summary: BenchmarkSummary;
19
+ };
20
+ /** Model B details */
21
+ modelB: {
22
+ provider: string;
23
+ model: string;
24
+ summary: BenchmarkSummary;
25
+ };
26
+ /** Per-metric winners */
27
+ winners: {
28
+ passRate: 'A' | 'B' | 'tie';
29
+ quality: 'A' | 'B' | 'tie';
30
+ latency: 'A' | 'B' | 'tie';
31
+ cost: 'A' | 'B' | 'tie';
32
+ };
33
+ /** Overall winner */
34
+ overallWinner: 'A' | 'B' | 'tie';
35
+ /** Recommendation string */
36
+ recommendation: string;
37
+ }
38
+ /** Recommendation for how to route agent types based on benchmark data */
39
+ export interface BenchmarkDrivenRecommendation {
40
+ /** Agent type */
41
+ agentType: string;
42
+ /** Currently recommended model */
43
+ currentModel: string;
44
+ /** Better model found via benchmark */
45
+ betterModel: string | null;
46
+ /** Quality improvement expected (null if no improvement) */
47
+ qualityImprovement: number | null;
48
+ /** Confidence level */
49
+ confidence: 'high' | 'medium' | 'low';
50
+ }
51
+ /**
52
+ * Compare two benchmark runs and determine the winner.
53
+ */
54
+ export declare function compareModelRuns(runA: BenchmarkRun, runB: BenchmarkRun): ModelComparisonResult;
55
+ /**
56
+ * Compare two benchmark runs and auto-update the ModelRouter / AgentStats
57
+ * recommendations based on the results.
58
+ */
59
+ export declare function compareAndRecommend(runA: BenchmarkRun, runB: BenchmarkRun, verbose?: boolean): Promise<{
60
+ comparison: ModelComparisonResult;
61
+ updatedRoutes: string[];
62
+ }>;
63
+ /**
64
+ * Find the best model for a specific agent type by comparing all
65
+ * available benchmark runs.
66
+ */
67
+ export declare function findBestModelForAgent(agentType: string): BenchmarkDrivenRecommendation;
68
+ /**
69
+ * Format a model comparison as a human-readable report.
70
+ */
71
+ export declare function formatComparisonResult(result: ModelComparisonResult): string;
72
+ /**
73
+ * Format benchmark-driven routing recommendations.
74
+ */
75
+ export declare function formatBenchmarkRecommendations(recommendations: BenchmarkDrivenRecommendation[]): string;
76
+ //# sourceMappingURL=model-compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-compare.d.ts","sourceRoot":"","sources":["../../src/learning/model-compare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAOrE,6CAA6C;AAC7C,MAAM,WAAW,qBAAqB;IACpC,sBAAsB;IACtB,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,gBAAgB,CAAA;KAAE,CAAC;IACvE,sBAAsB;IACtB,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,gBAAgB,CAAA;KAAE,CAAC;IACvE,yBAAyB;IACzB,OAAO,EAAE;QACP,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;QAC5B,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;QAC3B,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;QAC3B,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;KACzB,CAAC;IACF,qBAAqB;IACrB,aAAa,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;IACjC,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,0EAA0E;AAC1E,MAAM,WAAW,6BAA6B;IAC5C,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,4DAA4D;IAC5D,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,uBAAuB;IACvB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,YAAY,GACjB,qBAAqB,CA4BvB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC;IACT,UAAU,EAAE,qBAAqB,CAAC;IAClC,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC,CAqCD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,GAChB,6BAA6B,CA6D/B;AAID;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAyB5E;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,eAAe,EAAE,6BAA6B,EAAE,GAC/C,MAAM,CAkCR"}
@@ -0,0 +1,252 @@
1
+ /**
2
+ * ModelCompare — A/B comparison engine that connects benchmark results
3
+ * to model routing recommendations.
4
+ *
5
+ * Provides:
6
+ * - Side-by-side benchmark comparison for two models
7
+ * - Automatic best-model recommendation per agent type
8
+ * - Integration with the ModelRouter and AgentStats
9
+ * - Human-readable comparison reports
10
+ */
11
+ import { getBenchmarkRuns } from './benchmark.js';
12
+ import { getAgentStats } from './agent-stats.js';
13
+ // ─── Comparison Engine ──────────────────────────────────────────────────────
14
+ /**
15
+ * Compare two benchmark runs and determine the winner.
16
+ */
17
+ export function compareModelRuns(runA, runB) {
18
+ const a = runA.summary;
19
+ const b = runB.summary;
20
+ const passRateA = a.totalTasks > 0 ? a.tasksPassed / a.totalTasks : 0;
21
+ const passRateB = b.totalTasks > 0 ? b.tasksPassed / b.totalTasks : 0;
22
+ const winners = {
23
+ passRate: compareMetric(passRateA, passRateB, true),
24
+ quality: compareMetric(a.avgQualityScore, b.avgQualityScore, true),
25
+ latency: compareMetric(a.medianLatencyMs, b.medianLatencyMs, false),
26
+ cost: compareMetric(a.totalCostUsd, b.totalCostUsd, false),
27
+ };
28
+ // Overall winner: weighted scoring
29
+ const scoreA = calcOverallScore(runA);
30
+ const scoreB = calcOverallScore(runB);
31
+ const overallWinner = scoreA > scoreB ? 'A' : scoreB > scoreA ? 'B' : 'tie';
32
+ const recommendation = buildRecommendation(overallWinner, runA, runB, winners);
33
+ return {
34
+ modelA: { provider: runA.provider, model: runA.model, summary: runA.summary },
35
+ modelB: { provider: runB.provider, model: runB.model, summary: runB.summary },
36
+ winners,
37
+ overallWinner,
38
+ recommendation,
39
+ };
40
+ }
41
+ /**
42
+ * Compare two benchmark runs and auto-update the ModelRouter / AgentStats
43
+ * recommendations based on the results.
44
+ */
45
+ export async function compareAndRecommend(runA, runB, verbose = false) {
46
+ const comparison = compareModelRuns(runA, runB);
47
+ const updatedRoutes = [];
48
+ // Update AgentStats with the comparison results
49
+ const stats = getAgentStats();
50
+ const winnerModel = comparison.overallWinner === 'A'
51
+ ? comparison.modelA.model
52
+ : comparison.modelB.model;
53
+ const winnerProvider = comparison.overallWinner === 'A'
54
+ ? comparison.modelA.provider
55
+ : comparison.modelB.provider;
56
+ const loserModel = comparison.overallWinner === 'A'
57
+ ? comparison.modelB.model
58
+ : comparison.modelA.model;
59
+ const loserProvider = comparison.overallWinner === 'A'
60
+ ? comparison.modelB.provider
61
+ : comparison.modelA.provider;
62
+ // Record a virtual run for each agent type with the winning model
63
+ const agentTypes = ['planner', 'writer', 'reviewer', 'tester', 'debugger', 'context-gatherer'];
64
+ for (const agentType of agentTypes) {
65
+ stats.recordRun(agentType, true, `${winnerProvider}/${winnerModel}`);
66
+ stats.recordRun(agentType, false, `${loserProvider}/${loserModel}`);
67
+ }
68
+ if (verbose) {
69
+ // Log updated recommendations
70
+ for (const agentType of agentTypes) {
71
+ const bestModel = stats.getBestModel(agentType);
72
+ if (bestModel) {
73
+ updatedRoutes.push(`${agentType} → ${bestModel}`);
74
+ }
75
+ }
76
+ }
77
+ return { comparison, updatedRoutes };
78
+ }
79
+ /**
80
+ * Find the best model for a specific agent type by comparing all
81
+ * available benchmark runs.
82
+ */
83
+ export function findBestModelForAgent(agentType) {
84
+ const runs = getBenchmarkRuns();
85
+ if (runs.length < 2) {
86
+ return {
87
+ agentType,
88
+ currentModel: 'default',
89
+ betterModel: null,
90
+ qualityImprovement: null,
91
+ confidence: 'low',
92
+ };
93
+ }
94
+ // Group runs by provider/model
95
+ const modelGroups = new Map();
96
+ for (const run of runs) {
97
+ const key = `${run.provider}/${run.model}`;
98
+ if (!modelGroups.has(key))
99
+ modelGroups.set(key, []);
100
+ modelGroups.get(key).push(run);
101
+ }
102
+ // Find the best performing model group
103
+ let bestKey = '';
104
+ let bestScore = -1;
105
+ let secondBestScore = -1;
106
+ for (const [key, groupRuns] of modelGroups) {
107
+ const avgScore = groupRuns.reduce((sum, r) => {
108
+ return sum + calcOverallScore(r);
109
+ }, 0) / groupRuns.length;
110
+ if (avgScore > bestScore) {
111
+ secondBestScore = bestScore;
112
+ bestScore = avgScore;
113
+ bestKey = key;
114
+ }
115
+ else if (avgScore > secondBestScore) {
116
+ secondBestScore = avgScore;
117
+ }
118
+ }
119
+ const qualityImprovement = secondBestScore > 0
120
+ ? ((bestScore - secondBestScore) / secondBestScore) * 100
121
+ : null;
122
+ const confidence = modelGroups.size >= 3 && runs.length >= 6
123
+ ? 'high'
124
+ : modelGroups.size >= 2 && runs.length >= 3
125
+ ? 'medium'
126
+ : 'low';
127
+ // Get current recommendation from stats
128
+ const stats = getAgentStats();
129
+ const currentModel = stats.getBestModel(agentType) || 'default';
130
+ return {
131
+ agentType,
132
+ currentModel,
133
+ betterModel: bestKey !== `${currentModel}` ? bestKey : null,
134
+ qualityImprovement: qualityImprovement ? Math.round(qualityImprovement) : null,
135
+ confidence,
136
+ };
137
+ }
138
+ // ─── Formatting ─────────────────────────────────────────────────────────────
139
+ /**
140
+ * Format a model comparison as a human-readable report.
141
+ */
142
+ export function formatComparisonResult(result) {
143
+ const lines = [
144
+ '═'.repeat(60),
145
+ ' ⚔️ Model Comparison',
146
+ '═'.repeat(60),
147
+ '',
148
+ ` Model A: ${result.modelA.provider}/${result.modelA.model}`,
149
+ ` Model B: ${result.modelB.provider}/${result.modelB.model}`,
150
+ '',
151
+ ' ┌──────────────────┬──────────────────────┬──────────────────────┐',
152
+ ' │ Metric │ Model A │ Model B │',
153
+ ' ├──────────────────┼──────────────────────┼──────────────────────┤',
154
+ ` │ Pass Rate │ ${fmtPct(result.modelA.summary.tasksPassed, result.modelA.summary.totalTasks).padEnd(20)} │ ${fmtPct(result.modelB.summary.tasksPassed, result.modelB.summary.totalTasks).padEnd(20)} │ ${winnerBadge(result.winners.passRate)}`,
155
+ ` │ Quality │ ${fmtScore(result.modelA.summary.avgQualityScore).padEnd(20)} │ ${fmtScore(result.modelB.summary.avgQualityScore).padEnd(20)} │ ${winnerBadge(result.winners.quality)}`,
156
+ ` │ Latency │ ${fmtMs(result.modelA.summary.medianLatencyMs).padEnd(20)} │ ${fmtMs(result.modelB.summary.medianLatencyMs).padEnd(20)} │ ${winnerBadge(result.winners.latency)}`,
157
+ ` │ Cost │ $${result.modelA.summary.totalCostUsd.toFixed(6).padEnd(17)} │ $${result.modelB.summary.totalCostUsd.toFixed(6).padEnd(17)} │ ${winnerBadge(result.winners.cost)}`,
158
+ ' └──────────────────┴──────────────────────┴──────────────────────┘',
159
+ '',
160
+ ` Overall winner: ${result.overallWinner === 'A' ? 'Model A' : result.overallWinner === 'B' ? 'Model B' : 'Tie'}`,
161
+ '',
162
+ ` Recommendation: ${result.recommendation}`,
163
+ '',
164
+ ];
165
+ return lines.join('\n');
166
+ }
167
+ /**
168
+ * Format benchmark-driven routing recommendations.
169
+ */
170
+ export function formatBenchmarkRecommendations(recommendations) {
171
+ const lines = [
172
+ '═'.repeat(60),
173
+ ' 📊 Benchmark-Driven Routing Recommendations',
174
+ '═'.repeat(60),
175
+ '',
176
+ ' Based on comparing benchmark runs, here are the recommended model',
177
+ ' updates for each agent type:',
178
+ '',
179
+ ' ┌─────────────────────┬──────────────────────┬──────────────────────┬──────────┐',
180
+ ' │ Agent │ Current │ Recommended │ Change │',
181
+ ' ├─────────────────────┼──────────────────────┼──────────────────────┼──────────┤',
182
+ ];
183
+ for (const rec of recommendations) {
184
+ const agent = rec.agentType.padEnd(18).slice(0, 18);
185
+ const current = rec.currentModel.padEnd(20).slice(0, 20);
186
+ if (rec.betterModel) {
187
+ const better = rec.betterModel.padEnd(20).slice(0, 20);
188
+ const change = rec.qualityImprovement !== null
189
+ ? `+${rec.qualityImprovement}%`.padStart(8)
190
+ : 'update'.padStart(8);
191
+ lines.push(` │ ${agent} │ ${current} │ ${better} │ ${change} │`);
192
+ }
193
+ else {
194
+ const noChange = '─'.padStart(8);
195
+ lines.push(` │ ${agent} │ ${current} │ ${'(best)'.padEnd(20)} │ ${noChange} │`);
196
+ }
197
+ }
198
+ lines.push(' └─────────────────────┴──────────────────────┴──────────────────────┴──────────┘');
199
+ lines.push('');
200
+ return lines.join('\n');
201
+ }
202
+ // ─── Helpers ────────────────────────────────────────────────────────────────
203
+ function compareMetric(aVal, bVal, higherBetter) {
204
+ if (aVal === bVal)
205
+ return 'tie';
206
+ return higherBetter ? (aVal > bVal ? 'A' : 'B') : (aVal < bVal ? 'A' : 'B');
207
+ }
208
+ function calcOverallScore(run) {
209
+ const s = run.summary;
210
+ const passRate = s.totalTasks > 0 ? s.tasksPassed / s.totalTasks : 0;
211
+ const quality = s.avgQualityScore;
212
+ const latencyScore = Math.max(0, 1 - s.medianLatencyMs / 30000);
213
+ const costScore = Math.max(0, 1 - s.totalCostUsd / 1);
214
+ // Weighted score
215
+ return passRate * 0.4 + quality * 0.3 + latencyScore * 0.2 + costScore * 0.1;
216
+ }
217
+ function buildRecommendation(winner, runA, runB, winners) {
218
+ if (winner === 'tie') {
219
+ return 'Both models perform similarly. Consider cost or latency preferences.';
220
+ }
221
+ const winningModel = winner === 'A' ? runA.model : runB.model;
222
+ const losingModel = winner === 'A' ? runB.model : runA.model;
223
+ const advantages = [];
224
+ if ((winner === 'A' && winners.passRate === 'A') || (winner === 'B' && winners.passRate === 'B'))
225
+ advantages.push('higher pass rate');
226
+ if ((winner === 'A' && winners.quality === 'A') || (winner === 'B' && winners.quality === 'B'))
227
+ advantages.push('better quality');
228
+ if ((winner === 'A' && winners.latency === 'A') || (winner === 'B' && winners.latency === 'B'))
229
+ advantages.push('lower latency');
230
+ if ((winner === 'A' && winners.cost === 'A') || (winner === 'B' && winners.cost === 'B'))
231
+ advantages.push('lower cost');
232
+ return `${winningModel} is recommended over ${losingModel} due to ${advantages.join(', ')}.`;
233
+ }
234
+ function fmtPct(passed, total) {
235
+ if (total === 0)
236
+ return 'N/A';
237
+ return `${((passed / total) * 100).toFixed(0)}%`;
238
+ }
239
+ function fmtScore(score) {
240
+ return `${(score * 100).toFixed(1)}%`;
241
+ }
242
+ function fmtMs(ms) {
243
+ if (ms < 1000)
244
+ return `${Math.round(ms)}ms`;
245
+ return `${(ms / 1000).toFixed(1)}s`;
246
+ }
247
+ function winnerBadge(winner) {
248
+ if (winner === 'tie')
249
+ return ' ➖';
250
+ return winner === 'A' ? ' 🔵' : ' 🟠';
251
+ }
252
+ //# sourceMappingURL=model-compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-compare.js","sourceRoot":"","sources":["../../src/learning/model-compare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * ModelRouter — Recommends the optimal inference provider and model
3
+ * for different types of agent tasks.
4
+ *
5
+ * Task categories and their recommended providers:
6
+ *
7
+ * | Task Type | Recommended Provider | Rationale |
8
+ * |------------------------|---------------------------|-------------------------------|
9
+ * | code-format, lint | local (small model) | Fast, private, cheap |
10
+ * | simple-edit, refactor | groq / nim | Low latency, good quality |
11
+ * | architect, plan | gemini / openrouter | Large context, strong reasoning |
12
+ * | security-audit, review | openrouter (GPT-4/Claude) | Best at finding subtle issues |
13
+ * | test-generation | any capable | Depends on test framework |
14
+ *
15
+ * The mapping is fully configurable — users can override via config file.
16
+ * The router integrates with Orchestrator's `agentModels` option.
17
+ */
18
+ import type { ProviderType } from '../config/types.js';
19
+ /** Categories of coding tasks that map to different model requirements */
20
+ export type TaskType = 'code-format' | 'lint' | 'simple-edit' | 'refactor' | 'architect' | 'plan' | 'security-audit' | 'code-review' | 'test-generation' | 'context-gather' | 'debug' | 'default';
21
+ /** A recommended provider + model pair */
22
+ export interface ModelRecommendation {
23
+ provider: ProviderType;
24
+ model?: string;
25
+ /** Human-readable reason for this recommendation */
26
+ reason: string;
27
+ }
28
+ /**
29
+ * A mapping from agent type strings (as used in task plans) to
30
+ * the recommended model routing.
31
+ *
32
+ * Example:
33
+ * ```json
34
+ * {
35
+ * "planner": "gemini-2.0-flash-exp",
36
+ * "writer": "groq/llama-3.3-70b-versatile",
37
+ * "reviewer": "openrouter/meta-llama/llama-3.1-8b-instruct"
38
+ * }
39
+ * ```
40
+ */
41
+ export type AgentModelMap = Record<string, string>;
42
+ /**
43
+ * Get the recommended model string for a given agent type.
44
+ * Format: "provider/model" or just "model" to use the default provider.
45
+ */
46
+ export declare function recommendModel(agentType: string): ModelRecommendation;
47
+ /**
48
+ * Build an `agentModels` map for the Orchestrator's `execute` options.
49
+ * This can be passed directly to automatically route each agent to
50
+ * its recommended model.
51
+ *
52
+ * @param overrides Optional overrides to customize specific agent models
53
+ */
54
+ export declare function buildAgentModelMap(overrides?: AgentModelMap): AgentModelMap;
55
+ /**
56
+ * Get the recommended provider type for a task type.
57
+ */
58
+ export declare function recommendProvider(taskType: TaskType): ProviderType;
59
+ /**
60
+ * Get the task type for an agent type.
61
+ */
62
+ export declare function getTaskType(agentType: string): TaskType;
63
+ /**
64
+ * Check whether a provider is well-suited for a given task type.
65
+ * Returns true if the provider matches or is a reasonable alternative.
66
+ */
67
+ export declare function isProviderSuitable(provider: string, taskType: TaskType): boolean;
68
+ //# sourceMappingURL=model-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-router.d.ts","sourceRoot":"","sources":["../../src/learning/model-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,0EAA0E;AAC1E,MAAM,MAAM,QAAQ,GAChB,aAAa,GACb,MAAM,GACN,aAAa,GACb,UAAU,GACV,WAAW,GACX,MAAM,GACN,gBAAgB,GAChB,aAAa,GACb,iBAAiB,GACjB,gBAAgB,GAChB,OAAO,GACP,SAAS,CAAC;AAEd,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AA6CnD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,CA8BrE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,aAAa,CAY3E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAElE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAEvD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAehF"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * ModelRouter — Recommends the optimal inference provider and model
3
+ * for different types of agent tasks.
4
+ *
5
+ * Task categories and their recommended providers:
6
+ *
7
+ * | Task Type | Recommended Provider | Rationale |
8
+ * |------------------------|---------------------------|-------------------------------|
9
+ * | code-format, lint | local (small model) | Fast, private, cheap |
10
+ * | simple-edit, refactor | groq / nim | Low latency, good quality |
11
+ * | architect, plan | gemini / openrouter | Large context, strong reasoning |
12
+ * | security-audit, review | openrouter (GPT-4/Claude) | Best at finding subtle issues |
13
+ * | test-generation | any capable | Depends on test framework |
14
+ *
15
+ * The mapping is fully configurable — users can override via config file.
16
+ * The router integrates with Orchestrator's `agentModels` option.
17
+ */
18
+ // ─── Default Mappings ───────────────────────────────────────────────────────
19
+ /** Maps agent types to their recommended model strings */
20
+ const DEFAULT_AGENT_MODELS = {
21
+ planner: 'gemini-2.0-flash-exp',
22
+ 'context-gatherer': 'groq/llama-3.3-70b-versatile',
23
+ writer: 'groq/llama-3.3-70b-versatile',
24
+ reviewer: 'openrouter/meta-llama/llama-3.1-8b-instruct',
25
+ tester: 'groq/llama-3.3-70b-versatile',
26
+ debugger: 'openrouter/meta-llama/llama-3.1-8b-instruct',
27
+ };
28
+ /**
29
+ * Maps task types to their ideal provider (used for config-level routing).
30
+ * Agent-level routing is more specific and takes precedence.
31
+ */
32
+ const TASK_TO_PROVIDER = {
33
+ 'code-format': 'local',
34
+ lint: 'local',
35
+ 'simple-edit': 'groq',
36
+ refactor: 'nim',
37
+ architect: 'gemini',
38
+ plan: 'gemini',
39
+ 'security-audit': 'openrouter',
40
+ 'code-review': 'openrouter',
41
+ 'test-generation': 'groq',
42
+ 'context-gather': 'groq',
43
+ debug: 'groq',
44
+ default: 'groq',
45
+ };
46
+ /** Maps agent types to their task type */
47
+ const AGENT_TO_TASK = {
48
+ planner: 'plan',
49
+ 'context-gatherer': 'context-gather',
50
+ writer: 'simple-edit',
51
+ reviewer: 'code-review',
52
+ tester: 'test-generation',
53
+ debugger: 'debug',
54
+ };
55
+ // ─── Router ────────────────────────────────────────────────────────────────
56
+ /**
57
+ * Get the recommended model string for a given agent type.
58
+ * Format: "provider/model" or just "model" to use the default provider.
59
+ */
60
+ export function recommendModel(agentType) {
61
+ const modelStr = DEFAULT_AGENT_MODELS[agentType];
62
+ if (!modelStr) {
63
+ // Fall back to default
64
+ return {
65
+ provider: TASK_TO_PROVIDER.default,
66
+ reason: `No specific recommendation for '${agentType}', using default`,
67
+ };
68
+ }
69
+ // Parse "provider/model" format
70
+ const slashIdx = modelStr.indexOf('/');
71
+ if (slashIdx > 0) {
72
+ const provider = modelStr.slice(0, slashIdx);
73
+ const model = modelStr.slice(slashIdx + 1);
74
+ return {
75
+ provider,
76
+ model,
77
+ reason: `Recommended for '${agentType}' tasks`,
78
+ };
79
+ }
80
+ // Just a model name — use its task type's preferred provider
81
+ const taskType = AGENT_TO_TASK[agentType] || 'default';
82
+ const provider = TASK_TO_PROVIDER[taskType];
83
+ return {
84
+ provider,
85
+ model: modelStr,
86
+ reason: `Recommended for '${agentType}' tasks`,
87
+ };
88
+ }
89
+ /**
90
+ * Build an `agentModels` map for the Orchestrator's `execute` options.
91
+ * This can be passed directly to automatically route each agent to
92
+ * its recommended model.
93
+ *
94
+ * @param overrides Optional overrides to customize specific agent models
95
+ */
96
+ export function buildAgentModelMap(overrides) {
97
+ const map = {};
98
+ for (const agentType of Object.keys(DEFAULT_AGENT_MODELS)) {
99
+ if (overrides?.[agentType]) {
100
+ map[agentType] = overrides[agentType];
101
+ }
102
+ else {
103
+ map[agentType] = DEFAULT_AGENT_MODELS[agentType];
104
+ }
105
+ }
106
+ return map;
107
+ }
108
+ /**
109
+ * Get the recommended provider type for a task type.
110
+ */
111
+ export function recommendProvider(taskType) {
112
+ return TASK_TO_PROVIDER[taskType] || TASK_TO_PROVIDER.default;
113
+ }
114
+ /**
115
+ * Get the task type for an agent type.
116
+ */
117
+ export function getTaskType(agentType) {
118
+ return AGENT_TO_TASK[agentType] || 'default';
119
+ }
120
+ /**
121
+ * Check whether a provider is well-suited for a given task type.
122
+ * Returns true if the provider matches or is a reasonable alternative.
123
+ */
124
+ export function isProviderSuitable(provider, taskType) {
125
+ const recommended = TASK_TO_PROVIDER[taskType] || TASK_TO_PROVIDER.default;
126
+ if (provider === recommended)
127
+ return true;
128
+ // Reasonable alternatives
129
+ const alternatives = {
130
+ 'simple-edit': ['groq', 'nim', 'gemini'],
131
+ refactor: ['nim', 'groq', 'gemini'],
132
+ plan: ['gemini', 'openrouter'],
133
+ 'code-review': ['openrouter', 'gemini'],
134
+ };
135
+ const alt = alternatives[taskType];
136
+ if (alt)
137
+ return alt.includes(provider);
138
+ return false;
139
+ }
140
+ //# sourceMappingURL=model-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/learning/model-router.ts"],"names":[],"mappings":"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"}