@sriinnu/kosha-discovery 1.1.0 → 1.5.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 (191) hide show
  1. package/README.md +66 -26
  2. package/dist/aliases.d.ts +6 -1
  3. package/dist/aliases.d.ts.map +1 -1
  4. package/dist/aliases.js +38 -12
  5. package/dist/aliases.js.map +1 -1
  6. package/dist/cache.d.ts.map +1 -1
  7. package/dist/cache.js +25 -2
  8. package/dist/cache.js.map +1 -1
  9. package/dist/claude-generation.d.ts +59 -0
  10. package/dist/claude-generation.d.ts.map +1 -0
  11. package/dist/claude-generation.js +117 -0
  12. package/dist/claude-generation.js.map +1 -0
  13. package/dist/cli-cmd-doctor.d.ts +17 -0
  14. package/dist/cli-cmd-doctor.d.ts.map +1 -0
  15. package/dist/cli-cmd-doctor.js +199 -0
  16. package/dist/cli-cmd-doctor.js.map +1 -0
  17. package/dist/cli-cmd-model.js +2 -2
  18. package/dist/cli-cmd-model.js.map +1 -1
  19. package/dist/cli-cmd-spend.d.ts +10 -0
  20. package/dist/cli-cmd-spend.d.ts.map +1 -0
  21. package/dist/cli-cmd-spend.js +130 -0
  22. package/dist/cli-cmd-spend.js.map +1 -0
  23. package/dist/cli-commands.d.ts +4 -1
  24. package/dist/cli-commands.d.ts.map +1 -1
  25. package/dist/cli-commands.js +10 -2
  26. package/dist/cli-commands.js.map +1 -1
  27. package/dist/cli-format.d.ts.map +1 -1
  28. package/dist/cli-format.js +2 -1
  29. package/dist/cli-format.js.map +1 -1
  30. package/dist/cli-help.d.ts.map +1 -1
  31. package/dist/cli-help.js +4 -2
  32. package/dist/cli-help.js.map +1 -1
  33. package/dist/cli.js +10 -0
  34. package/dist/cli.js.map +1 -1
  35. package/dist/context-strategy.d.ts +48 -0
  36. package/dist/context-strategy.d.ts.map +1 -0
  37. package/dist/context-strategy.js +274 -0
  38. package/dist/context-strategy.js.map +1 -0
  39. package/dist/cost.d.ts +152 -0
  40. package/dist/cost.d.ts.map +1 -0
  41. package/dist/cost.js +377 -0
  42. package/dist/cost.js.map +1 -0
  43. package/dist/credentials/resolver.d.ts +17 -0
  44. package/dist/credentials/resolver.d.ts.map +1 -1
  45. package/dist/credentials/resolver.js +92 -34
  46. package/dist/credentials/resolver.js.map +1 -1
  47. package/dist/discovery/anthropic.d.ts +19 -1
  48. package/dist/discovery/anthropic.d.ts.map +1 -1
  49. package/dist/discovery/anthropic.js +112 -8
  50. package/dist/discovery/anthropic.js.map +1 -1
  51. package/dist/discovery/base.d.ts +7 -0
  52. package/dist/discovery/base.d.ts.map +1 -1
  53. package/dist/discovery/base.js +32 -4
  54. package/dist/discovery/base.js.map +1 -1
  55. package/dist/discovery/bedrock.d.ts.map +1 -1
  56. package/dist/discovery/cerebras.d.ts.map +1 -1
  57. package/dist/discovery/cohere.d.ts.map +1 -1
  58. package/dist/discovery/deepinfra.d.ts.map +1 -1
  59. package/dist/discovery/deepseek.d.ts.map +1 -1
  60. package/dist/discovery/fireworks.d.ts.map +1 -1
  61. package/dist/discovery/glm.d.ts.map +1 -1
  62. package/dist/discovery/google.d.ts +3 -1
  63. package/dist/discovery/google.d.ts.map +1 -1
  64. package/dist/discovery/google.js +13 -6
  65. package/dist/discovery/google.js.map +1 -1
  66. package/dist/discovery/groq.d.ts.map +1 -1
  67. package/dist/discovery/index.d.ts +3 -0
  68. package/dist/discovery/index.d.ts.map +1 -1
  69. package/dist/discovery/index.js +9 -0
  70. package/dist/discovery/index.js.map +1 -1
  71. package/dist/discovery/litellm-seed.js +12 -8
  72. package/dist/discovery/litellm-seed.js.map +1 -1
  73. package/dist/discovery/llama-cpp.d.ts.map +1 -1
  74. package/dist/discovery/lmstudio.d.ts +26 -0
  75. package/dist/discovery/lmstudio.d.ts.map +1 -0
  76. package/dist/discovery/lmstudio.js +93 -0
  77. package/dist/discovery/lmstudio.js.map +1 -0
  78. package/dist/discovery/minimax.d.ts.map +1 -1
  79. package/dist/discovery/mistral.d.ts.map +1 -1
  80. package/dist/discovery/modelsdev-seed.js +16 -12
  81. package/dist/discovery/modelsdev-seed.js.map +1 -1
  82. package/dist/discovery/moonshot.d.ts.map +1 -1
  83. package/dist/discovery/nvidia.d.ts.map +1 -1
  84. package/dist/discovery/ollama.d.ts.map +1 -1
  85. package/dist/discovery/openai-compatible.d.ts.map +1 -1
  86. package/dist/discovery/openai.d.ts.map +1 -1
  87. package/dist/discovery/openrouter.d.ts +29 -5
  88. package/dist/discovery/openrouter.d.ts.map +1 -1
  89. package/dist/discovery/openrouter.js +56 -18
  90. package/dist/discovery/openrouter.js.map +1 -1
  91. package/dist/discovery/perplexity.d.ts.map +1 -1
  92. package/dist/discovery/promo-overrides.js.map +1 -1
  93. package/dist/discovery/static-direct.d.ts +9 -1
  94. package/dist/discovery/static-direct.d.ts.map +1 -1
  95. package/dist/discovery/static-direct.js +68 -7
  96. package/dist/discovery/static-direct.js.map +1 -1
  97. package/dist/discovery/together.d.ts.map +1 -1
  98. package/dist/discovery/vercel.d.ts +45 -0
  99. package/dist/discovery/vercel.d.ts.map +1 -0
  100. package/dist/discovery/vercel.js +232 -0
  101. package/dist/discovery/vercel.js.map +1 -0
  102. package/dist/discovery/vertex.d.ts.map +1 -1
  103. package/dist/discovery/vllm.d.ts +26 -0
  104. package/dist/discovery/vllm.d.ts.map +1 -0
  105. package/dist/discovery/vllm.js +93 -0
  106. package/dist/discovery/vllm.js.map +1 -0
  107. package/dist/discovery/zai.d.ts.map +1 -1
  108. package/dist/discovery-contract.d.ts +8 -1
  109. package/dist/discovery-contract.d.ts.map +1 -1
  110. package/dist/discovery-contract.js +28 -1
  111. package/dist/discovery-contract.js.map +1 -1
  112. package/dist/discovery-routes.d.ts +9 -0
  113. package/dist/discovery-routes.d.ts.map +1 -1
  114. package/dist/discovery-routes.js +106 -18
  115. package/dist/discovery-routes.js.map +1 -1
  116. package/dist/enrichment/litellm-catalog.d.ts +1 -0
  117. package/dist/enrichment/litellm-catalog.d.ts.map +1 -1
  118. package/dist/enrichment/litellm-catalog.js.map +1 -1
  119. package/dist/enrichment/litellm.d.ts +1 -1
  120. package/dist/enrichment/litellm.d.ts.map +1 -1
  121. package/dist/enrichment/litellm.js +9 -3
  122. package/dist/enrichment/litellm.js.map +1 -1
  123. package/dist/entry.d.ts +14 -0
  124. package/dist/entry.d.ts.map +1 -0
  125. package/dist/entry.js +26 -0
  126. package/dist/entry.js.map +1 -0
  127. package/dist/index.d.ts +10 -0
  128. package/dist/index.d.ts.map +1 -1
  129. package/dist/index.js +5 -0
  130. package/dist/index.js.map +1 -1
  131. package/dist/mcp-server.d.ts +207 -2
  132. package/dist/mcp-server.d.ts.map +1 -1
  133. package/dist/mcp-server.js +254 -54
  134. package/dist/mcp-server.js.map +1 -1
  135. package/dist/model-features.d.ts.map +1 -1
  136. package/dist/model-features.js +11 -2
  137. package/dist/model-features.js.map +1 -1
  138. package/dist/normalize.d.ts +7 -7
  139. package/dist/normalize.js +8 -8
  140. package/dist/provider-catalog.d.ts +17 -2
  141. package/dist/provider-catalog.d.ts.map +1 -1
  142. package/dist/provider-catalog.js +112 -0
  143. package/dist/provider-catalog.js.map +1 -1
  144. package/dist/proxy.d.ts +49 -7
  145. package/dist/proxy.d.ts.map +1 -1
  146. package/dist/proxy.js +765 -80
  147. package/dist/proxy.js.map +1 -1
  148. package/dist/registry-discovery.d.ts.map +1 -1
  149. package/dist/registry-discovery.js +4 -4
  150. package/dist/registry-discovery.js.map +1 -1
  151. package/dist/registry-query.d.ts +2 -2
  152. package/dist/registry-query.d.ts.map +1 -1
  153. package/dist/registry-query.js +60 -9
  154. package/dist/registry-query.js.map +1 -1
  155. package/dist/registry-routing.d.ts +65 -0
  156. package/dist/registry-routing.d.ts.map +1 -0
  157. package/dist/registry-routing.js +165 -0
  158. package/dist/registry-routing.js.map +1 -0
  159. package/dist/registry-runtime.d.ts +2 -0
  160. package/dist/registry-runtime.d.ts.map +1 -1
  161. package/dist/registry-runtime.js +167 -15
  162. package/dist/registry-runtime.js.map +1 -1
  163. package/dist/registry-selection.d.ts.map +1 -1
  164. package/dist/registry-selection.js +27 -3
  165. package/dist/registry-selection.js.map +1 -1
  166. package/dist/registry.d.ts +69 -0
  167. package/dist/registry.d.ts.map +1 -1
  168. package/dist/registry.js +135 -3
  169. package/dist/registry.js.map +1 -1
  170. package/dist/resilience.d.ts +15 -0
  171. package/dist/resilience.d.ts.map +1 -1
  172. package/dist/resilience.js +23 -1
  173. package/dist/resilience.js.map +1 -1
  174. package/dist/security.js +6 -6
  175. package/dist/security.js.map +1 -1
  176. package/dist/server.d.ts +44 -2
  177. package/dist/server.d.ts.map +1 -1
  178. package/dist/server.js +329 -34
  179. package/dist/server.js.map +1 -1
  180. package/dist/tally.d.ts +80 -0
  181. package/dist/tally.d.ts.map +1 -0
  182. package/dist/tally.js +176 -0
  183. package/dist/tally.js.map +1 -0
  184. package/dist/types.d.ts +64 -3
  185. package/dist/types.d.ts.map +1 -1
  186. package/dist/wire-anthropic.d.ts +264 -0
  187. package/dist/wire-anthropic.d.ts.map +1 -0
  188. package/dist/wire-anthropic.js +960 -0
  189. package/dist/wire-anthropic.js.map +1 -0
  190. package/package.json +106 -97
  191. package/logo.png +0 -0
