modelrig 0.0.1 → 0.2.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 (420) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/LICENSE +201 -0
  3. package/README.md +145 -8
  4. package/data/PROVENANCE.md +19 -0
  5. package/data/pricing-manual.json +22 -0
  6. package/data/pricing-map.json +46362 -0
  7. package/data/pricing-overlay.json +419 -0
  8. package/dist/adapters/anthropic.d.ts +90 -0
  9. package/dist/adapters/anthropic.d.ts.map +1 -0
  10. package/dist/adapters/anthropic.js +296 -0
  11. package/dist/adapters/build-adapters.d.ts +11 -0
  12. package/dist/adapters/build-adapters.d.ts.map +1 -0
  13. package/dist/adapters/build-adapters.js +45 -0
  14. package/dist/adapters/deepseek.d.ts +47 -0
  15. package/dist/adapters/deepseek.d.ts.map +1 -0
  16. package/dist/adapters/deepseek.js +216 -0
  17. package/dist/adapters/gemini.d.ts +44 -0
  18. package/dist/adapters/gemini.d.ts.map +1 -0
  19. package/dist/adapters/gemini.js +262 -0
  20. package/dist/adapters/grok.d.ts +53 -0
  21. package/dist/adapters/grok.d.ts.map +1 -0
  22. package/dist/adapters/grok.js +232 -0
  23. package/dist/adapters/openai-compat.d.ts +80 -0
  24. package/dist/adapters/openai-compat.d.ts.map +1 -0
  25. package/dist/adapters/openai-compat.js +244 -0
  26. package/dist/adapters/openai-stream.d.ts +58 -0
  27. package/dist/adapters/openai-stream.d.ts.map +1 -0
  28. package/dist/adapters/openai-stream.js +120 -0
  29. package/dist/adapters/openai.d.ts +55 -0
  30. package/dist/adapters/openai.d.ts.map +1 -0
  31. package/dist/adapters/openai.js +281 -0
  32. package/dist/adapters/sampling.d.ts +28 -0
  33. package/dist/adapters/sampling.d.ts.map +1 -0
  34. package/dist/adapters/sampling.js +34 -0
  35. package/dist/adapters/tool-mapping.d.ts +92 -0
  36. package/dist/adapters/tool-mapping.d.ts.map +1 -0
  37. package/dist/adapters/tool-mapping.js +143 -0
  38. package/dist/artifacts/artifact.d.ts +137 -0
  39. package/dist/artifacts/artifact.d.ts.map +1 -0
  40. package/dist/artifacts/artifact.js +377 -0
  41. package/dist/artifacts/content-uploader.d.ts +87 -0
  42. package/dist/artifacts/content-uploader.d.ts.map +1 -0
  43. package/dist/artifacts/content-uploader.js +124 -0
  44. package/dist/artifacts/index.d.ts +63 -0
  45. package/dist/artifacts/index.d.ts.map +1 -0
  46. package/dist/artifacts/index.js +80 -0
  47. package/dist/artifacts/run-context.d.ts +129 -0
  48. package/dist/artifacts/run-context.d.ts.map +1 -0
  49. package/dist/artifacts/run-context.js +208 -0
  50. package/dist/artifacts/scrub.d.ts +60 -0
  51. package/dist/artifacts/scrub.d.ts.map +1 -0
  52. package/dist/artifacts/scrub.js +139 -0
  53. package/dist/artifacts/step.d.ts +26 -0
  54. package/dist/artifacts/step.d.ts.map +1 -0
  55. package/dist/artifacts/step.js +37 -0
  56. package/dist/artifacts/taint.d.ts +63 -0
  57. package/dist/artifacts/taint.d.ts.map +1 -0
  58. package/dist/artifacts/taint.js +76 -0
  59. package/dist/bakeoff/cache-sim.d.ts +99 -0
  60. package/dist/bakeoff/cache-sim.d.ts.map +1 -0
  61. package/dist/bakeoff/cache-sim.js +126 -0
  62. package/dist/bakeoff/engine.d.ts +52 -0
  63. package/dist/bakeoff/engine.d.ts.map +1 -0
  64. package/dist/bakeoff/engine.js +163 -0
  65. package/dist/bakeoff/eval-cases.d.ts +96 -0
  66. package/dist/bakeoff/eval-cases.d.ts.map +1 -0
  67. package/dist/bakeoff/eval-cases.js +105 -0
  68. package/dist/bakeoff/replay.d.ts +52 -0
  69. package/dist/bakeoff/replay.d.ts.map +1 -0
  70. package/dist/bakeoff/replay.js +94 -0
  71. package/dist/bakeoff/report.d.ts +41 -0
  72. package/dist/bakeoff/report.d.ts.map +1 -0
  73. package/dist/bakeoff/report.js +142 -0
  74. package/dist/bakeoff/samples.d.ts +77 -0
  75. package/dist/bakeoff/samples.d.ts.map +1 -0
  76. package/dist/bakeoff/samples.js +148 -0
  77. package/dist/bakeoff/stats.d.ts +13 -0
  78. package/dist/bakeoff/stats.d.ts.map +1 -0
  79. package/dist/bakeoff/stats.js +48 -0
  80. package/dist/bakeoff/types.d.ts +37 -0
  81. package/dist/bakeoff/types.d.ts.map +1 -0
  82. package/dist/bakeoff/types.js +10 -0
  83. package/dist/cli.d.ts +25 -0
  84. package/dist/cli.d.ts.map +1 -0
  85. package/dist/cli.js +590 -0
  86. package/dist/config.d.ts +204 -0
  87. package/dist/config.d.ts.map +1 -0
  88. package/dist/config.js +252 -0
  89. package/dist/deprecations.d.ts +32 -0
  90. package/dist/deprecations.d.ts.map +1 -0
  91. package/dist/deprecations.js +59 -0
  92. package/dist/feedback/coverage.d.ts +32 -0
  93. package/dist/feedback/coverage.d.ts.map +1 -0
  94. package/dist/feedback/coverage.js +95 -0
  95. package/dist/feedback/feedback.d.ts +35 -0
  96. package/dist/feedback/feedback.d.ts.map +1 -0
  97. package/dist/feedback/feedback.js +39 -0
  98. package/dist/gateway/http-protocol.d.ts +175 -0
  99. package/dist/gateway/http-protocol.d.ts.map +1 -0
  100. package/dist/gateway/http-protocol.js +105 -0
  101. package/dist/index.d.ts +242 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +576 -0
  104. package/dist/init/finder.d.ts +94 -0
  105. package/dist/init/finder.d.ts.map +1 -0
  106. package/dist/init/finder.js +343 -0
  107. package/dist/init/init-cli.d.ts +10 -0
  108. package/dist/init/init-cli.d.ts.map +1 -0
  109. package/dist/init/init-cli.js +86 -0
  110. package/dist/init/observe-cli.d.ts +19 -0
  111. package/dist/init/observe-cli.d.ts.map +1 -0
  112. package/dist/init/observe-cli.js +73 -0
  113. package/dist/init/observe.d.ts +81 -0
  114. package/dist/init/observe.d.ts.map +1 -0
  115. package/dist/init/observe.js +245 -0
  116. package/dist/init/run.d.ts +99 -0
  117. package/dist/init/run.d.ts.map +1 -0
  118. package/dist/init/run.js +281 -0
  119. package/dist/init/signatures.d.ts +39 -0
  120. package/dist/init/signatures.d.ts.map +1 -0
  121. package/dist/init/signatures.js +116 -0
  122. package/dist/matrix/aggregate.d.ts +89 -0
  123. package/dist/matrix/aggregate.d.ts.map +1 -0
  124. package/dist/matrix/aggregate.js +186 -0
  125. package/dist/query/grammar.d.ts +35 -0
  126. package/dist/query/grammar.d.ts.map +1 -0
  127. package/dist/query/grammar.js +279 -0
  128. package/dist/query/run.d.ts +8 -0
  129. package/dist/query/run.d.ts.map +1 -0
  130. package/dist/query/run.js +21 -0
  131. package/dist/registry/build.d.ts +219 -0
  132. package/dist/registry/build.d.ts.map +1 -0
  133. package/dist/registry/build.js +313 -0
  134. package/dist/registry/cache-policy.d.ts +94 -0
  135. package/dist/registry/cache-policy.d.ts.map +1 -0
  136. package/dist/registry/cache-policy.js +238 -0
  137. package/dist/registry/call-notes.d.ts +11 -0
  138. package/dist/registry/call-notes.d.ts.map +1 -0
  139. package/dist/registry/call-notes.js +110 -0
  140. package/dist/registry/claims.d.ts +63 -0
  141. package/dist/registry/claims.d.ts.map +1 -0
  142. package/dist/registry/claims.js +107 -0
  143. package/dist/registry/effective-rate.d.ts +151 -0
  144. package/dist/registry/effective-rate.d.ts.map +1 -0
  145. package/dist/registry/effective-rate.js +156 -0
  146. package/dist/registry/facts.d.ts +32 -0
  147. package/dist/registry/facts.d.ts.map +1 -0
  148. package/dist/registry/facts.js +136 -0
  149. package/dist/registry/fingerprint.d.ts +20 -0
  150. package/dist/registry/fingerprint.d.ts.map +1 -0
  151. package/dist/registry/fingerprint.js +150 -0
  152. package/dist/registry/parity.d.ts +52 -0
  153. package/dist/registry/parity.d.ts.map +1 -0
  154. package/dist/registry/parity.js +82 -0
  155. package/dist/registry/pricing-shape.d.ts +113 -0
  156. package/dist/registry/pricing-shape.d.ts.map +1 -0
  157. package/dist/registry/pricing-shape.js +123 -0
  158. package/dist/registry/pricing.d.ts +43 -0
  159. package/dist/registry/pricing.d.ts.map +1 -0
  160. package/dist/registry/pricing.js +127 -0
  161. package/dist/registry/rows.d.ts +16 -0
  162. package/dist/registry/rows.d.ts.map +1 -0
  163. package/dist/registry/rows.js +57 -0
  164. package/dist/registry/seed.d.ts +43 -0
  165. package/dist/registry/seed.d.ts.map +1 -0
  166. package/dist/registry/seed.js +97 -0
  167. package/dist/registry/select.d.ts +68 -0
  168. package/dist/registry/select.d.ts.map +1 -0
  169. package/dist/registry/select.js +141 -0
  170. package/dist/registry/staleness.d.ts +18 -0
  171. package/dist/registry/staleness.d.ts.map +1 -0
  172. package/dist/registry/staleness.js +39 -0
  173. package/dist/rigindex/bootstrap.d.ts +36 -0
  174. package/dist/rigindex/bootstrap.d.ts.map +1 -0
  175. package/dist/rigindex/bootstrap.js +97 -0
  176. package/dist/rigindex/fit.d.ts +24 -0
  177. package/dist/rigindex/fit.d.ts.map +1 -0
  178. package/dist/rigindex/fit.js +76 -0
  179. package/dist/rigindex/gates.d.ts +52 -0
  180. package/dist/rigindex/gates.d.ts.map +1 -0
  181. package/dist/rigindex/gates.js +109 -0
  182. package/dist/rigindex/graph.d.ts +31 -0
  183. package/dist/rigindex/graph.d.ts.map +1 -0
  184. package/dist/rigindex/graph.js +120 -0
  185. package/dist/rigindex/index.d.ts +23 -0
  186. package/dist/rigindex/index.d.ts.map +1 -0
  187. package/dist/rigindex/index.js +112 -0
  188. package/dist/rigindex/types.d.ts +76 -0
  189. package/dist/rigindex/types.d.ts.map +1 -0
  190. package/dist/rigindex/types.js +8 -0
  191. package/dist/routes/cache-lint.d.ts +41 -0
  192. package/dist/routes/cache-lint.d.ts.map +1 -0
  193. package/dist/routes/cache-lint.js +81 -0
  194. package/dist/routes/draft.d.ts +83 -0
  195. package/dist/routes/draft.d.ts.map +1 -0
  196. package/dist/routes/draft.js +135 -0
  197. package/dist/routes/loader.d.ts +63 -0
  198. package/dist/routes/loader.d.ts.map +1 -0
  199. package/dist/routes/loader.js +574 -0
  200. package/dist/routes/manifest.d.ts +24 -0
  201. package/dist/routes/manifest.d.ts.map +1 -0
  202. package/dist/routes/manifest.js +118 -0
  203. package/dist/routes/resolved-bundle.d.ts +79 -0
  204. package/dist/routes/resolved-bundle.d.ts.map +1 -0
  205. package/dist/routes/resolved-bundle.js +148 -0
  206. package/dist/routes/sampling-config.d.ts +32 -0
  207. package/dist/routes/sampling-config.d.ts.map +1 -0
  208. package/dist/routes/sampling-config.js +91 -0
  209. package/dist/routes/serveability.d.ts +52 -0
  210. package/dist/routes/serveability.d.ts.map +1 -0
  211. package/dist/routes/serveability.js +73 -0
  212. package/dist/routes/template.d.ts +18 -0
  213. package/dist/routes/template.d.ts.map +1 -0
  214. package/dist/routes/template.js +94 -0
  215. package/dist/run/ajv.d.ts +22 -0
  216. package/dist/run/ajv.d.ts.map +1 -0
  217. package/dist/run/ajv.js +32 -0
  218. package/dist/run/cache-handle.d.ts +58 -0
  219. package/dist/run/cache-handle.d.ts.map +1 -0
  220. package/dist/run/cache-handle.js +54 -0
  221. package/dist/run/cache-stamp.d.ts +65 -0
  222. package/dist/run/cache-stamp.d.ts.map +1 -0
  223. package/dist/run/cache-stamp.js +0 -0
  224. package/dist/run/capture-write.d.ts +33 -0
  225. package/dist/run/capture-write.d.ts.map +1 -0
  226. package/dist/run/capture-write.js +55 -0
  227. package/dist/run/cost.d.ts +26 -0
  228. package/dist/run/cost.d.ts.map +1 -0
  229. package/dist/run/cost.js +41 -0
  230. package/dist/run/dispatch.d.ts +99 -0
  231. package/dist/run/dispatch.d.ts.map +1 -0
  232. package/dist/run/dispatch.js +191 -0
  233. package/dist/run/envelope.d.ts +21 -0
  234. package/dist/run/envelope.d.ts.map +1 -0
  235. package/dist/run/envelope.js +45 -0
  236. package/dist/run/grounding.d.ts +56 -0
  237. package/dist/run/grounding.d.ts.map +1 -0
  238. package/dist/run/grounding.js +89 -0
  239. package/dist/run/raw.d.ts +88 -0
  240. package/dist/run/raw.d.ts.map +1 -0
  241. package/dist/run/raw.js +286 -0
  242. package/dist/run/record-attempt.d.ts +40 -0
  243. package/dist/run/record-attempt.d.ts.map +1 -0
  244. package/dist/run/record-attempt.js +99 -0
  245. package/dist/run/repair.d.ts +36 -0
  246. package/dist/run/repair.d.ts.map +1 -0
  247. package/dist/run/repair.js +61 -0
  248. package/dist/run/resolve.d.ts +99 -0
  249. package/dist/run/resolve.d.ts.map +1 -0
  250. package/dist/run/resolve.js +203 -0
  251. package/dist/run/retry.d.ts +19 -0
  252. package/dist/run/retry.d.ts.map +1 -0
  253. package/dist/run/retry.js +50 -0
  254. package/dist/run/run.d.ts +55 -0
  255. package/dist/run/run.d.ts.map +1 -0
  256. package/dist/run/run.js +540 -0
  257. package/dist/run/stream.d.ts +49 -0
  258. package/dist/run/stream.d.ts.map +1 -0
  259. package/dist/run/stream.js +87 -0
  260. package/dist/run/validate.d.ts +15 -0
  261. package/dist/run/validate.d.ts.map +1 -0
  262. package/dist/run/validate.js +55 -0
  263. package/dist/savings/cache-ledger.d.ts +108 -0
  264. package/dist/savings/cache-ledger.d.ts.map +1 -0
  265. package/dist/savings/cache-ledger.js +174 -0
  266. package/dist/savings/cache-reconcile.d.ts +64 -0
  267. package/dist/savings/cache-reconcile.d.ts.map +1 -0
  268. package/dist/savings/cache-reconcile.js +59 -0
  269. package/dist/savings/cache-stats.d.ts +63 -0
  270. package/dist/savings/cache-stats.d.ts.map +1 -0
  271. package/dist/savings/cache-stats.js +108 -0
  272. package/dist/savings/emit.d.ts +38 -0
  273. package/dist/savings/emit.d.ts.map +1 -0
  274. package/dist/savings/emit.js +100 -0
  275. package/dist/savings/odometer.d.ts +32 -0
  276. package/dist/savings/odometer.d.ts.map +1 -0
  277. package/dist/savings/odometer.js +70 -0
  278. package/dist/savings/swap-execute.d.ts +58 -0
  279. package/dist/savings/swap-execute.d.ts.map +1 -0
  280. package/dist/savings/swap-execute.js +130 -0
  281. package/dist/savings/swaps-client.d.ts +55 -0
  282. package/dist/savings/swaps-client.d.ts.map +1 -0
  283. package/dist/savings/swaps-client.js +95 -0
  284. package/dist/settings/api-fetcher.d.ts +39 -0
  285. package/dist/settings/api-fetcher.d.ts.map +1 -0
  286. package/dist/settings/api-fetcher.js +92 -0
  287. package/dist/settings/index.d.ts +10 -0
  288. package/dist/settings/index.d.ts.map +1 -0
  289. package/dist/settings/index.js +15 -0
  290. package/dist/settings/task-settings.d.ts +91 -0
  291. package/dist/settings/task-settings.d.ts.map +1 -0
  292. package/dist/settings/task-settings.js +116 -0
  293. package/dist/status.d.ts +77 -0
  294. package/dist/status.d.ts.map +1 -0
  295. package/dist/status.js +113 -0
  296. package/dist/telemetry/artifact-store.d.ts +48 -0
  297. package/dist/telemetry/artifact-store.d.ts.map +1 -0
  298. package/dist/telemetry/artifact-store.js +189 -0
  299. package/dist/telemetry/cache-miss-streak.d.ts +79 -0
  300. package/dist/telemetry/cache-miss-streak.d.ts.map +1 -0
  301. package/dist/telemetry/cache-miss-streak.js +99 -0
  302. package/dist/telemetry/capture.d.ts +31 -0
  303. package/dist/telemetry/capture.d.ts.map +1 -0
  304. package/dist/telemetry/capture.js +81 -0
  305. package/dist/telemetry/exporter-setup.d.ts +28 -0
  306. package/dist/telemetry/exporter-setup.d.ts.map +1 -0
  307. package/dist/telemetry/exporter-setup.js +34 -0
  308. package/dist/telemetry/exporter.d.ts +137 -0
  309. package/dist/telemetry/exporter.d.ts.map +1 -0
  310. package/dist/telemetry/exporter.js +510 -0
  311. package/dist/telemetry/health.d.ts +76 -0
  312. package/dist/telemetry/health.d.ts.map +1 -0
  313. package/dist/telemetry/health.js +92 -0
  314. package/dist/telemetry/ingest-protocol.d.ts +310 -0
  315. package/dist/telemetry/ingest-protocol.d.ts.map +1 -0
  316. package/dist/telemetry/ingest-protocol.js +363 -0
  317. package/dist/telemetry/load-error-report.d.ts +24 -0
  318. package/dist/telemetry/load-error-report.d.ts.map +1 -0
  319. package/dist/telemetry/load-error-report.js +50 -0
  320. package/dist/telemetry/otel-map.d.ts +121 -0
  321. package/dist/telemetry/otel-map.d.ts.map +1 -0
  322. package/dist/telemetry/otel-map.js +224 -0
  323. package/dist/telemetry/otel-normalize.d.ts +104 -0
  324. package/dist/telemetry/otel-normalize.d.ts.map +1 -0
  325. package/dist/telemetry/otel-normalize.js +530 -0
  326. package/dist/telemetry/otlp-emitter.d.ts +52 -0
  327. package/dist/telemetry/otlp-emitter.d.ts.map +1 -0
  328. package/dist/telemetry/otlp-emitter.js +144 -0
  329. package/dist/telemetry/otlp-proto.d.ts +29 -0
  330. package/dist/telemetry/otlp-proto.d.ts.map +1 -0
  331. package/dist/telemetry/otlp-proto.js +266 -0
  332. package/dist/telemetry/sinks.d.ts +90 -0
  333. package/dist/telemetry/sinks.d.ts.map +1 -0
  334. package/dist/telemetry/sinks.js +180 -0
  335. package/dist/telemetry/store.d.ts +65 -0
  336. package/dist/telemetry/store.d.ts.map +1 -0
  337. package/dist/telemetry/store.js +547 -0
  338. package/dist/tenancy/api-key-format.d.ts +77 -0
  339. package/dist/tenancy/api-key-format.d.ts.map +1 -0
  340. package/dist/tenancy/api-key-format.js +110 -0
  341. package/dist/tenancy/constants.d.ts +23 -0
  342. package/dist/tenancy/constants.d.ts.map +1 -0
  343. package/dist/tenancy/constants.js +25 -0
  344. package/dist/tenancy/scrub.d.ts +47 -0
  345. package/dist/tenancy/scrub.d.ts.map +1 -0
  346. package/dist/tenancy/scrub.js +85 -0
  347. package/dist/types/config-teaching.d.ts +62 -0
  348. package/dist/types/config-teaching.d.ts.map +1 -0
  349. package/dist/types/config-teaching.js +183 -0
  350. package/dist/types/failures-teaching.d.ts +56 -0
  351. package/dist/types/failures-teaching.d.ts.map +1 -0
  352. package/dist/types/failures-teaching.js +177 -0
  353. package/dist/types/failures.d.ts +27 -0
  354. package/dist/types/failures.d.ts.map +1 -0
  355. package/dist/types/failures.js +41 -0
  356. package/dist/types/provider.d.ts +200 -0
  357. package/dist/types/provider.d.ts.map +1 -0
  358. package/dist/types/provider.js +40 -0
  359. package/dist/types/route.d.ts +205 -0
  360. package/dist/types/route.d.ts.map +1 -0
  361. package/dist/types/route.js +6 -0
  362. package/dist/types/telemetry.d.ts +206 -0
  363. package/dist/types/telemetry.d.ts.map +1 -0
  364. package/dist/types/telemetry.js +6 -0
  365. package/dist/validate-cli.d.ts +12 -0
  366. package/dist/validate-cli.d.ts.map +1 -0
  367. package/dist/validate-cli.js +57 -0
  368. package/dist/verify/capture.d.ts +66 -0
  369. package/dist/verify/capture.d.ts.map +1 -0
  370. package/dist/verify/capture.js +180 -0
  371. package/dist/verify/cli-run.d.ts +23 -0
  372. package/dist/verify/cli-run.d.ts.map +1 -0
  373. package/dist/verify/cli-run.js +57 -0
  374. package/dist/verify/diff.d.ts +48 -0
  375. package/dist/verify/diff.d.ts.map +1 -0
  376. package/dist/verify/diff.js +157 -0
  377. package/dist/verify/index.d.ts +17 -0
  378. package/dist/verify/index.d.ts.map +1 -0
  379. package/dist/verify/index.js +24 -0
  380. package/dist/verify/report.d.ts +14 -0
  381. package/dist/verify/report.d.ts.map +1 -0
  382. package/dist/verify/report.js +88 -0
  383. package/dist/verify/types.d.ts +101 -0
  384. package/dist/verify/types.d.ts.map +1 -0
  385. package/dist/verify/types.js +17 -0
  386. package/dist/verify/verify.d.ts +29 -0
  387. package/dist/verify/verify.d.ts.map +1 -0
  388. package/dist/verify/verify.js +148 -0
  389. package/dist/watch/budget.d.ts +19 -0
  390. package/dist/watch/budget.d.ts.map +1 -0
  391. package/dist/watch/budget.js +35 -0
  392. package/dist/watch/evaluate.d.ts +225 -0
  393. package/dist/watch/evaluate.d.ts.map +1 -0
  394. package/dist/watch/evaluate.js +155 -0
  395. package/dist/watch/monitor.d.ts +116 -0
  396. package/dist/watch/monitor.d.ts.map +1 -0
  397. package/dist/watch/monitor.js +199 -0
  398. package/dist/watch/proposals.d.ts +89 -0
  399. package/dist/watch/proposals.d.ts.map +1 -0
  400. package/dist/watch/proposals.js +197 -0
  401. package/dist/watch/run-record.d.ts +64 -0
  402. package/dist/watch/run-record.d.ts.map +1 -0
  403. package/dist/watch/run-record.js +86 -0
  404. package/dist/watch/run-reported.d.ts +20 -0
  405. package/dist/watch/run-reported.d.ts.map +1 -0
  406. package/dist/watch/run-reported.js +53 -0
  407. package/dist/watch/run.d.ts +73 -0
  408. package/dist/watch/run.d.ts.map +1 -0
  409. package/dist/watch/run.js +83 -0
  410. package/dist/watch/state-store.d.ts +48 -0
  411. package/dist/watch/state-store.d.ts.map +1 -0
  412. package/dist/watch/state-store.js +86 -0
  413. package/dist/watch/state.d.ts +21 -0
  414. package/dist/watch/state.d.ts.map +1 -0
  415. package/dist/watch/state.js +93 -0
  416. package/package.json +56 -14
  417. package/registry/LICENSE +20 -0
  418. package/registry/leaderboard.json +3639 -0
  419. package/registry/registry.json +7263 -0
  420. package/index.js +0 -3
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ /**
3
+ * Anthropic ProviderAdapter — provider expansion 2026-08-02. Messages API
4
+ * via @anthropic-ai/sdk with streaming. Structured output is a FORCED TOOL
5
+ * CALL: the route schema becomes the single tool's input_schema and
6
+ * tool_choice pins it, so the accumulated input_json_delta stream IS the
7
+ * JSON output (Anthropic's recommended structured-output pattern; the run
8
+ * loop still ajv-validates like every provider). Prompt caching (WS-C) is
9
+ * explicit `cache_control` on Anthropic: when the request opts in, the system
10
+ * prefix is marked with an ephemeral breakpoint (buildAnthropicParams) and the
11
+ * `context_cache_explicit` capability is advertised per the cache-policy registry.
12
+ */
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.isStrictSchemaRejection = isStrictSchemaRejection;
18
+ exports.anthropicSupports = anthropicSupports;
19
+ exports.classifyAnthropicFailure = classifyAnthropicFailure;
20
+ exports.buildAnthropicParams = buildAnthropicParams;
21
+ exports.normalizeAnthropicInputUsage = normalizeAnthropicInputUsage;
22
+ exports.createAnthropicAdapter = createAnthropicAdapter;
23
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
24
+ const tool_mapping_1 = require("./tool-mapping");
25
+ const sampling_1 = require("./sampling");
26
+ const DEFAULT_MAX_TOKENS = 32000;
27
+ const OUTPUT_TOOL_NAME = "route_output";
28
+ /** Strict tool use (constrained decoding) — public beta. Schemas that
29
+ * exceed Anthropic's compile limits (e.g. >16 union-typed parameters) are
30
+ * rejected with a 400; the call() path downgrades to advisory mode then. */
31
+ const STRUCTURED_OUTPUTS_BETA = "structured-outputs-2025-11-13";
32
+ /** True when a 400 says the schema cannot compile for strict mode —
33
+ * downgrade to advisory, do NOT surface as a failure. */
34
+ function isStrictSchemaRejection(message) {
35
+ return /union|exponential compilation|does not support strict|strict.*not supported/i.test(message);
36
+ }
37
+ function anthropicSupports(feature, _model) {
38
+ switch (feature) {
39
+ case "structured_native": // forced tool call with the route schema
40
+ case "json_mode":
41
+ case "context_cache_explicit": // cache_control ephemeral blocks (WS-C) — cache-policy registry truth
42
+ return true;
43
+ case "grounded_native": // web-search tool exists but is not wired
44
+ case "prompt_cache_key": // anthropic ignores keys — caching is prefix-based via cache_control
45
+ case "prefix_cache_implicit":
46
+ case "tier_flex":
47
+ case "trace_visible": // extended thinking not enabled by this adapter
48
+ case "zero_retention": // never a static adapter attestation — set only from the credential-scoped registry facts (claims.ts)
49
+ return false;
50
+ }
51
+ }
52
+ function classifyAnthropicFailure(message) {
53
+ const msg = message.toLowerCase();
54
+ if (/\b429\b|rate limit|rate_limit/.test(msg))
55
+ return { cls: "capacity_shed" };
56
+ if (/\b529\b|overloaded|\b50[023]\b|service unavailable/.test(msg)) {
57
+ return { cls: "capacity_shed" };
58
+ }
59
+ if (/timeout|etimedout|abort/.test(msg))
60
+ return { cls: "timeout" };
61
+ if (/econnreset|econnrefused|enotfound|fetch failed|network/.test(msg))
62
+ return { cls: "network" };
63
+ if (/\b401\b|authentication|x-api-key|api key/.test(msg)) {
64
+ // F2: non-retryable — a dead key never burns backoff retries.
65
+ return { cls: "config_auth", fixHint: "check the Anthropic API key configured for this rig" };
66
+ }
67
+ if (/credit|spending limit|insufficient_quota|billing/.test(msg)) {
68
+ // Account-level hard stop — retrying burns nothing but time (learned
69
+ // from the 2026-08-03 xAI credit exhaustion mid-bake-off).
70
+ return { cls: "config_auth", fixHint: "the Anthropic account is out of credits or over its spending limit" };
71
+ }
72
+ if (/not_found|not found|does not exist/.test(msg)) {
73
+ return {
74
+ cls: "network",
75
+ fixHint: "the candidate model was not found — fix the model id in the route's candidate list",
76
+ };
77
+ }
78
+ return { cls: "network" };
79
+ }
80
+ function buildAnthropicParams(model, req, strict = false) {
81
+ // Structured output is a FORCED tool call on the route schema (existing
82
+ // path). Otherwise, caller-supplied `tools` (spec §4.4) map to Anthropic's
83
+ // tool_use — the two are mutually exclusive here (a structured route does
84
+ // not also expose free tools in Phase A).
85
+ const toolBlock = req.outputSchema !== null
86
+ ? {
87
+ tools: [
88
+ {
89
+ name: OUTPUT_TOOL_NAME,
90
+ description: "Emit the structured output for this route.",
91
+ input_schema: req.outputSchema,
92
+ ...(strict ? { strict: true } : {}),
93
+ },
94
+ ],
95
+ tool_choice: { type: "tool", name: OUTPUT_TOOL_NAME },
96
+ }
97
+ : req.tools !== undefined && req.tools.length > 0
98
+ ? {
99
+ tools: (0, tool_mapping_1.toAnthropicTools)(req.tools),
100
+ ...((0, tool_mapping_1.toAnthropicToolChoice)(req.toolChoice) !== undefined
101
+ ? { tool_choice: (0, tool_mapping_1.toAnthropicToolChoice)(req.toolChoice) }
102
+ : {}),
103
+ }
104
+ : {};
105
+ // Prompt caching (WS-C): when the request opts in (`cache` set by the run
106
+ // loop's policy-gated stamp), mark the system prompt — the stable prefix in
107
+ // ModelRig's system-carries-the-task convention — with a `cache_control`
108
+ // ephemeral breakpoint. Anthropic caches the prefix up to and including the
109
+ // marked block (default 5m TTL, refreshes free on read); the `cache.key` is
110
+ // ignored (caching is prefix-based, not key-based — that is why the telemetry
111
+ // `cache_key` for anthropic is null). Extended 1h TTL is a documented
112
+ // follow-up (needs the extended-cache beta header; WS-A already accounts the
113
+ // 5m/1h split when the provider reports it).
114
+ const wantsCache = req.cache?.key !== undefined && req.cache.key !== "";
115
+ const systemField = req.systemPrompt === ""
116
+ ? {}
117
+ : wantsCache
118
+ ? {
119
+ system: [
120
+ { type: "text", text: req.systemPrompt, cache_control: { type: "ephemeral" } },
121
+ ],
122
+ }
123
+ : { system: req.systemPrompt };
124
+ return {
125
+ model,
126
+ max_tokens: (0, sampling_1.effectiveMaxOutputTokens)(req, DEFAULT_MAX_TOKENS),
127
+ ...(0, sampling_1.openAISamplingFields)(req),
128
+ ...systemField,
129
+ messages: [{ role: "user", content: req.userPrompt }],
130
+ stream: true,
131
+ ...toolBlock,
132
+ };
133
+ }
134
+ /**
135
+ * Normalize Anthropic's `message_start` usage to ModelRig's convention
136
+ * (research §4 fix). Anthropic's `input_tokens` is the UNCACHED portion only;
137
+ * ModelRig requires `tokensIn` to INCLUDE cache reads and writes as subsets, so
138
+ * we add them back. Pure and total — the fixture-tested seam for the subset
139
+ * invariant and the 5m/1h split.
140
+ */
141
+ function normalizeAnthropicInputUsage(u) {
142
+ const uncached = u.input_tokens ?? 0;
143
+ const read = u.cache_read_input_tokens ?? 0;
144
+ const write = u.cache_creation_input_tokens ?? 0;
145
+ // 1h split when the extended-TTL beta reports it; clamp to the total write so
146
+ // a malformed payload can never make the 1h bucket exceed the write bucket.
147
+ const write1h = Math.min(u.cache_creation?.ephemeral_1h_input_tokens ?? 0, write);
148
+ return {
149
+ tokensIn: uncached + read + write,
150
+ tokensCached: read,
151
+ tokensCacheWrite: write,
152
+ tokensCacheWrite1h: write1h,
153
+ };
154
+ }
155
+ function createAnthropicAdapter(config) {
156
+ return {
157
+ id: "anthropic",
158
+ supports: anthropicSupports,
159
+ supportsTools: () => true,
160
+ async call(req) {
161
+ const model = req.candidate.model;
162
+ // F1: post-stream failures still billed tokens — attach usage.
163
+ const fail = (cls, message, fixHint, usage) => ({
164
+ ok: false,
165
+ failure: {
166
+ class: cls,
167
+ message,
168
+ provider: "anthropic",
169
+ model,
170
+ ...(fixHint !== undefined ? { fixHint } : {}),
171
+ },
172
+ ...(usage !== undefined ? { usage } : {}),
173
+ });
174
+ const wantJson = req.outputSchema !== null;
175
+ try {
176
+ const client = new sdk_1.default({ apiKey: config.apiKey, timeout: req.timeoutMs });
177
+ // Strict-first (constrained decoding, structured-outputs beta): the
178
+ // strongest available rung. Schemas over Anthropic's compile limits
179
+ // (e.g. >16 union-typed parameters — hit live by earnings_5c on
180
+ // 2026-08-03) get an immediate 400; downgrade to advisory mode and
181
+ // let the run loop's ajv validation arbitrate, like every provider.
182
+ let stream;
183
+ if (wantJson) {
184
+ try {
185
+ stream = await client.messages.create(buildAnthropicParams(model, req, true), { headers: { "anthropic-beta": STRUCTURED_OUTPUTS_BETA } });
186
+ }
187
+ catch (strictError) {
188
+ const message = strictError instanceof Error ? strictError.message : String(strictError);
189
+ if (!isStrictSchemaRejection(message))
190
+ throw strictError;
191
+ stream = await client.messages.create(buildAnthropicParams(model, req));
192
+ }
193
+ }
194
+ else {
195
+ stream = await client.messages.create(buildAnthropicParams(model, req));
196
+ }
197
+ const events = stream;
198
+ // Caller-supplied tools (spec §4.4) live on the non-structured path:
199
+ // accumulate each `tool_use` block's input_json_delta by block index.
200
+ const wantTools = req.outputSchema === null && req.tools !== undefined && req.tools.length > 0;
201
+ const toolBlocks = new Map();
202
+ let text = "";
203
+ // Input-side usage, normalized at message_start (subset invariant +
204
+ // research §4 tokensIn fix + 5m/1h split live in normalizeAnthropicInputUsage).
205
+ let inputUsage = {
206
+ tokensIn: 0,
207
+ tokensCached: 0,
208
+ tokensCacheWrite: 0,
209
+ tokensCacheWrite1h: 0,
210
+ };
211
+ let completionTokens = 0;
212
+ let stopReason = null;
213
+ for await (const event of events) {
214
+ if (event.type === "message_start" && event.message?.usage !== undefined) {
215
+ inputUsage = normalizeAnthropicInputUsage(event.message.usage);
216
+ }
217
+ else if (event.type === "content_block_start" &&
218
+ wantTools &&
219
+ event.content_block?.type === "tool_use") {
220
+ toolBlocks.set(event.index ?? 0, {
221
+ id: event.content_block.id ?? "",
222
+ name: event.content_block.name ?? "",
223
+ json: "",
224
+ });
225
+ }
226
+ else if (event.type === "content_block_delta") {
227
+ // Tools path: input_json_delta is the tool's arguments, per block.
228
+ // Schema path: the forced tool's input_json_delta IS the output.
229
+ // Plain path: text deltas. Never mix the buffers.
230
+ if (wantTools && event.delta?.type === "input_json_delta" && event.delta.partial_json) {
231
+ const blk = toolBlocks.get(event.index ?? 0);
232
+ if (blk !== undefined)
233
+ blk.json += event.delta.partial_json;
234
+ }
235
+ else if (wantJson && event.delta?.type === "input_json_delta" && event.delta.partial_json) {
236
+ text += event.delta.partial_json;
237
+ }
238
+ else if (event.delta?.type === "text_delta" && event.delta.text) {
239
+ text += event.delta.text;
240
+ }
241
+ }
242
+ else if (event.type === "message_delta") {
243
+ if (event.usage?.output_tokens !== undefined) {
244
+ completionTokens = event.usage.output_tokens;
245
+ }
246
+ if (event.delta?.stop_reason)
247
+ stopReason = event.delta.stop_reason;
248
+ }
249
+ }
250
+ // Anthropic has no service tiers on this path — served is standard.
251
+ // The input side (tokensIn incl. cached+write, the write buckets) was
252
+ // normalized by normalizeAnthropicInputUsage (research §4 fix).
253
+ const usage = {
254
+ ...inputUsage,
255
+ tokensOut: completionTokens,
256
+ servedTier: "standard",
257
+ };
258
+ // Tool-call turn (spec §4.4): `arguments` is the raw JSON string the
259
+ // model streamed (OpenAI parity) — text may be empty, skip the guards.
260
+ if (wantTools && toolBlocks.size > 0) {
261
+ const toolCalls = [...toolBlocks.values()].map((b, i) => ({
262
+ id: b.id !== "" ? b.id : `call_${i}`,
263
+ type: "function",
264
+ function: { name: b.name, arguments: b.json === "" ? "{}" : b.json },
265
+ }));
266
+ return { ok: true, text, usage, toolCalls };
267
+ }
268
+ if (stopReason === "refusal") {
269
+ return fail("refusal", "Anthropic refused this request (stop_reason=refusal)", undefined, usage);
270
+ }
271
+ if (text.trim().length === 0) {
272
+ return fail("content_invalid", `empty response from Anthropic (stop_reason=${stopReason ?? "none"})`, undefined, usage);
273
+ }
274
+ if (stopReason === "max_tokens" && wantJson) {
275
+ return fail("content_invalid", "Anthropic structured output truncated (stop_reason=max_tokens)", "raise maxOutputTokens for this route", usage);
276
+ }
277
+ return { ok: true, text, usage };
278
+ }
279
+ catch (error) {
280
+ const message = error instanceof Error ? error.message : String(error);
281
+ const { cls, fixHint } = classifyAnthropicFailure(message);
282
+ return {
283
+ ok: false,
284
+ failure: {
285
+ class: cls,
286
+ message,
287
+ provider: "anthropic",
288
+ model,
289
+ cause: error,
290
+ ...(fixHint !== undefined ? { fixHint } : {}),
291
+ },
292
+ };
293
+ }
294
+ },
295
+ };
296
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Build the provider-adapter map from resolved config + registry facts.
3
+ * Extracted from index.ts (the SDK entrypoint) so that file stays under the LOC
4
+ * cap — the same reason wireRigArtifacts / buildExportedRouteMirrors live apart.
5
+ * Mechanical, one caller; behaviour is byte-identical to the prior inline block.
6
+ */
7
+ import type { RigConfig } from "../config";
8
+ import type { RegistryFacts } from "../registry/facts";
9
+ import type { CapabilityFlag, ProviderAdapter } from "../types/provider";
10
+ export declare function buildAdapters(config: RigConfig, registryFacts: RegistryFacts, compatStatic: ReadonlySet<CapabilityFlag>): Map<string, ProviderAdapter>;
11
+ //# sourceMappingURL=build-adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-adapters.d.ts","sourceRoot":"","sources":["../../src/adapters/build-adapters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAQzE,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,WAAW,CAAC,cAAc,CAAC,GACxC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CA6B9B"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ /**
3
+ * Build the provider-adapter map from resolved config + registry facts.
4
+ * Extracted from index.ts (the SDK entrypoint) so that file stays under the LOC
5
+ * cap — the same reason wireRigArtifacts / buildExportedRouteMirrors live apart.
6
+ * Mechanical, one caller; behaviour is byte-identical to the prior inline block.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.buildAdapters = buildAdapters;
10
+ const anthropic_1 = require("./anthropic");
11
+ const deepseek_1 = require("./deepseek");
12
+ const gemini_1 = require("./gemini");
13
+ const grok_1 = require("./grok");
14
+ const openai_1 = require("./openai");
15
+ const openai_compat_1 = require("./openai-compat");
16
+ function buildAdapters(config, registryFacts, compatStatic) {
17
+ const adapters = new Map();
18
+ if (config.keys.gemini)
19
+ adapters.set("gemini", (0, gemini_1.createGeminiAdapter)({ apiKey: config.keys.gemini }));
20
+ if (config.keys.openai)
21
+ adapters.set("openai", (0, openai_1.createOpenAIAdapter)({ apiKey: config.keys.openai }));
22
+ if (config.keys.deepseek) {
23
+ adapters.set("deepseek", (0, deepseek_1.createDeepSeekAdapter)({ apiKey: config.keys.deepseek }));
24
+ }
25
+ if (config.keys.anthropic) {
26
+ adapters.set("anthropic", (0, anthropic_1.createAnthropicAdapter)({ apiKey: config.keys.anthropic }));
27
+ }
28
+ if (config.keys.grok)
29
+ adapters.set("grok", (0, grok_1.createGrokAdapter)({ apiKey: config.keys.grok }));
30
+ // A1 aggregator hosts behind the generic openai-compatible adapter.
31
+ for (const hostId of ["deepinfra", "fireworks"]) {
32
+ const apiKey = config.keys[hostId];
33
+ if (!apiKey)
34
+ continue;
35
+ const host = openai_compat_1.OPENAI_COMPAT_HOSTS[hostId];
36
+ adapters.set(hostId, (0, openai_compat_1.createOpenAICompatAdapter)({
37
+ providerId: hostId,
38
+ baseUrl: host.baseUrl,
39
+ apiKey,
40
+ ...(host.shapeModelId !== undefined ? { shapeModelId: host.shapeModelId } : {}),
41
+ capabilityProfile: (model) => registryFacts.flagsFor(hostId, model, compatStatic) ?? compatStatic,
42
+ }));
43
+ }
44
+ return adapters;
45
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * DeepSeek ProviderAdapter — plan step 5 (sanctioned cut if C1 date at risk).
3
+ * Transformation logic ported from apps/api/src/services/deepseek-provider.ts:
4
+ * OpenAI-compatible API at api.deepseek.com, json_object forcing (DeepSeek has
5
+ * NO native strict json_schema — the run loop's json_mode path injects the
6
+ * schema-coached prompt; this adapter receives it already coached),
7
+ * prompt_cache_hit_tokens accounting, reasoning_content excluded from the
8
+ * JSON buffer (only delta.content is accumulated).
9
+ * NOT ported: logging, pricing tables, env reads, the analyst-persona prompt.
10
+ *
11
+ * Portions may be derived from LiteLLM (https://github.com/BerriAI/litellm),
12
+ * Copyright (c) 2023 Berri AI, MIT License — retain this notice if LiteLLM's
13
+ * deepseek transformation logic is consulted during the port.
14
+ */
15
+ import type { CapabilityFlag, ProviderAdapter } from "../types/provider";
16
+ import type { ClassifiedFailure, ShapingInput } from "./gemini";
17
+ import type { OpenAIWireTool, OpenAIWireToolChoice } from "./tool-mapping";
18
+ export interface DeepSeekAdapterConfig {
19
+ readonly apiKey: string;
20
+ }
21
+ export declare function deepseekSupports(feature: CapabilityFlag, model: string): boolean;
22
+ export declare function classifyDeepSeekFailure(message: string): ClassifiedFailure;
23
+ interface ChatMessage {
24
+ readonly role: "system" | "user";
25
+ readonly content: string;
26
+ }
27
+ export interface DeepSeekShapedParams {
28
+ readonly model: string;
29
+ readonly max_tokens: number;
30
+ readonly messages: readonly ChatMessage[];
31
+ readonly stream: true;
32
+ readonly stream_options: {
33
+ readonly include_usage: true;
34
+ };
35
+ /** CE-6 declared sampling — present only when the route/raw asks for them. */
36
+ readonly temperature?: number;
37
+ readonly top_p?: number;
38
+ readonly response_format?: {
39
+ readonly type: "json_object";
40
+ };
41
+ readonly tools?: readonly OpenAIWireTool[];
42
+ readonly tool_choice?: OpenAIWireToolChoice;
43
+ }
44
+ export declare function buildDeepSeekParams(model: string, req: ShapingInput): DeepSeekShapedParams;
45
+ export declare function createDeepSeekAdapter(config: DeepSeekAdapterConfig): ProviderAdapter;
46
+ export {};
47
+ //# sourceMappingURL=deepseek.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek.d.ts","sourceRoot":"","sources":["../../src/adapters/deepseek.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAIV,cAAc,EACd,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAMhE,OAAO,KAAK,EAAuB,cAAc,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAMhG,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAKD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAMhF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAiB1E;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE;QAAE,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAA;KAAE,CAAC;IAC1D,8EAA8E;IAC9E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;KAAE,CAAC;IAC5D,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAOD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,oBAAoB,CA2B1F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CA8JpF"}
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ /**
3
+ * DeepSeek ProviderAdapter — plan step 5 (sanctioned cut if C1 date at risk).
4
+ * Transformation logic ported from apps/api/src/services/deepseek-provider.ts:
5
+ * OpenAI-compatible API at api.deepseek.com, json_object forcing (DeepSeek has
6
+ * NO native strict json_schema — the run loop's json_mode path injects the
7
+ * schema-coached prompt; this adapter receives it already coached),
8
+ * prompt_cache_hit_tokens accounting, reasoning_content excluded from the
9
+ * JSON buffer (only delta.content is accumulated).
10
+ * NOT ported: logging, pricing tables, env reads, the analyst-persona prompt.
11
+ *
12
+ * Portions may be derived from LiteLLM (https://github.com/BerriAI/litellm),
13
+ * Copyright (c) 2023 Berri AI, MIT License — retain this notice if LiteLLM's
14
+ * deepseek transformation logic is consulted during the port.
15
+ */
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.deepseekSupports = deepseekSupports;
21
+ exports.classifyDeepSeekFailure = classifyDeepSeekFailure;
22
+ exports.buildDeepSeekParams = buildDeepSeekParams;
23
+ exports.createDeepSeekAdapter = createDeepSeekAdapter;
24
+ const openai_1 = __importDefault(require("openai"));
25
+ const tool_mapping_1 = require("./tool-mapping");
26
+ const openai_stream_1 = require("./openai-stream");
27
+ const sampling_1 = require("./sampling");
28
+ const DEEPSEEK_BASE_URL = "https://api.deepseek.com";
29
+ const DEFAULT_MAX_TOKENS = 64000; // R1/V3 max — full capacity for long reports (ported)
30
+ function deepseekSupports(feature, model) {
31
+ if (feature === "trace_visible") {
32
+ // Reasoner models stream reasoning_content — the trace IS caller-visible.
33
+ return model.includes("reasoner");
34
+ }
35
+ return feature === "json_mode" || feature === "prefix_cache_implicit";
36
+ }
37
+ function classifyDeepSeekFailure(message) {
38
+ const msg = message.toLowerCase();
39
+ if (/\b429\b|rate limit|\brate\b/.test(msg))
40
+ return { cls: "capacity_shed" };
41
+ if (/\b50[023]\b|service unavailable|overloaded/.test(msg))
42
+ return { cls: "capacity_shed" };
43
+ if (/timeout|etimedout|abort/.test(msg))
44
+ return { cls: "timeout" };
45
+ if (/econnreset|econnrefused|enotfound|fetch failed|network/.test(msg))
46
+ return { cls: "network" };
47
+ if (/\b401\b|api key/.test(msg)) {
48
+ // F2: non-retryable — a dead key never burns backoff retries.
49
+ return { cls: "config_auth", fixHint: "check the DeepSeek API key configured for this rig" };
50
+ }
51
+ if (/not found|does not exist/.test(msg)) {
52
+ return {
53
+ cls: "network",
54
+ fixHint: "the candidate model was not found — fix the model id in the route's candidate list",
55
+ };
56
+ }
57
+ return { cls: "network" };
58
+ }
59
+ /** DeepSeek's json_object mode 400s when the literal word "JSON" appears
60
+ * nowhere in the prompt. The run loop's coached prompt normally guarantees
61
+ * it; this one-line guard is the adapter's belt-and-suspenders (ported). */
62
+ const JSON_GUARD = "Respond with a single valid JSON object.";
63
+ function buildDeepSeekParams(model, req) {
64
+ const wantJson = req.outputSchema !== null;
65
+ let systemPrompt = req.systemPrompt;
66
+ if (wantJson && !req.systemPrompt.includes("JSON") && !req.userPrompt.includes("JSON")) {
67
+ systemPrompt = systemPrompt === "" ? JSON_GUARD : `${systemPrompt}\n\n${JSON_GUARD}`;
68
+ }
69
+ const messages = [
70
+ ...(systemPrompt !== "" ? [{ role: "system", content: systemPrompt }] : []),
71
+ { role: "user", content: req.userPrompt },
72
+ ];
73
+ return {
74
+ model,
75
+ max_tokens: (0, sampling_1.effectiveMaxOutputTokens)(req, DEFAULT_MAX_TOKENS),
76
+ messages,
77
+ stream: true,
78
+ stream_options: { include_usage: true },
79
+ ...(0, sampling_1.openAISamplingFields)(req),
80
+ ...(wantJson ? { response_format: { type: "json_object" } } : {}),
81
+ ...(req.tools !== undefined && req.tools.length > 0
82
+ ? {
83
+ tools: (0, tool_mapping_1.toOpenAITools)(req.tools),
84
+ ...((0, tool_mapping_1.toOpenAIToolChoice)(req.toolChoice) !== undefined
85
+ ? { tool_choice: (0, tool_mapping_1.toOpenAIToolChoice)(req.toolChoice) }
86
+ : {}),
87
+ }
88
+ : {}),
89
+ };
90
+ }
91
+ function createDeepSeekAdapter(config) {
92
+ return {
93
+ id: "deepseek",
94
+ supports: deepseekSupports,
95
+ supportsTools: () => true,
96
+ async call(req) {
97
+ const model = req.candidate.model;
98
+ // F1: post-stream failures still billed tokens — attach usage.
99
+ const fail = (cls, message, fixHint, usage) => ({
100
+ ok: false,
101
+ failure: {
102
+ class: cls,
103
+ message,
104
+ provider: "deepseek",
105
+ model,
106
+ ...(fixHint !== undefined ? { fixHint } : {}),
107
+ },
108
+ ...(usage !== undefined ? { usage } : {}),
109
+ });
110
+ try {
111
+ const client = new openai_1.default({
112
+ apiKey: config.apiKey,
113
+ baseURL: DEEPSEEK_BASE_URL,
114
+ timeout: req.timeoutMs,
115
+ });
116
+ const params = buildDeepSeekParams(model, req);
117
+ const dispatchedAt = Date.now();
118
+ const stream = await client.chat.completions.create(params);
119
+ let text = "";
120
+ let promptTokens = 0;
121
+ let completionTokens = 0;
122
+ let cachedTokens = 0;
123
+ let finishReason = null;
124
+ // TTFB (Phase 4 WS3): first streamed chunk = first body byte.
125
+ let ttfbMs;
126
+ const toolCallAcc = (0, tool_mapping_1.createOpenAIToolCallAccumulator)();
127
+ // Only delta.content is accumulated — a reasoner's reasoning_content
128
+ // (chain-of-thought) must never leak into the JSON buffer (ported).
129
+ for await (const chunk of stream) {
130
+ if (ttfbMs === undefined)
131
+ ttfbMs = Date.now() - dispatchedAt;
132
+ const choice = chunk.choices[0];
133
+ if (choice?.delta?.content)
134
+ text += choice.delta.content;
135
+ toolCallAcc.push(choice?.delta?.tool_calls);
136
+ if (choice?.finish_reason)
137
+ finishReason = choice.finish_reason;
138
+ if (chunk.usage) {
139
+ promptTokens = chunk.usage.prompt_tokens ?? 0;
140
+ completionTokens = chunk.usage.completion_tokens ?? 0;
141
+ // DeepSeek's automatic prefix cache: tokens billed ~10x cheaper.
142
+ cachedTokens = chunk.usage.prompt_cache_hit_tokens ?? 0;
143
+ }
144
+ }
145
+ // DeepSeek has no service tiers — served is always standard.
146
+ const usage = {
147
+ tokensIn: promptTokens,
148
+ tokensOut: completionTokens,
149
+ tokensCached: cachedTokens,
150
+ servedTier: "standard",
151
+ ...(ttfbMs !== undefined ? { ttfbMs } : {}),
152
+ };
153
+ // Tool-call turn (spec §4.4): surface normalized calls, skip content guards.
154
+ const toolCalls = toolCallAcc.finalize();
155
+ if (toolCalls !== undefined) {
156
+ return { ok: true, text, usage, toolCalls };
157
+ }
158
+ if (text.trim().length === 0) {
159
+ return fail("content_invalid", `empty response from DeepSeek (finish_reason=${finishReason ?? "none"})`, undefined, usage);
160
+ }
161
+ if (finishReason === "length" && req.outputSchema !== null) {
162
+ return fail("content_invalid", "DeepSeek JSON output truncated (finish_reason=length)", "raise maxOutputTokens for this route", usage);
163
+ }
164
+ return { ok: true, text, usage };
165
+ }
166
+ catch (error) {
167
+ const message = error instanceof Error ? error.message : String(error);
168
+ const { cls, fixHint } = classifyDeepSeekFailure(message);
169
+ return {
170
+ ok: false,
171
+ failure: {
172
+ class: cls,
173
+ message,
174
+ provider: "deepseek",
175
+ model,
176
+ cause: error,
177
+ ...(fixHint !== undefined ? { fixHint } : {}),
178
+ },
179
+ };
180
+ }
181
+ },
182
+ async *stream(req) {
183
+ const model = req.candidate.model;
184
+ try {
185
+ const client = new openai_1.default({ apiKey: config.apiKey, baseURL: DEEPSEEK_BASE_URL, timeout: req.timeoutMs });
186
+ const params = buildDeepSeekParams(model, req);
187
+ const dispatchedAt = Date.now();
188
+ const stream = await client.chat.completions.create(params);
189
+ // DeepSeek: cached tokens surface as prompt_cache_hit_tokens; no tiers.
190
+ yield* (0, openai_stream_1.streamOpenAIDialect)(stream, req, dispatchedAt, {
191
+ provider: "deepseek",
192
+ cachedTokenSource: "cache_hit",
193
+ mapServedTier: () => "standard",
194
+ });
195
+ }
196
+ catch (error) {
197
+ const message = error instanceof Error ? error.message : String(error);
198
+ const { cls, fixHint } = classifyDeepSeekFailure(message);
199
+ yield {
200
+ kind: "final",
201
+ result: {
202
+ ok: false,
203
+ failure: {
204
+ class: cls,
205
+ message,
206
+ provider: "deepseek",
207
+ model,
208
+ cause: error,
209
+ ...(fixHint !== undefined ? { fixHint } : {}),
210
+ },
211
+ },
212
+ };
213
+ }
214
+ },
215
+ };
216
+ }