@sriinnu/kosha-discovery 1.9.1 → 1.11.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 (86) hide show
  1. package/README.md +9 -1
  2. package/dist/catalog-source.d.ts +99 -0
  3. package/dist/catalog-source.d.ts.map +1 -0
  4. package/dist/catalog-source.js +203 -0
  5. package/dist/catalog-source.js.map +1 -0
  6. package/dist/cli-cmd-doctor.d.ts +7 -0
  7. package/dist/cli-cmd-doctor.d.ts.map +1 -1
  8. package/dist/cli-cmd-doctor.js +38 -17
  9. package/dist/cli-cmd-doctor.js.map +1 -1
  10. package/dist/cli-cmd-query.d.ts +5 -0
  11. package/dist/cli-cmd-query.d.ts.map +1 -1
  12. package/dist/cli-cmd-query.js +64 -12
  13. package/dist/cli-cmd-query.js.map +1 -1
  14. package/dist/cli-cmd-registry.d.ts +12 -0
  15. package/dist/cli-cmd-registry.d.ts.map +1 -0
  16. package/dist/cli-cmd-registry.js +39 -0
  17. package/dist/cli-cmd-registry.js.map +1 -0
  18. package/dist/cli-cmd-spend.d.ts +6 -0
  19. package/dist/cli-cmd-spend.d.ts.map +1 -1
  20. package/dist/cli-cmd-spend.js +22 -6
  21. package/dist/cli-cmd-spend.js.map +1 -1
  22. package/dist/cli-commands.d.ts +4 -4
  23. package/dist/cli-commands.d.ts.map +1 -1
  24. package/dist/cli-commands.js +14 -12
  25. package/dist/cli-commands.js.map +1 -1
  26. package/dist/cli-help.d.ts.map +1 -1
  27. package/dist/cli-help.js +15 -2
  28. package/dist/cli-help.js.map +1 -1
  29. package/dist/cli.d.ts.map +1 -1
  30. package/dist/cli.js +11 -4
  31. package/dist/cli.js.map +1 -1
  32. package/dist/cost.d.ts +4 -0
  33. package/dist/cost.d.ts.map +1 -1
  34. package/dist/cost.js +27 -18
  35. package/dist/cost.js.map +1 -1
  36. package/dist/discovery/public-seed.d.ts.map +1 -1
  37. package/dist/discovery/public-seed.js +9 -0
  38. package/dist/discovery/public-seed.js.map +1 -1
  39. package/dist/discovery/snapshot-catalog.d.ts +13 -1
  40. package/dist/discovery/snapshot-catalog.d.ts.map +1 -1
  41. package/dist/discovery/snapshot-catalog.js +25 -7
  42. package/dist/discovery/snapshot-catalog.js.map +1 -1
  43. package/dist/enrichment/catalog.d.ts +19 -0
  44. package/dist/enrichment/catalog.d.ts.map +1 -0
  45. package/dist/enrichment/catalog.js +60 -0
  46. package/dist/enrichment/catalog.js.map +1 -0
  47. package/dist/enrichment/index.d.ts +1 -0
  48. package/dist/enrichment/index.d.ts.map +1 -1
  49. package/dist/enrichment/index.js +1 -0
  50. package/dist/enrichment/index.js.map +1 -1
  51. package/dist/index.d.ts +17 -15
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +8 -7
  54. package/dist/index.js.map +1 -1
  55. package/dist/mcp-server.d.ts.map +1 -1
  56. package/dist/mcp-server.js +12 -14
  57. package/dist/mcp-server.js.map +1 -1
  58. package/dist/price-trust.d.ts +29 -0
  59. package/dist/price-trust.d.ts.map +1 -0
  60. package/dist/price-trust.js +36 -0
  61. package/dist/price-trust.js.map +1 -0
  62. package/dist/proxy.d.ts.map +1 -1
  63. package/dist/proxy.js +170 -32
  64. package/dist/proxy.js.map +1 -1
  65. package/dist/registry-query.d.ts +1 -1
  66. package/dist/registry-query.d.ts.map +1 -1
  67. package/dist/registry-query.js +90 -25
  68. package/dist/registry-query.js.map +1 -1
  69. package/dist/registry-routing.d.ts +3 -1
  70. package/dist/registry-routing.d.ts.map +1 -1
  71. package/dist/registry-routing.js +7 -8
  72. package/dist/registry-routing.js.map +1 -1
  73. package/dist/registry-runtime.d.ts.map +1 -1
  74. package/dist/registry-runtime.js +26 -21
  75. package/dist/registry-runtime.js.map +1 -1
  76. package/dist/registry.d.ts +1 -1
  77. package/dist/registry.d.ts.map +1 -1
  78. package/dist/registry.js +82 -32
  79. package/dist/registry.js.map +1 -1
  80. package/dist/server.d.ts.map +1 -1
  81. package/dist/server.js +25 -15
  82. package/dist/server.js.map +1 -1
  83. package/dist/types.d.ts +30 -4
  84. package/dist/types.d.ts.map +1 -1
  85. package/package.json +1 -1
  86. package/server.json +2 -2
package/dist/index.js CHANGED
@@ -5,19 +5,20 @@
5
5
  * consumers can import from a single `"kosha-discovery"` entry point.
6
6
  * @module
7
7
  */
8
- export { ModelRegistry } from "./registry.js";
9
8
  export { AliasResolver, DEFAULT_ALIASES } from "./aliases.js";
10
9
  export { KoshaCache } from "./cache.js";
10
+ export { buildCatalogEnvelope, CATALOG_FILE_ENV, CATALOG_KIND, CATALOG_SCHEMA_VERSION, CATALOG_SOURCE_ENV, CATALOG_SOURCES, describeCatalog, resolveCatalogSource, } from "./catalog-source.js";
11
+ export { claudeEffortLadder, claudeSamplingSupport, claudeSupportsForcedToolChoice, claudeSupportsNativeJsonSchema, claudeSupportsPrefill, parseClaudeGeneration, } from "./claude-generation.js";
12
+ export { actualCostFromUsage, appendLedgerEntry, currentLedgerPath, DEFAULT_LEDGER_PATH, estimateRequestCost, isRequestRow, LEDGER_PATH_ENV, ledgerRowUsd, readMonthlyBudgetUsd, readSpendForMonth, readTenantBudgetUsd, } from "./cost.js";
11
13
  export { DISCOVERY_SCHEMA_VERSION, discoveryRoles, makeModelKey, rawCapabilitiesForModel, trustedCapabilitiesForModel, } from "./discovery-contract.js";
