modelrig 0.8.1 → 0.10.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 (382) hide show
  1. package/CHANGELOG.md +324 -0
  2. package/README.md +55 -29
  3. package/data/PROVENANCE.md +14 -0
  4. package/data/pricing-map.json +26 -0
  5. package/dist/adapters/attempt-meta-map.d.ts +8 -1
  6. package/dist/adapters/attempt-meta-map.d.ts.map +1 -1
  7. package/dist/adapters/attempt-meta-map.js +4 -0
  8. package/dist/adapters/build-adapters.js +2 -2
  9. package/dist/adapters/gemini.d.ts +28 -1
  10. package/dist/adapters/gemini.d.ts.map +1 -1
  11. package/dist/adapters/gemini.js +38 -9
  12. package/dist/adapters/grok.d.ts.map +1 -1
  13. package/dist/adapters/grok.js +53 -4
  14. package/dist/adapters/openai-compat.d.ts +8 -2
  15. package/dist/adapters/openai-compat.d.ts.map +1 -1
  16. package/dist/adapters/openai-compat.js +8 -1
  17. package/dist/adapters/openai-stream.d.ts +10 -2
  18. package/dist/adapters/openai-stream.d.ts.map +1 -1
  19. package/dist/adapters/openai-stream.js +5 -1
  20. package/dist/adapters/openai.d.ts +10 -1
  21. package/dist/adapters/openai.d.ts.map +1 -1
  22. package/dist/adapters/openai.js +57 -7
  23. package/dist/adapters/responses-api.d.ts +61 -0
  24. package/dist/adapters/responses-api.d.ts.map +1 -0
  25. package/dist/adapters/responses-api.js +124 -0
  26. package/dist/artifacts/artifact.d.ts +31 -12
  27. package/dist/artifacts/artifact.d.ts.map +1 -1
  28. package/dist/artifacts/artifact.js +218 -188
  29. package/dist/artifacts/index.d.ts +15 -5
  30. package/dist/artifacts/index.d.ts.map +1 -1
  31. package/dist/artifacts/index.js +19 -5
  32. package/dist/artifacts/run-context.d.ts +3 -24
  33. package/dist/artifacts/run-context.d.ts.map +1 -1
  34. package/dist/artifacts/run-context.js +3 -39
  35. package/dist/bakeoff/engine.d.ts +29 -0
  36. package/dist/bakeoff/engine.d.ts.map +1 -1
  37. package/dist/bakeoff/engine.js +47 -0
  38. package/dist/bakeoff/eval-cases-rig.d.ts +36 -0
  39. package/dist/bakeoff/eval-cases-rig.d.ts.map +1 -0
  40. package/dist/bakeoff/eval-cases-rig.js +27 -0
  41. package/dist/bakeoff/eval-cases.d.ts +19 -0
  42. package/dist/bakeoff/eval-cases.d.ts.map +1 -1
  43. package/dist/bakeoff/eval-cases.js +18 -1
  44. package/dist/bakeoff/golden-judge.d.ts +47 -0
  45. package/dist/bakeoff/golden-judge.d.ts.map +1 -0
  46. package/dist/bakeoff/golden-judge.js +49 -0
  47. package/dist/bakeoff/groundedness.d.ts +58 -0
  48. package/dist/bakeoff/groundedness.d.ts.map +1 -0
  49. package/dist/bakeoff/groundedness.js +165 -0
  50. package/dist/bakeoff/quality.d.ts +43 -0
  51. package/dist/bakeoff/quality.d.ts.map +1 -1
  52. package/dist/bakeoff/quality.js +31 -0
  53. package/dist/bakeoff/replay.d.ts +11 -0
  54. package/dist/bakeoff/replay.d.ts.map +1 -1
  55. package/dist/bakeoff/replay.js +12 -0
  56. package/dist/bakeoff/report.d.ts +7 -0
  57. package/dist/bakeoff/report.d.ts.map +1 -1
  58. package/dist/bakeoff/report.js +26 -0
  59. package/dist/cli-judge.d.ts +12 -0
  60. package/dist/cli-judge.d.ts.map +1 -0
  61. package/dist/cli-judge.js +48 -0
  62. package/dist/cli.d.ts.map +1 -1
  63. package/dist/cli.js +22 -42
  64. package/dist/config.d.ts +85 -29
  65. package/dist/config.d.ts.map +1 -1
  66. package/dist/config.js +109 -47
  67. package/dist/detect/detector.d.ts +4 -2
  68. package/dist/detect/detector.d.ts.map +1 -1
  69. package/dist/detect/safe-harbor.d.ts +57 -0
  70. package/dist/detect/safe-harbor.d.ts.map +1 -0
  71. package/dist/detect/safe-harbor.js +278 -0
  72. package/dist/doctor-cli.d.ts +7 -0
  73. package/dist/doctor-cli.d.ts.map +1 -0
  74. package/dist/doctor-cli.js +67 -0
  75. package/dist/doctor-preflight.d.ts +52 -0
  76. package/dist/doctor-preflight.d.ts.map +1 -0
  77. package/dist/doctor-preflight.js +112 -0
  78. package/dist/feedback/coverage.d.ts +11 -8
  79. package/dist/feedback/coverage.d.ts.map +1 -1
  80. package/dist/feedback/coverage.js +29 -16
  81. package/dist/feedback/grade.d.ts +58 -0
  82. package/dist/feedback/grade.d.ts.map +1 -0
  83. package/dist/feedback/grade.js +67 -0
  84. package/dist/gateway/http-protocol.d.ts +20 -1
  85. package/dist/gateway/http-protocol.d.ts.map +1 -1
  86. package/dist/gateway/http-protocol.js +1 -1
  87. package/dist/gateway/serve-client.d.ts +99 -0
  88. package/dist/gateway/serve-client.d.ts.map +1 -0
  89. package/dist/gateway/serve-client.js +360 -0
  90. package/dist/index.d.ts +68 -29
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +167 -46
  93. package/dist/init/observe-cli.js +1 -1
  94. package/dist/init/observe.d.ts +2 -2
  95. package/dist/init/observe.d.ts.map +1 -1
  96. package/dist/init/observe.js +11 -7
  97. package/dist/mask/arm.d.ts +112 -0
  98. package/dist/mask/arm.d.ts.map +1 -0
  99. package/dist/mask/arm.js +179 -0
  100. package/dist/mask/index.d.ts +2 -0
  101. package/dist/mask/index.d.ts.map +1 -1
  102. package/dist/mask/index.js +7 -1
  103. package/dist/mask/mask-policy-cli.d.ts +12 -4
  104. package/dist/mask/mask-policy-cli.d.ts.map +1 -1
  105. package/dist/mask/mask-policy-cli.js +34 -9
  106. package/dist/prompts/manifest.d.ts +128 -0
  107. package/dist/prompts/manifest.d.ts.map +1 -0
  108. package/dist/prompts/manifest.js +214 -0
  109. package/dist/prompts/prompt-fetch.d.ts +84 -0
  110. package/dist/prompts/prompt-fetch.d.ts.map +1 -0
  111. package/dist/prompts/prompt-fetch.js +120 -0
  112. package/dist/prompts/prompt-resolve.d.ts +76 -0
  113. package/dist/prompts/prompt-resolve.d.ts.map +1 -0
  114. package/dist/prompts/prompt-resolve.js +93 -0
  115. package/dist/prompts/slot-resolver.d.ts +91 -0
  116. package/dist/prompts/slot-resolver.d.ts.map +1 -0
  117. package/dist/prompts/slot-resolver.js +135 -0
  118. package/dist/prompts/tools-register.d.ts +60 -0
  119. package/dist/prompts/tools-register.d.ts.map +1 -0
  120. package/dist/prompts/tools-register.js +48 -0
  121. package/dist/prompts/version-hash.d.ts +29 -0
  122. package/dist/prompts/version-hash.d.ts.map +1 -0
  123. package/dist/prompts/version-hash.js +54 -0
  124. package/dist/prompts-export-cli.d.ts +21 -0
  125. package/dist/prompts-export-cli.d.ts.map +1 -0
  126. package/dist/prompts-export-cli.js +130 -0
  127. package/dist/query/grammar.d.ts +2 -2
  128. package/dist/query/grammar.d.ts.map +1 -1
  129. package/dist/query/grammar.js +3 -1
  130. package/dist/query/saved.d.ts +13 -0
  131. package/dist/query/saved.d.ts.map +1 -1
  132. package/dist/query/saved.js +67 -1
  133. package/dist/receipts/types.d.ts +1 -1
  134. package/dist/receipts/types.d.ts.map +1 -1
  135. package/dist/receipts/types.js +1 -0
  136. package/dist/registry/build.d.ts +43 -1
  137. package/dist/registry/build.d.ts.map +1 -1
  138. package/dist/registry/build.js +52 -0
  139. package/dist/registry/cache-policy.d.ts.map +1 -1
  140. package/dist/registry/cache-policy.js +22 -0
  141. package/dist/registry/pricing-shape.d.ts +67 -8
  142. package/dist/registry/pricing-shape.d.ts.map +1 -1
  143. package/dist/registry/pricing-shape.js +50 -13
  144. package/dist/registry/pricing.d.ts +6 -5
  145. package/dist/registry/pricing.d.ts.map +1 -1
  146. package/dist/registry/pricing.js +9 -5
  147. package/dist/registry/rows.d.ts.map +1 -1
  148. package/dist/registry/rows.js +1 -0
  149. package/dist/registry/select.d.ts +6 -1
  150. package/dist/registry/select.d.ts.map +1 -1
  151. package/dist/registry/select.js +11 -0
  152. package/dist/routes/call-config.d.ts +199 -0
  153. package/dist/routes/call-config.d.ts.map +1 -0
  154. package/dist/routes/call-config.js +343 -0
  155. package/dist/routes/destination-loader.d.ts +16 -0
  156. package/dist/routes/destination-loader.d.ts.map +1 -0
  157. package/dist/routes/destination-loader.js +29 -0
  158. package/dist/routes/draft.d.ts +7 -0
  159. package/dist/routes/draft.d.ts.map +1 -1
  160. package/dist/routes/draft.js +12 -0
  161. package/dist/routes/loader.d.ts.map +1 -1
  162. package/dist/routes/loader.js +31 -56
  163. package/dist/routes/objective-loader.d.ts +12 -0
  164. package/dist/routes/objective-loader.d.ts.map +1 -1
  165. package/dist/routes/objective-loader.js +82 -0
  166. package/dist/routes/output-loader.d.ts +42 -0
  167. package/dist/routes/output-loader.d.ts.map +1 -0
  168. package/dist/routes/output-loader.js +112 -0
  169. package/dist/routes/prompt-loader.d.ts +49 -0
  170. package/dist/routes/prompt-loader.d.ts.map +1 -0
  171. package/dist/routes/prompt-loader.js +113 -0
  172. package/dist/routes/resolved-bundle.d.ts +69 -0
  173. package/dist/routes/resolved-bundle.d.ts.map +1 -1
  174. package/dist/routes/resolved-bundle.js +76 -0
  175. package/dist/routes/screen-loader.d.ts +29 -1
  176. package/dist/routes/screen-loader.d.ts.map +1 -1
  177. package/dist/routes/screen-loader.js +59 -1
  178. package/dist/run/accept.d.ts +5 -0
  179. package/dist/run/accept.d.ts.map +1 -1
  180. package/dist/run/accept.js +2 -0
  181. package/dist/run/cost.d.ts +31 -2
  182. package/dist/run/cost.d.ts.map +1 -1
  183. package/dist/run/cost.js +57 -2
  184. package/dist/run/destination.d.ts +39 -0
  185. package/dist/run/destination.d.ts.map +1 -0
  186. package/dist/run/destination.js +45 -0
  187. package/dist/run/dispatch.d.ts +67 -16
  188. package/dist/run/dispatch.d.ts.map +1 -1
  189. package/dist/run/dispatch.js +133 -29
  190. package/dist/run/grounding.d.ts +28 -2
  191. package/dist/run/grounding.d.ts.map +1 -1
  192. package/dist/run/grounding.js +54 -10
  193. package/dist/run/raw-defaults.d.ts.map +1 -1
  194. package/dist/run/raw-defaults.js +6 -1
  195. package/dist/run/raw-finalize.d.ts +50 -0
  196. package/dist/run/raw-finalize.d.ts.map +1 -0
  197. package/dist/run/raw-finalize.js +266 -0
  198. package/dist/run/raw-knobs.d.ts +36 -0
  199. package/dist/run/raw-knobs.d.ts.map +1 -0
  200. package/dist/run/raw-knobs.js +99 -0
  201. package/dist/run/raw-request.d.ts +24 -0
  202. package/dist/run/raw-request.d.ts.map +1 -0
  203. package/dist/run/raw-request.js +69 -0
  204. package/dist/run/raw-schema.d.ts +76 -0
  205. package/dist/run/raw-schema.d.ts.map +1 -0
  206. package/dist/run/raw-schema.js +166 -0
  207. package/dist/run/raw-search-cost.d.ts +48 -0
  208. package/dist/run/raw-search-cost.d.ts.map +1 -0
  209. package/dist/run/raw-search-cost.js +78 -0
  210. package/dist/run/raw-support.d.ts +64 -6
  211. package/dist/run/raw-support.d.ts.map +1 -1
  212. package/dist/run/raw-support.js +84 -11
  213. package/dist/run/raw.d.ts +25 -26
  214. package/dist/run/raw.d.ts.map +1 -1
  215. package/dist/run/raw.js +30 -351
  216. package/dist/run/record-attempt.d.ts +12 -0
  217. package/dist/run/record-attempt.d.ts.map +1 -1
  218. package/dist/run/record-attempt.js +30 -12
  219. package/dist/run/repair-attempt.d.ts +68 -0
  220. package/dist/run/repair-attempt.d.ts.map +1 -0
  221. package/dist/run/repair-attempt.js +180 -0
  222. package/dist/run/resolve-destination.d.ts +49 -0
  223. package/dist/run/resolve-destination.d.ts.map +1 -0
  224. package/dist/run/resolve-destination.js +76 -0
  225. package/dist/run/routing-docs.d.ts.map +1 -1
  226. package/dist/run/routing-docs.js +10 -5
  227. package/dist/run/run.d.ts +30 -1
  228. package/dist/run/run.d.ts.map +1 -1
  229. package/dist/run/run.js +94 -172
  230. package/dist/run/telemetry-row.d.ts +92 -0
  231. package/dist/run/telemetry-row.d.ts.map +1 -0
  232. package/dist/run/telemetry-row.js +81 -0
  233. package/dist/run/validate.d.ts +12 -1
  234. package/dist/run/validate.d.ts.map +1 -1
  235. package/dist/run/validate.js +31 -0
  236. package/dist/run/web-search-pricing.d.ts +43 -0
  237. package/dist/run/web-search-pricing.d.ts.map +1 -0
  238. package/dist/run/web-search-pricing.js +56 -0
  239. package/dist/savings/odometer.d.ts +4 -0
  240. package/dist/savings/odometer.d.ts.map +1 -1
  241. package/dist/savings/odometer.js +20 -1
  242. package/dist/savings/swap-execute.d.ts +7 -0
  243. package/dist/savings/swap-execute.d.ts.map +1 -1
  244. package/dist/savings/swap-execute.js +30 -0
  245. package/dist/savings/swaps-client.d.ts +10 -0
  246. package/dist/savings/swaps-client.d.ts.map +1 -1
  247. package/dist/screen/fixtures/probe-corpora.d.ts +23 -0
  248. package/dist/screen/fixtures/probe-corpora.d.ts.map +1 -0
  249. package/dist/screen/fixtures/probe-corpora.js +69 -0
  250. package/dist/screen/index.d.ts +21 -0
  251. package/dist/screen/index.d.ts.map +1 -0
  252. package/dist/screen/index.js +64 -0
  253. package/dist/screen/model-screen.d.ts +111 -0
  254. package/dist/screen/model-screen.d.ts.map +1 -0
  255. package/dist/screen/model-screen.js +178 -0
  256. package/dist/screen/patterns.d.ts +51 -0
  257. package/dist/screen/patterns.d.ts.map +1 -0
  258. package/dist/screen/patterns.js +151 -0
  259. package/dist/screen/phi-gate.d.ts +52 -0
  260. package/dist/screen/phi-gate.d.ts.map +1 -0
  261. package/dist/screen/phi-gate.js +86 -0
  262. package/dist/screen/policy.d.ts +71 -0
  263. package/dist/screen/policy.d.ts.map +1 -0
  264. package/dist/screen/policy.js +334 -0
  265. package/dist/screen/probe.d.ts +118 -0
  266. package/dist/screen/probe.d.ts.map +1 -0
  267. package/dist/screen/probe.js +132 -0
  268. package/dist/screen/screen-cli.d.ts +16 -0
  269. package/dist/screen/screen-cli.d.ts.map +1 -0
  270. package/dist/screen/screen-cli.js +178 -0
  271. package/dist/screen/screen.d.ts +99 -0
  272. package/dist/screen/screen.d.ts.map +1 -0
  273. package/dist/screen/screen.js +0 -0
  274. package/dist/screen/sidecar.d.ts +69 -0
  275. package/dist/screen/sidecar.d.ts.map +1 -0
  276. package/dist/screen/sidecar.js +145 -0
  277. package/dist/screen/types.d.ts +43 -2
  278. package/dist/screen/types.d.ts.map +1 -1
  279. package/dist/settings/api-fetcher.d.ts +14 -3
  280. package/dist/settings/api-fetcher.d.ts.map +1 -1
  281. package/dist/settings/api-fetcher.js +61 -10
  282. package/dist/settings/grading-guide.d.ts +102 -0
  283. package/dist/settings/grading-guide.d.ts.map +1 -0
  284. package/dist/settings/grading-guide.js +23 -0
  285. package/dist/settings/index.d.ts +3 -2
  286. package/dist/settings/index.d.ts.map +1 -1
  287. package/dist/settings/index.js +2 -1
  288. package/dist/settings/task-settings.d.ts +44 -7
  289. package/dist/settings/task-settings.d.ts.map +1 -1
  290. package/dist/settings/task-settings.js +53 -12
  291. package/dist/status.d.ts +32 -20
  292. package/dist/status.d.ts.map +1 -1
  293. package/dist/status.js +51 -30
  294. package/dist/telemetry/artifact-store.d.ts +5 -6
  295. package/dist/telemetry/artifact-store.d.ts.map +1 -1
  296. package/dist/telemetry/artifact-store.js +21 -24
  297. package/dist/telemetry/attempt-meta.d.ts +76 -1
  298. package/dist/telemetry/attempt-meta.d.ts.map +1 -1
  299. package/dist/telemetry/attempt-meta.js +33 -1
  300. package/dist/telemetry/exporter-setup.d.ts +2 -0
  301. package/dist/telemetry/exporter-setup.d.ts.map +1 -1
  302. package/dist/telemetry/exporter-setup.js +6 -1
  303. package/dist/telemetry/exporter.d.ts +2 -2
  304. package/dist/telemetry/exporter.d.ts.map +1 -1
  305. package/dist/telemetry/exporter.js +22 -41
  306. package/dist/telemetry/grade-mappers.d.ts +25 -0
  307. package/dist/telemetry/grade-mappers.d.ts.map +1 -0
  308. package/dist/telemetry/grade-mappers.js +64 -0
  309. package/dist/telemetry/grades-sql.d.ts +56 -0
  310. package/dist/telemetry/grades-sql.d.ts.map +1 -0
  311. package/dist/telemetry/grades-sql.js +156 -0
  312. package/dist/telemetry/ingest-protocol.d.ts +55 -48
  313. package/dist/telemetry/ingest-protocol.d.ts.map +1 -1
  314. package/dist/telemetry/ingest-protocol.js +48 -83
  315. package/dist/telemetry/org-identity.d.ts +44 -0
  316. package/dist/telemetry/org-identity.d.ts.map +1 -0
  317. package/dist/telemetry/org-identity.js +98 -0
  318. package/dist/telemetry/route-registration.d.ts +48 -0
  319. package/dist/telemetry/route-registration.d.ts.map +1 -0
  320. package/dist/telemetry/route-registration.js +77 -0
  321. package/dist/telemetry/sinks.d.ts +10 -1
  322. package/dist/telemetry/sinks.d.ts.map +1 -1
  323. package/dist/telemetry/sinks.js +52 -6
  324. package/dist/telemetry/store-migrations.d.ts.map +1 -1
  325. package/dist/telemetry/store-migrations.js +64 -0
  326. package/dist/telemetry/store.d.ts +9 -6
  327. package/dist/telemetry/store.d.ts.map +1 -1
  328. package/dist/telemetry/store.js +8 -50
  329. package/dist/tenancy/api-key-format.d.ts +45 -1
  330. package/dist/tenancy/api-key-format.d.ts.map +1 -1
  331. package/dist/tenancy/api-key-format.js +50 -1
  332. package/dist/types/provider.d.ts +23 -3
  333. package/dist/types/provider.d.ts.map +1 -1
  334. package/dist/types/provider.js +26 -0
  335. package/dist/types/route.d.ts +154 -2
  336. package/dist/types/route.d.ts.map +1 -1
  337. package/dist/types/telemetry.d.ts +73 -48
  338. package/dist/types/telemetry.d.ts.map +1 -1
  339. package/dist/validate-cli.d.ts.map +1 -1
  340. package/dist/validate-cli.js +32 -0
  341. package/dist/verify/verify.d.ts +5 -0
  342. package/dist/verify/verify.d.ts.map +1 -1
  343. package/dist/verify/verify.js +2 -0
  344. package/dist/watch/evaluate.d.ts +84 -1
  345. package/dist/watch/evaluate.d.ts.map +1 -1
  346. package/dist/watch/evaluate.js +28 -0
  347. package/dist/watch/monitor.d.ts +8 -2
  348. package/dist/watch/monitor.d.ts.map +1 -1
  349. package/dist/watch/monitor.js +13 -5
  350. package/dist/watch/regret-monitor-cli.d.ts +16 -0
  351. package/dist/watch/regret-monitor-cli.d.ts.map +1 -0
  352. package/dist/watch/regret-monitor-cli.js +137 -0
  353. package/dist/watch/regret-monitor.d.ts +168 -0
  354. package/dist/watch/regret-monitor.d.ts.map +1 -0
  355. package/dist/watch/regret-monitor.js +304 -0
  356. package/dist/watch/upgrade.d.ts +62 -0
  357. package/dist/watch/upgrade.d.ts.map +1 -0
  358. package/dist/watch/upgrade.js +57 -0
  359. package/docs/agent-skill/SKILL.md +181 -9
  360. package/docs/how-it-fits.md +3 -2
  361. package/docs/instrumentation.md +219 -46
  362. package/docs/llms.txt +158 -35
  363. package/docs/managed-serving.md +150 -0
  364. package/docs/mcp-oracle.md +322 -0
  365. package/docs/migration-playbook.md +5 -4
  366. package/docs/quickstart.md +263 -89
  367. package/package.json +18 -4
  368. package/registry/leaderboard.json +74 -0
  369. package/registry/registry.json +232 -112
  370. package/screen.d.ts +16 -0
  371. package/templates/call-disposition-qa.json +77 -0
  372. package/templates/catalog-cleansing.json +77 -0
  373. package/templates/compliance-review.json +76 -0
  374. package/templates/cs-next-action.json +76 -0
  375. package/templates/document-extraction.json +78 -0
  376. package/templates/financial-classification.json +75 -0
  377. package/templates/lead-qualification.json +76 -0
  378. package/templates/medical-classification.json +71 -0
  379. package/templates/ticket-triage.json +76 -0
  380. package/dist/feedback/feedback.d.ts +0 -35
  381. package/dist/feedback/feedback.d.ts.map +0 -1
  382. package/dist/feedback/feedback.js +0 -39