package/dist/cli-help.js CHANGED
@@ -58,7 +58,8 @@ ${c(BOLD, "COMMANDS")}
58
58
  --provider <name> Scope latest fetch to one provider
59
59
  ${c(CYAN, "refresh")} ${c(DIM, "(update)")} Force re-discover all providers (bypass cache)
60
60
  --provider <name> Refresh only one provider
61
- ${c(CYAN, "serve")} [--port 3000] Start HTTP API server
61
+ ${c(CYAN, "serve")} [--port 3000] Start HTTP API server (binds 127.0.0.1)
62
+ --host <address> Bind address; set KOSHA_PROXY_TOKEN before exposing
62
63
 
63
64
  ${c(BOLD, "CACHING & OUTPUT")}
64
65
  Results are cached at ${c(CYAN, "~/.kosha/cache")} for 24h by default.
@@ -89,7 +90,7 @@ ${c(BOLD, "EXAMPLES")}
89
90
  ${c(DIM, "$")} kosha capable vision
90
91
  ${c(DIM, "$")} kosha capable embeddings --limit 5
91
92
  ${c(DIM, "$")} kosha cheapest --role image --limit 3
92
- ${c(DIM, "$")} kosha routes claude-opus-4-6
93
+ ${c(DIM, "$")} kosha routes claude-opus-4-8
93
94
  ${c(DIM, "$")} kosha routes gpt-4o --json