14
+ export { inferParallelToolCalls, inferStructuredOutputModes, inferToolDialect } from "./model-features.js";
15
+ export { extractModelVersion, extractOriginProvider, normalizeModelId } from "./normalize.js";
16
+ export { getProviderDescriptor, isLocalProvider, listProviderDescriptors, normalizeProviderId, PROVIDER_CATALOG, } from "./provider-catalog.js";
17
+ export { ModelRegistry } from "./registry.js";
12
18
  export { parseRouteStrategy, ROUTE_STRATEGIES, } from "./registry-routing.js";
13
- export { actualCostFromUsage, appendLedgerEntry, DEFAULT_LEDGER_PATH, estimateRequestCost, isRequestRow, ledgerRowUsd, readMonthlyBudgetUsd, readSpendForMonth, readTenantBudgetUsd, } from "./cost.js";
14
19
  export { estimateUsdCost, normalizeTokenUsage, tallyCosts } from "./tally.js";
15
- export { claudeEffortLadder, claudeSamplingSupport, claudeSupportsForcedToolChoice, claudeSupportsNativeJsonSchema, claudeSupportsPrefill, parseClaudeGeneration, } from "./claude-generation.js";
16
- export { coerceOpenAIChatRequest, toOpenAIUsage, translateAnthropicStreamToOpenAI, translateAnthropicToOpenAI, translateOpenAIToAnthropic, translateOpenAIToAnthropicWithNotes, UnsupportedWireContentError, } from "./wire-anthropic.js";
17
- export { extractModelVersion, extractOriginProvider, normalizeModelId } from "./normalize.js";
18
20
  export { inferTokenizerFamily } from "./tokenizer-family.js";