@@ -29,6 +29,9 @@ const KEY_PREFIXES = {
29
29
  // Fireworks pricing keys carry the accounts/… wire prefix.
30
30
  deepinfra: ["deepinfra/"],
31
31
  fireworks: ["fireworks_ai/accounts/fireworks/models/", "fireworks_ai/"],
32
+ // Z.ai (B4a): GLM models keyed under "zai/" in the snapshot. Registry entries
33
+ // carry their own declared pricing, so this only gaps-fills a future snapshot.
34
+ zai: ["zai/"],
32
35
  };
33
36
  let cachedMap = null;
34
37
  /** Host-swept gap-filler (scripts/pricing-sweep.ts): prices for models the
@@ -77,11 +80,12 @@ function getPricing(provider, model) {
77
80
  return null;
78
81
  }
79
82
  /**
80
- * The richer `ModelPricingV2` a vendor overlay/manual entry carries, if any —
81
- * resolved by the SAME key precedence as {@link getPricing} (snapshot wins on a
82
- * shared key, and the snapshot never carries `pricing_v2`, so a shared key
83
- * yields null → the caller synthesizes from the flat rate). Returns null when
84
- * no richer shape is on file. Never guesses: absence is `base`-only downstream.
83
+ * The richer `ModelPricingV2` on file for a model, if any — resolved by the SAME
84
+ * key precedence as {@link getPricing} (snapshot wins on a shared key; a snapshot
85
+ * entry yields its hand-grafted `pricing_v2` when it has one — issue #2's gemini
86
+ * tiers — else null → the caller synthesizes from the flat rate; an overlay or
87
+ * manual entry yields its own block). Returns null when no richer shape is on
88
+ * file. Never guesses: absence is `base`-only downstream.
85
89
  */
