@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.
- package/README.md +66 -26
- package/dist/aliases.d.ts +6 -1
- package/dist/aliases.d.ts.map +1 -1
- package/dist/aliases.js +38 -12
- package/dist/aliases.js.map +1 -1
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +25 -2
- package/dist/cache.js.map +1 -1
- package/dist/claude-generation.d.ts +59 -0
- package/dist/claude-generation.d.ts.map +1 -0
- package/dist/claude-generation.js +117 -0
- package/dist/claude-generation.js.map +1 -0
- package/dist/cli-cmd-doctor.d.ts +17 -0
- package/dist/cli-cmd-doctor.d.ts.map +1 -0
- package/dist/cli-cmd-doctor.js +199 -0
- package/dist/cli-cmd-doctor.js.map +1 -0
- package/dist/cli-cmd-model.js +2 -2
- package/dist/cli-cmd-model.js.map +1 -1
- package/dist/cli-cmd-spend.d.ts +10 -0
- package/dist/cli-cmd-spend.d.ts.map +1 -0
- package/dist/cli-cmd-spend.js +130 -0
- package/dist/cli-cmd-spend.js.map +1 -0
- package/dist/cli-commands.d.ts +4 -1
- package/dist/cli-commands.d.ts.map +1 -1
- package/dist/cli-commands.js +10 -2
- package/dist/cli-commands.js.map +1 -1
- package/dist/cli-format.d.ts.map +1 -1
- package/dist/cli-format.js +2 -1
- package/dist/cli-format.js.map +1 -1
- package/dist/cli-help.d.ts.map +1 -1
- package/dist/cli-help.js +4 -2
- package/dist/cli-help.js.map +1 -1
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -1
- package/dist/context-strategy.d.ts +48 -0
- package/dist/context-strategy.d.ts.map +1 -0
- package/dist/context-strategy.js +274 -0
- package/dist/context-strategy.js.map +1 -0
- package/dist/cost.d.ts +152 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +377 -0
- package/dist/cost.js.map +1 -0
- package/dist/credentials/resolver.d.ts +17 -0
- package/dist/credentials/resolver.d.ts.map +1 -1
- package/dist/credentials/resolver.js +92 -34
- package/dist/credentials/resolver.js.map +1 -1
- package/dist/discovery/anthropic.d.ts +19 -1
- package/dist/discovery/anthropic.d.ts.map +1 -1
- package/dist/discovery/anthropic.js +112 -8
- package/dist/discovery/anthropic.js.map +1 -1
- package/dist/discovery/base.d.ts +7 -0
- package/dist/discovery/base.d.ts.map +1 -1
- package/dist/discovery/base.js +32 -4
- package/dist/discovery/base.js.map +1 -1
- package/dist/discovery/bedrock.d.ts.map +1 -1
- package/dist/discovery/cerebras.d.ts.map +1 -1
- package/dist/discovery/cohere.d.ts.map +1 -1
- package/dist/discovery/deepinfra.d.ts.map +1 -1
- package/dist/discovery/deepseek.d.ts.map +1 -1
- package/dist/discovery/fireworks.d.ts.map +1 -1
- package/dist/discovery/glm.d.ts.map +1 -1
- package/dist/discovery/google.d.ts +3 -1
- package/dist/discovery/google.d.ts.map +1 -1
- package/dist/discovery/google.js +13 -6
- package/dist/discovery/google.js.map +1 -1
- package/dist/discovery/groq.d.ts.map +1 -1
- package/dist/discovery/index.d.ts +3 -0
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +9 -0
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/litellm-seed.js +12 -8
- package/dist/discovery/litellm-seed.js.map +1 -1
- package/dist/discovery/llama-cpp.d.ts.map +1 -1
- package/dist/discovery/lmstudio.d.ts +26 -0
- package/dist/discovery/lmstudio.d.ts.map +1 -0
- package/dist/discovery/lmstudio.js +93 -0
- package/dist/discovery/lmstudio.js.map +1 -0
- package/dist/discovery/minimax.d.ts.map +1 -1
- package/dist/discovery/mistral.d.ts.map +1 -1
- package/dist/discovery/modelsdev-seed.js +16 -12
- package/dist/discovery/modelsdev-seed.js.map +1 -1
- package/dist/discovery/moonshot.d.ts.map +1 -1
- package/dist/discovery/nvidia.d.ts.map +1 -1
- package/dist/discovery/ollama.d.ts.map +1 -1
- package/dist/discovery/openai-compatible.d.ts.map +1 -1
- package/dist/discovery/openai.d.ts.map +1 -1
- package/dist/discovery/openrouter.d.ts +29 -5
- package/dist/discovery/openrouter.d.ts.map +1 -1
- package/dist/discovery/openrouter.js +56 -18
- package/dist/discovery/openrouter.js.map +1 -1
- package/dist/discovery/perplexity.d.ts.map +1 -1
- package/dist/discovery/promo-overrides.js.map +1 -1
- package/dist/discovery/static-direct.d.ts +9 -1
- package/dist/discovery/static-direct.d.ts.map +1 -1
- package/dist/discovery/static-direct.js +68 -7
- package/dist/discovery/static-direct.js.map +1 -1
- package/dist/discovery/together.d.ts.map +1 -1
- package/dist/discovery/vercel.d.ts +45 -0
- package/dist/discovery/vercel.d.ts.map +1 -0
- package/dist/discovery/vercel.js +232 -0
- package/dist/discovery/vercel.js.map +1 -0
- package/dist/discovery/vertex.d.ts.map +1 -1
- package/dist/discovery/vllm.d.ts +26 -0
- package/dist/discovery/vllm.d.ts.map +1 -0
- package/dist/discovery/vllm.js +93 -0
- package/dist/discovery/vllm.js.map +1 -0
- package/dist/discovery/zai.d.ts.map +1 -1
- package/dist/discovery-contract.d.ts +8 -1
- package/dist/discovery-contract.d.ts.map +1 -1
- package/dist/discovery-contract.js +28 -1
- package/dist/discovery-contract.js.map +1 -1
- package/dist/discovery-routes.d.ts +9 -0
- package/dist/discovery-routes.d.ts.map +1 -1
- package/dist/discovery-routes.js +106 -18
- package/dist/discovery-routes.js.map +1 -1
- package/dist/enrichment/litellm-catalog.d.ts +1 -0
- package/dist/enrichment/litellm-catalog.d.ts.map +1 -1
- package/dist/enrichment/litellm-catalog.js.map +1 -1
- package/dist/enrichment/litellm.d.ts +1 -1
- package/dist/enrichment/litellm.d.ts.map +1 -1
- package/dist/enrichment/litellm.js +9 -3
- package/dist/enrichment/litellm.js.map +1 -1
- package/dist/entry.d.ts +14 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +26 -0
- package/dist/entry.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts +207 -2
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +254 -54
- package/dist/mcp-server.js.map +1 -1
- package/dist/model-features.d.ts.map +1 -1
- package/dist/model-features.js +11 -2
- package/dist/model-features.js.map +1 -1
- package/dist/normalize.d.ts +7 -7
- package/dist/normalize.js +8 -8
- package/dist/provider-catalog.d.ts +17 -2
- package/dist/provider-catalog.d.ts.map +1 -1
- package/dist/provider-catalog.js +112 -0
- package/dist/provider-catalog.js.map +1 -1
- package/dist/proxy.d.ts +49 -7
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +765 -80
- package/dist/proxy.js.map +1 -1
- package/dist/registry-discovery.d.ts.map +1 -1
- package/dist/registry-discovery.js +4 -4
- package/dist/registry-discovery.js.map +1 -1
- package/dist/registry-query.d.ts +2 -2
- package/dist/registry-query.d.ts.map +1 -1
- package/dist/registry-query.js +60 -9
- package/dist/registry-query.js.map +1 -1
- package/dist/registry-routing.d.ts +65 -0
- package/dist/registry-routing.d.ts.map +1 -0
- package/dist/registry-routing.js +165 -0
- package/dist/registry-routing.js.map +1 -0
- package/dist/registry-runtime.d.ts +2 -0
- package/dist/registry-runtime.d.ts.map +1 -1
- package/dist/registry-runtime.js +167 -15
- package/dist/registry-runtime.js.map +1 -1
- package/dist/registry-selection.d.ts.map +1 -1
- package/dist/registry-selection.js +27 -3
- package/dist/registry-selection.js.map +1 -1
- package/dist/registry.d.ts +69 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +135 -3
- package/dist/registry.js.map +1 -1
- package/dist/resilience.d.ts +15 -0
- package/dist/resilience.d.ts.map +1 -1
- package/dist/resilience.js +23 -1
- package/dist/resilience.js.map +1 -1
- package/dist/security.js +6 -6
- package/dist/security.js.map +1 -1
- package/dist/server.d.ts +44 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +329 -34
- package/dist/server.js.map +1 -1
- package/dist/tally.d.ts +80 -0
- package/dist/tally.d.ts.map +1 -0
- package/dist/tally.js +176 -0
- package/dist/tally.js.map +1 -0
- package/dist/types.d.ts +64 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/wire-anthropic.d.ts +264 -0
- package/dist/wire-anthropic.d.ts.map +1 -0
- package/dist/wire-anthropic.js +960 -0
- package/dist/wire-anthropic.js.map +1 -0
- package/package.json +106 -97
- 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-
|
|
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. */
|
package/dist/cli-help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
1
|
+
{"version":3,"file":"cli-help.js","sourceRoot":"","sources":["../src/cli-help.ts"],"names":[],"mappings":"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"}
|
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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"}
|