94
95
  ${c(DIM, "$")} kosha providers
95
96
  ${c(DIM, "$")} kosha latest
@@ -97,6 +98,7 @@ ${c(BOLD, "EXAMPLES")}
97
98
  ${c(DIM, "$")} kosha resolve haiku
98
99
  ${c(DIM, "$")} kosha refresh --provider anthropic
99
100
  ${c(DIM, "$")} kosha serve --port 8080
101
+ ${c(DIM, "$")} KOSHA_PROXY_TOKEN=s3cret kosha serve --host 0.0.0.0
100
102
  `.trim());
101
103
  }
102
104
  /** Print the CLI version string to stdout. */
@@ -1 +1 @@
1
- {"version":3,"file":"cli-help.js","sourceRoot":"","sources":["../src/cli-help.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-help.js","sourceRoot":"","sources":["../src/cli-help.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACN,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAC5C,CAAC,GACD,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,OAAO,GAAI,QAAQ,CAAC,iBAAiB,CAAyB,CAAC,OAAO,CAAC;AAE7E,4EAA4E;AAE5E,sDAAsD;AACtD,MAAM,UAAU,QAAQ;IACvB,OAAO,CAAC,GAAG,CAAC;EACX,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,+CAA+C,CAAC;;EAE3E,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC;;;EAGhB,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC;IACjB,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC;IACnB,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC;IACjB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;;;;;IAKf,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC;;IAEjB,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC;IAChB,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC;;;;;;IAMhB,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC;;IAE3C,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC;;;;;IAKlB,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC;;;;;;;;;IASnB,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC;IACjB,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC;IACpB,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC;IAClB,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC;;IAEjB,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC;;IAExC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC;;;EAGlB,CAAC,CAAC,IAAI,EAAE,kBAAkB,CAAC;0BACH,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC;eACpC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC;QAClD,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC;;;MAGzB,CAAC,CAAC,IAAI,EAAE,wBAAwB,CAAC;;;;;EAKrC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC;;;;;EAKlB,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC;IACjB,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;IACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;CACd,CAAC,IAAI,EAAE,CAAC,CAAC;AACV,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,WAAW;IAC1B,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU;IACzB,MAAM,SAAS,GACd,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IACpF,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,CAAC;IACxE,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,CAAC;IACpE,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,oBAAoB,CAAC,EAAE,CAAC;IAExE,OAAO,CAAC,GAAG,CAAC;EACX,CAAC,CAAC,OAAO,EAAE,kUAAkU,CAAC;EAC9U,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,sDAAsD,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC;EAChG,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,uFAAuF,CAAC,4BAA4B,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC;EAC5K,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,uFAAuF,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,oCAAoC,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC;EAC9M,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,sDAAsD,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC;EAChG,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,SAAS,IAAI,CAAC,CAAC,GAAG,EAAE,wCAAwC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC;EAClH,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC,6CAA6C,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC;EAClH,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,OAAO,mCAAmC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC;EAC1F,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,OAAO,mCAAmC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC;EAC1F,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,OAAO,mCAAmC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC;EAC1F,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,sDAAsD,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC;EAChG,CAAC,CAAC,OAAO,EAAE,kUAAkU,CAAC;;IAE5U,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC;;MAErB,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC;MACzB,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC;MACvB,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC;MACrB,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC;MACxC,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC;MACxC,CAAC,CAAC,IAAI,EAAE,oBAAoB,CAAC;MAC7B,CAAC,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC;MAC3C,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC;MACtB,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC;MACzB,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC;MACzC,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC;MAC1B,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC;MACvB,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC;;IAExB,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,iBAAiB,CAAC;CACxE,CAAC,CAAC;AACH,CAAC"}
package/dist/cli.js CHANGED
@@ -13,6 +13,8 @@
13
13
  */
14
14
  import { ModelRegistry } from "./registry.js";
15
15
  import { DIM, RED, c } from "./cli-format.js";
16
+ import { cmdDoctor } from "./cli-cmd-doctor.js";
17
+ import { cmdSpend } from "./cli-cmd-spend.js";
16
18
  import { cmdCapabilities, cmdCapable, cmdCheapest, cmdDiscover, cmdEnrich, cmdLatest, cmdList, cmdModel, cmdProviders, cmdRefresh, cmdResolve, cmdRoles, cmdRoutes, cmdSearch, cmdServe, showHelp, showSplash, showVersion, } from "./cli-commands.js";
17
19
  /**
18
20
  * Parse a raw argv slice into positional tokens and named flags.
@@ -133,6 +135,14 @@ async function main() {
133
135
  case "update":
134
136
  await cmdRefresh(registry, flags);
135
137
  break;
138
+ case "doctor":
139
+ case "health":
140
+ await cmdDoctor(registry, flags);
141
+ break;
142
+ case "spend":
143
+ case "usage":
144
+ await cmdSpend(registry, flags);
145
+ break;
136
146
  default:
137
147
  console.error(c(RED, `Unknown command: "${command}"`));
138
148
  console.error(c(DIM, 'Run "kosha --help" for usage information.'));
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * kosha-discovery — Context-management strategy advisor.
3
+ *
4
+ * Pure synthesis over the model + provider catalog: given where a caller is
5
+ * in their conversation, return ranked options (continue / cache / compact /
6
+ * switch model / long-context tier / batch offload) with rough cost math.
7
+ *
8
+ * No tokenization, no model inference — just arithmetic over the registry.
9
+ * @module
10
+ */
11
+ import type { ModelCard, ProviderCacheBehavior } from "./types.js";
12
+ export interface ContextStrategyInput {
13
+ model: ModelCard;
14
+ currentTokens: number;
15
+ expectedRemainingTurns?: number;
16
+ expectedOutputTokens?: number;
17
+ candidateAlternatives?: ModelCard[];
18
+ }
19
+ export interface ContextSituation {
20
+ tokensUsed: number;
21
+ contextWindow: number;
22
+ headroomTokens: number;
23
+ headroomPercent: number;
24
+ inLongContextTier: boolean;
25
+ longContextThresholdTokens?: number;
26
+ }
27
+ export interface StrategyOption {
28
+ strategy: "continue" | "enable_prompt_cache" | "compact_and_continue" | "switch_to_long_context_tier" | "switch_model" | "batch_offload";
29
+ viable: boolean;
30
+ costPerTurnUsd?: number;
31
+ savingsPerTurnUsd?: number;
32
+ notes: string;
33
+ details?: Record<string, unknown>;
34
+ }
35
+ export interface ContextStrategy {
36
+ model: {
37
+ id: string;
38
+ provider: string;
39
+ contextWindow: number;
40
+ };
41
+ situation: ContextSituation;
42
+ cacheBehavior?: ProviderCacheBehavior;
43
+ options: StrategyOption[];
44
+ recommended: StrategyOption["strategy"];
45
+ }
46
+ /** Compute ranked context-management options for the given conversation state. */
47
+ export declare function computeContextStrategy(input: ContextStrategyInput): ContextStrategy;
48
+ //# sourceMappingURL=context-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-strategy.d.ts","sourceRoot":"","sources":["../src/context-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAgB,qBAAqB,EAAE,MAAM,YAAY,CAAC;AASjF,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,SAAS,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,EACL,UAAU,GACV,qBAAqB,GACrB,sBAAsB,GACtB,6BAA6B,GAC7B,cAAc,GACd,eAAe,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,WAAW,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;CACxC;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,eAAe,CA6CnF"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * kosha-discovery — Context-management strategy advisor.
3
+ *
4
+ * Pure synthesis over the model + provider catalog: given where a caller is
5
+ * in their conversation, return ranked options (continue / cache / compact /
6
+ * switch model / long-context tier / batch offload) with rough cost math.
7
+ *
8
+ * No tokenization, no model inference — just arithmetic over the registry.
9
+ * @module
10
+ */
11
+ import { getProviderCacheBehavior } from "./provider-catalog.js";
12
+ const DEFAULT_EXPECTED_OUTPUT_TOKENS = 1024;
13
+ const DEFAULT_EXPECTED_REMAINING_TURNS = 5;
14
+ const HEADROOM_WARN_PERCENT = 20;
15
+ const HEADROOM_CRITICAL_PERCENT = 10;
16
+ const COMPACTION_TARGET_PERCENT = 25;
17
+ const CACHE_READ_DISCOUNT_FLOOR = 0.5;
18
+ /** Compute ranked context-management options for the given conversation state. */
19
+ export function computeContextStrategy(input) {
20
+ const { model, currentTokens, expectedRemainingTurns = DEFAULT_EXPECTED_REMAINING_TURNS, expectedOutputTokens = DEFAULT_EXPECTED_OUTPUT_TOKENS, candidateAlternatives = [], } = input;
21
+ const tokensUsed = Math.max(0, Math.floor(currentTokens));
22
+ const headroomTokens = Math.max(0, model.contextWindow - tokensUsed);
23
+ const headroomPercent = model.contextWindow > 0 ? (headroomTokens / model.contextWindow) * 100 : 0;
24
+ const longThreshold = model.pricing?.longContextThresholdTokens;
25
+ const inLongContextTier = longThreshold !== undefined && tokensUsed >= longThreshold;
26
+ const situation = {
27
+ tokensUsed,
28
+ contextWindow: model.contextWindow,
29
+ headroomTokens,
30
+ headroomPercent: round(headroomPercent, 2),
31
+ inLongContextTier,
32
+ ...(longThreshold !== undefined ? { longContextThresholdTokens: longThreshold } : {}),
33
+ };
34
+ const cacheBehavior = getProviderCacheBehavior(model.provider);
35
+ const baselineCost = perTurnCost(model.pricing, tokensUsed, expectedOutputTokens, inLongContextTier);
36
+ const options = [];
37
+ options.push(buildContinueOption(situation, baselineCost, expectedRemainingTurns));
38
+ options.push(buildPromptCacheOption(model, tokensUsed, expectedOutputTokens, baselineCost, cacheBehavior));
39
+ options.push(buildLongContextTierOption(model, situation, baselineCost, expectedOutputTokens));
40
+ options.push(buildCompactionOption(model, situation, baselineCost, expectedOutputTokens, candidateAlternatives));
41
+ options.push(buildSwitchModelOption(model, tokensUsed, expectedOutputTokens, baselineCost, candidateAlternatives));
42
+ options.push(buildBatchOffloadOption(model, tokensUsed, expectedOutputTokens, baselineCost));
43
+ const recommended = pickRecommended(options, situation);
44
+ return {
45
+ model: { id: model.id, provider: model.provider, contextWindow: model.contextWindow },
46
+ situation,
47
+ ...(cacheBehavior ? { cacheBehavior } : {}),
48
+ options,
49
+ recommended,
50
+ };
51
+ }
52
+ function buildContinueOption(situation, baselineCost, expectedRemainingTurns) {
53
+ const viable = situation.headroomPercent > 0;
54
+ const tone = situation.headroomPercent < HEADROOM_CRITICAL_PERCENT
55
+ ? `Only ${situation.headroomPercent.toFixed(1)}% headroom — likely to overflow within 1–2 turns.`
56
+ : situation.headroomPercent < HEADROOM_WARN_PERCENT
57
+ ? `${situation.headroomPercent.toFixed(1)}% headroom — comfortable for a few more turns.`
58
+ : `${situation.headroomPercent.toFixed(1)}% headroom — no pressure.`;
59
+ return {
60
+ strategy: "continue",
61
+ viable,
62
+ ...(baselineCost !== undefined ? { costPerTurnUsd: round(baselineCost, 6) } : {}),
63
+ notes: tone,
64
+ details: {
65
+ projectedCostForRemainingTurnsUsd: baselineCost !== undefined ? round(baselineCost * expectedRemainingTurns, 6) : undefined,
66
+ inLongContextTier: situation.inLongContextTier,
67
+ },
68
+ };
69
+ }
70
+ function buildPromptCacheOption(model, currentTokens, expectedOutputTokens, baselineCost, cacheBehavior) {
71
+ if (!cacheBehavior || cacheBehavior.mode === "none") {
72
+ return {
73
+ strategy: "enable_prompt_cache",
74
+ viable: false,
75
+ notes: cacheBehavior?.mode === "none"
76
+ ? "Provider has no documented prompt cache."
77
+ : "Cache behavior for this provider has not been curated yet.",
78
+ };
79
+ }
80
+ const cacheReadRate = model.pricing?.cacheReadPerMillion;
81
+ const inputRate = model.pricing?.inputPerMillion;
82
+ const outputRate = model.pricing?.outputPerMillion;
83
+ const canEstimate = cacheReadRate !== undefined && inputRate !== undefined && outputRate !== undefined;
84
+ const cachedTurnCost = canEstimate
85
+ ? (currentTokens * cacheReadRate + expectedOutputTokens * outputRate) / 1_000_000
86
+ : undefined;
87
+ const savings = baselineCost !== undefined && cachedTurnCost !== undefined ? baselineCost - cachedTurnCost : undefined;
88
+ const ttlGuidance = cacheBehavior.mode === "explicit"
89
+ ? cacheBehavior.ttlTiers
90
+ ? `Pick a TTL from: ${cacheBehavior.ttlTiers.join(", ")}.`
91
+ : cacheBehavior.maxTtlSeconds
92
+ ? `Set TTL up to ${cacheBehavior.maxTtlSeconds}s (default ${cacheBehavior.defaultTtlSeconds ?? "provider-defined"}).`
93
+ : "Caller picks TTL."
94
+ : cacheBehavior.mode === "automatic"
95
+ ? `Provider manages TTL${cacheBehavior.approximateTtlSeconds ? ` (~${cacheBehavior.approximateTtlSeconds}s typical)` : ""}.`
96
+ : "Gateway forwards cache_control to the routed model — TTL inherits from the underlying provider.";
97
+ return {
98
+ strategy: "enable_prompt_cache",
99
+ viable: true,
100
+ ...(cachedTurnCost !== undefined ? { costPerTurnUsd: round(cachedTurnCost, 6) } : {}),
101
+ ...(savings !== undefined ? { savingsPerTurnUsd: round(savings, 6) } : {}),
102
+ notes: cacheReadRate !== undefined &&
103
+ inputRate !== undefined &&
104
+ inputRate > 0 &&
105
+ cacheReadRate / inputRate < CACHE_READ_DISCOUNT_FLOOR
106
+ ? `Cache reads cost ${round((cacheReadRate / inputRate) * 100, 1)}% of base input — meaningful savings on a stable prefix. ${ttlGuidance}`
107
+ : `Mode: ${cacheBehavior.mode}. ${ttlGuidance}`,
108
+ details: {
109
+ cacheMode: cacheBehavior.mode,
110
+ ttlTiers: cacheBehavior.ttlTiers,
111
+ defaultTtlSeconds: cacheBehavior.defaultTtlSeconds,
112
+ maxTtlSeconds: cacheBehavior.maxTtlSeconds,
113
+ approximateTtlSeconds: cacheBehavior.approximateTtlSeconds,
114
+ cacheReadRatePerMillion: cacheReadRate,
115
+ documented: cacheBehavior.documented,
116
+ },
117
+ };
118
+ }
119
+ function buildLongContextTierOption(model, situation, baselineCost, expectedOutputTokens) {
120
+ const threshold = model.pricing?.longContextThresholdTokens;
121
+ const longIn = model.pricing?.longContextInputPerMillion;
122
+ const longOut = model.pricing?.longContextOutputPerMillion;
123
+ if (threshold === undefined || longIn === undefined || longOut === undefined) {
124
+ return {
125
+ strategy: "switch_to_long_context_tier",
126
+ viable: false,
127
+ notes: "Model does not publish a tiered long-context price — single rate applies regardless of size.",
128
+ };
129
+ }
130
+ const tieredCost = (situation.tokensUsed * longIn + expectedOutputTokens * longOut) / 1_000_000;
131
+ const delta = baselineCost !== undefined ? tieredCost - baselineCost : undefined;
132
+ return {
133
+ strategy: "switch_to_long_context_tier",
134
+ viable: true,
135
+ costPerTurnUsd: round(tieredCost, 6),
136
+ ...(delta !== undefined ? { savingsPerTurnUsd: round(-delta, 6) } : {}),
137
+ notes: situation.inLongContextTier
138
+ ? `Already in long-context tier (>${threshold} tokens). Cost is what it is — consider compaction or a smaller-context-priced model instead.`
139
+ : `You're under the ${threshold}-token threshold; growing past it triggers tiered pricing (input ${longIn}/M, output ${longOut}/M).`,
140
+ details: { thresholdTokens: threshold, longInputPerMillion: longIn, longOutputPerMillion: longOut },
141
+ };
142
+ }
143
+ function buildCompactionOption(model, situation, baselineCost, expectedOutputTokens, candidateAlternatives) {
144
+ if (situation.tokensUsed === 0) {
145
+ return { strategy: "compact_and_continue", viable: false, notes: "Nothing to compact yet." };
146
+ }
147
+ const targetTokens = Math.max(1024, Math.floor(model.contextWindow * (COMPACTION_TARGET_PERCENT / 100)));
148
+ const tokensReclaimed = Math.max(0, situation.tokensUsed - targetTokens);
149
+ const summarizer = pickCheapestChatModel(candidateAlternatives, model);
150
+ const summarizationCost = summarizer?.pricing?.inputPerMillion !== undefined
151
+ ? (situation.tokensUsed * summarizer.pricing.inputPerMillion +
152
+ targetTokens * (summarizer.pricing.outputPerMillion ?? 0)) /
153
+ 1_000_000
154
+ : undefined;
155
+ const postCompactionTurnCost = model.pricing?.inputPerMillion !== undefined && model.pricing?.outputPerMillion !== undefined
156
+ ? (targetTokens * model.pricing.inputPerMillion + expectedOutputTokens * model.pricing.outputPerMillion) / 1_000_000
157
+ : undefined;
158
+ const savings = baselineCost !== undefined && postCompactionTurnCost !== undefined ? baselineCost - postCompactionTurnCost : undefined;
159
+ return {
160
+ strategy: "compact_and_continue",
161
+ viable: tokensReclaimed > 0,
162
+ ...(postCompactionTurnCost !== undefined ? { costPerTurnUsd: round(postCompactionTurnCost, 6) } : {}),
163
+ ...(savings !== undefined ? { savingsPerTurnUsd: round(savings, 6) } : {}),
164
+ notes: summarizer
165
+ ? `Summarize older turns down to ~${targetTokens} tokens using ${summarizer.id}; reclaims ${tokensReclaimed} tokens.`
166
+ : `Summarize older turns down to ~${targetTokens} tokens; reclaims ${tokensReclaimed} tokens. No cheap summarizer in candidate set.`,
167
+ details: {
168
+ targetTokens,
169
+ tokensReclaimed,
170
+ summarizerModelId: summarizer?.id,
171
+ summarizationCostUsd: summarizationCost !== undefined ? round(summarizationCost, 6) : undefined,
172
+ },
173
+ };
174
+ }
175
+ function buildSwitchModelOption(currentModel, currentTokens, expectedOutputTokens, baselineCost, candidateAlternatives) {
176
+ const candidates = candidateAlternatives
177
+ .filter((m) => m.id !== currentModel.id && m.contextWindow >= currentTokens && m.pricing?.inputPerMillion !== undefined)
178
+ .map((m) => ({
179
+ model: m,
180
+ cost: perTurnCost(m.pricing, currentTokens, expectedOutputTokens, false) ?? Number.POSITIVE_INFINITY,
181
+ }))
182
+ .sort((a, b) => a.cost - b.cost)
183
+ .slice(0, 3);
184
+ if (candidates.length === 0) {
185
+ return {
186
+ strategy: "switch_model",
187
+ viable: false,
188
+ notes: "No alternative model in the candidate set fits the current context size.",
189
+ };
190
+ }
191
+ const best = candidates[0];
192
+ const savings = baselineCost !== undefined ? baselineCost - best.cost : undefined;
193
+ return {
194
+ strategy: "switch_model",
195
+ viable: true,
196
+ costPerTurnUsd: round(best.cost, 6),
197
+ ...(savings !== undefined ? { savingsPerTurnUsd: round(savings, 6) } : {}),
198
+ notes: `Cheapest fit: ${best.model.id} (${best.model.contextWindow} context). ${candidates.length - 1} other option(s) considered.`,
199
+ details: {
200
+ alternatives: candidates.map((c) => ({
201
+ id: c.model.id,
202
+ provider: c.model.provider,
203
+ contextWindow: c.model.contextWindow,
204
+ costPerTurnUsd: Number.isFinite(c.cost) ? round(c.cost, 6) : null,
205
+ })),
206
+ },
207
+ };
208
+ }
209
+ function buildBatchOffloadOption(model, currentTokens, expectedOutputTokens, baselineCost) {
210
+ const batchIn = model.pricing?.batchInputPerMillion;
211
+ const batchOut = model.pricing?.batchOutputPerMillion;
212
+ if (batchIn === undefined || batchOut === undefined) {
213
+ return {
214
+ strategy: "batch_offload",
215
+ viable: false,
216
+ notes: "Model does not publish Batch API pricing.",
217
+ };
218
+ }
219
+ const batchCost = (currentTokens * batchIn + expectedOutputTokens * batchOut) / 1_000_000;
220
+ const savings = baselineCost !== undefined ? baselineCost - batchCost : undefined;
221
+ return {
222
+ strategy: "batch_offload",
223
+ viable: true,
224
+ costPerTurnUsd: round(batchCost, 6),
225
+ ...(savings !== undefined ? { savingsPerTurnUsd: round(savings, 6) } : {}),
226
+ notes: "Batch API trades latency (typically 24h SLO) for cheaper tokens — only viable if the workload is not real-time.",
227
+ details: { batchInputPerMillion: batchIn, batchOutputPerMillion: batchOut },
228
+ };
229
+ }
230
+ function pickRecommended(options, situation) {
231
+ const viable = options.filter((o) => o.viable);
232
+ if (viable.length === 0)
233
+ return "continue";
234
+ if (situation.headroomPercent < HEADROOM_CRITICAL_PERCENT) {
235
+ const compact = viable.find((o) => o.strategy === "compact_and_continue");
236
+ if (compact)
237
+ return "compact_and_continue";
238
+ const switchModel = viable.find((o) => o.strategy === "switch_model");
239
+ if (switchModel)
240
+ return "switch_model";
241
+ }
242
+ const withSavings = viable
243
+ .filter((o) => o.strategy !== "continue" && typeof o.savingsPerTurnUsd === "number" && o.savingsPerTurnUsd > 0)
244
+ .sort((a, b) => (b.savingsPerTurnUsd ?? 0) - (a.savingsPerTurnUsd ?? 0));
245
+ if (withSavings.length > 0)
246
+ return withSavings[0].strategy;
247
+ return "continue";
248
+ }
249
+ function pickCheapestChatModel(candidates, currentModel) {
250
+ return candidates
251
+ .filter((m) => m.id !== currentModel.id &&
252
+ m.mode === "chat" &&
253
+ typeof m.pricing?.inputPerMillion === "number" &&
254
+ typeof m.pricing?.outputPerMillion === "number")
255
+ .sort((a, b) => (a.pricing?.inputPerMillion ?? 0) - (b.pricing?.inputPerMillion ?? 0))[0];
256
+ }
257
+ function perTurnCost(pricing, inputTokens, outputTokens, useLongContextTier) {
258
+ if (!pricing)
259
+ return undefined;
260
+ const inputRate = useLongContextTier
261
+ ? (pricing.longContextInputPerMillion ?? pricing.inputPerMillion)
262
+ : pricing.inputPerMillion;
263
+ const outputRate = useLongContextTier
264
+ ? (pricing.longContextOutputPerMillion ?? pricing.outputPerMillion)
265
+ : pricing.outputPerMillion;
266
+ if (inputRate === undefined || outputRate === undefined)
267
+ return undefined;
268
+ return (inputTokens * inputRate + outputTokens * outputRate) / 1_000_000;
269
+ }
270
+ function round(n, digits) {
271
+ const factor = 10 ** digits;
272
+ return Math.round(n * factor) / factor;
273
+ }
274
+ //# sourceMappingURL=context-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-strategy.js","sourceRoot":"","sources":["../src/context-strategy.ts"],"names":[],"mappings":"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"}
package/dist/cost.d.ts ADDED
@@ -0,0 +1,152 @@
1
+ /**
2
+ * kosha-discovery — Cost primitives shared by the proxy and the CLI.
3
+ *
4
+ * Three pieces, all pure synthesis over the model + provider catalog:
5
+ * - Pre-flight cost estimation (input + expected-output tokens × rates).
6
+ * - JSONL spend ledger persisted under `~/.kosha/`, partitioned one file
7
+ * per calendar month (`ledger-YYYY-MM.jsonl`) so the budget gate only
8
+ * ever scans the month it cares about — not the full history. The legacy
9
+ * append-only `ledger.jsonl` is still read for backward compat so
10
+ * existing installs keep working until it stops growing.
11
+ * - Monthly budget gate driven by `KOSHA_MONTHLY_BUDGET_USD`.
12
+ *
13
+ * No tokenizer dependency — request bodies travel through the proxy
14
+ * untouched, so we approximate input tokens with a coarse char→token ratio.
15
+ * @module
16
+ */
17
+ import type { ModelCard } from "./types.js";
18
+ /** A single completion record written to the ledger. */
19
+ export interface LedgerEntry {
20
+ ts: number;
21
+ provider: string;
22
+ modelId: string;
23
+ requested: string;
24
+ tenant: string | null;
25
+ /** Estimated total cost in USD. */
26
+ estimatedUsd: number;
27
+ /** Input tokens estimated from the forwarded request body. */
28
+ estimatedInputTokens: number;
29
+ /** Output tokens the caller asked for (or our fallback). */
30
+ estimatedOutputTokens: number;
31
+ upstreamStatus: number;
32
+ /** Reconciled cost from the provider's `usage` block, when it returned one. */
33
+ actualUsd?: number;
34
+ /** Uncached input tokens the provider billed. */
35
+ actualInputTokens?: number;
36
+ /** Output tokens the provider billed. */
37
+ actualOutputTokens?: number;
38
+ /** Cache-read (hit) input tokens the provider reported. */
39
+ cacheReadTokens?: number;
40
+ /** Cache-write (creation) input tokens the provider reported. */
41
+ cacheWriteTokens?: number;
42
+ /** `upstream` when the actual* fields came from the provider; `estimate` when only the pre-flight numbers exist. */
43
+ usageSource?: "upstream" | "estimate";
44
+ /**
45
+ * `request` (default) for the row written when a request completes;
46
+ * `adjustment` for a follow-up row that corrects an earlier estimate once
47
+ * the upstream usage arrived (streaming responses). Adjustment rows carry
48
+ * deltas, so summing every row's {@link ledgerRowUsd} yields actual spend.
49
+ */
50
+ kind?: "request" | "adjustment";
51
+ /** Correlates an adjustment with the request row it amends. */
52
+ requestId?: string;
53
+ /** Adjustment rows only: actual − estimated, in USD (may be negative). */
54
+ adjustmentUsd?: number;
55
+ /** Adjustment rows only: actual − estimated input tokens. */
56
+ adjustmentInputTokens?: number;
57
+ /** Adjustment rows only: actual − estimated output tokens. */
58
+ adjustmentOutputTokens?: number;
59
+ }
60
+ /**
61
+ * The USD figure a ledger row contributes to spend: an adjustment row's
62
+ * delta; otherwise the reconciled upstream cost when the row has one, the
63
+ * pre-flight estimate if not. Every reader (budget gate, `kosha spend`,
64
+ * /metrics) goes through this so they agree.
65
+ */
66
+ export declare function ledgerRowUsd(row: Pick<LedgerEntry, "estimatedUsd" | "actualUsd" | "kind" | "adjustmentUsd">): number;
67
+ /** True for rows that represent a completed request (not a later correction). */
68
+ export declare function isRequestRow(row: Pick<LedgerEntry, "kind">): boolean;
69
+ /** Reconciled cost derived from a provider's `usage` block. */
70
+ export interface ActualUsageCost {
71
+ usd: number;
72
+ inputTokens: number;
73
+ outputTokens: number;
74
+ cacheReadTokens: number;
75
+ cacheWriteTokens: number;
76
+ }
77
+ /**
78
+ * Which accounting convention the usage block follows:
79
+ * - `openai` — `prompt_tokens` already includes cached tokens
80
+ * (`prompt_tokens_details.cached_tokens` is a subset).
81
+ * - `anthropic` — `input_tokens` excludes cache reads / writes, which are
82
+ * reported separately and billed at their own rates.
83
+ */
84
+ export type UsageShape = "openai" | "anthropic";
85
+ /**
86
+ * Turn a provider `usage` block into a reconciled USD cost against the
87
+ * model's pricing. Returns null when the model has no usable pricing or the
88
+ * block carries no token counts. Cache rates fall back to the provider's
89
+ * published ratios (Anthropic: reads 0.1×, writes 1.25× input; OpenAI: reads
90
+ * 0.5× input) when the catalog entry lacks explicit cache pricing, so a
91
+ * cached request is never priced as if it were fully uncached.
92
+ */
93
+ export declare function actualCostFromUsage(model: ModelCard, rawUsage: unknown, shape: UsageShape): ActualUsageCost | null;
94
+ export declare const DEFAULT_LEDGER_PATH: string;
95
+ export interface CostEstimate {
96
+ estimatedUsd: number;
97
+ inputTokens: number;
98
+ expectedOutputTokens: number;
99
+ }
100
+ /**
101
+ * Estimate the USD cost of forwarding `requestBody` to `model`. Returns null
102
+ * when the model has no usable pricing — the caller should treat that as
103
+ * "cost unknown" rather than free.
104
+ */
105
+ export declare function estimateRequestCost(model: ModelCard, requestBody: Record<string, unknown>): CostEstimate | null;
106
+ /**
107
+ * Read `KOSHA_MONTHLY_BUDGET_USD` (if any). Returns null when no budget is
108
+ * configured — the proxy's budget gate then becomes a no-op. This cap is
109
+ * global: it is always compared against total spend, never a tenant's slice,
110
+ * so a caller cannot escape it by inventing a fresh tenant tag.
111
+ */
112
+ export declare function readMonthlyBudgetUsd(): number | null;
113
+ /**
114
+ * Read `KOSHA_TENANT_BUDGET_USD` (if any): an additional per-tenant monthly
115
+ * cap applied on top of the global one to requests that carry a tenant tag.
116
+ */
117
+ export declare function readTenantBudgetUsd(): number | null;
118
+ /**
119
+ * Sum estimated USD spend for entries falling in the calendar month that
120
+ * contains `nowMs`. Tenant scopes the sum when given.
121
+ *
122
+ * Reads only the month's partition (`ledger-YYYY-MM.jsonl` next to
123
+ * `ledgerPath`) plus, for backward compat, the legacy append-only
124
+ * `ledgerPath` itself — so existing installs whose history still lives in
125
+ * the un-partitioned file keep counting until that file stops growing. At
126
+ * most two files are read, never the full history.
127
+ */
128
+ export declare function readSpendForMonth(nowMs: number, tenant?: string | null, ledgerPath?: string): Promise<number>;
129
+ /**
130
+ * Drop monthly partition files older than the retention window. Best-effort:
131
+ * errors are swallowed because retention is housekeeping, not correctness.
132
+ * The legacy `ledgerPath` file itself is never touched — only
133
+ * `ledger-YYYY-MM.jsonl` siblings are eligible. Returns the count of
134
+ * partitions removed (handy for tests / a future `kosha ledger trim`).
135
+ *
136
+ * The window is "current month plus `retentionMonths - 1` prior months", so
137
+ * the default of 12 keeps a rolling year. Exported so the CLI can run an
138
+ * explicit sweep without waiting for an append.
139
+ */
140
+ export declare function trimLedgerPartitions(ledgerPath: string, nowMs: number, retentionMonths?: number): Promise<number>;
141
+ /**
142
+ * Append one ledger entry atomically. The entry is written to the monthly
143
+ * partition for its own `ts` (`ledger-YYYY-MM.jsonl`), keeping each file
144
+ * bounded to a single month so budget reads don't scan the full history.
145
+ *
146
+ * Writes are append-only so concurrent processes don't clobber each other.
147
+ * A best-effort atomic create-and-rename is used if the first append hits
148
+ * ENOENT, so a fresh install comes up cleanly. After the write we run a
149
+ * best-effort retention trim so old partitions age out without a cron job.
150
+ */
151
+ export declare function appendLedgerEntry(entry: LedgerEntry, ledgerPath?: string): Promise<void>;
152
+ //# sourceMappingURL=cost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"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"}