19
- export { inferParallelToolCalls, inferStructuredOutputModes, inferToolDialect } from "./model-features.js";
20
- export { getProviderDescriptor, isLocalProvider, listProviderDescriptors, normalizeProviderId, PROVIDER_CATALOG, } from "./provider-catalog.js";
21
+ export { coerceOpenAIChatRequest, toOpenAIUsage, translateAnthropicStreamToOpenAI, translateAnthropicToOpenAI, translateOpenAIToAnthropic, translateOpenAIToAnthropicWithNotes, UnsupportedWireContentError, } from "./wire-anthropic.js";
21
22
  /**
22
23
  * Convenience factory: creates a ModelRegistry and runs discovery in one call.
23
24
  *
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACN,wBAAwB,EACxB,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,2BAA2B,GAC3B,MAAM,yBAAyB,CAAC;AAgBjC,OAAO,EACN,kBAAkB,EAClB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACN,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS9E,OAAO,EACN,kBAAkB,EAClB,qBAAqB,EACrB,8BAA8B,EAC9B,8BAA8B,EAC9B,qBAAqB,EACrB,qBAAqB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACN,uBAAuB,EACvB,aAAa,EACb,gCAAgC,EAChC,0BAA0B,EAC1B,0BAA0B,EAC1B,mCAAmC,EACnC,2BAA2B,GAC3B,MAAM,qBAAqB,CAAC;AAa7B,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC3G,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AAkC/B;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAyC;IAC1E,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC1B,OAAO,QAAQ,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EACN,oBAAoB,EACpB,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,oBAAoB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,kBAAkB,EAClB,qBAAqB,EACrB,8BAA8B,EAC9B,8BAA8B,EAC9B,qBAAqB,EACrB,qBAAqB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACN,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,GACnB,MAAM,WAAW,CAAC;AAgBnB,OAAO,EACN,wBAAwB,EACxB,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,2BAA2B,GAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC3G,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE9F,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EACN,kBAAkB,EAClB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AA4C7D,OAAO,EACN,uBAAuB,EACvB,aAAa,EACb,gCAAgC,EAChC,0BAA0B,EAC1B,0BAA0B,EAC1B,mCAAmC,EACnC,2BAA2B,GAC3B,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,MAAyC;IAEzC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC1B,OAAO,QAAQ,CAAC;AACjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAKH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAQ9C,qGAAqG;AACrG,eAAO,MAAM,iBAAiB,EAAE,MAO5B,CAAC;AAEL,mEAAmE;AACnE,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAA+C,CAAC;AAEnG;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAGnE;AAMD,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAcD,eAAO,MAAM,KAAK;aAEhB,IAAI,EAAE,oBAAoB;aAC1B,WAAW,EACV,oLAAoL;aACrL,WAAW;iBACV,IAAI,EAAE,QAAQ;iBACd,UAAU;qBACT,QAAQ;yBAAI,IAAI,EAAE,QAAQ;yBAAE,WAAW,EAAE,wDAAwD;;qBACjG,IAAI;yBACH,IAAI,EAAE,QAAQ;yBACd,IAAI,YAAG,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU;yBACzF,WAAW,EAAE,oBAAoB;;qBAElC,UAAU;yBACT,IAAI,EAAE,QAAQ;yBACd,WAAW,EAAE,yDAAyD;;qBAEvE,KAAK;yBAAI,IAAI,EAAE,QAAQ;yBAAE,WAAW,EAAE,oCAAoC;;;;;aAK5E,IAAI,EAAE,sBAAsB;aAC5B,WAAW,EACV,2LAA2L;aAC5L,WAAW;iBACV,IAAI,EAAE,QAAQ;iBACd,UAAU;qBACT,UAAU;yBACT,IAAI,EAAE,QAAQ;yBACd,WAAW,EAAE,8DAA8D;;qBAE5E,aAAa;yBACZ,IAAI,EAAE,QAAQ;yBACd,WAAW,EAAE,qEAAqE;;qBAEnF,QAAQ;yBAAI,IAAI,EAAE,QAAQ;yBAAE,WAAW,EAAE,4BAA4B;;qBACrE,KAAK;yBAAI,IAAI,EAAE,QAAQ;yBAAE,WAAW,EAAE,sCAAsC;;;;;aAK9E,IAAI,EAAE,qBAAqB;aAC3B,WAAW,EACV,0VAA0V;aAC3V,WAAW;iBACV,IAAI,EAAE,QAAQ;iBACd,UAAU;qBACT,QAAQ;yBACP,IAAI,EAAE,QAAQ;yBACd,IAAI,YAAG,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU;yBACpD,WAAW,EAAE,kBAAkB;;qBAEhC,UAAU;yBAAI,IAAI,EAAE,QAAQ;yBAAE,WAAW,EAAE,iDAAiD;;qBAC5F,aAAa;yBAAI,IAAI,EAAE,QAAQ;yBAAE,WAAW,EAAE,+CAA+C;;qBAC7F,QAAQ;yBAAI,IAAI,EAAE,QAAQ;yBAAE,WAAW,EAAE,4BAA4B;;qBACrE,KAAK;yBAAI,IAAI,EAAE,QAAQ;yBAAE,WAAW,EAAE,sCAAsC;;;iBAE7E,QAAQ,YAAG,UAAU;;;aAItB,IAAI,EAAE,oBAAoB;aAC1B,WAAW,EACV,qJAAqJ;aACtJ,WAAW;iBACV,IAAI,EAAE,QAAQ;iBACd,UAAU;qBACT,KAAK;yBACJ,IAAI,EAAE,QAAQ;yBACd,WAAW,EAAE,uEAAuE;;;iBAGtF,QAAQ,YAAG,OAAO;;;aAInB,IAAI,EAAE,oBAAoB;aAC1B,WAAW,EACV,oMAAoM;aACrM,WAAW;iBACV,IAAI,EAAE,QAAQ;iBACd,UAAU;qBACT,KAAK;yBAAI,IAAI,EAAE,QAAQ;yBAAE,WAAW,EAAE,mBAAmB;;;iBAE1D,QAAQ,YAAG,OAAO;;;aAInB,IAAI,EAAE,qBAAqB;aAC3B,WAAW,EAAE,uEAAuE;aACpF,WAAW;iBACV,IAAI,EAAE,QAAQ;iBACd,UAAU;qBACT,KAAK;yBACJ,IAAI,EAAE,QAAQ;yBACd,WAAW,EAAE,2EAA2E;;;iBAG1F,QAAQ,YAAG,OAAO;;;aAInB,IAAI,EAAE,uBAAuB;aAC7B,WAAW,EACV,+JAA+J;aAChK,WAAW;iBACV,IAAI,EAAE,QAAQ;iBACd,UAAU;qBACT,QAAQ;yBAAI,IAAI,EAAE,QAAQ;yBAAE,WAAW,EAAE,kCAAkC;;;;;aAK7E,IAAI,EAAE,wBAAwB;aAC9B,WAAW,EACV,wVAAwV;aACzV,WAAW;iBACV,IAAI,EAAE,QAAQ;iBACd,UAAU;qBACT,KAAK;yBAAI,IAAI,EAAE,QAAQ;yBAAE,WAAW,EAAE,iDAAiD;;qBACvF,cAAc;yBAAI,IAAI,EAAE,QAAQ;yBAAE,WAAW,EAAE,oDAAoD;;qBACnG,sBAAsB;yBACrB,IAAI,EAAE,QAAQ;yBACd,WAAW,EAAE,6DAA6D;;qBAE3E,wBAAwB;yBACvB,IAAI,EAAE,QAAQ;yBACd,WAAW,EAAE,kDAAkD;;;iBAGjE,QAAQ,YAAG,OAAO,EAAE,gBAAgB;;EAG7B,CAAC;AAOX,gGAAgG;AAChG,MAAM,WAAW,OAAO;IACvB,QAAQ,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;CACvC;AA4BD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,GAAE,OAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CA8KzH;AAcD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,GAAE,OAAqB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA4CpH;AAMD,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,IAAI,GAAE,OAAqB,GAAG,IAAI,CA4ChE"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -197,7 +197,7 @@ export const TOOLS = [
197
197
  let registryInstance = null;
198
198
  let registryReady = null;
199
199
  async function loadRegistry() {
200
- const reg = new ModelRegistry();
200
+ const reg = new ModelRegistry(await ModelRegistry.loadConfigFile());
201
201
  await reg.discover();
202
202
  registryInstance = reg;
203
203
  return reg;
@@ -242,13 +242,11 @@ export async function callTool(name, args, deps = defaultDeps) {
242
242
  mode: "chat",
243
243
  capability: args.capability,
244
244
  provider: args.provider,
245
+ minContextWindow: minContext,
245
246
  limit: typeof args.limit === "number" ? args.limit : 5,
246
247
  });
247
- const matches = minContext
248
- ? result.matches.filter((m) => m.model.contextWindow >= minContext)
249
- : result.matches;
250
248
  return {
251
- matches: matches.map((m) => ({
249
+ matches: result.matches.map((m) => ({
252
250
  id: m.model.id,
253
251
  provider: m.model.provider,
254
252
  name: m.model.name,
@@ -256,6 +254,7 @@ export async function callTool(name, args, deps = defaultDeps) {
256
254
  pricing: m.model.pricing ?? null,
257
255
  score: m.score,
258
256
  priceMetric: m.priceMetric,
257
+ ...(m.priceUnverified ? { priceUnverified: true } : {}),
259
258
  })),
260
259
  missingCredentials: result.missingCredentials.map((c) => c.providerId),
261
260
  };
@@ -271,20 +270,19 @@ export async function callTool(name, args, deps = defaultDeps) {
271
270
  mode: "chat",
272
271
  capability: args.capability,
273
272
  provider: args.provider,
274
- // Over-fetch so a min-context filter applied after ranking
275
- // still has enough candidates to fill `limit`.
276
- limit: Math.max(limit * 4, 20),
273
+ minContextWindow: minContext,
274
+ limit,
277
275
  }, strategy);
278
- const filtered = minContext ? ranked.filter((r) => r.model.contextWindow >= minContext) : ranked;
279
276
  return {
280
277
  strategy,
281
- routes: filtered.slice(0, limit).map((r) => ({
278
+ routes: ranked.map((r) => ({
282
279
  id: r.model.id,
283
280
  provider: r.providerId,
284
281
  name: r.model.name,
285
282
  contextWindow: r.model.contextWindow,
286
283
  pricing: r.model.pricing ?? null,
287
284
  price: r.price,
285
+ ...(r.priceUnverified ? { priceUnverified: true } : {}),
288
286
  compositeScore: r.compositeScore,
289
287
  health: {
290
288
  available: r.health.available,
@@ -337,9 +335,7 @@ export async function callTool(name, args, deps = defaultDeps) {
337
335
  const providers = reg.providers_list();
338
336
  const errors = reg.discoveryErrors();
339
337
  const errorByProvider = new Map(errors.map((e) => [e.providerId, e.error]));
340
- const list = args.provider
341
- ? providers.filter((p) => p.id === args.provider)
342
- : providers;
338
+ const list = args.provider ? providers.filter((p) => p.id === args.provider) : providers;
343
339
  return list.map((p) => ({
344
340
  id: p.id,
345
341
  name: p.name,
@@ -361,8 +357,10 @@ export async function callTool(name, args, deps = defaultDeps) {
361
357
  const model = reg.model(modelId);
362
358
  if (!model)
363
359
  return { error: `model '${modelId}' not found` };
360
+ // Alternatives must hold the conversation, so that filter goes into
361
+ // the query; filtering the 20 cheapest after the fact found none.
364
362
  const candidates = reg
365
- .cheapestModels({ mode: "chat", limit: 20 })
363
+ .cheapestModels({ mode: "chat", minContextWindow: currentTokens, limit: 20 })
366
364
  .matches.map((m) => m.model);
367
365
  return computeContextStrategy({
368
366
  model,
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG7E,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAE9E,qGAAqG;AACrG,MAAM,CAAC,MAAM,iBAAiB,GAAW,CAAC,GAAG,EAAE;IAC9C,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAQ,OAAO,CAAC,iBAAiB,CAAyB,CAAC,OAAO,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,OAAO,CAAC;IAChB,CAAC;AACF,CAAC,CAAC,EAAE,CAAC;AAEL,mEAAmE;AACnE,MAAM,CAAC,MAAM,qBAAqB,GAAsB,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AAEnG;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAAkB;IAC1D,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACjG,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AAeD,6DAA6D;AAC7D,MAAM,QAAQ,GAAG;IAChB,WAAW,EAAE,CAAC,KAAK;IACnB,gBAAgB,EAAE,CAAC,KAAK;IACxB,cAAc,EAAE,CAAC,KAAK;IACtB,cAAc,EAAE,CAAC,KAAK;CACb,CAAC;AAEX,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,KAAK,GAAG;IACpB;QACC,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACV,oLAAoL;QACrL,WAAW,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACX,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wDAAwD,EAAE;gBACnG,IAAI,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,CAAC;oBAC1F,WAAW,EAAE,oBAAoB;iBACjC;gBACD,UAAU,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yDAAyD;iBACtE;gBACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oCAAoC,EAAE;aAC5E;SACD;KACD;IACD;QACC,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EACV,2LAA2L;QAC5L,WAAW,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACX,UAAU,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8DAA8D;iBAC3E;gBACD,aAAa,EAAE;oBACd,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qEAAqE;iBAClF;gBACD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;gBACvE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;aAC9E;SACD;KACD;IACD;QACC,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EACV,0VAA0V;QAC3V,WAAW,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACX,QAAQ,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC;oBACrD,WAAW,EAAE,kBAAkB;iBAC/B;gBACD,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iDAAiD,EAAE;gBAC9F,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE;gBAC/F,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;gBACvE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;aAC9E;YACD,QAAQ,EAAE,CAAC,UAAU,CAAC;SACtB;KACD;IACD;QACC,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACV,qJAAqJ;QACtJ,WAAW,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACX,KAAK,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uEAAuE;iBACpF;aACD;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACnB;KACD;IACD;QACC,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACV,oMAAoM;QACrM,WAAW,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACX,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;aAC3D;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACnB;KACD;IACD;QACC,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,uEAAuE;QACpF,WAAW,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACX,KAAK,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2EAA2E;iBACxF;aACD;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACnB;KACD;IACD;QACC,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACV,+JAA+J;QAChK,WAAW,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACX,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;aAC7E;SACD;KACD;IACD;QACC,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACV,wVAAwV;QACzV,WAAW,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACX,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iDAAiD,EAAE;gBACzF,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oDAAoD,EAAE;gBACrG,sBAAsB,EAAE;oBACvB,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6DAA6D;iBAC1E;gBACD,wBAAwB,EAAE;oBACzB,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kDAAkD;iBAC/D;aACD;YACD,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC;SACrC;KACD;CACQ,CAAC;AAYX,IAAI,gBAAgB,GAAyB,IAAI,CAAC;AAClD,IAAI,aAAa,GAAkC,IAAI,CAAC;AAExD,KAAK,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;IAChC,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC;IACrB,gBAAgB,GAAG,GAAG,CAAC;IACvB,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,WAAW;IACzB,IAAI,gBAAgB;QAAE,OAAO,gBAAgB,CAAC;IAC9C,aAAa,KAAK,YAAY,EAAE,CAAC;IACjC,OAAO,aAAa,CAAC;AACtB,CAAC;AAED,mEAAmE;AACnE,MAAM,WAAW,GAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AAEvD,iFAAiF;AACjF,MAAM,cAAe,SAAQ,KAAK;CAAG;AAErC,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAA6B,EAAE,IAAI,GAAY,WAAW;IACtG,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IAElC,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,oBAAoB,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAA8B;gBAC7C,IAAI,EAAE,IAAI,CAAC,IAA6B;gBACxC,UAAU,EAAE,IAAI,CAAC,UAAgC;aACjD,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI;aAC1B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,KAAK,sBAAsB,EAAE,CAAC;YAC7B,MAAM,UAAU,GACf,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YACjF,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC;gBACjC,IAAI,EAAE,MAAM;gBACZ,UAAU,EAAE,IAAI,CAAC,UAAgC;gBACjD,QAAQ,EAAE,IAAI,CAAC,QAA8B;gBAC7C,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACtD,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,UAAU;gBACzB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,IAAI,UAAU,CAAC;gBACnE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAClB,OAAO;gBACN,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC5B,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE;oBACd,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ;oBAC1B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;oBAClB,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa;oBACpC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI;oBAChC,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,WAAW,EAAE,CAAC,CAAC,WAAW;iBAC1B,CAAC,CAAC;gBACH,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;aACtE,CAAC;QACH,CAAC;QAED,KAAK,qBAAqB,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACnG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,MAAM,IAAI,cAAc,CACvB,qBAAqB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,uBAAuB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9F,CAAC;YACH,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5F,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YACnG,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAC9B;gBACC,IAAI,EAAE,MAAM;gBACZ,UAAU,EAAE,IAAI,CAAC,UAAgC;gBACjD,QAAQ,EAAE,IAAI,CAAC,QAA8B;gBAC7C,2DAA2D;gBAC3D,+CAA+C;gBAC/C,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC;aAC9B,EACD,QAAQ,CACR,CAAC;YACF,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACjG,OAAO;gBACN,QAAQ;gBACR,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC5C,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE;oBACd,QAAQ,EAAE,CAAC,CAAC,UAAU;oBACtB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;oBAClB,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa;oBACpC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI;oBAChC,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,cAAc,EAAE,CAAC,CAAC,cAAc;oBAChC,MAAM,EAAE;wBACP,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS;wBAC7B,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY;wBACnC,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB;wBAC3C,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY;wBACnC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO;wBACzB,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa;qBACrC;iBACD,CAAC,CAAC;aACH,CAAC;QACH,CAAC;QAED,KAAK,oBAAoB,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,aAAa,EAAE,CAAC;YAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC9C,OAAO;gBACN,GAAG,KAAK;gBACR,OAAO,EAAE,QAAQ,EAAE,OAAO;gBAC1B,aAAa,EAAE,QAAQ,EAAE,aAAa,IAAI,KAAK;aAC/C,CAAC;QACH,CAAC;QAED,KAAK,oBAAoB,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;YACxD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,aAAa,EAAE,CAAC;YAC7E,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE;gBACnB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI;gBAChC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI;aAC5C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,KAAK,qBAAqB,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAClC,OAAO;gBACN,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ;gBACR,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC,KAAK;gBAChC,QAAQ,EAAE,KAAK,EAAE,QAAQ,IAAI,IAAI;gBACjC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI;aACzB,CAAC;QACH,CAAC;QAED,KAAK,uBAAuB,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;YACrC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ;gBACzB,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC;gBACjD,CAAC,CAAC,SAAS,CAAC;YACb,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,IAAI,IAAI;gBAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;gBAC3B,aAAa,EAAE,CAAC,CAAC,aAAa,IAAI,IAAI;gBACtC,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI;aAC5C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,KAAK,wBAAwB,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAA2B,CAAC;YACjD,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;YACpD,MAAM,aAAa,GAAG,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;YAChG,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtD,OAAO,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC;YAClE,CAAC;YACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,KAAK,EAAE,UAAU,OAAO,aAAa,EAAE,CAAC;YAE7D,MAAM,UAAU,GAAG,GAAG;iBACpB,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;iBAC3C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAE9B,OAAO,sBAAsB,CAAC;gBAC7B,KAAK;gBACL,aAAa;gBACb,sBAAsB,EACrB,OAAO,IAAI,CAAC,wBAAwB,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,SAAS;gBAC9F,oBAAoB,EACnB,OAAO,IAAI,CAAC,sBAAsB,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,SAAS;gBAC1F,qBAAqB,EAAE,UAAU;aACjC,CAAC,CAAC;QACJ,CAAC;QAED;YACC,MAAM,IAAI,cAAc,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;AACF,CAAC;AAED,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAE9E,SAAS,EAAE,CAAC,EAAwB,EAAE,MAAe;IACpD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,IAAI,CAAC,EAAwB,EAAE,IAAY,EAAE,OAAe;IACpE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;AACrE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAmB,EAAE,IAAI,GAAY,WAAW;IACnF,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAEnC,oDAAoD;IACpD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhE,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,YAAY,EAAE,CAAC;YACnB,MAAM,SAAS,GAAI,MAAoD,EAAE,eAAe,CAAC;YACzF,OAAO,EAAE,CAAC,EAAE,EAAE;gBACb,eAAe,EAAE,wBAAwB,CAAC,SAAS,CAAC;gBACpD,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC3B,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE;aACzD,CAAC,CAAC;QACJ,CAAC;QAED,KAAK,MAAM;YACV,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAEnB,KAAK,YAAY;YAChB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAEjC,KAAK,YAAY,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,CAA4C,CAAC;YACvE,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,cAAc,EAAE,qCAAqC,CAAC,CAAC;YACjF,CAAC;YACD,MAAM,IAAI,GACT,IAAI,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;gBACrF,CAAC,CAAE,IAAI,CAAC,SAAqC;gBAC7C,CAAC,CAAC,EAAE,CAAC;YACP,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBACrD,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACvF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,IAAI,GAAG,YAAY,cAAc;oBAAE,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;gBACrF,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9E,CAAC;QACF,CAAC;QAED;YACC,OAAO,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,MAAM,EAAE,CAAC,CAAC;IAC5E,CAAC;AACF,CAAC;AAED,SAAS,IAAI,CAAC,GAAmB;IAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,cAAc,CAAC,IAAI,GAAY,WAAW;IACzD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,qFAAqF;IACrF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QAC1C,MAAM,IAAI,KAAK,CAAC;QAChB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,IAAI,MAAsB,CAAC;YAC3B,IAAI,CAAC;gBACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACR,+DAA+D;gBAC/D,iEAAiE;gBACjE,iEAAiE;gBACjE,mEAAmE;gBACnE,gEAAgE;gBAChE,uBAAuB;gBACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;gBACtD,SAAS;YACV,CAAC;YACD,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC;iBACrC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAClB,IAAI,QAAQ;oBAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;YAC9C,CAAC,CAAC;iBACD,OAAO,CAAC,GAAG,EAAE;gBACb,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,sEAAsE;IACtE,2EAA2E;IAC3E,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;QAC5B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,qEAAqE;AACrE,IAAI,YAAY,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC;IAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * kosha-discovery — Which prices kosha can trust.
3
+ *
4
+ * Most prices come from community catalogs. A $0 token price there is either
5
+ * a genuinely free model or a mistake (or a poisoned entry), and nothing in
6
+ * the card tells the two apart. The proxy, which costs chat by tokens,
7
+ * refuses such a route under a budget, and every ranking puts a $0 score
8
+ * built on it after the priced ones, so it can never come out "cheapest".
9
+ * @module
10
+ */
11
+ import type { ModelCard } from "./types.js";
12
+ /**
13
+ * True when input and output tokens are both $0 and nothing other than a
14
+ * catalog vouches for it. Two exceptions are real $0: local runtimes (you run
15
+ * them), and OpenRouter `:free` ids (the provider bills by id, so a `:free`
16
+ * route costs nothing whatever the catalog says).
17
+ *
18
+ * A provider's own API doesn't vouch for $0 either: some adapters fill a
19
+ * token rate the API left out with 0 (Vercel's does), so a live $0 can be
20
+ * an unknown too.
21
+ *
22
+ * Only token rates count. The proxy estimates and records chat spend from
23
+ * them alone, so an image or cache rate beside $0 tokens (a cache rate like
24
+ * that was seen live on gemini-exp-1206) would still pass a budget as free.
25
+ * Rankings judge per-image or per-second models by the score for the
26
+ * query instead (see registryCheapestModels).
27
+ */
28
+ export declare function isUnverifiedZeroPrice(model: ModelCard): boolean;
29
+ //# sourceMappingURL=price-trust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"price-trust.d.ts","sourceRoot":"","sources":["../src/price-trust.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAK/D"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * kosha-discovery — Which prices kosha can trust.
3
+ *
4
+ * Most prices come from community catalogs. A $0 token price there is either
5
+ * a genuinely free model or a mistake (or a poisoned entry), and nothing in
6
+ * the card tells the two apart. The proxy, which costs chat by tokens,
7
+ * refuses such a route under a budget, and every ranking puts a $0 score
8
+ * built on it after the priced ones, so it can never come out "cheapest".
9
+ * @module
10
+ */
11
+ import { getProviderDescriptor } from "./provider-catalog.js";
12
+ /**
13
+ * True when input and output tokens are both $0 and nothing other than a
14
+ * catalog vouches for it. Two exceptions are real $0: local runtimes (you run
15
+ * them), and OpenRouter `:free` ids (the provider bills by id, so a `:free`
16
+ * route costs nothing whatever the catalog says).
17
+ *
18
+ * A provider's own API doesn't vouch for $0 either: some adapters fill a
19
+ * token rate the API left out with 0 (Vercel's does), so a live $0 can be
20
+ * an unknown too.
21
+ *
22
+ * Only token rates count. The proxy estimates and records chat spend from
23
+ * them alone, so an image or cache rate beside $0 tokens (a cache rate like
24
+ * that was seen live on gemini-exp-1206) would still pass a budget as free.
25
+ * Rankings judge per-image or per-second models by the score for the
26
+ * query instead (see registryCheapestModels).
27
+ */
28
+ export function isUnverifiedZeroPrice(model) {
29
+ const pricing = model.pricing;
30
+ if (pricing?.inputPerMillion !== 0 || pricing.outputPerMillion !== 0)
31
+ return false;
32
+ if (model.provider === "openrouter" && model.id.endsWith(":free"))
33
+ return false;
34
+ return getProviderDescriptor(model.provider)?.isLocal !== true;
35
+ }
36
+ //# sourceMappingURL=price-trust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"price-trust.js","sourceRoot":"","sources":["../src/price-trust.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAG9D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAgB;IACrD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,OAAO,EAAE,eAAe,KAAK,CAAC,IAAI,OAAO,CAAC,gBAAgB,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnF,IAAI,KAAK,CAAC,QAAQ,KAAK,YAAY,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAChF,OAAO,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAChE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAyDnD,+EAA+E;AAC/E,MAAM,WAAW,oBAAoB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,oBAAoB,CAU3D;AA2LD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAM/G;AAwID,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,WAAW,GAAG,IAAI,CA6gB1G"}
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAGH,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAiB1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAgDnD,+EAA+E;AAC/E,MAAM,WAAW,oBAAoB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,oBAAoB,CAU3D;AA2MD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAM/G;AAuID,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,WAAW,GAAG,IAAI,CA8oB1G"}
package/dist/proxy.js CHANGED
@@ -38,11 +38,12 @@
38
38
  * @module
