@plurnk/plurnk-providers 1.5.0 → 1.6.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/.env.defaults +36 -22
- package/SPEC.md +133 -59
- package/dist/AiSdkProvider.d.ts +19 -26
- package/dist/AiSdkProvider.d.ts.map +1 -1
- package/dist/AiSdkProvider.js +318 -106
- package/dist/AiSdkProvider.js.map +1 -1
- package/dist/Mock.d.ts +4 -9
- package/dist/Mock.d.ts.map +1 -1
- package/dist/Mock.js +36 -9
- package/dist/Mock.js.map +1 -1
- package/dist/Pool.d.ts +2 -21
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +19 -14
- package/dist/Pool.js.map +1 -1
- package/dist/accounting.d.ts +5 -2
- package/dist/accounting.d.ts.map +1 -1
- package/dist/accounting.js +100 -16
- package/dist/accounting.js.map +1 -1
- package/dist/aiSdkTransport.d.ts +9 -2
- package/dist/aiSdkTransport.d.ts.map +1 -1
- package/dist/aiSdkTransport.js +160 -62
- package/dist/aiSdkTransport.js.map +1 -1
- package/dist/catalogProvider.d.ts +7 -3
- package/dist/catalogProvider.d.ts.map +1 -1
- package/dist/catalogProvider.js +30 -24
- package/dist/catalogProvider.js.map +1 -1
- package/dist/compatibleProvider.d.ts.map +1 -1
- package/dist/compatibleProvider.js +18 -7
- package/dist/compatibleProvider.js.map +1 -1
- package/dist/cost.d.ts +10 -10
- package/dist/cost.d.ts.map +1 -1
- package/dist/cost.js +90 -42
- package/dist/cost.js.map +1 -1
- package/dist/env.d.ts +5 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +30 -10
- package/dist/env.js.map +1 -1
- package/dist/errors.d.ts +14 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +58 -2
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/ollama.js +3 -3
- package/dist/ollama.js.map +1 -1
- package/dist/sdkModels.d.ts +6 -2
- package/dist/sdkModels.d.ts.map +1 -1
- package/dist/sdkModels.js +38 -5
- package/dist/sdkModels.js.map +1 -1
- package/dist/types.d.ts +33 -31
- package/dist/types.d.ts.map +1 -1
- package/dist/usage.d.ts +21 -5
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +164 -83
- package/dist/usage.js.map +1 -1
- package/package.json +7 -6
- package/src/AiSdkProvider.test.ts +788 -191
- package/src/AiSdkProvider.ts +381 -124
- package/src/Mock.test.ts +37 -12
- package/src/Mock.ts +45 -14
- package/src/Pool.test.ts +19 -6
- package/src/Pool.ts +20 -16
- package/src/ProviderRegistry.test.ts +16 -11
- package/src/accounting.test.ts +58 -22
- package/src/accounting.ts +120 -18
- package/src/aiSdkTransport.test.ts +42 -49
- package/src/aiSdkTransport.ts +174 -62
- package/src/boundaries.test.ts +1 -0
- package/src/catalogProvider.test.ts +258 -22
- package/src/catalogProvider.ts +42 -27
- package/src/compatibleProvider.test.ts +6 -3
- package/src/compatibleProvider.ts +20 -7
- package/src/cost.test.ts +55 -36
- package/src/cost.ts +111 -50
- package/src/defaults.test.ts +13 -3
- package/src/env.test.ts +54 -5
- package/src/env.ts +43 -18
- package/src/errors.test.ts +47 -2
- package/src/errors.ts +67 -3
- package/src/index.ts +21 -5
- package/src/ollama.test.ts +4 -1
- package/src/ollama.ts +3 -3
- package/src/sdkModels.test.ts +76 -4
- package/src/sdkModels.ts +45 -7
- package/src/types.ts +77 -38
- package/src/usage.test.ts +112 -116
- package/src/usage.ts +209 -93
package/dist/catalogProvider.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { lookupProvider, resolveModel } from "@plurnk/plurnk-models";
|
|
2
|
-
import { contextWindowFromEnv, effectiveContextWindow, dataCaptureFromEnv, envelopeFromEnv, parseRequiredFloat, parseRequiredInt,
|
|
2
|
+
import { contextWindowFromEnv, effectiveContextWindow, dataCaptureFromEnv, envelopeFromEnv, parseRequiredFloat, parseRequiredInt, parseTimeoutMs, cacheAffinityFromEnv, cacheWritePolicyFromEnv, reasoningFromEnv, reasoningResponseStyleFromEnv, resolveReserve, } from "./env.js";
|
|
3
3
|
import AiSdkProvider from "./AiSdkProvider.js";
|
|
4
4
|
import { configuredProviderInfo, createSdkModel } from "./sdkModels.js";
|
|
5
5
|
import { providerSource } from "./notices.js";
|
|
6
|
-
import {
|
|
6
|
+
import { estimateProviderCost } from "./cost.js";
|
|
7
7
|
import { emitWarningOnce } from "./warnings.js";
|
|
8
8
|
const reasoningStyleFromEnv = (env, name) => {
|
|
9
9
|
const prefix = name.replaceAll(/[^a-zA-Z0-9]/g, "_").toUpperCase();
|
|
@@ -19,8 +19,8 @@ const reasoningStyleFromEnv = (env, name) => {
|
|
|
19
19
|
}
|
|
20
20
|
return value;
|
|
21
21
|
};
|
|
22
|
-
export const providerFromSdkModel = ({ name, env, model, languageModel,
|
|
23
|
-
emitWarningOnce(`${name} provider:
|
|
22
|
+
export const providerFromSdkModel = ({ name, env, model, languageModel, normalizeCost, url, headers, contextWindow, info, attributions, cacheAffinity, systemCacheProviderOptions, reasoningResponseProviderOptions, }) => {
|
|
23
|
+
emitWarningOnce(`${name} provider: request-level prompt counting is a chars/2 estimate; hard context-envelope admission fails closed without exact or bounded evidence`, "PLURNK_PROMPT_COUNT_ESTIMATE");
|
|
24
24
|
const reasoning = reasoningFromEnv(env, name);
|
|
25
25
|
const { reasoningReserve: configuredReasoning, completionReserve: configuredCompletion } = envelopeFromEnv(env, name);
|
|
26
26
|
const completionReserve = "tokens" in configuredCompletion
|
|
@@ -40,30 +40,28 @@ export const providerFromSdkModel = ({ name, env, model, languageModel, normaliz
|
|
|
40
40
|
const rates = catalogCost === undefined ? null : {
|
|
41
41
|
input: catalogCost.inputPer1M,
|
|
42
42
|
output: catalogCost.outputPer1M,
|
|
43
|
-
|
|
43
|
+
...(catalogCost.cacheReadPer1M === undefined
|
|
44
|
+
? {}
|
|
45
|
+
: { cacheRead: catalogCost.cacheReadPer1M }),
|
|
46
|
+
...(catalogCost.cacheWritePer1M === undefined
|
|
47
|
+
? {}
|
|
48
|
+
: { cacheWrite: catalogCost.cacheWritePer1M }),
|
|
44
49
|
};
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const calculateCharge = rates === null
|
|
49
|
-
? () => ({ kind: "unknown", reason: "the response reported no cost and Models.dev has no rate for this model" })
|
|
50
|
-
: rates.input === 0 && rates.output === 0 && rates.cached === 0
|
|
51
|
-
? () => ({ kind: "free", source: "Models.dev catalog rates" })
|
|
52
|
-
: (usage) => ({
|
|
53
|
-
kind: "estimated",
|
|
54
|
-
usd: calculateCostUsdDecimal(usage, rates),
|
|
55
|
-
source: "Models.dev catalog rates",
|
|
56
|
-
});
|
|
50
|
+
const estimateCost = (usage) => estimateProviderCost(usage, rates, "Models.dev catalog rates");
|
|
51
|
+
const affinityEnabled = cacheAffinityFromEnv(env, name);
|
|
52
|
+
const cacheWritePolicy = cacheWritePolicyFromEnv(env, name);
|
|
57
53
|
return new AiSdkProvider({
|
|
58
54
|
model,
|
|
59
55
|
...(attributions === undefined ? {} : { attributions }),
|
|
60
56
|
...(languageModel === undefined ? {} : { languageModel }),
|
|
61
|
-
...(
|
|
57
|
+
...(normalizeCost === undefined ? {} : { normalizeCost }),
|
|
62
58
|
...(url === undefined ? {} : { url }),
|
|
63
59
|
...(headers === undefined ? {} : { headers: { ...headers } }),
|
|
64
60
|
contextWindow,
|
|
65
|
-
fetchTimeoutMs:
|
|
66
|
-
|
|
61
|
+
fetchTimeoutMs: parseTimeoutMs(env.PLURNK_PROVIDERS_FETCH_TIMEOUT, "PLURNK_PROVIDERS_FETCH_TIMEOUT", name),
|
|
62
|
+
operationTimeoutMs: parseTimeoutMs(env.PLURNK_PROVIDERS_OPERATION_TIMEOUT, "PLURNK_PROVIDERS_OPERATION_TIMEOUT", name),
|
|
63
|
+
firstContentTimeoutMs: parseTimeoutMs(env.PLURNK_PROVIDERS_FIRST_CONTENT_TIMEOUT, "PLURNK_PROVIDERS_FIRST_CONTENT_TIMEOUT", name),
|
|
64
|
+
streamIdleTimeoutMs: parseTimeoutMs(env.PLURNK_PROVIDERS_STREAM_IDLE_TIMEOUT, "PLURNK_PROVIDERS_STREAM_IDLE_TIMEOUT", name),
|
|
67
65
|
reasoning,
|
|
68
66
|
reasoningResponseStyle: reasoningResponseStyleFromEnv(env, name),
|
|
69
67
|
temperature: parseRequiredFloat(env.PLURNK_PROVIDERS_TEMPERATURE, "PLURNK_PROVIDERS_TEMPERATURE", name, 0),
|
|
@@ -74,10 +72,15 @@ export const providerFromSdkModel = ({ name, env, model, languageModel, normaliz
|
|
|
74
72
|
retryAttempts: parseRequiredInt(env.PLURNK_PROVIDERS_RETRY_ATTEMPTS, "PLURNK_PROVIDERS_RETRY_ATTEMPTS", name),
|
|
75
73
|
errorDetailLimit: parseRequiredInt(env.PLURNK_PROVIDERS_ERROR_DETAIL_LIMIT, "PLURNK_PROVIDERS_ERROR_DETAIL_LIMIT", name),
|
|
76
74
|
reasoningStyle: reasoningStyleFromEnv(env, name),
|
|
77
|
-
|
|
75
|
+
...(affinityEnabled && cacheAffinity !== undefined ? { cacheAffinity } : {}),
|
|
76
|
+
...(cacheWritePolicy === "stable-system" && systemCacheProviderOptions !== undefined
|
|
77
|
+
? { systemCacheProviderOptions }
|
|
78
|
+
: {}),
|
|
79
|
+
...(reasoningResponseProviderOptions === undefined
|
|
80
|
+
? {}
|
|
81
|
+
: { reasoningResponseProviderOptions }),
|
|
78
82
|
serviceTier: env.PLURNK_PROVIDERS_SERVICE_TIER,
|
|
79
|
-
|
|
80
|
-
calculateCharge,
|
|
83
|
+
estimateCost,
|
|
81
84
|
source: providerSource(name),
|
|
82
85
|
gbnfDebug: env.PLURNK_PROVIDERS_GBNF_DEBUG !== undefined
|
|
83
86
|
&& env.PLURNK_PROVIDERS_GBNF_DEBUG !== ""
|
|
@@ -109,9 +112,12 @@ export const catalogProviderFromEnv = (name, env, model, baseUrlOverride) => {
|
|
|
109
112
|
env,
|
|
110
113
|
model: wireModel,
|
|
111
114
|
languageModel: sdk.languageModel,
|
|
112
|
-
|
|
115
|
+
normalizeCost: sdk.normalizeCost,
|
|
113
116
|
url: sdk.compatible?.url,
|
|
114
117
|
headers: sdk.compatible?.headers,
|
|
118
|
+
cacheAffinity: sdk.cacheAffinity,
|
|
119
|
+
systemCacheProviderOptions: sdk.systemCacheProviderOptions,
|
|
120
|
+
reasoningResponseProviderOptions: sdk.reasoningResponseProviderOptions,
|
|
115
121
|
contextWindow,
|
|
116
122
|
info,
|
|
117
123
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalogProvider.js","sourceRoot":"","sources":["../src/catalogProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAkB,MAAM,uBAAuB,CAAC;AACrF,OAAO,EACH,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,
|
|
1
|
+
{"version":3,"file":"catalogProvider.js","sourceRoot":"","sources":["../src/catalogProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compatibleProvider.d.ts","sourceRoot":"","sources":["../src/compatibleProvider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compatibleProvider.d.ts","sourceRoot":"","sources":["../src/compatibleProvider.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAgG3C,eAAO,MAAM,yBAAyB,aACxB,QAAQ,GAAG,QAAQ,OACxB,MAAM,CAAC,UAAU,SACf,MAAM,oBACK,MAAM,KACzB,OAAO,CAAC,QAAQ,CA2GlB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import AiSdkProvider from "./AiSdkProvider.js";
|
|
2
|
-
import { contextWindowFromEnv, effectiveContextWindow, dataCaptureFromEnv, envelopeFromEnv, parseOptionalFloat, parseOptionalInt, parseRequiredFloat, parseRequiredInt,
|
|
2
|
+
import { contextWindowFromEnv, effectiveContextWindow, dataCaptureFromEnv, envelopeFromEnv, parseOptionalFloat, parseOptionalInt, parseRequiredFloat, parseRequiredInt, parseTimeoutMs, cacheAffinityFromEnv, cacheWritePolicyFromEnv, reasoningFromEnv, reasoningResponseStyleFromEnv, } from "./env.js";
|
|
3
3
|
import { providerSource } from "./notices.js";
|
|
4
|
+
import { plurnkCostNormalizer } from "./accounting.js";
|
|
4
5
|
import { emitWarningOnce } from "./warnings.js";
|
|
5
6
|
const chatUrl = (provider, env, override) => {
|
|
6
7
|
const configured = override
|
|
@@ -20,7 +21,10 @@ const chatUrl = (provider, env, override) => {
|
|
|
20
21
|
const probeModels = async (url, headers, model, timeout) => {
|
|
21
22
|
const modelsUrl = url.replace(/\/chat\/completions$/, "/models");
|
|
22
23
|
try {
|
|
23
|
-
const response = await fetch(modelsUrl, {
|
|
24
|
+
const response = await fetch(modelsUrl, {
|
|
25
|
+
headers,
|
|
26
|
+
...(timeout > 0 ? { signal: AbortSignal.timeout(timeout) } : {}),
|
|
27
|
+
});
|
|
24
28
|
if (!response.ok)
|
|
25
29
|
return { nCtx: null, llamaServer: false, servedModel: null, failed: true };
|
|
26
30
|
const data = await response.json();
|
|
@@ -53,7 +57,7 @@ const probeProps = async (url, headers, timeout) => {
|
|
|
53
57
|
try {
|
|
54
58
|
const response = await fetch(url.replace(/\/v1\/chat\/completions$/, "/props"), {
|
|
55
59
|
headers,
|
|
56
|
-
signal: AbortSignal.timeout(timeout),
|
|
60
|
+
...(timeout > 0 ? { signal: AbortSignal.timeout(timeout) } : {}),
|
|
57
61
|
});
|
|
58
62
|
if (!response.ok)
|
|
59
63
|
return { slotCount: null, eosText: null };
|
|
@@ -68,12 +72,17 @@ const probeProps = async (url, headers, timeout) => {
|
|
|
68
72
|
}
|
|
69
73
|
};
|
|
70
74
|
export const compatibleProviderFromEnv = async (provider, env, model, baseUrlOverride) => {
|
|
75
|
+
// The knobs remain universal and fail hard when malformed, but this local /
|
|
76
|
+
// first-party compatible route declares no vendor cache projection. llama-server
|
|
77
|
+
// already owns slot affinity and the first-party endpoint receives worker metadata.
|
|
78
|
+
cacheAffinityFromEnv(env, provider);
|
|
79
|
+
cacheWritePolicyFromEnv(env, provider);
|
|
71
80
|
const url = chatUrl(provider, env, baseUrlOverride);
|
|
72
81
|
const apiKey = provider === "openai" ? env.OPENAI_API_KEY : env.PLURNK_API_KEY;
|
|
73
82
|
const headers = apiKey === undefined || apiKey.length === 0
|
|
74
83
|
? {}
|
|
75
84
|
: { Authorization: `Bearer ${apiKey}` };
|
|
76
|
-
const timeout =
|
|
85
|
+
const timeout = parseTimeoutMs(env.PLURNK_PROVIDERS_FETCH_TIMEOUT, "PLURNK_PROVIDERS_FETCH_TIMEOUT", provider);
|
|
77
86
|
const attempts = parseRequiredInt(env.PLURNK_PROVIDERS_PROBE_ATTEMPTS, "PLURNK_PROVIDERS_PROBE_ATTEMPTS", provider);
|
|
78
87
|
const probe = await probeModelsRetrying(url, headers, model, timeout, attempts, parseRequiredInt(env.PLURNK_PROVIDERS_PROBE_DELAY, "PLURNK_PROVIDERS_PROBE_DELAY", provider));
|
|
79
88
|
const contextWindow = effectiveContextWindow(contextWindowFromEnv(env, provider), probe.nCtx);
|
|
@@ -105,7 +114,7 @@ export const compatibleProviderFromEnv = async (provider, env, model, baseUrlOve
|
|
|
105
114
|
promptTokensUrl = url.replace(/\/v1\/chat\/completions$/, "/v1/chat/completions/input_tokens");
|
|
106
115
|
}
|
|
107
116
|
if (!llamaServer) {
|
|
108
|
-
emitWarningOnce(`${provider} provider:
|
|
117
|
+
emitWarningOnce(`${provider} provider: request-level prompt counting is a chars/2 estimate; hard context-envelope admission fails closed without exact or bounded evidence`, "PLURNK_PROMPT_COUNT_ESTIMATE");
|
|
109
118
|
}
|
|
110
119
|
const { reasoningReserve, completionReserve } = envelopeFromEnv(env, provider);
|
|
111
120
|
return new AiSdkProvider({
|
|
@@ -114,7 +123,9 @@ export const compatibleProviderFromEnv = async (provider, env, model, baseUrlOve
|
|
|
114
123
|
headers,
|
|
115
124
|
contextWindow,
|
|
116
125
|
fetchTimeoutMs: timeout,
|
|
117
|
-
|
|
126
|
+
operationTimeoutMs: parseTimeoutMs(env.PLURNK_PROVIDERS_OPERATION_TIMEOUT, "PLURNK_PROVIDERS_OPERATION_TIMEOUT", provider),
|
|
127
|
+
firstContentTimeoutMs: parseTimeoutMs(env.PLURNK_PROVIDERS_FIRST_CONTENT_TIMEOUT, "PLURNK_PROVIDERS_FIRST_CONTENT_TIMEOUT", provider),
|
|
128
|
+
streamIdleTimeoutMs: parseTimeoutMs(env.PLURNK_PROVIDERS_STREAM_IDLE_TIMEOUT, "PLURNK_PROVIDERS_STREAM_IDLE_TIMEOUT", provider),
|
|
118
129
|
reasoning: reasoningFromEnv(env, provider),
|
|
119
130
|
reasoningResponseStyle: reasoningResponseStyleFromEnv(env, provider),
|
|
120
131
|
reasoningStyle,
|
|
@@ -130,7 +141,6 @@ export const compatibleProviderFromEnv = async (provider, env, model, baseUrlOve
|
|
|
130
141
|
tuningFloors: provider !== "plurnk",
|
|
131
142
|
retryAttempts: parseRequiredInt(env.PLURNK_PROVIDERS_RETRY_ATTEMPTS, "PLURNK_PROVIDERS_RETRY_ATTEMPTS", provider),
|
|
132
143
|
errorDetailLimit: parseRequiredInt(env.PLURNK_PROVIDERS_ERROR_DETAIL_LIMIT, "PLURNK_PROVIDERS_ERROR_DETAIL_LIMIT", provider),
|
|
133
|
-
promptCacheKey: promptCacheKeyFromEnv(env, provider),
|
|
134
144
|
source: providerSource(provider),
|
|
135
145
|
grammarStyle,
|
|
136
146
|
gbnfDebug: env.PLURNK_PROVIDERS_GBNF_DEBUG !== undefined
|
|
@@ -138,6 +148,7 @@ export const compatibleProviderFromEnv = async (provider, env, model, baseUrlOve
|
|
|
138
148
|
&& env.PLURNK_PROVIDERS_GBNF_DEBUG !== "0",
|
|
139
149
|
...dataCaptureFromEnv(env, provider),
|
|
140
150
|
firstPartyMetadata: provider === "plurnk",
|
|
151
|
+
normalizeCost: provider === "plurnk" ? plurnkCostNormalizer : undefined,
|
|
141
152
|
apiKeyRejectedMessage: provider === "plurnk"
|
|
142
153
|
? "PLURNK_API_KEY was rejected by plurnk.ai (invalid or expired)."
|
|
143
154
|
: undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compatibleProvider.js","sourceRoot":"","sources":["../src/compatibleProvider.ts"],"names":[],"mappings":"AAAA,OAAO,aAAyD,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EACH,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,
|
|
1
|
+
{"version":3,"file":"compatibleProvider.js","sourceRoot":"","sources":["../src/compatibleProvider.ts"],"names":[],"mappings":"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"}
|
package/dist/cost.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import type { ChargedCost, ProviderCost, ProviderUsage } from "./types.ts";
|
|
2
|
+
import { type TokenRates } from "./usage.ts";
|
|
3
|
+
export declare const validateDecimal: (value: unknown, name: string) => string;
|
|
4
|
+
export declare const validateChargedCost: (value: unknown) => ChargedCost;
|
|
5
|
+
export declare const validateProviderCost: (value: unknown) => ProviderCost;
|
|
6
|
+
export declare const estimateProviderCost: (usage: ProviderUsage | undefined, rates: TokenRates | null, source: string) => ProviderCost;
|
|
7
|
+
export declare const resolveProviderCost: (direct: ProviderCost | undefined, estimated: ProviderCost) => ProviderCost;
|
|
8
|
+
export declare const providerCostUsd: (cost: ProviderCost) => string | null;
|
|
9
|
+
export declare const addDecimals: (values: readonly string[]) => string;
|
|
10
|
+
export declare const sumProviderCostsUsd: (costs: readonly ProviderCost[]) => string | null;
|
|
11
11
|
//# sourceMappingURL=cost.d.ts.map
|
package/dist/cost.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,
|
|
1
|
+
{"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,WAAW,EACX,YAAY,EACZ,aAAa,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAGH,KAAK,UAAU,EAClB,MAAM,YAAY,CAAC;AAmBpB,eAAO,MAAM,eAAe,UAAW,OAAO,QAAQ,MAAM,KAAG,MAK9D,CAAC;AAWF,eAAO,MAAM,mBAAmB,UAAW,OAAO,KAAG,WASpD,CAAC;AAEF,eAAO,MAAM,oBAAoB,UAAW,OAAO,KAAG,YAerD,CAAC;AAEF,eAAO,MAAM,oBAAoB,UACtB,aAAa,GAAG,SAAS,SACzB,UAAU,GAAG,IAAI,UAChB,MAAM,KACf,YAkBF,CAAC;AAEF,eAAO,MAAM,mBAAmB,WACpB,YAAY,GAAG,SAAS,aACrB,YAAY,KACxB,YAE+B,CAAC;AAEnC,eAAO,MAAM,eAAe,SAAU,YAAY,KAAG,MAAM,GAAG,IAY7D,CAAC;AAQF,eAAO,MAAM,WAAW,WAAY,SAAS,MAAM,EAAE,KAAG,MAQvD,CAAC;AAEF,eAAO,MAAM,mBAAmB,UAAW,SAAS,YAAY,EAAE,KAAG,MAAM,GAAG,IAK7E,CAAC"}
|
package/dist/cost.js
CHANGED
|
@@ -1,61 +1,109 @@
|
|
|
1
|
+
import { calculateCostUsdDecimal, canonicalDecimal, } from "./usage.js";
|
|
1
2
|
const DECIMAL = /^(?:0|[1-9]\d*)(?:\.\d+)?$/;
|
|
2
3
|
const CURRENCY = /^[A-Z][A-Z0-9]{2,11}$/;
|
|
4
|
+
const recordOf = (value, name) => {
|
|
5
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
6
|
+
throw new TypeError(`${name} must be an object`);
|
|
7
|
+
}
|
|
8
|
+
return value;
|
|
9
|
+
};
|
|
3
10
|
const nonEmpty = (value, name) => {
|
|
4
|
-
if (value.trim() === "")
|
|
5
|
-
throw new TypeError(`${name} must be non-empty`);
|
|
11
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
12
|
+
throw new TypeError(`${name} must be a non-empty string`);
|
|
13
|
+
}
|
|
6
14
|
return value;
|
|
7
15
|
};
|
|
8
|
-
const
|
|
9
|
-
if (!DECIMAL.test(value))
|
|
16
|
+
export const validateDecimal = (value, name) => {
|
|
17
|
+
if (typeof value !== "string" || !DECIMAL.test(value)) {
|
|
10
18
|
throw new TypeError(`${name} must be a canonical non-negative decimal string`);
|
|
19
|
+
}
|
|
11
20
|
return value;
|
|
12
21
|
};
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
throw new TypeError("provider charge currency must be an uppercase currency code");
|
|
22
|
+
const monetaryAmount = (value, name) => {
|
|
23
|
+
const amount = recordOf(value, name);
|
|
24
|
+
const decimalAmount = validateDecimal(amount.amount, `${name} amount`);
|
|
25
|
+
if (typeof amount.currency !== "string" || !CURRENCY.test(amount.currency)) {
|
|
26
|
+
throw new TypeError(`${name} currency must be an uppercase currency code`);
|
|
19
27
|
}
|
|
20
|
-
|
|
21
|
-
nonEmpty(charge.source, "provider charge source");
|
|
22
|
-
return charge;
|
|
28
|
+
return { amount: decimalAmount, currency: amount.currency };
|
|
23
29
|
};
|
|
24
|
-
export const
|
|
30
|
+
export const validateChargedCost = (value) => {
|
|
31
|
+
const cost = recordOf(value, "provider charged cost");
|
|
32
|
+
if (cost.kind !== "charged")
|
|
33
|
+
throw new TypeError("provider charged cost kind must be charged");
|
|
34
|
+
monetaryAmount(cost.amount, "provider charged cost");
|
|
35
|
+
if (cost.usdEquivalent !== undefined) {
|
|
36
|
+
validateDecimal(cost.usdEquivalent, "provider charged cost USD equivalent");
|
|
37
|
+
}
|
|
38
|
+
nonEmpty(cost.source, "provider charged cost source");
|
|
39
|
+
return value;
|
|
40
|
+
};
|
|
41
|
+
export const validateProviderCost = (value) => {
|
|
42
|
+
const cost = recordOf(value, "provider cost");
|
|
25
43
|
switch (cost.kind) {
|
|
26
|
-
case "
|
|
27
|
-
return
|
|
44
|
+
case "charged":
|
|
45
|
+
return validateChargedCost(value);
|
|
28
46
|
case "estimated":
|
|
29
|
-
|
|
30
|
-
nonEmpty(cost.source, "provider cost
|
|
31
|
-
return
|
|
32
|
-
case "free":
|
|
33
|
-
nonEmpty(cost.source, "provider free source");
|
|
34
|
-
return cost;
|
|
47
|
+
monetaryAmount(cost.amount, "provider estimated cost");
|
|
48
|
+
nonEmpty(cost.source, "provider estimated cost source");
|
|
49
|
+
return value;
|
|
35
50
|
case "unknown":
|
|
36
51
|
nonEmpty(cost.reason, "provider unknown-cost reason");
|
|
37
|
-
return
|
|
52
|
+
return value;
|
|
53
|
+
default:
|
|
54
|
+
throw new TypeError("provider cost kind must be charged, estimated, or unknown");
|
|
38
55
|
}
|
|
39
56
|
};
|
|
40
|
-
export const
|
|
41
|
-
if (
|
|
42
|
-
return
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
57
|
+
export const estimateProviderCost = (usage, rates, source) => {
|
|
58
|
+
if (usage === undefined) {
|
|
59
|
+
return { kind: "unknown", reason: "the provider response reported no normalized usage" };
|
|
60
|
+
}
|
|
61
|
+
if (rates === null) {
|
|
62
|
+
return { kind: "unknown", reason: "Models.dev has no complete rate for this model" };
|
|
63
|
+
}
|
|
64
|
+
const usd = calculateCostUsdDecimal(usage, rates);
|
|
65
|
+
return usd === null
|
|
66
|
+
? {
|
|
67
|
+
kind: "unknown",
|
|
68
|
+
reason: "the provider response omitted a token category with a distinct Models.dev rate",
|
|
69
|
+
}
|
|
70
|
+
: {
|
|
71
|
+
kind: "estimated",
|
|
72
|
+
amount: { amount: usd, currency: "USD" },
|
|
73
|
+
source,
|
|
74
|
+
};
|
|
49
75
|
};
|
|
76
|
+
export const resolveProviderCost = (direct, estimated) => direct === undefined
|
|
77
|
+
? validateProviderCost(estimated)
|
|
78
|
+
: validateProviderCost(direct);
|
|
50
79
|
export const providerCostUsd = (cost) => {
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
80
|
+
const validated = validateProviderCost(cost);
|
|
81
|
+
switch (validated.kind) {
|
|
82
|
+
case "charged":
|
|
83
|
+
return validated.amount.currency === "USD"
|
|
84
|
+
? validated.amount.amount
|
|
85
|
+
: validated.usdEquivalent ?? null;
|
|
86
|
+
case "estimated":
|
|
87
|
+
return validated.amount.currency === "USD" ? validated.amount.amount : null;
|
|
88
|
+
case "unknown":
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const decimalParts = (value) => {
|
|
93
|
+
validateDecimal(value, "decimal amount");
|
|
94
|
+
const [integer, fraction = ""] = value.split(".");
|
|
95
|
+
return { coefficient: BigInt(`${integer}${fraction}`), scale: fraction.length };
|
|
96
|
+
};
|
|
97
|
+
export const addDecimals = (values) => {
|
|
98
|
+
const parts = values.map(decimalParts);
|
|
99
|
+
const scale = Math.max(0, ...parts.map((part) => part.scale));
|
|
100
|
+
const coefficient = parts.reduce((sum, part) => sum + part.coefficient * 10n ** BigInt(scale - part.scale), 0n);
|
|
101
|
+
return canonicalDecimal(coefficient, scale);
|
|
102
|
+
};
|
|
103
|
+
export const sumProviderCostsUsd = (costs) => {
|
|
104
|
+
const values = costs.map(providerCostUsd);
|
|
105
|
+
return values.some((value) => value === null)
|
|
106
|
+
? null
|
|
107
|
+
: addDecimals(values);
|
|
108
|
+
};
|
|
61
109
|
//# sourceMappingURL=cost.js.map
|
package/dist/cost.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost.js","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cost.js","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"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"}
|
package/dist/env.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
export declare const parseRequiredInt: (raw: string | undefined, name: string, label: string) => number;
|
|
2
|
+
export declare const MAX_PROVIDER_TIMEOUT_MS = 2147483647;
|
|
3
|
+
export declare const parseTimeoutMs: (raw: string | undefined, name: string, label: string) => number;
|
|
2
4
|
export declare const parseOptionalInt: (raw: string | undefined, name: string, label: string) => number | null;
|
|
3
5
|
export declare const parseRequiredFloat: (raw: string | undefined, name: string, label: string, min: number) => number;
|
|
4
6
|
export declare const parseOptionalFloat: (raw: string | undefined, name: string, label: string, min: number) => number | null;
|
|
5
7
|
export declare const requireEnv: (raw: string | undefined, name: string, label: string) => string;
|
|
6
|
-
export
|
|
8
|
+
export type CacheWritePolicy = "off" | "stable-system";
|
|
9
|
+
export declare const cacheAffinityFromEnv: (env: NodeJS.ProcessEnv, label: string) => boolean;
|
|
10
|
+
export declare const cacheWritePolicyFromEnv: (env: NodeJS.ProcessEnv, label: string) => CacheWritePolicy;
|
|
7
11
|
export declare const dataCaptureFromEnv: (env: NodeJS.ProcessEnv, label: string) => {
|
|
8
12
|
topLogprobs: number | null;
|
|
9
13
|
rawBody: boolean;
|
package/dist/env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,KAAG,MAKvF,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,KAAG,MAAM,GAAG,IAKhG,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,OAAO,MAAM,KAAG,MAKtG,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,OAAO,MAAM,KAAG,MAAM,GAAG,IAK/G,CAAC;AAEF,eAAO,MAAM,UAAU,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,KAAG,MAGjF,CAAC;AAEF,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
|
package/dist/env.js
CHANGED
|
@@ -8,6 +8,14 @@ export const parseRequiredInt = (raw, name, label) => {
|
|
|
8
8
|
throw new Error(`${label} provider: ${name} must be a non-negative integer (got "${raw}")`);
|
|
9
9
|
return n;
|
|
10
10
|
};
|
|
11
|
+
export const MAX_PROVIDER_TIMEOUT_MS = 2_147_483_647;
|
|
12
|
+
export const parseTimeoutMs = (raw, name, label) => {
|
|
13
|
+
const timeoutMs = parseRequiredInt(raw, name, label);
|
|
14
|
+
if (timeoutMs > MAX_PROVIDER_TIMEOUT_MS) {
|
|
15
|
+
throw new Error(`${label} provider: ${name} must be at most ${MAX_PROVIDER_TIMEOUT_MS} milliseconds (got "${raw}")`);
|
|
16
|
+
}
|
|
17
|
+
return timeoutMs;
|
|
18
|
+
};
|
|
11
19
|
export const parseOptionalInt = (raw, name, label) => {
|
|
12
20
|
if (raw === undefined || raw.length === 0)
|
|
13
21
|
return null;
|
|
@@ -37,14 +45,6 @@ export const requireEnv = (raw, name, label) => {
|
|
|
37
45
|
throw new Error(`${label} provider: ${name} must be set`);
|
|
38
46
|
return raw;
|
|
39
47
|
};
|
|
40
|
-
export const promptCacheKeyFromEnv = (env, label) => {
|
|
41
|
-
const name = "PLURNK_PROVIDERS_PROMPT_CACHE_KEY";
|
|
42
|
-
const value = env[name];
|
|
43
|
-
if (value !== "0" && value !== "1") {
|
|
44
|
-
throw new Error(`${label} provider: ${name} must be "0" or "1"`);
|
|
45
|
-
}
|
|
46
|
-
return value === "1";
|
|
47
|
-
};
|
|
48
48
|
// {§provider-configuration} A still-set retired knob fails
|
|
49
49
|
// hard pointing at its successor — never silently coexists with the new floor.
|
|
50
50
|
// The retired names appear ONLY as this function's ARGUMENTS at the call sites
|
|
@@ -54,6 +54,23 @@ const shedRenamed = (env, oldName, newName, label, ref) => {
|
|
|
54
54
|
if (stale !== undefined && stale.length > 0)
|
|
55
55
|
throw new Error(`${label} provider: ${oldName} was renamed to ${newName} (${ref}); update the env`);
|
|
56
56
|
};
|
|
57
|
+
export const cacheAffinityFromEnv = (env, label) => {
|
|
58
|
+
const name = "PLURNK_PROVIDERS_CACHE_AFFINITY";
|
|
59
|
+
shedRenamed(env, "PLURNK_PROVIDERS_PROMPT_CACHE_KEY", name, label, "{§provider-cache-affinity}"); // lexicon-allow
|
|
60
|
+
const value = env[name];
|
|
61
|
+
if (value !== "0" && value !== "1") {
|
|
62
|
+
throw new Error(`${label} provider: ${name} must be "0" or "1"`);
|
|
63
|
+
}
|
|
64
|
+
return value === "1";
|
|
65
|
+
};
|
|
66
|
+
export const cacheWritePolicyFromEnv = (env, label) => {
|
|
67
|
+
const name = "PLURNK_PROVIDERS_CACHE_WRITE_POLICY";
|
|
68
|
+
const value = env[name];
|
|
69
|
+
if (value !== "off" && value !== "stable-system") {
|
|
70
|
+
throw new Error(`${label} provider: ${name} must be "off" or "stable-system"`);
|
|
71
|
+
}
|
|
72
|
+
return value;
|
|
73
|
+
};
|
|
57
74
|
// {§provider-evidence} Data-capture knobs are read identically by every provider
|
|
58
75
|
// (standard AND
|
|
59
76
|
// plugin) so the opt-in surface is one source of truth. Both OFF by default —
|
|
@@ -145,7 +162,7 @@ export const reasoningFromEnv = (env, label) => {
|
|
|
145
162
|
const capName = "PLURNK_PROVIDERS_REASONING_BUDGET";
|
|
146
163
|
const capRaw = env[capName];
|
|
147
164
|
if (capRaw === undefined || capRaw.length === 0)
|
|
148
|
-
|
|
165
|
+
return { mode: "on", budget: null };
|
|
149
166
|
const n = Number(capRaw);
|
|
150
167
|
if (!Number.isInteger(n) || n <= 0)
|
|
151
168
|
throw new Error(`${label} provider: ${capName} must be a positive integer (got "${capRaw}")`);
|
|
@@ -167,14 +184,17 @@ export const PROVIDERS_KNOBS = Object.freeze([
|
|
|
167
184
|
"PLURNK_PROVIDERS_CONTEXT_WINDOW",
|
|
168
185
|
"PLURNK_PROVIDERS_RETRY_ATTEMPTS",
|
|
169
186
|
"PLURNK_PROVIDERS_ERROR_DETAIL_LIMIT",
|
|
187
|
+
"PLURNK_PROVIDERS_OPERATION_TIMEOUT",
|
|
170
188
|
"PLURNK_PROVIDERS_FETCH_TIMEOUT",
|
|
189
|
+
"PLURNK_PROVIDERS_FIRST_CONTENT_TIMEOUT",
|
|
171
190
|
"PLURNK_PROVIDERS_STREAM_IDLE_TIMEOUT",
|
|
172
191
|
"PLURNK_PROVIDERS_LLAMA_SERVER",
|
|
173
192
|
"PLURNK_PROVIDERS_TEMPERATURE",
|
|
174
193
|
"PLURNK_PROVIDERS_REPEAT_PENALTY",
|
|
175
194
|
"PLURNK_PROVIDERS_FREQUENCY_PENALTY",
|
|
176
195
|
"PLURNK_PROVIDERS_SERVICE_TIER",
|
|
177
|
-
"
|
|
196
|
+
"PLURNK_PROVIDERS_CACHE_WRITE_POLICY",
|
|
197
|
+
"PLURNK_PROVIDERS_CACHE_AFFINITY",
|
|
178
198
|
"PLURNK_PROVIDERS_REPEAT_LAST_N",
|
|
179
199
|
"PLURNK_PROVIDERS_DRY_MULTIPLIER",
|
|
180
200
|
"PLURNK_PROVIDERS_DRY_BASE",
|