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,80 @@
1
+ /**
2
+ * Generic openai-compatible adapter — Phase 4 addendum A1
3
+ * (provider-coverage-plan §1: "the DeepSeek adapter is its
4
+ * parameterization"). One adapter covers every OpenAI-dialect host; what
5
+ * varies is INJECTED: base URL, auth key, model-id shaping, and — the
6
+ * doctrine part — the per-model capability profile READ FROM THE REGISTRY.
7
+ * Speaking the dialect proves nothing: strict schema enforcement, caching,
8
+ * grounding are all probe-established facts, never dialect assumptions.
9
+ *
10
+ * Host quirks referenced from LiteLLM's per-provider transformation modules
11
+ * (vendor/litellm-upstream/litellm/llms/{deepinfra,fireworks_ai}/):
12
+ * DeepInfra base URL https://api.deepinfra.com/v1/openai (standard Bearer,
13
+ * OpenAI params incl. response_format); Fireworks base URL
14
+ * https://api.fireworks.ai/inference/v1 with model ids on the wire as
15
+ * accounts/fireworks/models/<short>.
16
+ * Portions derived from LiteLLM (https://github.com/BerriAI/litellm),
17
+ * Copyright (c) 2023 Berri AI, MIT License — retained per
18
+ * litellm-vendoring-strategy.md.
19
+ */
20
+ import type { CapabilityFlag, ProviderAdapter, ProviderId } from "../types/provider";
21
+ import type { ClassifiedFailure, ShapingInput } from "./gemini";
22
+ import type { OpenAIWireTool, OpenAIWireToolChoice } from "./tool-mapping";
23
+ /** Fireworks serves models at accounts/fireworks/models/<short> — routes
24
+ * declare the short name; the wire gets the full path (LiteLLM
25
+ * fireworks_ai transformation, harvested). */
26
+ export declare function shapeFireworksModelId(model: string): string;
27
+ export interface OpenAICompatHost {
28
+ readonly baseUrl: string;
29
+ readonly shapeModelId?: (model: string) => string;
30
+ }
31
+ /** The researched Tier-2 hosts (provider-coverage-plan §2, architect pick
32
+ * 2026-08-02): DeepInfra (widest open catalog, lowest price) + Fireworks
33
+ * (SOC 2/HIPAA reliability counterweight). Same weights on both on purpose
34
+ * — host-level conformance/latency/price deltas become registry facts. */
35
+ export declare const OPENAI_COMPAT_HOSTS: Readonly<Record<"deepinfra" | "fireworks", OpenAICompatHost>>;
36
+ export declare function classifyCompatFailure(message: string, host: string): ClassifiedFailure;
37
+ interface ChatMessage {
38
+ readonly role: "system" | "user";
39
+ readonly content: string;
40
+ }
41
+ export interface OpenAICompatShapedParams {
42
+ readonly model: string;
43
+ readonly max_tokens: number;
44
+ readonly messages: readonly ChatMessage[];
45
+ readonly stream: true;
46
+ readonly stream_options: {
47
+ readonly include_usage: true;
48
+ };
49
+ /** CE-6 declared sampling — present only when the route/raw asks for them. */
50
+ readonly temperature?: number;
51
+ readonly top_p?: number;
52
+ readonly response_format?: {
53
+ readonly type: "json_object";
54
+ } | {
55
+ readonly type: "json_schema";
56
+ readonly json_schema: {
57
+ readonly name: string;
58
+ readonly strict: true;
59
+ readonly schema: object;
60
+ };
61
+ };
62
+ readonly tools?: readonly OpenAIWireTool[];
63
+ readonly tool_choice?: OpenAIWireToolChoice;
64
+ }
65
+ /** Pure request shaping. The PROFILE decides the wire shape: strict
66
+ * json_schema only when the registry granted structured_native for this
67
+ * model; else json_object (ajv still arbitrates above). */
68
+ export declare function buildOpenAICompatParams(model: string, req: ShapingInput, profileFlags: ReadonlySet<CapabilityFlag>): OpenAICompatShapedParams;
69
+ export interface OpenAICompatAdapterConfig {
70
+ readonly providerId: ProviderId;
71
+ readonly baseUrl: string;
72
+ readonly apiKey: string;
73
+ readonly shapeModelId?: (model: string) => string;
74
+ /** Registry-fed per-model capability flags — the ONLY capability source.
75
+ * The conservative dialect baseline is json_mode alone. */
76
+ readonly capabilityProfile: (model: string) => ReadonlySet<CapabilityFlag>;
77
+ }
78
+ export declare function createOpenAICompatAdapter(config: OpenAICompatAdapterConfig): ProviderAdapter;
79
+ export {};
80
+ //# sourceMappingURL=openai-compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compat.d.ts","sourceRoot":"","sources":["../../src/adapters/openai-compat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAIV,cAAc,EACd,eAAe,EACf,UAAU,EACX,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;AAQhG;;8CAE8C;AAC9C,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACnD;AAED;;;0EAG0E;AAC1E,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,GAAG,WAAW,EAAE,gBAAgB,CAAC,CAG7F,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAiBtF;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,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,EACrB;QAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;KAAE,GAChC;QACE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;QAC7B,QAAQ,CAAC,WAAW,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KACjG,CAAC;IACN,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAOD;;2DAE2D;AAC3D,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,YAAY,EACjB,YAAY,EAAE,WAAW,CAAC,cAAc,CAAC,GACxC,wBAAwB,CAqC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD;+DAC2D;IAC3D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC,cAAc,CAAC,CAAC;CAC5E;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,yBAAyB,GAAG,eAAe,CAwK5F"}
@@ -0,0 +1,244 @@
1
+ "use strict";
2
+ /**
3
+ * Generic openai-compatible adapter — Phase 4 addendum A1
4
+ * (provider-coverage-plan §1: "the DeepSeek adapter is its
5
+ * parameterization"). One adapter covers every OpenAI-dialect host; what
6
+ * varies is INJECTED: base URL, auth key, model-id shaping, and — the
7
+ * doctrine part — the per-model capability profile READ FROM THE REGISTRY.
8
+ * Speaking the dialect proves nothing: strict schema enforcement, caching,
9
+ * grounding are all probe-established facts, never dialect assumptions.
10
+ *
11
+ * Host quirks referenced from LiteLLM's per-provider transformation modules
12
+ * (vendor/litellm-upstream/litellm/llms/{deepinfra,fireworks_ai}/):
13
+ * DeepInfra base URL https://api.deepinfra.com/v1/openai (standard Bearer,
14
+ * OpenAI params incl. response_format); Fireworks base URL
15
+ * https://api.fireworks.ai/inference/v1 with model ids on the wire as
16
+ * accounts/fireworks/models/<short>.
17
+ * Portions derived from LiteLLM (https://github.com/BerriAI/litellm),
18
+ * Copyright (c) 2023 Berri AI, MIT License — retained per
19
+ * litellm-vendoring-strategy.md.
20
+ */
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.OPENAI_COMPAT_HOSTS = void 0;
26
+ exports.shapeFireworksModelId = shapeFireworksModelId;
27
+ exports.classifyCompatFailure = classifyCompatFailure;
28
+ exports.buildOpenAICompatParams = buildOpenAICompatParams;
29
+ exports.createOpenAICompatAdapter = createOpenAICompatAdapter;
30
+ const openai_1 = __importDefault(require("openai"));
31
+ const tool_mapping_1 = require("./tool-mapping");
32
+ const openai_stream_1 = require("./openai-stream");
33
+ const sampling_1 = require("./sampling");
34
+ const DEFAULT_MAX_TOKENS = 32000;
35
+ /** Fireworks serves models at accounts/fireworks/models/<short> — routes
36
+ * declare the short name; the wire gets the full path (LiteLLM
37
+ * fireworks_ai transformation, harvested). */
38
+ function shapeFireworksModelId(model) {
39
+ return model.startsWith("accounts/") ? model : `accounts/fireworks/models/${model}`;
40
+ }
41
+ /** The researched Tier-2 hosts (provider-coverage-plan §2, architect pick
42
+ * 2026-08-02): DeepInfra (widest open catalog, lowest price) + Fireworks
43
+ * (SOC 2/HIPAA reliability counterweight). Same weights on both on purpose
44
+ * — host-level conformance/latency/price deltas become registry facts. */
45
+ exports.OPENAI_COMPAT_HOSTS = {
46
+ deepinfra: { baseUrl: "https://api.deepinfra.com/v1/openai" },
47
+ fireworks: { baseUrl: "https://api.fireworks.ai/inference/v1", shapeModelId: shapeFireworksModelId },
48
+ };
49
+ function classifyCompatFailure(message, host) {
50
+ const msg = message.toLowerCase();
51
+ if (/\b429\b|rate limit|\brate\b/.test(msg))
52
+ return { cls: "capacity_shed" };
53
+ if (/\b50[023]\b|service unavailable|overloaded/.test(msg))
54
+ return { cls: "capacity_shed" };
55
+ if (/timeout|etimedout|abort/.test(msg))
56
+ return { cls: "timeout" };
57
+ if (/econnreset|econnrefused|enotfound|fetch failed|network/.test(msg))
58
+ return { cls: "network" };
59
+ if (/\b401\b|\b403\b|api key|unauthorized/.test(msg)) {
60
+ // F2: non-retryable — a dead key never burns backoff retries.
61
+ return { cls: "config_auth", fixHint: `check the ${host} API key configured for this rig` };
62
+ }
63
+ if (/not found|does not exist/.test(msg)) {
64
+ return {
65
+ cls: "network",
66
+ fixHint: "the candidate model was not found — fix the model id in the route's candidate list",
67
+ };
68
+ }
69
+ return { cls: "network" };
70
+ }
71
+ /** json_object mode 400s on several compat backends when the literal word
72
+ * "JSON" appears nowhere in the prompt (the DeepSeek-family quirk; coached
73
+ * prompts normally guarantee it — this is belt-and-suspenders). */
74
+ const JSON_GUARD = "Respond with a single valid JSON object.";
75
+ /** Pure request shaping. The PROFILE decides the wire shape: strict
76
+ * json_schema only when the registry granted structured_native for this
77
+ * model; else json_object (ajv still arbitrates above). */
78
+ function buildOpenAICompatParams(model, req, profileFlags) {
79
+ const wantJson = req.outputSchema !== null;
80
+ const strict = wantJson && profileFlags.has("structured_native");
81
+ let systemPrompt = req.systemPrompt;
82
+ if (wantJson && !strict && !req.systemPrompt.includes("JSON") && !req.userPrompt.includes("JSON")) {
83
+ systemPrompt = systemPrompt === "" ? JSON_GUARD : `${systemPrompt}\n\n${JSON_GUARD}`;
84
+ }
85
+ const messages = [
86
+ ...(systemPrompt !== "" ? [{ role: "system", content: systemPrompt }] : []),
87
+ { role: "user", content: req.userPrompt },
88
+ ];
89
+ return {
90
+ model,
91
+ max_tokens: (0, sampling_1.effectiveMaxOutputTokens)(req, DEFAULT_MAX_TOKENS),
92
+ messages,
93
+ stream: true,
94
+ stream_options: { include_usage: true },
95
+ ...(0, sampling_1.openAISamplingFields)(req),
96
+ ...(wantJson
97
+ ? strict
98
+ ? {
99
+ response_format: {
100
+ type: "json_schema",
101
+ json_schema: { name: "output", strict: true, schema: req.outputSchema },
102
+ },
103
+ }
104
+ : { response_format: { type: "json_object" } }
105
+ : {}),
106
+ ...(req.tools !== undefined && req.tools.length > 0
107
+ ? {
108
+ tools: (0, tool_mapping_1.toOpenAITools)(req.tools),
109
+ ...((0, tool_mapping_1.toOpenAIToolChoice)(req.toolChoice) !== undefined
110
+ ? { tool_choice: (0, tool_mapping_1.toOpenAIToolChoice)(req.toolChoice) }
111
+ : {}),
112
+ }
113
+ : {}),
114
+ };
115
+ }
116
+ function createOpenAICompatAdapter(config) {
117
+ const shapeModel = config.shapeModelId ?? ((m) => m);
118
+ return {
119
+ id: config.providerId,
120
+ supports(feature, model) {
121
+ return config.capabilityProfile(model).has(feature);
122
+ },
123
+ supportsTools: () => true,
124
+ async call(req) {
125
+ const model = req.candidate.model;
126
+ const fail = (cls, message, fixHint, usage) => ({
127
+ ok: false,
128
+ failure: {
129
+ class: cls,
130
+ message,
131
+ provider: config.providerId,
132
+ model,
133
+ ...(fixHint !== undefined ? { fixHint } : {}),
134
+ },
135
+ ...(usage !== undefined ? { usage } : {}),
136
+ });
137
+ try {
138
+ const client = new openai_1.default({
139
+ apiKey: config.apiKey,
140
+ baseURL: config.baseUrl,
141
+ timeout: req.timeoutMs,
142
+ });
143
+ const params = buildOpenAICompatParams(shapeModel(model), req, config.capabilityProfile(model));
144
+ const dispatchedAt = Date.now();
145
+ const stream = await client.chat.completions.create(params);
146
+ let text = "";
147
+ let promptTokens = 0;
148
+ let completionTokens = 0;
149
+ let cachedTokens = 0;
150
+ let cacheWriteTokens = 0;
151
+ let finishReason = null;
152
+ // TTFB (Phase 4 WS3): first streamed chunk = first body byte.
153
+ let ttfbMs;
154
+ const toolCallAcc = (0, tool_mapping_1.createOpenAIToolCallAccumulator)();
155
+ for await (const chunk of stream) {
156
+ if (ttfbMs === undefined)
157
+ ttfbMs = Date.now() - dispatchedAt;
158
+ const choice = chunk.choices[0];
159
+ if (choice?.delta?.content)
160
+ text += choice.delta.content;
161
+ toolCallAcc.push(choice?.delta?.tool_calls);
162
+ if (choice?.finish_reason)
163
+ finishReason = choice.finish_reason;
164
+ if (chunk.usage) {
165
+ promptTokens = chunk.usage.prompt_tokens ?? 0;
166
+ completionTokens = chunk.usage.completion_tokens ?? 0;
167
+ cachedTokens = chunk.usage.prompt_tokens_details?.cached_tokens ?? 0;
168
+ cacheWriteTokens = chunk.usage.input_tokens_details?.cache_write_tokens ?? 0;
169
+ }
170
+ }
171
+ // Hosts have no service tiers in this dialect — standard, always.
172
+ // prompt_tokens already INCLUDES cached → tokensIn is subset-correct.
173
+ const usage = {
174
+ tokensIn: promptTokens,
175
+ tokensOut: completionTokens,
176
+ tokensCached: cachedTokens,
177
+ tokensCacheWrite: cacheWriteTokens,
178
+ servedTier: "standard",
179
+ ...(ttfbMs !== undefined ? { ttfbMs } : {}),
180
+ };
181
+ // Tool-call turn (spec §4.4): surface normalized calls, skip content guards.
182
+ const toolCalls = toolCallAcc.finalize();
183
+ if (toolCalls !== undefined) {
184
+ return { ok: true, text, usage, toolCalls };
185
+ }
186
+ if (text.trim().length === 0) {
187
+ return fail("content_invalid", `empty response from ${config.providerId} (finish_reason=${finishReason ?? "none"})`, undefined, usage);
188
+ }
189
+ if (finishReason === "length" && req.outputSchema !== null) {
190
+ return fail("content_invalid", `${config.providerId} JSON output truncated (finish_reason=length)`, "raise maxOutputTokens for this route", usage);
191
+ }
192
+ return { ok: true, text, usage };
193
+ }
194
+ catch (error) {
195
+ const message = error instanceof Error ? error.message : String(error);
196
+ const { cls, fixHint } = classifyCompatFailure(message, config.providerId);
197
+ return {
198
+ ok: false,
199
+ failure: {
200
+ class: cls,
201
+ message,
202
+ provider: config.providerId,
203
+ model,
204
+ cause: error,
205
+ ...(fixHint !== undefined ? { fixHint } : {}),
206
+ },
207
+ };
208
+ }
209
+ },
210
+ async *stream(req) {
211
+ const model = req.candidate.model;
212
+ try {
213
+ const client = new openai_1.default({ apiKey: config.apiKey, baseURL: config.baseUrl, timeout: req.timeoutMs });
214
+ const params = buildOpenAICompatParams(shapeModel(model), req, config.capabilityProfile(model));
215
+ const dispatchedAt = Date.now();
216
+ const stream = await client.chat.completions.create(params);
217
+ // Compat hosts have no service tiers in this dialect — standard, always.
218
+ yield* (0, openai_stream_1.streamOpenAIDialect)(stream, req, dispatchedAt, {
219
+ provider: config.providerId,
220
+ cachedTokenSource: "details",
221
+ mapServedTier: () => "standard",
222
+ });
223
+ }
224
+ catch (error) {
225
+ const message = error instanceof Error ? error.message : String(error);
226
+ const { cls, fixHint } = classifyCompatFailure(message, config.providerId);
227
+ yield {
228
+ kind: "final",
229
+ result: {
230
+ ok: false,
231
+ failure: {
232
+ class: cls,
233
+ message,
234
+ provider: config.providerId,
235
+ model,
236
+ cause: error,
237
+ ...(fixHint !== undefined ? { fixHint } : {}),
238
+ },
239
+ },
240
+ };
241
+ }
242
+ },
243
+ };
244
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Shared streaming loop for the OpenAI-dialect adapters (G-1/G-5 Phase A,
3
+ * spec §4.3). The openai / grok / deepseek / deepinfra / fireworks adapters all
4
+ * speak `client.chat.completions.create({ stream: true })`; this is the one
5
+ * place that drains such a stream into `AdapterStreamEvent`s — raw text deltas
6
+ * as they arrive, then a single terminal `final` carrying the same
7
+ * `AdapterResult` the adapter's buffered `call()` would return.
8
+ *
9
+ * ADDITIVE: `call()` is untouched. This powers the OPTIONAL `stream()` method
10
+ * the run loop uses only when a delta sink is wired (`rig.runStream`); every
11
+ * other path is byte-for-byte the pre-Phase-A behavior. Providers without a
12
+ * `stream()` (anthropic events / gemini non-streaming) fall back to buffered
13
+ * dispatch, which is the spec's sanctioned `buffered` mode.
14
+ */
15
+ import type { AdapterRequest, AdapterStreamEvent, ProviderId, ServiceTier } from "../types/provider";
16
+ import type { OpenAIToolCallDelta } from "./tool-mapping";
17
+ /** The permissive chunk shape common to the OpenAI-dialect hosts. */
18
+ export interface OpenAIDialectChunk {
19
+ readonly service_tier?: string;
20
+ readonly choices: Array<{
21
+ readonly delta?: {
22
+ readonly content?: string | null;
23
+ readonly refusal?: string | null;
24
+ readonly tool_calls?: readonly OpenAIToolCallDelta[];
25
+ };
26
+ readonly finish_reason?: string | null;
27
+ }>;
28
+ readonly usage?: {
29
+ readonly prompt_tokens?: number;
30
+ readonly completion_tokens?: number;
31
+ readonly prompt_tokens_details?: {
32
+ readonly cached_tokens?: number;
33
+ };
34
+ readonly prompt_cache_hit_tokens?: number;
35
+ /** Cache-WRITE tokens — GPT-5.6+ bills explicit writes at 1.25× and reports
36
+ * them here (spec §2 table). Absent on ≤5.5 (writes free) and every non-
37
+ * openai dialect host, so cache-write is 0 there. */
38
+ readonly input_tokens_details?: {
39
+ readonly cache_write_tokens?: number;
40
+ };
41
+ } | null;
42
+ }
43
+ export interface OpenAIStreamConfig {
44
+ readonly provider: ProviderId;
45
+ /** Where cached-token counts live in this dialect's usage block. */
46
+ readonly cachedTokenSource: "details" | "cache_hit";
47
+ /** Served-tier resolver (openai maps flex/priority; the rest are standard). */
48
+ readonly mapServedTier: (raw: string | null, requested: ServiceTier) => ServiceTier;
49
+ }
50
+ /**
51
+ * Drain an OpenAI-dialect completion stream into `AdapterStreamEvent`s. Emits a
52
+ * `delta` per content token, then exactly one `final`. The final result mirrors
53
+ * `call()`'s terminal decisions for the shared dialect: refusal → fail;
54
+ * tool-call turn → ok + normalized calls; empty → content_invalid; a
55
+ * schema-route truncation (`finish_reason=length`) → content_invalid.
56
+ */
57
+ export declare function streamOpenAIDialect(chunks: AsyncIterable<OpenAIDialectChunk>, req: AdapterRequest, dispatchedAt: number, cfg: OpenAIStreamConfig): AsyncGenerator<AdapterStreamEvent>;
58
+ //# sourceMappingURL=openai-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-stream.d.ts","sourceRoot":"","sources":["../../src/adapters/openai-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAElB,UAAU,EACV,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,qEAAqE;AACrE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;QACtB,QAAQ,CAAC,KAAK,CAAC,EAAE;YACf,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;SACtD,CAAC;QACF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACxC,CAAC,CAAC;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,qBAAqB,CAAC,EAAE;YAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACrE,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;QAC1C;;6DAEqD;QACrD,QAAQ,CAAC,oBAAoB,CAAC,EAAE;YAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1E,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,iBAAiB,EAAE,SAAS,GAAG,WAAW,CAAC;IACpD,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,WAAW,KAAK,WAAW,CAAC;CACrF;AAED;;;;;;GAMG;AACH,wBAAuB,mBAAmB,CACxC,MAAM,EAAE,aAAa,CAAC,kBAAkB,CAAC,EACzC,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,kBAAkB,GACtB,cAAc,CAAC,kBAAkB,CAAC,CAqGpC"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ /**
3
+ * Shared streaming loop for the OpenAI-dialect adapters (G-1/G-5 Phase A,
4
+ * spec §4.3). The openai / grok / deepseek / deepinfra / fireworks adapters all
5
+ * speak `client.chat.completions.create({ stream: true })`; this is the one
6
+ * place that drains such a stream into `AdapterStreamEvent`s — raw text deltas
7
+ * as they arrive, then a single terminal `final` carrying the same
8
+ * `AdapterResult` the adapter's buffered `call()` would return.
9
+ *
10
+ * ADDITIVE: `call()` is untouched. This powers the OPTIONAL `stream()` method
11
+ * the run loop uses only when a delta sink is wired (`rig.runStream`); every
12
+ * other path is byte-for-byte the pre-Phase-A behavior. Providers without a
13
+ * `stream()` (anthropic events / gemini non-streaming) fall back to buffered
14
+ * dispatch, which is the spec's sanctioned `buffered` mode.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.streamOpenAIDialect = streamOpenAIDialect;
18
+ const tool_mapping_1 = require("./tool-mapping");
19
+ /**
20
+ * Drain an OpenAI-dialect completion stream into `AdapterStreamEvent`s. Emits a
21
+ * `delta` per content token, then exactly one `final`. The final result mirrors
22
+ * `call()`'s terminal decisions for the shared dialect: refusal → fail;
23
+ * tool-call turn → ok + normalized calls; empty → content_invalid; a
24
+ * schema-route truncation (`finish_reason=length`) → content_invalid.
25
+ */
26
+ async function* streamOpenAIDialect(chunks, req, dispatchedAt, cfg) {
27
+ let ttfbMs;
28
+ let text = "";
29
+ let refusalText = "";
30
+ const toolCallAcc = (0, tool_mapping_1.createOpenAIToolCallAccumulator)();
31
+ let promptTokens = 0;
32
+ let completionTokens = 0;
33
+ let cachedTokens = 0;
34
+ let cacheWriteTokens = 0;
35
+ let responseTier = null;
36
+ let finishReason = null;
37
+ for await (const chunk of chunks) {
38
+ if (ttfbMs === undefined)
39
+ ttfbMs = Date.now() - dispatchedAt;
40
+ if (responseTier === null && chunk.service_tier !== undefined)
41
+ responseTier = chunk.service_tier;
42
+ const choice = chunk.choices[0];
43
+ const content = choice?.delta?.content;
44
+ if (content) {
45
+ text += content;
46
+ yield { kind: "delta", text: content };
47
+ }
48
+ if (typeof choice?.delta?.refusal === "string" && choice.delta.refusal.length > 0) {
49
+ refusalText += choice.delta.refusal;
50
+ }
51
+ toolCallAcc.push(choice?.delta?.tool_calls);
52
+ if (choice?.finish_reason)
53
+ finishReason = choice.finish_reason;
54
+ if (chunk.usage) {
55
+ promptTokens = chunk.usage.prompt_tokens ?? 0;
56
+ completionTokens = chunk.usage.completion_tokens ?? 0;
57
+ cachedTokens =
58
+ cfg.cachedTokenSource === "cache_hit"
59
+ ? chunk.usage.prompt_cache_hit_tokens ?? 0
60
+ : chunk.usage.prompt_tokens_details?.cached_tokens ?? 0;
61
+ // Cache-write (GPT-5.6+): 0 on every dialect that does not report it.
62
+ cacheWriteTokens = chunk.usage.input_tokens_details?.cache_write_tokens ?? 0;
63
+ }
64
+ }
65
+ // prompt_tokens already INCLUDES cached (and any write) on the OpenAI dialect,
66
+ // so tokensIn = promptTokens honors the subset invariant as-is. There is no 1h
67
+ // TTL tier on this dialect (OpenAI 5.6 writes are a single 30m tier) → 1h = 0.
68
+ const usage = {
69
+ tokensIn: promptTokens,
70
+ tokensOut: completionTokens,
71
+ tokensCached: cachedTokens,
72
+ tokensCacheWrite: cacheWriteTokens,
73
+ servedTier: cfg.mapServedTier(responseTier, req.requestedTier),
74
+ ...(ttfbMs !== undefined ? { ttfbMs } : {}),
75
+ };
76
+ const fail = (message, fixHint) => ({
77
+ kind: "final",
78
+ result: {
79
+ ok: false,
80
+ failure: {
81
+ class: "content_invalid",
82
+ message,
83
+ provider: cfg.provider,
84
+ model: req.candidate.model,
85
+ ...(fixHint !== undefined ? { fixHint } : {}),
86
+ },
87
+ usage,
88
+ },
89
+ });
90
+ if (refusalText.length > 0) {
91
+ yield {
92
+ kind: "final",
93
+ result: {
94
+ ok: false,
95
+ failure: {
96
+ class: "refusal",
97
+ message: `${cfg.provider} refused output: ${refusalText.slice(0, 200)}`,
98
+ provider: cfg.provider,
99
+ model: req.candidate.model,
100
+ },
101
+ usage,
102
+ },
103
+ };
104
+ return;
105
+ }
106
+ const toolCalls = toolCallAcc.finalize();
107
+ if (toolCalls !== undefined) {
108
+ yield { kind: "final", result: { ok: true, text, usage, toolCalls } };
109
+ return;
110
+ }
111
+ if (text.trim().length === 0) {
112
+ yield fail(`empty response from ${cfg.provider} (finish_reason=${finishReason ?? "none"})`);
113
+ return;
114
+ }
115
+ if (finishReason === "length" && req.outputSchema !== null) {
116
+ yield fail(`${cfg.provider} output truncated (finish_reason=length)`, "raise maxOutputTokens for this route");
117
+ return;
118
+ }
119
+ yield { kind: "final", result: { ok: true, text, usage } };
120
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * OpenAI ProviderAdapter — plan step 5.
3
+ * Transformation logic ported from apps/api/src/services/openai-provider.ts:
4
+ * response_format json_schema strict, service tiers (flex allowlist + served
5
+ * tier from the stream), prompt-cache key + retention passthrough, streaming
6
+ * with usage, structured-output refusal detection, suspicious-short guard.
7
+ * NOT ported: logging, pricing tables, env reads, the analyst-persona system
8
+ * prompt (route templates own prompt content).
9
+ *
10
+ * Portions may be derived from LiteLLM (https://github.com/BerriAI/litellm),
11
+ * Copyright (c) 2023 Berri AI, MIT License — retain this notice if LiteLLM's
12
+ * openai transformation logic is consulted during the port.
13
+ */
14
+ import type { CapabilityFlag, ProviderAdapter } from "../types/provider";
15
+ import type { ClassifiedFailure, ShapingInput } from "./gemini";
16
+ import type { OpenAIWireTool, OpenAIWireToolChoice } from "./tool-mapping";
17
+ export interface OpenAIAdapterConfig {
18
+ readonly apiKey: string;
19
+ }
20
+ export declare function isModelFlexEligible(modelName: string): boolean;
21
+ export declare function openaiSupports(feature: CapabilityFlag, model: string): boolean;
22
+ export declare function classifyOpenAIFailure(message: string): ClassifiedFailure;
23
+ interface ChatMessage {
24
+ readonly role: "system" | "user";
25
+ readonly content: string;
26
+ }
27
+ export interface OpenAIShapedParams {
28
+ readonly model: string;
29
+ readonly max_completion_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 service_tier?: "flex" | "priority";
39
+ readonly prompt_cache_key?: string;
40
+ readonly prompt_cache_retention?: "24h";
41
+ readonly response_format?: {
42
+ readonly type: "json_schema";
43
+ readonly json_schema: {
44
+ readonly name: string;
45
+ readonly schema: object;
46
+ readonly strict: true;
47
+ };
48
+ };
49
+ readonly tools?: readonly OpenAIWireTool[];
50
+ readonly tool_choice?: OpenAIWireToolChoice;
51
+ }
52
+ export declare function buildOpenAIParams(model: string, req: ShapingInput): OpenAIShapedParams;
53
+ export declare function createOpenAIAdapter(config: OpenAIAdapterConfig): ProviderAdapter;
54
+ export {};
55
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAIV,cAAc,EACd,eAAe,EAEhB,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,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAMD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAI9D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAe9E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAiBxE;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,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,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,KAAK,CAAC;IACxC,QAAQ,CAAC,eAAe,CAAC,EAAE;QACzB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;QAC7B,QAAQ,CAAC,WAAW,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;SAAE,CAAC;KACjG,CAAC;IACF,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,kBAAkB,CA6CtF;AAcD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,eAAe,CAwMhF"}