@plurnk/plurnk-providers 1.3.12 → 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/.env.defaults +47 -38
- package/README.md +68 -4
- package/SPEC.md +245 -62
- package/dist/AiSdkProvider.d.ts +19 -5
- package/dist/AiSdkProvider.d.ts.map +1 -1
- package/dist/AiSdkProvider.js +264 -156
- package/dist/AiSdkProvider.js.map +1 -1
- package/dist/Mock.d.ts +15 -17
- package/dist/Mock.d.ts.map +1 -1
- package/dist/Mock.js +27 -10
- package/dist/Mock.js.map +1 -1
- package/dist/Pool.d.ts +8 -2
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +41 -8
- package/dist/Pool.js.map +1 -1
- package/dist/ProviderRegistry.d.ts +4 -1
- package/dist/ProviderRegistry.d.ts.map +1 -1
- package/dist/ProviderRegistry.js +7 -3
- package/dist/ProviderRegistry.js.map +1 -1
- package/dist/accounting.d.ts +3 -0
- package/dist/accounting.d.ts.map +1 -0
- package/dist/accounting.js +84 -0
- package/dist/accounting.js.map +1 -0
- package/dist/aiSdkTransport.d.ts +5 -2
- package/dist/aiSdkTransport.d.ts.map +1 -1
- package/dist/aiSdkTransport.js +91 -5
- package/dist/aiSdkTransport.js.map +1 -1
- package/dist/catalogProvider.d.ts +5 -2
- package/dist/catalogProvider.d.ts.map +1 -1
- package/dist/catalogProvider.js +24 -11
- package/dist/catalogProvider.js.map +1 -1
- package/dist/compatibleProvider.d.ts.map +1 -1
- package/dist/compatibleProvider.js +11 -4
- package/dist/compatibleProvider.js.map +1 -1
- package/dist/cost.d.ts +11 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +61 -0
- package/dist/cost.js.map +1 -0
- package/dist/discover.d.ts +2 -0
- package/dist/discover.d.ts.map +1 -1
- package/dist/discover.js +15 -9
- package/dist/discover.js.map +1 -1
- package/dist/env.d.ts +4 -6
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +27 -29
- package/dist/env.js.map +1 -1
- package/dist/errors.d.ts +27 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +152 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +12 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/notices.d.ts +10 -0
- package/dist/notices.d.ts.map +1 -0
- package/dist/notices.js +11 -0
- package/dist/notices.js.map +1 -0
- package/dist/ollama.d.ts.map +1 -1
- package/dist/ollama.js +3 -3
- package/dist/ollama.js.map +1 -1
- package/dist/openai.d.ts +1 -1
- package/dist/openai.d.ts.map +1 -1
- package/dist/promptTokens.d.ts +4 -0
- package/dist/promptTokens.d.ts.map +1 -0
- package/dist/promptTokens.js +32 -0
- package/dist/promptTokens.js.map +1 -0
- package/dist/sdkModels.d.ts +2 -0
- package/dist/sdkModels.d.ts.map +1 -1
- package/dist/sdkModels.js +17 -6
- package/dist/sdkModels.js.map +1 -1
- package/dist/types.d.ts +52 -16
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/usage.d.ts +4 -0
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +64 -19
- package/dist/usage.js.map +1 -1
- package/dist/warnings.js +0 -0
- package/dist/warnings.js.map +1 -1
- package/package.json +15 -10
- package/src/AiSdkProvider.test.ts +750 -169
- package/src/AiSdkProvider.ts +354 -200
- package/src/Mock.test.ts +29 -14
- package/src/Mock.ts +36 -15
- package/src/Pool.test.ts +43 -6
- package/src/Pool.ts +56 -10
- package/src/ProviderRegistry.test.ts +158 -9
- package/src/ProviderRegistry.ts +19 -6
- package/src/accounting.test.ts +58 -0
- package/src/accounting.ts +88 -0
- package/src/aiSdkTransport.ts +101 -8
- package/src/boundaries.test.ts +9 -3
- package/src/catalogProvider.test.ts +43 -15
- package/src/catalogProvider.ts +32 -16
- package/src/compatibleProvider.test.ts +96 -0
- package/src/compatibleProvider.ts +15 -6
- package/src/cost.test.ts +64 -0
- package/src/cost.ts +78 -0
- package/src/defaults.test.ts +1 -0
- package/src/discover.test.ts +48 -7
- package/src/discover.ts +31 -21
- package/src/env.test.ts +38 -48
- package/src/env.ts +43 -40
- package/src/errors.test.ts +148 -0
- package/src/errors.ts +208 -0
- package/src/index.ts +30 -8
- package/src/lexicon-guard.test.ts +6 -6
- package/src/notices.ts +22 -0
- package/src/ollama.test.ts +64 -0
- package/src/ollama.ts +6 -3
- package/src/openai.ts +3 -0
- package/src/promptTokens.ts +41 -0
- package/src/sdkModels.test.ts +29 -3
- package/src/sdkModels.ts +19 -11
- package/src/types.ts +125 -64
- package/src/usage.test.ts +24 -5
- package/src/usage.ts +72 -21
- package/src/warnings.test.ts +10 -10
- package/src/warnings.ts +0 -0
- package/dist/OpenAICompat.d.ts +0 -76
- package/dist/OpenAICompat.d.ts.map +0 -1
- package/dist/OpenAICompat.js +0 -555
- package/dist/OpenAICompat.js.map +0 -1
- package/dist/openaiStream.d.ts +0 -47
- package/dist/openaiStream.d.ts.map +0 -1
- package/dist/openaiStream.js +0 -280
- package/dist/openaiStream.js.map +0 -1
- package/dist/standardProviders.d.ts +0 -31
- package/dist/standardProviders.d.ts.map +0 -1
- package/dist/standardProviders.js +0 -518
- package/dist/standardProviders.js.map +0 -1
- package/dist/telemetry.d.ts +0 -24
- package/dist/telemetry.d.ts.map +0 -1
- package/dist/telemetry.js +0 -85
- package/dist/telemetry.js.map +0 -1
- package/src/telemetry.test.ts +0 -69
- package/src/telemetry.ts +0 -116
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type ProviderNoticeKind = "grammar_unenforced";
|
|
2
|
+
export interface ProviderNotice {
|
|
3
|
+
readonly source: string;
|
|
4
|
+
readonly kind: ProviderNoticeKind;
|
|
5
|
+
readonly level: "warn";
|
|
6
|
+
readonly message: string;
|
|
7
|
+
readonly position: number | null;
|
|
8
|
+
}
|
|
9
|
+
export declare const providerSource: (vendor: string) => string;
|
|
10
|
+
//# sourceMappingURL=notices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notices.d.ts","sourceRoot":"","sources":["../src/notices.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAKtD,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,eAAO,MAAM,cAAc,WAAY,MAAM,KAAG,MAQ/C,CAAC"}
|
package/dist/notices.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const providerSource = (vendor) => {
|
|
2
|
+
const raw = vendor.startsWith("provider:") ? vendor.slice("provider:".length) : vendor;
|
|
3
|
+
const normalized = raw
|
|
4
|
+
.toLowerCase()
|
|
5
|
+
.replace(/[^a-z0-9-]+/g, "-")
|
|
6
|
+
.replace(/^-+|-+$/g, "");
|
|
7
|
+
if (normalized.length === 0)
|
|
8
|
+
throw new TypeError("provider source must name a provider");
|
|
9
|
+
return `provider:${/^[a-z]/.test(normalized) ? normalized : `p-${normalized}`}`;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=notices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notices.js","sourceRoot":"","sources":["../src/notices.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAc,EAAU,EAAE;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACvF,MAAM,UAAU,GAAG,GAAG;SACjB,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC7B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IACzF,OAAO,YAAY,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,EAAE,CAAC;AACpF,CAAC,CAAC"}
|
package/dist/ollama.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../src/ollama.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA6B5D,eAAO,MAAM,qBAAqB,QACzB,MAAM,CAAC,UAAU,SACf,MAAM,YACH,eAAe,KAC1B,OAAO,CAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../src/ollama.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA6B5D,eAAO,MAAM,qBAAqB,QACzB,MAAM,CAAC,UAAU,SACf,MAAM,YACH,eAAe,KAC1B,OAAO,CAAC,QAAQ,CA6BlB,CAAC"}
|
package/dist/ollama.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
2
|
-
import { contextWindowFromEnv, parseRequiredInt, requireEnv } from "./env.js";
|
|
2
|
+
import { contextWindowFromEnv, effectiveContextWindow, parseRequiredInt, requireEnv } from "./env.js";
|
|
3
3
|
import { providerFromSdkModel } from "./catalogProvider.js";
|
|
4
4
|
const fetchContextWindow = async ({ baseUrl, model, timeout, }) => {
|
|
5
5
|
const response = await fetch(`${baseUrl}/api/show`, {
|
|
@@ -21,8 +21,8 @@ export const ollamaProviderFromEnv = async (env, model, options) => {
|
|
|
21
21
|
const configured = options?.baseUrl ?? env.OLLAMA_BASE_URL ?? env.OLLAMA_HOST;
|
|
22
22
|
const baseUrl = requireEnv(configured, "OLLAMA_BASE_URL or OLLAMA_HOST (or a PLURNK_BASEURL_<alias> override)", "ollama").replace(/\/+$/, "").replace(/\/v1$/, "");
|
|
23
23
|
const timeout = parseRequiredInt(env.PLURNK_PROVIDERS_FETCH_TIMEOUT, "PLURNK_PROVIDERS_FETCH_TIMEOUT", "ollama");
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
// {§model-fact-resolution}
|
|
25
|
+
const contextWindow = effectiveContextWindow(contextWindowFromEnv(env, "ollama"), await fetchContextWindow({ baseUrl, model, timeout }));
|
|
26
26
|
const languageModel = createOpenAICompatible({
|
|
27
27
|
name: "ollama",
|
|
28
28
|
baseURL: `${baseUrl}/v1`,
|
package/dist/ollama.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../src/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../src/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtG,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAO5D,MAAM,kBAAkB,GAAG,KAAK,EAAE,EAC9B,OAAO,EACP,KAAK,EACL,OAAO,GAKV,EAAmB,EAAE;IAClB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE;QAChD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;QAC/B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;KACvC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAkB,CAAC;IACnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,IAAI,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;IAChG,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,+DAA+D,KAAK,GAAG,CAAC,CAAC;AAC7F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACtC,GAAsB,EACtB,KAAa,EACb,OAAyB,EACR,EAAE;IACnB,MAAM,UAAU,GAAG,OAAO,EAAE,OAAO,IAAI,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,WAAW,CAAC;IAC9E,MAAM,OAAO,GAAG,UAAU,CACtB,UAAU,EACV,uEAAuE,EACvE,QAAQ,CACX,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,gBAAgB,CAC5B,GAAG,CAAC,8BAA8B,EAClC,gCAAgC,EAChC,QAAQ,CACX,CAAC;IACF,2BAA2B;IAC3B,MAAM,aAAa,GAAG,sBAAsB,CACxC,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,EACnC,MAAM,kBAAkB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CACxD,CAAC;IACF,MAAM,aAAa,GAAG,sBAAsB,CAAC;QACzC,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,GAAG,OAAO,KAAK;QACxB,YAAY,EAAE,IAAI;KACrB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,oBAAoB,CAAC;QACxB,IAAI,EAAE,QAAQ;QACd,GAAG;QACH,KAAK;QACL,aAAa;QACb,aAAa;KAChB,CAAC,CAAC;AACP,CAAC,CAAC"}
|
package/dist/openai.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { default as AiSdkProvider, effortFromBudget } from "./AiSdkProvider.ts";
|
|
2
2
|
export type { AiSdkProviderConfig, GrammarStyle, ProviderFetch, ReasoningStyle } from "./AiSdkProvider.ts";
|
|
3
|
-
export type { ChatMessage, FinishReason, Provider, ProviderAssistant, ProviderResponse, ProviderUsage, TokenAlternative, TokenLogprob, } from "./types.ts";
|
|
3
|
+
export type { ChatMessage, FinishReason, Provider, ProviderAssistant, ProviderAttempt, ProviderAttemptFinishReason, ProviderResponse, ProviderUsage, PromptTokenMeasurement, TokenAlternative, TokenLogprob, } from "./types.ts";
|
|
4
4
|
//# sourceMappingURL=openai.d.ts.map
|
package/dist/openai.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC3G,YAAY,EACR,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,YAAY,GACf,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC3G,YAAY,EACR,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,iBAAiB,EACjB,eAAe,EACf,2BAA2B,EAC3B,gBAAgB,EAChB,aAAa,EACb,sBAAsB,EACtB,gBAAgB,EAChB,YAAY,GACf,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ChatMessage, PromptTokenMeasurement } from "./types.ts";
|
|
2
|
+
export declare const assertPromptTokenMeasurement: (value: unknown, owner?: string) => PromptTokenMeasurement;
|
|
3
|
+
export declare const estimatePromptTokens: (messages: readonly ChatMessage[], detail?: string) => PromptTokenMeasurement;
|
|
4
|
+
//# sourceMappingURL=promptTokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptTokens.d.ts","sourceRoot":"","sources":["../src/promptTokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAQtE,eAAO,MAAM,4BAA4B,UAC9B,OAAO,qBAEf,sBAmBF,CAAC;AAEF,eAAO,MAAM,oBAAoB,aACnB,SAAS,WAAW,EAAE,sBAEjC,sBAKD,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const KINDS = new Set([
|
|
2
|
+
"exact",
|
|
3
|
+
"upper_bound",
|
|
4
|
+
"estimate",
|
|
5
|
+
]);
|
|
6
|
+
export const assertPromptTokenMeasurement = (value, owner = "provider") => {
|
|
7
|
+
if (typeof value !== "object" || value === null) {
|
|
8
|
+
throw new TypeError(`${owner}: prompt token measurement must be an object`);
|
|
9
|
+
}
|
|
10
|
+
const candidate = value;
|
|
11
|
+
if (!KINDS.has(candidate.kind)) {
|
|
12
|
+
throw new TypeError(`${owner}: prompt token measurement has invalid kind ${JSON.stringify(candidate.kind)}`);
|
|
13
|
+
}
|
|
14
|
+
if (!Number.isInteger(candidate.tokens) || candidate.tokens < 0) {
|
|
15
|
+
throw new TypeError(`${owner}: prompt token measurement tokens must be a non-negative integer`);
|
|
16
|
+
}
|
|
17
|
+
if (typeof candidate.source !== "string" || candidate.source.length === 0) {
|
|
18
|
+
throw new TypeError(`${owner}: prompt token measurement source must be a non-empty string`);
|
|
19
|
+
}
|
|
20
|
+
if (candidate.kind === "estimate"
|
|
21
|
+
&& (typeof candidate.detail !== "string" || candidate.detail.length === 0)) {
|
|
22
|
+
throw new TypeError(`${owner}: estimated prompt token measurement requires detail`);
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
};
|
|
26
|
+
export const estimatePromptTokens = (messages, detail = "chars/2 over message content; provider request framing is unknown") => ({
|
|
27
|
+
kind: "estimate",
|
|
28
|
+
tokens: Math.ceil(messages.reduce((sum, { content }) => sum + content.length, 0) / 2),
|
|
29
|
+
source: "heuristic:chars2",
|
|
30
|
+
detail,
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=promptTokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptTokens.js","sourceRoot":"","sources":["../src/promptTokens.ts"],"names":[],"mappings":"AAEA,MAAM,KAAK,GAAG,IAAI,GAAG,CAAiC;IAClD,OAAO;IACP,aAAa;IACb,UAAU;CACb,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CACxC,KAAc,EACd,KAAK,GAAG,UAAU,EACI,EAAE;IACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC9C,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,8CAA8C,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,SAAS,GAAG,KAAwC,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAsC,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,+CAA+C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjH,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,MAAO,GAAG,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,kEAAkE,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,8DAA8D,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU;WAC1B,CAAC,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,sDAAsD,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,KAA+B,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAChC,QAAgC,EAChC,MAAM,GAAG,mEAAmE,EACtD,EAAE,CAAC,CAAC;IAC1B,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACrF,MAAM,EAAE,kBAAkB;IAC1B,MAAM;CACT,CAAC,CAAC"}
|
package/dist/sdkModels.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { type ProviderInfo } from "@plurnk/plurnk-models";
|
|
2
2
|
import type { LanguageModel } from "ai";
|
|
3
|
+
import type { AuthoritativeChargeNormalizer } from "./types.ts";
|
|
3
4
|
export type SdkModel = {
|
|
4
5
|
readonly languageModel?: LanguageModel;
|
|
6
|
+
readonly normalizeCharge?: AuthoritativeChargeNormalizer;
|
|
5
7
|
readonly compatible?: {
|
|
6
8
|
readonly url: string;
|
|
7
9
|
readonly headers: Readonly<Record<string, string>>;
|
package/dist/sdkModels.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdkModels.d.ts","sourceRoot":"","sources":["../src/sdkModels.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sdkModels.d.ts","sourceRoot":"","sources":["../src/sdkModels.ts"],"names":[],"mappings":"AASA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,MAAM,QAAQ,GAAG;IACnB,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IACvC,QAAQ,CAAC,eAAe,CAAC,EAAE,6BAA6B,CAAC;IACzD,QAAQ,CAAC,UAAU,CAAC,EAAE;QAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;KACtD,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CACzC,CAAC;AAKF,eAAO,MAAM,sBAAsB,aACrB,MAAM,OACX,MAAM,CAAC,UAAU,KACvB,YAAY,GAAG,IAejB,CAAC;AAuDF,eAAO,MAAM,cAAc,aACb,MAAM,SACT,MAAM,OACR,MAAM,CAAC,UAAU,oBACJ,MAAM,KACzB,QAAQ,GAAG,IAgGb,CAAC"}
|
package/dist/sdkModels.js
CHANGED
|
@@ -6,9 +6,9 @@ import { createGroq } from "@ai-sdk/groq";
|
|
|
6
6
|
import { createMistral } from "@ai-sdk/mistral";
|
|
7
7
|
import { createOpenAI } from "@ai-sdk/openai";
|
|
8
8
|
import { createTogetherAI } from "@ai-sdk/togetherai";
|
|
9
|
-
import { createXai } from "@ai-sdk/xai";
|
|
10
9
|
import { createOpenRouter } from "@openrouter/ai-sdk-provider";
|
|
11
10
|
import { lookupProvider } from "@plurnk/plurnk-models";
|
|
11
|
+
import { authoritativeChargeNormalizer } from "./accounting.js";
|
|
12
12
|
const envPrefix = (provider) => provider.replaceAll(/[^a-zA-Z0-9]/g, "_").toUpperCase();
|
|
13
13
|
export const configuredProviderInfo = (provider, env) => {
|
|
14
14
|
const prefix = `PLURNK_PROVIDERS_PROVIDER_${envPrefix(provider)}`;
|
|
@@ -56,7 +56,6 @@ const baseUrl = (provider, env, catalog, override) => {
|
|
|
56
56
|
const value = override ?? configured;
|
|
57
57
|
return value === undefined ? undefined : expandEnv(value, env, provider).replace(/\/+$/, "");
|
|
58
58
|
};
|
|
59
|
-
const apiKey = (provider, env, catalog) => firstSet(env, configuredKeyNames(provider, env, catalog));
|
|
60
59
|
const requireApiKey = (provider, env, catalog) => {
|
|
61
60
|
const names = configuredKeyNames(provider, env, catalog);
|
|
62
61
|
const key = firstSet(env, names);
|
|
@@ -69,6 +68,7 @@ export const createSdkModel = (provider, model, env, baseUrlOverride) => {
|
|
|
69
68
|
if (catalog === null)
|
|
70
69
|
return null;
|
|
71
70
|
const url = baseUrl(provider, env, catalog, baseUrlOverride);
|
|
71
|
+
const normalizeCharge = authoritativeChargeNormalizer(catalog.npm);
|
|
72
72
|
switch (catalog.npm) {
|
|
73
73
|
case "@ai-sdk/openai":
|
|
74
74
|
return {
|
|
@@ -93,6 +93,7 @@ export const createSdkModel = (provider, model, env, baseUrlOverride) => {
|
|
|
93
93
|
case "@ai-sdk/deepinfra":
|
|
94
94
|
return {
|
|
95
95
|
languageModel: createDeepInfra({ apiKey: requireApiKey(provider, env, catalog), baseURL: url }).languageModel(model),
|
|
96
|
+
...(normalizeCharge === undefined ? {} : { normalizeCharge }),
|
|
96
97
|
catalog,
|
|
97
98
|
};
|
|
98
99
|
case "@ai-sdk/google":
|
|
@@ -100,11 +101,18 @@ export const createSdkModel = (provider, model, env, baseUrlOverride) => {
|
|
|
100
101
|
languageModel: createGoogle({ apiKey: requireApiKey(provider, env, catalog), baseURL: url }).languageModel(model),
|
|
101
102
|
catalog,
|
|
102
103
|
};
|
|
103
|
-
case "@ai-sdk/xai":
|
|
104
|
+
case "@ai-sdk/xai": {
|
|
105
|
+
const key = requireApiKey(provider, env, catalog);
|
|
106
|
+
const compatibleBase = url ?? "https://api.x.ai/v1";
|
|
104
107
|
return {
|
|
105
|
-
|
|
108
|
+
compatible: {
|
|
109
|
+
url: `${compatibleBase}/chat/completions`,
|
|
110
|
+
headers: { Authorization: `Bearer ${key}` },
|
|
111
|
+
},
|
|
112
|
+
...(normalizeCharge === undefined ? {} : { normalizeCharge }),
|
|
106
113
|
catalog,
|
|
107
114
|
};
|
|
115
|
+
}
|
|
108
116
|
case "@ai-sdk/anthropic":
|
|
109
117
|
return {
|
|
110
118
|
languageModel: createAnthropic({ apiKey: requireApiKey(provider, env, catalog), baseURL: url }).languageModel(model),
|
|
@@ -132,17 +140,20 @@ export const createSdkModel = (provider, model, env, baseUrlOverride) => {
|
|
|
132
140
|
...(env.OPENROUTER_X_TITLE === undefined ? {} : { "X-Title": env.OPENROUTER_X_TITLE }),
|
|
133
141
|
},
|
|
134
142
|
}).languageModel(model),
|
|
143
|
+
...(normalizeCharge === undefined ? {} : { normalizeCharge }),
|
|
135
144
|
catalog,
|
|
136
145
|
};
|
|
137
146
|
case "@ai-sdk/openai-compatible":
|
|
138
147
|
if (url === undefined)
|
|
139
148
|
throw new Error(`${provider} provider: Models.dev supplies no API URL and no base URL was configured`);
|
|
149
|
+
const keyNames = configuredKeyNames(provider, env, catalog);
|
|
150
|
+
const key = keyNames.length === 0 ? undefined : requireApiKey(provider, env, catalog);
|
|
140
151
|
return {
|
|
141
152
|
compatible: {
|
|
142
153
|
url: `${url}/chat/completions`,
|
|
143
|
-
headers:
|
|
154
|
+
headers: key === undefined
|
|
144
155
|
? {}
|
|
145
|
-
: { Authorization: `Bearer ${
|
|
156
|
+
: { Authorization: `Bearer ${key}` },
|
|
146
157
|
},
|
|
147
158
|
catalog,
|
|
148
159
|
};
|
package/dist/sdkModels.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdkModels.js","sourceRoot":"","sources":["../src/sdkModels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sdkModels.js","sourceRoot":"","sources":["../src/sdkModels.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,9 +1,21 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ProviderNotice } from "./notices.ts";
|
|
2
2
|
import type { LanguageModel } from "ai";
|
|
3
|
+
import type { PluginAttribution, PluginAttributionContext, PluginAttributionSource } from "@plurnk/plurnk-meta";
|
|
4
|
+
import type { ProviderCost } from "@plurnk/plurnk-contracts";
|
|
3
5
|
export interface ChatMessage {
|
|
4
6
|
role: "system" | "user" | "assistant";
|
|
5
7
|
content: string;
|
|
6
8
|
}
|
|
9
|
+
export type PromptTokenMeasurement = {
|
|
10
|
+
readonly kind: "exact" | "upper_bound";
|
|
11
|
+
readonly tokens: number;
|
|
12
|
+
readonly source: string;
|
|
13
|
+
} | {
|
|
14
|
+
readonly kind: "estimate";
|
|
15
|
+
readonly tokens: number;
|
|
16
|
+
readonly source: string;
|
|
17
|
+
readonly detail: string;
|
|
18
|
+
};
|
|
7
19
|
export interface ProviderUsage {
|
|
8
20
|
readonly prompt: number;
|
|
9
21
|
readonly completion: number;
|
|
@@ -11,7 +23,20 @@ export interface ProviderUsage {
|
|
|
11
23
|
readonly cached: number;
|
|
12
24
|
readonly total: number;
|
|
13
25
|
}
|
|
26
|
+
export type AuthoritativeCharge = Extract<ProviderCost, {
|
|
27
|
+
kind: "authoritative";
|
|
28
|
+
}>;
|
|
29
|
+
export interface ProviderChargeEvidence {
|
|
30
|
+
readonly providerMetadata?: unknown;
|
|
31
|
+
readonly usage?: unknown;
|
|
32
|
+
readonly response: {
|
|
33
|
+
readonly id: string;
|
|
34
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export type AuthoritativeChargeNormalizer = (evidence: ProviderChargeEvidence) => AuthoritativeCharge | undefined;
|
|
14
38
|
export type FinishReason = "stop" | "length" | "tool_calls" | "content_filter" | null;
|
|
39
|
+
export type ProviderAttemptFinishReason = FinishReason | "resource_interrupted";
|
|
15
40
|
export interface TokenAlternative {
|
|
16
41
|
readonly token: string;
|
|
17
42
|
readonly logprob: number;
|
|
@@ -21,31 +46,41 @@ export interface TokenLogprob {
|
|
|
21
46
|
readonly logprob: number;
|
|
22
47
|
readonly top?: readonly TokenAlternative[];
|
|
23
48
|
}
|
|
24
|
-
export interface
|
|
49
|
+
export interface ProviderEncryptedReasoningItem {
|
|
50
|
+
readonly id: string | null;
|
|
51
|
+
readonly subtype: string;
|
|
52
|
+
readonly encrypted: ReadonlyArray<{
|
|
53
|
+
data: string;
|
|
54
|
+
format: string | null;
|
|
55
|
+
}>;
|
|
56
|
+
}
|
|
57
|
+
export interface ProviderAssistant<TFinish extends ProviderAttemptFinishReason = FinishReason> {
|
|
25
58
|
readonly content: string;
|
|
26
59
|
readonly reasoning: string | null;
|
|
27
|
-
readonly reasoningEncrypted?: ReadonlyArray<
|
|
28
|
-
id: string | null;
|
|
29
|
-
subtype: string;
|
|
30
|
-
encrypted: ReadonlyArray<{
|
|
31
|
-
data: string;
|
|
32
|
-
format: string | null;
|
|
33
|
-
}>;
|
|
34
|
-
}>;
|
|
60
|
+
readonly reasoningEncrypted?: ReadonlyArray<ProviderEncryptedReasoningItem>;
|
|
35
61
|
readonly usage: ProviderUsage;
|
|
36
|
-
readonly finishReason:
|
|
62
|
+
readonly finishReason: TFinish;
|
|
37
63
|
readonly model: string;
|
|
38
64
|
readonly logprobs?: readonly TokenLogprob[];
|
|
39
65
|
readonly meanLogprob?: number;
|
|
40
66
|
}
|
|
41
|
-
export interface
|
|
42
|
-
readonly
|
|
67
|
+
export interface GrammarEvidence {
|
|
68
|
+
readonly input: string;
|
|
69
|
+
readonly contentStart: number;
|
|
70
|
+
readonly transported: boolean;
|
|
71
|
+
}
|
|
72
|
+
export interface ProviderResponse<TFinish extends ProviderAttemptFinishReason = FinishReason> {
|
|
73
|
+
readonly assistant: ProviderAssistant<TFinish>;
|
|
43
74
|
readonly assistantRaw: unknown;
|
|
75
|
+
readonly charge?: AuthoritativeCharge;
|
|
76
|
+
readonly grammarEvidence?: GrammarEvidence;
|
|
44
77
|
readonly meta?: Record<string, unknown>;
|
|
45
78
|
readonly rawBody?: unknown;
|
|
46
|
-
readonly
|
|
79
|
+
readonly notices?: readonly ProviderNotice[];
|
|
47
80
|
}
|
|
81
|
+
export type ProviderAttempt = ProviderResponse<ProviderAttemptFinishReason>;
|
|
48
82
|
export interface Provider {
|
|
83
|
+
attributions?(context: PluginAttributionContext): PluginAttribution;
|
|
49
84
|
generate(args: {
|
|
50
85
|
messages: ChatMessage[];
|
|
51
86
|
workerId: string;
|
|
@@ -68,14 +103,15 @@ export interface Provider {
|
|
|
68
103
|
readonly requiresMaxTokens?: boolean;
|
|
69
104
|
readonly reasoningReserve?: number | null;
|
|
70
105
|
readonly completionReserve?: number | null;
|
|
71
|
-
|
|
106
|
+
countPromptTokens(messages: readonly ChatMessage[], signal?: AbortSignal): Promise<PromptTokenMeasurement>;
|
|
72
107
|
tokenize?(text: string): Promise<number[]>;
|
|
73
108
|
calculateCost(usage: ProviderUsage): number;
|
|
109
|
+
calculateCharge?(usage: ProviderUsage): Exclude<ProviderCost, AuthoritativeCharge>;
|
|
74
110
|
}
|
|
75
111
|
export interface ProviderOptions {
|
|
76
112
|
readonly baseUrl?: string;
|
|
77
113
|
}
|
|
78
|
-
export interface AiSdkProviderPlugin {
|
|
114
|
+
export interface AiSdkProviderPlugin extends PluginAttributionSource {
|
|
79
115
|
languageModel(model: string): LanguageModel;
|
|
80
116
|
}
|
|
81
117
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Provider transport contract. Providers return raw wire-level output —
|
|
2
|
-
// content unparsed (consumer parses via @plurnk/plurnk-
|
|
2
|
+
// content unparsed (consumer parses via @plurnk/plurnk-contracts), reasoning
|
|
3
3
|
// is the wire-reported CoT only.
|
|
4
4
|
export {};
|
|
5
5
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,6EAA6E;AAC7E,iCAAiC"}
|
package/dist/usage.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export type RawUsage = {
|
|
|
4
4
|
completion_tokens?: number;
|
|
5
5
|
total_tokens?: number;
|
|
6
6
|
cached_tokens?: number;
|
|
7
|
+
prompt_cache_hit_tokens?: number;
|
|
8
|
+
prompt_cache_miss_tokens?: number;
|
|
7
9
|
prompt_tokens_details?: {
|
|
8
10
|
cached_tokens?: number;
|
|
9
11
|
};
|
|
@@ -11,11 +13,13 @@ export type RawUsage = {
|
|
|
11
13
|
reasoning_tokens?: number;
|
|
12
14
|
};
|
|
13
15
|
};
|
|
16
|
+
export declare const attributeUnitemizedReasoning: (usage: ProviderUsage, reasoningText: string, contentText: string) => ProviderUsage;
|
|
14
17
|
export declare const normalizeUsage: (raw: RawUsage | null | undefined, reasoningText?: string, contentText?: string) => ProviderUsage;
|
|
15
18
|
export type TokenRates = {
|
|
16
19
|
input: number;
|
|
17
20
|
output: number;
|
|
18
21
|
cached: number;
|
|
19
22
|
};
|
|
23
|
+
export declare const calculateCostUsdDecimal: (usage: ProviderUsage, rates: TokenRates) => string;
|
|
20
24
|
export declare const calculateCostUsd: (usage: ProviderUsage, rates: TokenRates) => number;
|
|
21
25
|
//# sourceMappingURL=usage.d.ts.map
|
package/dist/usage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,MAAM,QAAQ,GAAG;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,yBAAyB,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D,CAAC;AAEF,eAAO,MAAM,cAAc,QAAS,QAAQ,GAAG,IAAI,GAAG,SAAS,mDAAyC,
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,MAAM,QAAQ,GAAG;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,qBAAqB,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,yBAAyB,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D,CAAC;AAIF,eAAO,MAAM,4BAA4B,UAC9B,aAAa,iBACL,MAAM,eACR,MAAM,KACpB,aAUF,CAAC;AAEF,eAAO,MAAM,cAAc,QAAS,QAAQ,GAAG,IAAI,GAAG,SAAS,mDAAyC,aAyCvG,CAAC;AAGF,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA4B3E,eAAO,MAAM,uBAAuB,UAAW,aAAa,SAAS,UAAU,KAAG,MAWjF,CAAC;AAKF,eAAO,MAAM,gBAAgB,UAAW,aAAa,SAAS,UAAU,KAAG,MAE1E,CAAC"}
|
package/dist/usage.js
CHANGED
|
@@ -11,12 +11,29 @@
|
|
|
11
11
|
// normalizeUsage collapses all three into one invariant (see ProviderUsage):
|
|
12
12
|
// total = prompt + completion + reasoning; cached ⊆ prompt;
|
|
13
13
|
// completion EXCLUDES reasoning; billable output = completion + reasoning.
|
|
14
|
+
// Some providers return distinct reasoning text while reporting one combined
|
|
15
|
+
// output count. Attribute that count without disturbing an upstream split.
|
|
16
|
+
export const attributeUnitemizedReasoning = (usage, reasoningText, contentText) => {
|
|
17
|
+
if (usage.reasoning !== 0 || usage.completion === 0 || reasoningText.length === 0)
|
|
18
|
+
return usage;
|
|
19
|
+
const reasoning = contentText.length === 0
|
|
20
|
+
? usage.completion
|
|
21
|
+
: Math.round(usage.completion * reasoningText.length / (reasoningText.length + contentText.length));
|
|
22
|
+
return {
|
|
23
|
+
...usage,
|
|
24
|
+
completion: usage.completion - reasoning,
|
|
25
|
+
reasoning,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
14
28
|
export const normalizeUsage = (raw, reasoningText = "", contentText = "") => {
|
|
15
29
|
const prompt = raw?.prompt_tokens ?? 0;
|
|
16
30
|
const completionRaw = raw?.completion_tokens ?? 0;
|
|
17
31
|
const reportedTotal = raw?.total_tokens ?? 0;
|
|
18
32
|
// OpenAI nests cached under prompt_tokens_details; others put it top-level.
|
|
19
|
-
const cached = raw?.prompt_tokens_details?.cached_tokens
|
|
33
|
+
const cached = raw?.prompt_tokens_details?.cached_tokens
|
|
34
|
+
?? raw?.prompt_cache_hit_tokens
|
|
35
|
+
?? raw?.cached_tokens
|
|
36
|
+
?? 0;
|
|
20
37
|
const reasoningDetail = raw?.completion_tokens_details?.reasoning_tokens;
|
|
21
38
|
let completion;
|
|
22
39
|
let reasoning;
|
|
@@ -26,7 +43,7 @@ export const normalizeUsage = (raw, reasoningText = "", contentText = "") => {
|
|
|
26
43
|
// o-series folds it INTO completion_tokens (subset: total = prompt + completion,
|
|
27
44
|
// so completion must have reasoning subtracted out). xAI/Grok reports it
|
|
28
45
|
// ADDITIVE to a visible-only completion_tokens (total = prompt + completion +
|
|
29
|
-
// reasoning), where subtracting wrongly zeroes the visible output
|
|
46
|
+
// reasoning), where subtracting wrongly zeroes the visible output. Tell
|
|
30
47
|
// them apart by the total identity; with no total reported, fall back on the
|
|
31
48
|
// impossible-subset signal — reasoning can't exceed the completion it's a
|
|
32
49
|
// subset of.
|
|
@@ -40,29 +57,57 @@ export const normalizeUsage = (raw, reasoningText = "", contentText = "") => {
|
|
|
40
57
|
// reasoning. Only trust the gap when a total was actually reported.
|
|
41
58
|
reasoning = reportedTotal > 0 ? Math.max(0, reportedTotal - prompt - completionRaw) : 0;
|
|
42
59
|
completion = completionRaw;
|
|
43
|
-
// Fireworks folds reasoning INTO completion_tokens and itemizes no
|
|
44
|
-
// reasoning_tokens, so a turn that shipped only reasoning reads reasoning=0
|
|
45
|
-
// though 300k chars of it arrived (#425). When reasoning TEXT came back but
|
|
46
|
-
// the reported totals leave no gap, re-split the reported completion by the
|
|
47
|
-
// emitted text proportions. Sum-preserving: billable output
|
|
48
|
-
// (completion+reasoning) and cost are byte-identical; only the
|
|
49
|
-
// visible/reasoning gauge is corrected (pure-reasoning turn -> completion 0).
|
|
50
|
-
if (reasoning === 0 && reasoningText.length > 0 && reportedTotal > 0 && completionRaw > 0) {
|
|
51
|
-
reasoning = Math.round(completionRaw * reasoningText.length / (reasoningText.length + contentText.length));
|
|
52
|
-
completion = completionRaw - reasoning;
|
|
53
|
-
}
|
|
54
60
|
}
|
|
55
61
|
const total = reportedTotal > 0 ? reportedTotal : prompt + completion + reasoning;
|
|
56
|
-
|
|
62
|
+
const usage = { prompt, completion, reasoning, cached, total };
|
|
63
|
+
// Fireworks folds reasoning INTO completion_tokens and itemizes no
|
|
64
|
+
// reasoning_tokens. A reported total establishes that completion is an
|
|
65
|
+
// upstream quantity rather than a locally synthesized fallback.
|
|
66
|
+
return reasoningDetail === undefined && reportedTotal > 0
|
|
67
|
+
? attributeUnitemizedReasoning(usage, reasoningText, contentText)
|
|
68
|
+
: usage;
|
|
69
|
+
};
|
|
70
|
+
const decimalParts = (value) => {
|
|
71
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
72
|
+
throw new TypeError("token rates must be finite non-negative numbers");
|
|
73
|
+
}
|
|
74
|
+
const match = /^(\d+)(?:\.(\d+))?(?:e([+-]?\d+))?$/i.exec(String(value));
|
|
75
|
+
if (match === null)
|
|
76
|
+
throw new TypeError(`cannot represent token rate ${value} as a decimal`);
|
|
77
|
+
const fraction = match[2] ?? "";
|
|
78
|
+
const exponent = Number(match[3] ?? "0");
|
|
79
|
+
const scale = fraction.length - exponent;
|
|
80
|
+
const coefficient = BigInt(`${match[1]}${fraction}`);
|
|
81
|
+
return scale < 0
|
|
82
|
+
? { coefficient: coefficient * 10n ** BigInt(-scale), scale: 0 }
|
|
83
|
+
: { coefficient, scale };
|
|
84
|
+
};
|
|
85
|
+
const decimalString = (coefficient, scale) => {
|
|
86
|
+
const digits = String(coefficient).padStart(scale + 1, "0");
|
|
87
|
+
if (scale === 0)
|
|
88
|
+
return digits;
|
|
89
|
+
const integer = digits.slice(0, -scale);
|
|
90
|
+
const fraction = digits.slice(-scale).replace(/0+$/, "");
|
|
91
|
+
return fraction.length === 0 ? integer : `${integer}.${fraction}`;
|
|
92
|
+
};
|
|
93
|
+
// Models.dev rates are decimal USD-per-million values. Calculate their
|
|
94
|
+
// projection as decimal arithmetic so ProviderCost preserves the table and
|
|
95
|
+
// exact response counts without binary floating-point artifacts.
|
|
96
|
+
export const calculateCostUsdDecimal = (usage, rates) => {
|
|
97
|
+
const parts = [rates.input, rates.cached, rates.output].map(decimalParts);
|
|
98
|
+
const rateScale = Math.max(...parts.map(({ scale }) => scale));
|
|
99
|
+
const [input, cached, output] = parts.map(({ coefficient, scale }) => coefficient * 10n ** BigInt(rateScale - scale));
|
|
100
|
+
const nonCachedPrompt = Math.max(0, usage.prompt - usage.cached);
|
|
101
|
+
const outputTokens = usage.completion + usage.reasoning;
|
|
102
|
+
const coefficient = BigInt(nonCachedPrompt) * input
|
|
103
|
+
+ BigInt(usage.cached) * cached
|
|
104
|
+
+ BigInt(outputTokens) * output;
|
|
105
|
+
return decimalString(coefficient, rateScale + 6);
|
|
57
106
|
};
|
|
58
107
|
// The one cost formula every provider uses: non-cached prompt at the input
|
|
59
108
|
// rate, cached prompt at the cache rate, and billable output (completion +
|
|
60
109
|
// reasoning) at the output rate.
|
|
61
110
|
export const calculateCostUsd = (usage, rates) => {
|
|
62
|
-
|
|
63
|
-
const output = usage.completion + usage.reasoning;
|
|
64
|
-
return (nonCachedPrompt * rates.input
|
|
65
|
-
+ usage.cached * rates.cached
|
|
66
|
-
+ output * rates.output) / 1_000_000;
|
|
111
|
+
return Number(calculateCostUsdDecimal(usage, rates));
|
|
67
112
|
};
|
|
68
113
|
//# sourceMappingURL=usage.js.map
|
package/dist/usage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,yDAAyD;AACzD,6EAA6E;AAC7E,+EAA+E;AAC/E,yEAAyE;AACzE,4EAA4E;AAC5E,iFAAiF;AACjF,mFAAmF;AACnF,+EAA+E;AAC/E,6EAA6E;AAC7E,+DAA+D;AAC/D,8EAA8E;
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
|
package/dist/warnings.js
CHANGED
|
Binary file
|
package/dist/warnings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warnings.js","sourceRoot":"","sources":["../src/warnings.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,
|
|
1
|
+
{"version":3,"file":"warnings.js","sourceRoot":"","sources":["../src/warnings.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,yFAAyF;AACzF,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;AAElC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAe,EAAE,IAAY,EAAQ,EAAE;IACnE,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;IACjC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,cAAc,GAAI,UAEtB,CAAC,OAAO,CAAC;IACX,IAAI,cAAc,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;QAC5C,cAAc,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;IACzC,CAAC;AACL,CAAC,CAAC;AAEF,mFAAmF;AACnF,uCAAuC;AACvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAS,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC"}
|