39
39
  */
40
40
  import { randomUUID } from "node:crypto";
41
- import { getProviderDescriptor, listProviderDescriptors, providerExecutionCredentialRequired } from "./provider-catalog.js";
42
- import { fallbackRegistryCredential, getRegistryCredentialResolver } from "./registry-runtime.js";
43
- import { parseRouteStrategy } from "./registry-routing.js";
44
41
  import { actualCostFromUsage, appendLedgerEntry, estimateRequestCost, readMonthlyBudgetUsd, readSpendForMonth, readTenantBudgetUsd, } from "./cost.js";
45
- import { UnsupportedWireContentError, coerceOpenAIChatRequest, translateAnthropicStreamToOpenAI, translateAnthropicToOpenAI, translateOpenAIToAnthropicWithNotes, } from "./wire-anthropic.js";
42
+ import { isUnverifiedZeroPrice } from "./price-trust.js";
43
+ import { getProviderDescriptor, listProviderDescriptors, providerExecutionCredentialRequired, } from "./provider-catalog.js";
44
+ import { parseRouteStrategy } from "./registry-routing.js";
45
+ import { fallbackRegistryCredential, getRegistryCredentialResolver } from "./registry-runtime.js";
46
+ import { coerceOpenAIChatRequest, translateAnthropicStreamToOpenAI, translateAnthropicToOpenAI, translateOpenAIToAnthropicWithNotes, UnsupportedWireContentError, } from "./wire-anthropic.js";
46
47
  const proxyCounters = {
47
48
  requestsTotal: 0,
48
49
  errorsTotal: 0,
@@ -174,7 +175,10 @@ function parseKoshaHint(model) {
174
175
  const hint = { strategy };
175
176
  if (filters === null)
176
177
  return hint;
177
- for (const part of filters.split(",").map((s) => s.trim()).filter(Boolean)) {
178
+ for (const part of filters
179
+ .split(",")
180
+ .map((s) => s.trim())
181
+ .filter(Boolean)) {
178
182
  if (part.startsWith("provider:")) {
179
183
  hint.provider = part.slice("provider:".length);
180
184
  }
@@ -224,20 +228,30 @@ function isExecutableRoute(registry, model) {
224
228
  function resolveProxyCandidates(registry, requested) {
225
229
  const hint = parseKoshaHint(requested);
226
230
  if (hint !== null) {
227
- const ranked = registry.rankedRoutes({
231
+ // Context and forwardability filter the candidates before the cut to 20.
232
+ // Filtering after it left nothing whenever the 20 cheapest failed them,
233
+ // and in 1.10.0 those were all catalog $0 routes.
234
+ // Routes with credentials and routes without get their own cut, so 20
235
+ // cheaper routes we can't call never push out one we can.
236
+ const query = {
228
237
  mode: "chat",
229
238
  capability: hint.capability,
230
239
  provider: hint.provider,
240
+ minContextWindow: hint.minContext ?? undefined,
231
241
  limit: 20,
232
- }, hint.strategy);
233
- const filtered = hint.minContext
234
- ? ranked.filter((r) => r.model.contextWindow >= hint.minContext)
235
- : ranked;
236
- const exec = filtered.filter((r) => isExecutableRoute(registry, r.model)).map((r) => r.model);
237
- const fwd = filtered
238
- .filter((r) => isForwardable(r.model) && !isExecutableRoute(registry, r.model))
242
+ };
243
+ const exec = registry
244
+ .rankedRoutes({ ...query, where: (model) => isExecutableRoute(registry, model) }, hint.strategy)
239
245
  .map((r) => r.model);
240
- return dedupeModels([...exec, ...fwd]);
246
+ const fwd = registry
247
+ .rankedRoutes({ ...query, where: (model) => isForwardable(model) && !isExecutableRoute(registry, model) }, hint.strategy)
248
+ .map((r) => r.model);
249
+ // A catalog-only $0 would otherwise top every price ranking; the real
250
+ // bill would be whatever the provider charges. Try those routes last.
251
+ const ordered = dedupeModels([...exec, ...fwd]);
252
+ const trusted = ordered.filter((m) => !isUnverifiedZeroPrice(m));
253
+ const unverified = ordered.filter((m) => !trusted.includes(m));
254
+ return [...trusted, ...unverified];
241
255
  }
242
256
  // For a specific model ID or alias, prefer the canonical card but fall back
243
257
  // to any forwardable route if the primary provider isn't proxiable (e.g.
@@ -313,9 +327,6 @@ function dedupeModels(models) {
313
327
  }
314
328
  return out;
315
329
  }
316
- function resolveProxyModel(registry, requested) {
317
- return resolveProxyCandidates(registry, requested)[0] ?? null;
318
- }
319
330
  // ---------------------------------------------------------------------------
320
331
  // URL builder
321
332
  // ---------------------------------------------------------------------------
@@ -337,7 +348,8 @@ function buildUpstreamUrl(model, registry) {
337
348
  base = (descriptor?.defaultBaseUrl ?? "").replace(/\/$/, "");
338
349
  }
339
350
  // Some native/local roots expose the OpenAI-compatible layer under /v1.
340
- if ((model.provider === "openai" || model.provider === "ollama" || model.provider === "llama.cpp") && !base.endsWith("/v1")) {
351
+ if ((model.provider === "openai" || model.provider === "ollama" || model.provider === "llama.cpp") &&
352
+ !base.endsWith("/v1")) {
341
353
  return `${base}/v1/chat/completions`;
342
354
  }
343
355
  return `${base}/chat/completions`;
@@ -412,6 +424,65 @@ function observeOpenAIStreamUsage(upstream) {
412
424
  // Route registration
413
425
  // ---------------------------------------------------------------------------
414
426
  export function registerProxyRoutes(app, registry, shutdownSignal) {
427
+ // Spend rows that didn't reach the ledger. Budgets are enforced against
428
+ // the ledger, so while any are held, budgeted requests are refused, like a
429
+ // failed read. Each budgeted request first writes the held rows again, in
430
+ // order, to their real partition files; only when all of them land does it
431
+ // go ahead. A probe file beside the ledger can't prove that (a read-only
432
+ // partition in a writable directory passes it), and the lost spend would
433
+ // never be counted.
434
+ const unwrittenRows = [];
435
+ let replaying = null;
436
+ const writeLedgerRow = (entry) => appendLedgerEntry(entry).catch((err) => {
437
+ unwrittenRows.push(entry);
438
+ console.error("kosha: ledger write failed:", err instanceof Error ? err.message : String(err));
439
+ });
440
+ const ledgerCaughtUp = () => {
441
+ if (unwrittenRows.length === 0)
442
+ return Promise.resolve(true);
443
+ // One replay at a time, so concurrent requests don't write a row twice.
444
+ replaying ??= (async () => {
445
+ try {
446
+ while (unwrittenRows.length > 0) {
447
+ await appendLedgerEntry(unwrittenRows[0]);
448
+ unwrittenRows.shift();
449
+ }
450
+ return true;
451
+ }
452
+ catch {
453
+ return false;
454
+ }
455
+ finally {
456
+ replaying = null;
457
+ }
458
+ })();
459
+ return replaying;
460
+ };
461
+ // Estimates of requests cleared to go upstream whose ledger rows haven't
462
+ // landed yet. The budget check counts them, so concurrent requests can't
463
+ // all pass against the same committed spend. In-process only: two proxy
464
+ // processes sharing one ledger can still overshoot by their in-flight work.
465
+ let reservedUsd = 0;
466
+ const reservedByTenant = new Map();
467
+ const reserve = (usd, tenant) => {
468
+ reservedUsd += usd;
469
+ if (tenant)
470
+ reservedByTenant.set(tenant, (reservedByTenant.get(tenant) ?? 0) + usd);
471
+ let released = false;
472
+ return () => {
473
+ if (released)
474
+ return;
475
+ released = true;
476
+ reservedUsd = Math.max(0, reservedUsd - usd);
477
+ if (!tenant)
478
+ return;
479
+ const left = (reservedByTenant.get(tenant) ?? 0) - usd;
480
+ if (left > 1e-12)
481
+ reservedByTenant.set(tenant, left);
482
+ else
483
+ reservedByTenant.delete(tenant);
484
+ };
485
+ };
415
486
  // OpenAI-compatible model list — returns all models the proxy can forward.
416
487
  // Required for SDK compatibility: OpenAI clients call this before chat requests.
417
488
  app.get("/proxy/v1/models", (ctx) => {
@@ -426,7 +497,7 @@ export function registerProxyRoutes(app, registry, shutdownSignal) {
426
497
  })),
427
498
  });
428
499
  });
429
- app.post("/proxy/v1/chat/completions", async (ctx) => {
500
+ const handleChat = async (ctx, hold) => {
430
501
  // ── Parse request ──────────────────────────────────────────────
431
502
  let body;
432
503
  try {
@@ -478,9 +549,15 @@ export function registerProxyRoutes(app, registry, shutdownSignal) {
478
549
  // tenant tag per request. A per-tenant cap is an additional gate.
479
550
  const budget = readMonthlyBudgetUsd();
480
551
  const tenantBudget = tenant ? readTenantBudgetUsd() : null;
552
+ let spent = 0;
553
+ let tenantSpent = 0;
481
554
  if (budget !== null || tenantBudget !== null) {
482
- let spent = 0;
483
- let tenantSpent = 0;
555
+ if (!(await ledgerCaughtUp())) {
556
+ return ctx.json({
557
+ error: "budget enforcement unavailable — spend could not be written to the ledger",
558
+ budgetUsd: budget ?? tenantBudget,
559
+ }, 503);
560
+ }
484
561
  try {
485
562
  if (budget !== null)
486
563
  spent = await readSpendForMonth(Date.now());
@@ -527,12 +604,11 @@ export function registerProxyRoutes(app, registry, shutdownSignal) {
527
604
  let sawCredentialedRoute = false;
528
605
  let lastUnsupportedWire = null;
529
606
  let skippedUnpriced = false;
607
+ let overBudgetCap = null;
530
608
  const wantsStream = body.stream === true;
531
609
  const includeUsage = wantsStream && body.stream_options?.include_usage === true;
532
610
  for (const model of candidates) {
533
- const credential = resolver
534
- ? await resolver.resolve(model.provider)
535
- : fallbackRegistryCredential(model.provider);
611
+ const credential = resolver ? await resolver.resolve(model.provider) : fallbackRegistryCredential(model.provider);
536
612
  const bearerToken = credential.apiKey ?? credential.accessToken;
537
613
  const descriptor = getProviderDescriptor(model.provider);
538
614
  if (descriptor && providerExecutionCredentialRequired(descriptor) && !bearerToken) {
@@ -559,11 +635,31 @@ export function registerProxyRoutes(app, registry, shutdownSignal) {
559
635
  }
560
636
  // With no price kosha writes no ledger row, so a budget would never
561
637
  // see this spend. Local runtimes cost nothing and stay allowed.
562
- if ((budget !== null || tenantBudget !== null) && descriptor?.isLocal !== true && !estimateRequestCost(model, body)) {
638
+ // A remote $0/$0 price counts as no price: the catalogs are the only
639
+ // source for it, and a poisoned $0 would otherwise win kosha:cheapest
640
+ // and land in the ledger as free.
641
+ if ((budget !== null || tenantBudget !== null) &&
642
+ descriptor?.isLocal !== true &&
643
+ (!estimateRequestCost(model, body) || isUnverifiedZeroPrice(model))) {
563
644
  attemptChain.push(`${model.provider}:unpriced`);
564
645
  skippedUnpriced = true;
565
646
  continue;
566
647
  }
648
+ // The gate above only knows the cap isn't reached yet. A request
649
+ // whose own estimate would cross it is refused here, per route, so a
650
+ // cheaper route can still take it.
651
+ const routeEstimate = estimateRequestCost(model, body)?.estimatedUsd ?? 0;
652
+ const tenantReserved = tenant ? (reservedByTenant.get(tenant) ?? 0) : 0;
653
+ const overGlobal = budget !== null && spent + reservedUsd + routeEstimate > budget;
654
+ const overTenant = tenantBudget !== null && tenantSpent + tenantReserved + routeEstimate > tenantBudget;
655
+ if (overGlobal || overTenant) {
656
+ attemptChain.push(`${model.provider}:over-budget`);
657
+ overBudgetCap ??= overGlobal ? "global" : "tenant";
658
+ continue;
659
+ }
660
+ // Held until this request's ledger row lands; a failover swaps it.
661
+ hold.release?.();
662
+ hold.release = reserve(routeEstimate, tenant);
567
663
  const usesAnthropicWire = model.provider === "anthropic";
568
664
  const upstreamHeaders = { "content-type": "application/json" };
569
665
  let upstreamBody;
@@ -716,7 +812,7 @@ export function registerProxyRoutes(app, registry, shutdownSignal) {
716
812
  const recordSpend = (actual) => {
717
813
  if (!estimate || !upstreamOk)
718
814
  return;
719
- appendLedgerEntry({
815
+ hold.write = writeLedgerRow({
720
816
  ts: Date.now(),
721
817
  provider: model.provider,
722
818
  modelId: model.id,
@@ -738,12 +834,12 @@ export function registerProxyRoutes(app, registry, shutdownSignal) {
738
834
  usageSource: "upstream",
739
835
  }
740
836
  : { usageSource: "estimate" }),
741
- }).catch(() => { });
837
+ });
742
838
  };
743
839
  const recordAdjustment = (actual) => {
744
840
  if (!estimate || !upstreamOk || !actual)
745
841
  return;
746
- appendLedgerEntry({
842
+ void writeLedgerRow({
747
843
  ts: Date.now(),
748
844
  provider: model.provider,
749
845
  modelId: model.id,
@@ -764,7 +860,7 @@ export function registerProxyRoutes(app, registry, shutdownSignal) {
764
860
  cacheReadTokens: actual.cacheReadTokens,
765
861
  cacheWriteTokens: actual.cacheWriteTokens,
766
862
  usageSource: "upstream",
767
- }).catch(() => { });
863
+ });
768
864
  };
769
865
  const reflectActual = (actual) => {
770
866
  if (actual) {
@@ -792,13 +888,18 @@ export function registerProxyRoutes(app, registry, shutdownSignal) {
792
888
  }
793
889
  releaseTimer();
794
890
  const aErr = extractAnthropicError(raw);
795
- return new Response(JSON.stringify({ error: { ...aErr, code: String(upstream.status) } }), { status: upstream.status, headers: responseHeaders });
891
+ return new Response(JSON.stringify({ error: { ...aErr, code: String(upstream.status) } }), {
892
+ status: upstream.status,
893
+ headers: responseHeaders,
894
+ });
796
895
  }
797
896
  if (wantsStream) {
798
897
  if (!upstream.body) {
799
898
  releaseTimer();
800
899
  recordSpend(null);
801
- return new Response(JSON.stringify({ error: { message: "anthropic upstream returned no stream body", type: "upstream_error" } }), { status: 502, headers: responseHeaders });
900
+ return new Response(JSON.stringify({
901
+ error: { message: "anthropic upstream returned no stream body", type: "upstream_error" },
902
+ }), { status: 502, headers: responseHeaders });
802
903
  }
803
904
  // Estimate now; reconcile when (if) the stream reports usage.
804
905
  recordSpend(null);
@@ -816,7 +917,9 @@ export function registerProxyRoutes(app, registry, shutdownSignal) {
816
917
  catch {
817
918
  releaseTimer();
818
919
  recordSpend(null);
819
- return new Response(JSON.stringify({ error: { message: "anthropic upstream returned unparseable JSON", type: "upstream_error" } }), { status: 502, headers: responseHeaders });
920
+ return new Response(JSON.stringify({
921
+ error: { message: "anthropic upstream returned unparseable JSON", type: "upstream_error" },
922
+ }), { status: 502, headers: responseHeaders });
820
923
  }
821
924
  releaseTimer();
822
925
  const anthropicResponse = raw;
@@ -893,6 +996,24 @@ export function registerProxyRoutes(app, registry, shutdownSignal) {
893
996
  attemptChain,
894
997
  }, 422);
895
998
  }
999
+ if (overBudgetCap !== null && fetchAttempts === 0) {
1000
+ // Report the cap that refused it, with the same headers as the other 429s.
1001
+ const tenantCap = overBudgetCap === "tenant";
1002
+ const capUsd = (tenantCap ? tenantBudget : budget);
1003
+ const capSpent = tenantCap ? tenantSpent : spent;
1004
+ return ctx.json({
1005
+ error: tenantCap
1006
+ ? "this request would exceed the tenant monthly budget"
1007
+ : "this request would exceed the monthly budget",
1008
+ ...(tenantCap ? { tenant } : {}),
1009
+ spentUsd: capSpent,
1010
+ budgetUsd: capUsd,
1011
+ attemptChain,
1012
+ }, 429, {
1013
+ "x-kosha-budget-remaining-usd": Math.max(0, capUsd - capSpent).toFixed(4),
1014
+ "x-kosha-budget-usd": capUsd.toFixed(2),
1015
+ });
1016
+ }
896
1017
  if (skippedUnpriced && fetchAttempts === 0) {
897
1018
  return ctx.json({
898
1019
  error: "no priced route for this model; with a spend budget set, kosha only forwards models it can charge to the ledger",
@@ -900,6 +1021,23 @@ export function registerProxyRoutes(app, registry, shutdownSignal) {
900
1021
  }, 422);
901
1022
  }
902
1023
  return ctx.json({ error: "all upstream providers failed", attemptChain }, 502);
1024
+ };
1025
+ app.post("/proxy/v1/chat/completions", async (ctx) => {
1026
+ const hold = { release: null, write: null };
1027
+ try {
1028
+ return await handleChat(ctx, hold);
1029
+ }
1030
+ finally {
1031
+ // Release the budget hold once the spend it stood for is in the
1032
+ // ledger (or held for replay, which blocks budgeted requests anyway).
1033
+ const release = hold.release;
1034
+ if (release) {
1035
+ if (hold.write)
1036
+ void hold.write.finally(release);
1037
+ else
1038
+ release();
1039
+ }
1040
+ }
903
1041
  });
904
1042
  }
905
1043
  //# sourceMappingURL=proxy.js.map