86
90
  function getPricingV2(provider, model) {
87
91
  if (model === "")
@@ -1 +1 @@
1
- {"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../../src/registry/rows.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAyC/C;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CA2BxE"}
1
+ {"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../../src/registry/rows.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AA0C/C;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CA4BxE"}
@@ -49,6 +49,7 @@ function loadRegistryRows(registryPath) {
49
49
  nativeRungRate: entry.probed?.schema?.native_rung_rate ?? null,
50
50
  groundedRate: entry.probed?.grounding?.grounded_rate ?? null,
51
51
  cacheHitRate: entry.probed?.caching?.cache_hit_rate ?? null,
52
+ imageExtractRate: entry.probed?.image?.extract_rate ?? null,
52
53
  effectiveUsdPer1k: effective.get(entry.model_key) ?? null,
53
54
  discrepancies: entry.discrepancies?.length ?? 0,
54
55
  probedAsOf: entry.probed?.as_of ?? null,
@@ -18,7 +18,7 @@ import type { CapabilityFlag } from "../types/provider";
18
18
  import type { Requirement } from "../types/route";
19
19
  /** The capability predicates a question can carry. Deliberately the probed
20
20
  * dimensions only — we answer from measurement, not from provider claims. */
21
- export type CapabilityPredicate = "structured-native" | "structured-coached" | "grounding" | "caching";
21
+ export type CapabilityPredicate = "structured-native" | "structured-coached" | "grounding" | "caching" | "image_input";
22
22
  export declare const ALL_CAPABILITY_PREDICATES: readonly CapabilityPredicate[];
23
23
  /** Plain-language gloss per predicate — the explainability layer travels
24
24
  * WITH the answer (console-explainability.md §1), it is not a separate doc. */
@@ -34,6 +34,11 @@ export interface ModelSelectRow {
34
34
  readonly nativeRungRate: number | null;
35
35
  readonly groundedRate: number | null;
36
36
  readonly cacheHitRate: number | null;
37
+ /** Probed image-input schema-conformant extraction rate (UC-3 M0). `null` when
38
+ * the model has NOT been probed on the image class — which the filter treats
39
+ * as "does not qualify" (a match needs measured evidence), NEVER as "cannot"
40
+ * (that distinction is preserved by the surfaces that render it). */
41
+ readonly imageExtractRate: number | null;
37
42
  readonly effectiveUsdPer1k: number | null;
38
43
  readonly discrepancies: number;
39
44
  readonly probedAsOf: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/registry/select.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/registry/select.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,7 @@ exports.ALL_CAPABILITY_PREDICATES = [
28
28
  "structured-coached",
29
29
  "grounding",
30
30
  "caching",
31
+ "image_input",
31
32
  ];
32
33
  /** Plain-language gloss per predicate — the explainability layer travels
33
34
  * WITH the answer (console-explainability.md §1), it is not a separate doc. */
@@ -36,9 +37,12 @@ exports.PREDICATE_GLOSS = {
36
37
  "structured-coached": "output matched the schema at least 90% of probed samples, whether or not the provider enforced it natively",
37
38
  grounding: "at least half of probed answers cited real retrieved sources rather than answering from memory",
38
39
  caching: "repeat calls actually reported cached input tokens — a measured discount, not a claim",
40
+ image_input: "a probe sent a form image and the model returned schema-conformant JSON extracting the planted fields on at least 90% of samples — a MEASURED read of an image, never a provider's vision claim",
39
41
  };
40
42
  const CONFORMANCE_BAR = 0.9;
41
43
  const GROUNDED_BAR = 0.5;
44
+ /** Image-input extraction bar (UC-3 M0) — the same 0.9 the schema bar uses. */
45
+ const IMAGE_BAR = 0.9;
42
46
  function hasCapability(row, cap) {
43
47
  switch (cap) {
44
48
  case "structured-native":
@@ -49,6 +53,12 @@ function hasCapability(row, cap) {
49
53
  return (row.groundedRate ?? 0) >= GROUNDED_BAR;
50
54
  case "caching":
51
55
  return (row.cacheHitRate ?? 0) > 0;
56
+ case "image_input":
57
+ // Probed-only: an unprobed model (null) is never returned as image-capable
58
+ // — absence is not a match. It is also not "cannot": the filter answers
59
+ // "which models we MEASURED can do this", and the empty-selection prose
60
+ // says exactly that.
61
+ return (row.imageExtractRate ?? 0) >= IMAGE_BAR;
52
62
  }
53
63
  }
54
64
  /** Question scaffolding. A search box gets keywords; the MCP oracle gets a
@@ -71,6 +81,7 @@ const CAP_WORDS = [
71
81
  [["json", "strict", "structured", "schema"], "structured-native"],
72
82
  [["grounded", "grounding", "search", "web"], "grounding"],
73
83
  [["cache", "caching", "cached"], "caching"],
84
+ [["image", "images", "vision", "multimodal", "ocr"], "image_input"],
74
85
  ];
75
86
  /** The tiny grammar behind the query box and the oracle's free-text input:
76
87
  * capability words + an "under $N/M" price cap; everything else is a
@@ -0,0 +1,199 @@
1
+ /**
2
+ * SDK-side live call-config resolution (live-routing-evals spec §4, R-1; LRE-1a).
3
+ *
4
+ * A route's live call-config (which model/provider + sampling) can be edited in
5
+ * the console WITHOUT a redeploy. The SDK reads it just-before-call through
6
+ * `GET /v1/routes/:route/call-config`, caches the policy (short TTL, ETag-
7
+ * revalidated), and MERGES the pin over the resolved (mirrored/deploy-time)
8
+ * bundle before `run()`. This is R-1's cached-policy model: no per-call network
9
+ * cost when fresh, and outage-safe.
10
+ *
11
+ * ── FAIL-OPEN, ALWAYS — the hot path never throws ─────────────────────────
12
+ * `getCallConfig` NEVER throws. On any error it returns the LAST-KNOWN-GOOD
13
+ * cached policy; if there is none, it returns null — and a null resolution means
14
+ * "serve the mirrored/pinned bundle unchanged". A route with no override
15
+ * resolves BYTE-IDENTICAL to today (the golden invariant): `applyCallConfig`
16
+ * returns the SAME bundle reference when there is nothing to merge.
17
+ *
18
+ * ── PHASE 1 = PIN ONLY ────────────────────────────────────────────────────
19
+ * `mode='experiment'` (local weighted arm draw) and `mode='live'` (strict per-
20
+ * call read) are TYPED here so the wire shape is complete, but they are INERT:
21
+ * `applyCallConfig` acts on `mode='pin'` only and passes everything else through
22
+ * unchanged. Experiments ship in LRE-2.
23
+ */
24
+ import type { RouteBundle } from "../types/route";
25
+ export type CallConfigMode = "pin" | "experiment" | "live";
26
+ export type CallConfigSource = "user" | "optimizer" | "yaml-default";
27
+ /** The on-the-wire sampling block (snake_case, as the endpoint returns it). */
28
+ export interface CallConfigSampling {
29
+ readonly temperature?: number;
30
+ readonly top_p?: number;
31
+ readonly max_output_tokens?: number;
32
+ }
33
+ /** A `mode='pin'` config: a single model + optional sampling/variant. */
34
+ export interface CallConfigPin {
35
+ readonly provider: string;
36
+ readonly model: string;
37
+ readonly sampling?: CallConfigSampling;
38
+ readonly variant?: string;
39
+ }
40
+ /** A resolved current config, as the resolver caches it. `version===0` and
41
+ * `mode===null` is the INERT default (no override) — resolution is byte-identical
42
+ * to the mirrored bundle. */
43
+ export interface ResolvedCallConfig {
44
+ readonly version: number;
45
+ readonly mode: CallConfigMode | null;
46
+ readonly config: unknown;
47
+ readonly etag: string;
48
+ }
49
+ /** Pulls one route's current config from the control plane, ETag-aware. Returns
50
+ * the config, `"not-modified"` (304 — keep the cache), or null (miss / error —
51
+ * the resolver keeps last-known-good). NEVER throws. */
52
+ export interface CallConfigFetcher {
53
+ fetch(route: string, etag: string | undefined): Promise<ResolvedCallConfig | "not-modified" | null>;
54
+ }
55
+ export interface CallConfigResolver {
56
+ /** The effective config for a route. Reads the cache when fresh (within TTL);
57
+ * otherwise revalidates (ETag) and folds the result in. Fail-open: on error,
58
+ * returns last-known-good, else null. NEVER throws. `null` ⇒ no override ⇒
59
+ * serve the mirrored bundle unchanged. */
60
+ getCallConfig(route: string): Promise<ResolvedCallConfig | null>;
61
+ /** A copy of every resolved route's last-known config — for status/boot. */
62
+ snapshot(): ReadonlyMap<string, ResolvedCallConfig>;
63
+ }
64
+ export interface CallConfigResolverConfig {
65
+ readonly fetcher: CallConfigFetcher;
66
+ /** Cache freshness window (spec §4: ~30–60s). Within it, no fetch. */
67
+ readonly ttlMs: number;
68
+ /** Injectable clock for tests; defaults to Date.now. */
69
+ readonly now?: () => number;
70
+ }
71
+ /** Narrow an unknown endpoint body into a `ResolvedCallConfig`, or null when the
72
+ * shape is not what the endpoint promises (a malformed 200 is a miss, not
73
+ * trusted — we never fabricate an override from junk). */
74
+ export declare function parseCallConfig(body: unknown): ResolvedCallConfig | null;
75
+ /** Narrow a config to a `CallConfigPin`, or null (T7 — jsonb is not proof of
76
+ * shape). The single place a pin's shape is trusted on the SDK side. */
77
+ export declare function narrowPin(config: unknown): CallConfigPin | null;
78
+ /** The pin carried by a resolved config, or null when there is no pin override
79
+ * (no override, or a non-pin mode — inert in Phase 1). */
80
+ export declare function pinFromResolved(resolved: ResolvedCallConfig | null): CallConfigPin | null;
81
+ /**
82
+ * Merge a resolved call-config over a bundle, returning a runnable bundle.
83
+ *
84
+ * INERT BY DEFAULT: when `resolved` is null, or its mode is not `pin`, or the pin
85
+ * does not narrow, the SAME `bundle` reference is returned — byte-identical to
86
+ * today (the golden invariant). Otherwise the pin REPLACES the candidate set with
87
+ * the single pinned model (eligibility was gated at write, so it satisfies the
88
+ * route `require`) and merges its sampling into the policy.
89
+ *
90
+ * `mode='experiment'` is INERT here (returns the bundle unchanged): an experiment
91
+ * resolves through {@link resolveCallConfigForRun}, which draws an arm and returns
92
+ * the arm name for `inferences.meta.arm`. `applyCallConfig` stays pin-only so the
93
+ * pin/golden path is byte-identical.
94
+ */
95
+ export declare function applyCallConfig(bundle: RouteBundle, resolved: ResolvedCallConfig | null): RouteBundle;
96
+ /** One arm of an experiment: a resolved pin config + a positive weight + an
97
+ * optional stable name (defaults to the pin's variant or `provider/model`). The
98
+ * `ref` is a `CallConfigPin` so an arm merges over the bundle exactly like a pin. */
99
+ export interface ExperimentArm {
100
+ readonly ref: CallConfigPin;
101
+ readonly weight: number;
102
+ readonly name?: string;
103
+ }
104
+ /** A `mode='experiment'` config (spec §2.1): weighted arms, an optional
105
+ * stickiness key (names the input field whose VALUE keys deterministic
106
+ * assignment), and a fallback pin (served when the experiment cannot draw). */
107
+ export interface CallConfigExperiment {
108
+ readonly arms: readonly ExperimentArm[];
109
+ readonly stickyKey?: string;
110
+ readonly fallback: CallConfigPin;
111
+ }
112
+ /** The stable arm name stamped on `inferences.meta.arm` — the caller-declared
113
+ * name, else the pin's variant, else `provider/model`. Kept meta-safe (short, no
114
+ * whitespace) by construction: providers/models/variants are identifiers. */
115
+ export declare function armName(arm: ExperimentArm): string;
116
+ /** Narrow a jsonb `config` to a `CallConfigExperiment`, or null (T7 — jsonb is
117
+ * not proof of shape). Requires ≥1 well-formed arm (each `ref` a valid pin, each
118
+ * `weight` a positive finite number) and a fallback pin. Fail-open: a malformed
119
+ * experiment narrows to null and the caller serves the mirrored bundle. */
120
+ export declare function narrowExperiment(config: unknown): CallConfigExperiment | null;
121
+ /** FNV-1a 32-bit hash of a string → a stable uint32. Pure, dependency-free — the
122
+ * sticky-assignment key so the SAME unit key always draws the SAME arm (an A/B is
123
+ * measured honestly). Not cryptographic; a fast, well-distributed bucket hash. */
124
+ export declare function hashUnitKey(key: string): number;
125
+ export interface DrawArmOptions {
126
+ /** A stickiness unit key (already resolved from the input). When present the
127
+ * draw is DETERMINISTIC by `hash(unitKey)` — the same unit always lands on the
128
+ * same arm. Absent ⇒ a weighted random draw. */
129
+ readonly unitKey?: string;
130
+ /** Injectable RNG in [0,1) for the weighted-random path (tests seed it);
131
+ * defaults to Math.random. Ignored when `unitKey` is supplied. */
132
+ readonly rng?: () => number;
133
+ }
134
+ /**
135
+ * Draw one arm from an experiment (spec §4). Weighted by `weight`: an arm's draw
136
+ * probability is `weight / Σweights`. DETERMINISTIC by `hash(unitKey)` when a
137
+ * unit key is supplied (sticky assignment); weighted-random otherwise. Returns
138
+ * null only when there are no positive-weight arms (⇒ the caller serves the
139
+ * fallback). Pure over its inputs (the RNG/hash are the only entropy).
140
+ */
141
+ export declare function drawArm(experiment: CallConfigExperiment, opts?: DrawArmOptions): ExperimentArm | null;
142
+ /** The resolved bundle for a run PLUS the chosen arm name (or null for pin / no
143
+ * override / a non-experiment mode). The arm name is stamped on
144
+ * `inferences.meta.arm` (thread it into `run` via `RunOptions.arm`). */
145
+ export interface ResolvedForRun {
146
+ readonly bundle: RouteBundle;
147
+ readonly arm: string | null;
148
+ }
149
+ /**
150
+ * Resolve a route's call-config into a runnable bundle for ONE call, drawing an
151
+ * experiment arm locally when `mode='experiment'` (spec §4, R-1). FAIL-OPEN and
152
+ * byte-identical for pin: `mode='pin'` merges exactly like {@link applyCallConfig}
153
+ * (arm null), a null/`live`/malformed resolution returns the bundle unchanged
154
+ * (arm null), and a malformed experiment falls back to the experiment's own
155
+ * fallback pin, else the mirrored bundle. NEVER throws.
156
+ *
157
+ * For an experiment, the stickiness unit key is `opts.unitKey` when given, else
158
+ * the value of `input[experiment.stickyKey]` (resolved from the run's input) —
159
+ * so the SAME unit is served the SAME arm across calls.
160
+ */
161
+ export declare function resolveCallConfigForRun(bundle: RouteBundle, resolved: ResolvedCallConfig | null, opts?: {
162
+ readonly unitKey?: string;
163
+ readonly input?: Record<string, unknown>;
164
+ readonly rng?: () => number;
165
+ }): ResolvedForRun;
166
+ /**
167
+ * Build the cached call-config resolver. Holds a per-route cache with a fetch
168
+ * timestamp + ETag; a read within `ttlMs` returns the cache with no network; a
169
+ * stale read revalidates (If-None-Match) and folds the result in. Every fetch is
170
+ * fail-open: a rejection or a null leaves the last-known value in place, and a
171
+ * route never yet resolved returns null (⇒ serve the mirrored bundle unchanged).
172
+ */
173
+ export declare function createCallConfigResolver(config: CallConfigResolverConfig): CallConfigResolver;
174
+ export interface ApiCallConfigFetcherConfig {
175
+ /** Base URL of the hosted control plane — the SAME `ingestUrl` the api sink
176
+ * uses (the call-config path hangs off the host). */
177
+ readonly ingestUrl: string;
178
+ /** `rig_sk_…` key. GET needs no special scope (a read rides the readable route
179
+ * + config rows). Header only, never a URL (C2). */
180
+ readonly apiKey: string;
181
+ readonly fetchFn?: typeof fetch;
182
+ }
183
+ /**
184
+ * The api-mode call-config fetcher: one authenticated, ETag-aware GET per route.
185
+ * Mirrors the api sink's leak discipline (status only, never the body/URL in an
186
+ * error — C2). NEVER throws: a network/HTTP failure resolves null, a 304 resolves
187
+ * "not-modified", a malformed 200 resolves null — so the resolver stays fail-open.
188
+ */
189
+ export declare function createApiCallConfigFetcher(config: ApiCallConfigFetcherConfig): CallConfigFetcher;
190
+ /**
191
+ * Convenience: resolve `route`'s config through the resolver, then merge it over
192
+ * `bundle`. NEVER throws (delegates to `getCallConfig`'s fail-open) and returns
193
+ * the SAME bundle reference when there is no override (byte-identical).
194
+ */
195
+ export declare function getCallConfig(route: string, deps: {
196
+ readonly resolver: CallConfigResolver;
197
+ readonly bundle: RouteBundle;
198
+ }): Promise<RouteBundle>;
199
+ //# sourceMappingURL=call-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-config.d.ts","sourceRoot":"","sources":["../../src/routes/call-config.ts"],"names":[],"mappings":"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"}