@x12i/ai-profiles 3.3.0 → 3.4.1
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 +74 -2
- package/dist/buildResolvedCatalogModel.d.ts +27 -0
- package/dist/buildResolvedCatalogModel.d.ts.map +1 -0
- package/dist/buildResolvedCatalogModel.js +179 -0
- package/dist/buildResolvedCatalogModel.js.map +1 -0
- package/dist/buildResolvedProfile.d.ts +2 -0
- package/dist/buildResolvedProfile.d.ts.map +1 -1
- package/dist/buildResolvedProfile.js +17 -1
- package/dist/buildResolvedProfile.js.map +1 -1
- package/dist/calculateInvokeCost.d.ts +57 -0
- package/dist/calculateInvokeCost.d.ts.map +1 -0
- package/dist/calculateInvokeCost.js +106 -0
- package/dist/calculateInvokeCost.js.map +1 -0
- package/dist/catalogEnrichment.d.ts +2 -2
- package/dist/catalogEnrichment.d.ts.map +1 -1
- package/dist/catalogEnrichment.js +16 -4
- package/dist/catalogEnrichment.js.map +1 -1
- package/dist/cost/computeInvokeCost.d.ts +33 -0
- package/dist/cost/computeInvokeCost.d.ts.map +1 -0
- package/dist/cost/computeInvokeCost.js +95 -0
- package/dist/cost/computeInvokeCost.js.map +1 -0
- package/dist/cost/constants.d.ts +7 -0
- package/dist/cost/constants.d.ts.map +1 -0
- package/dist/cost/constants.js +7 -0
- package/dist/cost/constants.js.map +1 -0
- package/dist/cost/invokePricingRecord.d.ts +55 -0
- package/dist/cost/invokePricingRecord.d.ts.map +1 -0
- package/dist/cost/invokePricingRecord.js +68 -0
- package/dist/cost/invokePricingRecord.js.map +1 -0
- package/dist/cost/reasoningWire.d.ts +13 -0
- package/dist/cost/reasoningWire.d.ts.map +1 -0
- package/dist/cost/reasoningWire.js +28 -0
- package/dist/cost/reasoningWire.js.map +1 -0
- package/dist/cost/resolveInvokePricing.d.ts +40 -0
- package/dist/cost/resolveInvokePricing.d.ts.map +1 -0
- package/dist/cost/resolveInvokePricing.js +170 -0
- package/dist/cost/resolveInvokePricing.js.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lookupBundledCatalogCaps.d.ts +11 -1
- package/dist/lookupBundledCatalogCaps.d.ts.map +1 -1
- package/dist/lookupBundledCatalogCaps.js +25 -11
- package/dist/lookupBundledCatalogCaps.js.map +1 -1
- package/dist/modelInputFallback.d.ts.map +1 -1
- package/dist/modelInputFallback.js +1 -0
- package/dist/modelInputFallback.js.map +1 -1
- package/dist/requireCatalogModel.d.ts +12 -2
- package/dist/requireCatalogModel.d.ts.map +1 -1
- package/dist/requireCatalogModel.js +135 -9
- package/dist/requireCatalogModel.js.map +1 -1
- package/dist/resolveAIProfile.d.ts.map +1 -1
- package/dist/resolveAIProfile.js +2 -0
- package/dist/resolveAIProfile.js.map +1 -1
- package/dist/resolveBundledCatalogModel.d.ts +6 -0
- package/dist/resolveBundledCatalogModel.d.ts.map +1 -1
- package/dist/resolveBundledCatalogModel.js +1 -1
- package/dist/resolveBundledCatalogModel.js.map +1 -1
- package/dist/resolveCatalogModel.d.ts.map +1 -1
- package/dist/resolveCatalogModel.js +16 -1
- package/dist/resolveCatalogModel.js.map +1 -1
- package/dist/resolveCatalogModelDetails.d.ts +18 -0
- package/dist/resolveCatalogModelDetails.d.ts.map +1 -0
- package/dist/resolveCatalogModelDetails.js +79 -0
- package/dist/resolveCatalogModelDetails.js.map +1 -0
- package/dist/resolveProfileInputCore.d.ts.map +1 -1
- package/dist/resolveProfileInputCore.js +2 -0
- package/dist/resolveProfileInputCore.js.map +1 -1
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { openRouterReasoningWireFromCatalog } from "./cost/reasoningWire.js";
|
|
1
2
|
import { buildModelsCatalogIndex } from "./modelsCatalog.js";
|
|
2
3
|
import { normalizeModalityContract } from "./modalityPolicy.js";
|
|
3
4
|
import { getChoiceOpenRouterModelId, getChoiceVendorModelId } from "./profileRegistryV2.js";
|
|
@@ -50,9 +51,20 @@ export function limitsFromCatalogEntry(entry) {
|
|
|
50
51
|
maxOutputTokens: entry.maxCompletionTokens ?? entry.openrouter.maxCompletionTokens,
|
|
51
52
|
};
|
|
52
53
|
}
|
|
53
|
-
export function capabilitiesFromCatalogEntry(entry) {
|
|
54
|
+
export function capabilitiesFromCatalogEntry(entry, instructionTier) {
|
|
54
55
|
const modalities = entry.modalities ?? entry.openrouter.modalities;
|
|
55
|
-
|
|
56
|
+
const limits = limitsFromCatalogEntry(entry);
|
|
57
|
+
const reasoningWire = openRouterReasoningWireFromCatalog(entry.openrouter.capabilities, entry.openrouter.pricing, instructionTier);
|
|
58
|
+
return {
|
|
59
|
+
...capabilitiesFromSlice(entry.openrouter.capabilities, modalities, entry.openrouter.pricing),
|
|
60
|
+
contextWindow: limits.contextWindow,
|
|
61
|
+
maxOutputTokens: limits.maxOutputTokens,
|
|
62
|
+
supportsOpenRouterReasoningParam: reasoningWire.supportsOpenRouterReasoningParam,
|
|
63
|
+
hasReasoningPricing: reasoningWire.hasReasoningPricing,
|
|
64
|
+
...(reasoningWire.suggestedReasoningEffort
|
|
65
|
+
? { suggestedReasoningEffort: reasoningWire.suggestedReasoningEffort }
|
|
66
|
+
: {}),
|
|
67
|
+
};
|
|
56
68
|
}
|
|
57
69
|
export function findCatalogModelEntry(catalog, params) {
|
|
58
70
|
const index = buildModelsCatalogIndex(catalog);
|
|
@@ -75,7 +87,7 @@ export function findCatalogModelEntry(catalog, params) {
|
|
|
75
87
|
return catalog.models.find((model) => model.direct.provider === params.provider &&
|
|
76
88
|
normalizeKey(model.direct.modelId) === normalizeKey(params.modelId));
|
|
77
89
|
}
|
|
78
|
-
export function enrichChoiceFromCatalog(catalog, choice, routed) {
|
|
90
|
+
export function enrichChoiceFromCatalog(catalog, choice, routed, instructionTier) {
|
|
79
91
|
const entry = findCatalogModelEntry(catalog, {
|
|
80
92
|
provider: choice.provider,
|
|
81
93
|
modelId: getChoiceVendorModelId(choice),
|
|
@@ -87,7 +99,7 @@ export function enrichChoiceFromCatalog(catalog, choice, routed) {
|
|
|
87
99
|
return {
|
|
88
100
|
pricing: pricingFromCatalogEntry(entry),
|
|
89
101
|
limits: limitsFromCatalogEntry(entry),
|
|
90
|
-
capabilities: capabilitiesFromCatalogEntry(entry),
|
|
102
|
+
capabilities: capabilitiesFromCatalogEntry(entry, instructionTier),
|
|
91
103
|
catalogEntry: entry,
|
|
92
104
|
};
|
|
93
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalogEnrichment.js","sourceRoot":"","sources":["../src/catalogEnrichment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAa5F,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,sBAAsB,CAC7B,UAAuD;IAEvD,OAAO,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;AACvD,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAA+C,EAC/C,UAAuD,EACvD,OAAkC;IAElC,MAAM,oBAAoB,GAAG,UAAU;QACrC,CAAC,CAAC,yBAAyB,CAAC,UAAU,CAAC;QACvC,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,cAAc,EAAE,sBAAsB,CAAC,UAAU,CAAC;QAClD,aAAa,EAAE,IAAI,EAAE,WAAW;QAChC,iBAAiB,EAAE,IAAI,EAAE,SAAS;QAClC,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,eAAe,EACb,OAAO,EAAE,WAAW,KAAK,SAAS,IAAI,OAAO,EAAE,UAAU,KAAK,SAAS;QACzE,aAAa,EACX,OAAO,EAAE,UAAU,KAAK,SAAS,IAAI,OAAO,EAAE,WAAW,KAAK,SAAS;QACzE,iBAAiB,EAAE,IAAI;QACvB,GAAG,CAAC,oBAAoB;YACtB,CAAC,CAAC;gBACE,eAAe,EAAE,oBAAoB,CAAC,KAAK;gBAC3C,gBAAgB,EAAE,oBAAoB,CAAC,MAAM;aAC9C;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAAwB;IAExB,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,YAAY,EAAE,OAAO,CAAC,UAAU;QAChC,KAAK,EAAE,OAAO,CAAC,mBAAmB;YAChC,CAAC,CAAC,4BAA4B,OAAO,CAAC,mBAAmB,EAAE;YAC3D,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAwB;IAExB,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,UAAU,CAAC,aAAa;QACpE,eAAe,EACb,KAAK,CAAC,mBAAmB,IAAI,KAAK,CAAC,UAAU,CAAC,mBAAmB;KACpE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,KAAwB;
|
|
1
|
+
{"version":3,"file":"catalogEnrichment.js","sourceRoot":"","sources":["../src/catalogEnrichment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AIModelPricing, CatalogOpenRouterPricing } from "../types.js";
|
|
2
|
+
export interface InvokeTokenUsage {
|
|
3
|
+
prompt: number;
|
|
4
|
+
completion: number;
|
|
5
|
+
total?: number;
|
|
6
|
+
cachedPrompt?: number;
|
|
7
|
+
cacheWrite?: number;
|
|
8
|
+
reasoning?: number;
|
|
9
|
+
audio?: number;
|
|
10
|
+
image?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface InvokeCostBreakdown {
|
|
13
|
+
promptCostUsd?: number;
|
|
14
|
+
completionCostUsd?: number;
|
|
15
|
+
reasoningCostUsd?: number;
|
|
16
|
+
cachingCostUsd?: number;
|
|
17
|
+
audioCostUsd?: number;
|
|
18
|
+
imageCostUsd?: number;
|
|
19
|
+
requestFlatCostUsd?: number;
|
|
20
|
+
openRouterMarkupCostUsd?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function hasPricedRates(pricing?: AIModelPricing, catalogPricing?: CatalogOpenRouterPricing): boolean;
|
|
23
|
+
export declare function computeInvokeCostUsd(params: {
|
|
24
|
+
tokens: InvokeTokenUsage;
|
|
25
|
+
pricing: AIModelPricing;
|
|
26
|
+
catalogPricing?: CatalogOpenRouterPricing;
|
|
27
|
+
routing?: "openrouter" | "direct";
|
|
28
|
+
includeBreakdown?: boolean;
|
|
29
|
+
}): {
|
|
30
|
+
costUsd: number;
|
|
31
|
+
breakdown?: InvokeCostBreakdown;
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=computeInvokeCost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeInvokeCost.d.ts","sourceRoot":"","sources":["../../src/cost/computeInvokeCost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAO5E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAoCD,wBAAgB,cAAc,CAC5B,OAAO,CAAC,EAAE,cAAc,EACxB,cAAc,CAAC,EAAE,wBAAwB,GACxC,OAAO,CAgBT;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,OAAO,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;IAClC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,mBAAmB,CAAA;CAAE,CA2EvD"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { DEFAULT_OPENROUTER_MARKUP_RATE, PROFILE_TIERED_CONTEXT_THRESHOLD, TOKENS_PER_MILLION, } from "./constants.js";
|
|
2
|
+
function usdPerToken(perMillion) {
|
|
3
|
+
return (perMillion ?? 0) / TOKENS_PER_MILLION;
|
|
4
|
+
}
|
|
5
|
+
function pickInputRatePerMillion(pricing, promptTokens) {
|
|
6
|
+
if (pricing.inputBelow200k !== undefined &&
|
|
7
|
+
pricing.inputAbove200k !== undefined) {
|
|
8
|
+
return promptTokens <= PROFILE_TIERED_CONTEXT_THRESHOLD
|
|
9
|
+
? pricing.inputBelow200k
|
|
10
|
+
: pricing.inputAbove200k;
|
|
11
|
+
}
|
|
12
|
+
return pricing.input ?? pricing.inputBelow200k ?? pricing.inputAbove200k;
|
|
13
|
+
}
|
|
14
|
+
function pickOutputRatePerMillion(pricing, promptTokens) {
|
|
15
|
+
if (pricing.outputBelow200k !== undefined &&
|
|
16
|
+
pricing.outputAbove200k !== undefined) {
|
|
17
|
+
return promptTokens <= PROFILE_TIERED_CONTEXT_THRESHOLD
|
|
18
|
+
? pricing.outputBelow200k
|
|
19
|
+
: pricing.outputAbove200k;
|
|
20
|
+
}
|
|
21
|
+
return pricing.output ?? pricing.outputBelow200k ?? pricing.outputAbove200k;
|
|
22
|
+
}
|
|
23
|
+
export function hasPricedRates(pricing, catalogPricing) {
|
|
24
|
+
if (!pricing) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const hasCore = pricing.input !== undefined ||
|
|
28
|
+
pricing.output !== undefined ||
|
|
29
|
+
pricing.inputBelow200k !== undefined ||
|
|
30
|
+
pricing.outputBelow200k !== undefined;
|
|
31
|
+
return (hasCore ||
|
|
32
|
+
catalogPricing?.internalReasoning !== undefined ||
|
|
33
|
+
catalogPricing?.webSearchPerRequest !== undefined);
|
|
34
|
+
}
|
|
35
|
+
export function computeInvokeCostUsd(params) {
|
|
36
|
+
const { tokens, pricing, catalogPricing } = params;
|
|
37
|
+
const routedViaOpenRouter = params.routing === "openrouter";
|
|
38
|
+
const promptTokens = tokens.prompt;
|
|
39
|
+
const promptRate = pickInputRatePerMillion(pricing, promptTokens);
|
|
40
|
+
const completionRate = pickOutputRatePerMillion(pricing, promptTokens);
|
|
41
|
+
const promptUsdPerToken = usdPerToken(promptRate);
|
|
42
|
+
const completionUsdPerToken = usdPerToken(completionRate);
|
|
43
|
+
const cacheReadUsdPerToken = usdPerToken(pricing.cachedInput ?? pricing.cacheHit);
|
|
44
|
+
const cacheWriteUsdPerToken = usdPerToken(pricing.cacheWrite5m ?? pricing.cacheWrite1h);
|
|
45
|
+
const reasoningUsdPerToken = catalogPricing?.internalReasoning !== undefined
|
|
46
|
+
? usdPerToken(catalogPricing.internalReasoning)
|
|
47
|
+
: promptUsdPerToken;
|
|
48
|
+
const audioUsdPerToken = usdPerToken(catalogPricing?.audioInput ?? promptRate);
|
|
49
|
+
const imageUsdPerToken = usdPerToken(catalogPricing?.imageInput);
|
|
50
|
+
let promptCost = tokens.prompt * promptUsdPerToken;
|
|
51
|
+
let completionCost = tokens.completion * completionUsdPerToken;
|
|
52
|
+
const cachedPrompt = tokens.cachedPrompt ?? 0;
|
|
53
|
+
const cachingCost = (tokens.cacheWrite ?? 0) * cacheWriteUsdPerToken +
|
|
54
|
+
cachedPrompt * cacheReadUsdPerToken;
|
|
55
|
+
const reasoningTokens = tokens.reasoning ?? 0;
|
|
56
|
+
const reasoningCost = reasoningTokens * reasoningUsdPerToken;
|
|
57
|
+
const audioCost = (tokens.audio ?? 0) * audioUsdPerToken;
|
|
58
|
+
const imageCost = (tokens.image ?? 0) * imageUsdPerToken;
|
|
59
|
+
const requestFlat = catalogPricing?.webSearchPerRequest ?? 0;
|
|
60
|
+
let openRouterMarkupCostUsd = 0;
|
|
61
|
+
if (routedViaOpenRouter) {
|
|
62
|
+
openRouterMarkupCostUsd =
|
|
63
|
+
tokens.prompt * promptUsdPerToken * DEFAULT_OPENROUTER_MARKUP_RATE +
|
|
64
|
+
tokens.completion * completionUsdPerToken * DEFAULT_OPENROUTER_MARKUP_RATE;
|
|
65
|
+
promptCost += tokens.prompt * promptUsdPerToken * DEFAULT_OPENROUTER_MARKUP_RATE;
|
|
66
|
+
completionCost +=
|
|
67
|
+
tokens.completion * completionUsdPerToken * DEFAULT_OPENROUTER_MARKUP_RATE;
|
|
68
|
+
}
|
|
69
|
+
const costUsd = promptCost +
|
|
70
|
+
completionCost +
|
|
71
|
+
cachingCost +
|
|
72
|
+
reasoningCost +
|
|
73
|
+
audioCost +
|
|
74
|
+
imageCost +
|
|
75
|
+
requestFlat;
|
|
76
|
+
if (!params.includeBreakdown) {
|
|
77
|
+
return { costUsd };
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
costUsd,
|
|
81
|
+
breakdown: {
|
|
82
|
+
promptCostUsd: promptCost,
|
|
83
|
+
completionCostUsd: completionCost,
|
|
84
|
+
...(cachingCost > 0 ? { cachingCostUsd: cachingCost } : {}),
|
|
85
|
+
...(reasoningCost > 0 ? { reasoningCostUsd: reasoningCost } : {}),
|
|
86
|
+
...(audioCost > 0 ? { audioCostUsd: audioCost } : {}),
|
|
87
|
+
...(imageCost > 0 ? { imageCostUsd: imageCost } : {}),
|
|
88
|
+
...(requestFlat > 0 ? { requestFlatCostUsd: requestFlat } : {}),
|
|
89
|
+
...(openRouterMarkupCostUsd > 0
|
|
90
|
+
? { openRouterMarkupCostUsd }
|
|
91
|
+
: {}),
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=computeInvokeCost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeInvokeCost.js","sourceRoot":"","sources":["../../src/cost/computeInvokeCost.ts"],"names":[],"mappings":"AACA,OAAO,EACL,8BAA8B,EAC9B,gCAAgC,EAChC,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAwBxB,SAAS,WAAW,CAAC,UAAmB;IACtC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,kBAAkB,CAAC;AAChD,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAAuB,EACvB,YAAoB;IAEpB,IACE,OAAO,CAAC,cAAc,KAAK,SAAS;QACpC,OAAO,CAAC,cAAc,KAAK,SAAS,EACpC,CAAC;QACD,OAAO,YAAY,IAAI,gCAAgC;YACrD,CAAC,CAAC,OAAO,CAAC,cAAc;YACxB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAC7B,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC;AAC3E,CAAC;AAED,SAAS,wBAAwB,CAC/B,OAAuB,EACvB,YAAoB;IAEpB,IACE,OAAO,CAAC,eAAe,KAAK,SAAS;QACrC,OAAO,CAAC,eAAe,KAAK,SAAS,EACrC,CAAC;QACD,OAAO,YAAY,IAAI,gCAAgC;YACrD,CAAC,CAAC,OAAO,CAAC,eAAe;YACzB,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;IAC9B,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAwB,EACxB,cAAyC;IAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GACX,OAAO,CAAC,KAAK,KAAK,SAAS;QAC3B,OAAO,CAAC,MAAM,KAAK,SAAS;QAC5B,OAAO,CAAC,cAAc,KAAK,SAAS;QACpC,OAAO,CAAC,eAAe,KAAK,SAAS,CAAC;IAExC,OAAO,CACL,OAAO;QACP,cAAc,EAAE,iBAAiB,KAAK,SAAS;QAC/C,cAAc,EAAE,mBAAmB,KAAK,SAAS,CAClD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAMpC;IACC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;IACnD,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,KAAK,YAAY,CAAC;IAC5D,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IAEnC,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAClE,MAAM,cAAc,GAAG,wBAAwB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvE,MAAM,iBAAiB,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,qBAAqB,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAC1D,MAAM,oBAAoB,GAAG,WAAW,CACtC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,QAAQ,CACxC,CAAC;IACF,MAAM,qBAAqB,GAAG,WAAW,CACvC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAC7C,CAAC;IACF,MAAM,oBAAoB,GACxB,cAAc,EAAE,iBAAiB,KAAK,SAAS;QAC7C,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,iBAAiB,CAAC;QAC/C,CAAC,CAAC,iBAAiB,CAAC;IACxB,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,EAAE,UAAU,IAAI,UAAU,CAAC,CAAC;IAC/E,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAEjE,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,iBAAiB,CAAC;IACnD,IAAI,cAAc,GAAG,MAAM,CAAC,UAAU,GAAG,qBAAqB,CAAC;IAE/D,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;IAC9C,MAAM,WAAW,GACf,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,qBAAqB;QAChD,YAAY,GAAG,oBAAoB,CAAC;IAEtC,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,eAAe,GAAG,oBAAoB,CAAC;IAE7D,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,gBAAgB,CAAC;IACzD,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,gBAAgB,CAAC;IACzD,MAAM,WAAW,GAAG,cAAc,EAAE,mBAAmB,IAAI,CAAC,CAAC;IAE7D,IAAI,uBAAuB,GAAG,CAAC,CAAC;IAChC,IAAI,mBAAmB,EAAE,CAAC;QACxB,uBAAuB;YACrB,MAAM,CAAC,MAAM,GAAG,iBAAiB,GAAG,8BAA8B;gBAClE,MAAM,CAAC,UAAU,GAAG,qBAAqB,GAAG,8BAA8B,CAAC;QAC7E,UAAU,IAAI,MAAM,CAAC,MAAM,GAAG,iBAAiB,GAAG,8BAA8B,CAAC;QACjF,cAAc;YACZ,MAAM,CAAC,UAAU,GAAG,qBAAqB,GAAG,8BAA8B,CAAC;IAC/E,CAAC;IAED,MAAM,OAAO,GACX,UAAU;QACV,cAAc;QACd,WAAW;QACX,aAAa;QACb,SAAS;QACT,SAAS;QACT,WAAW,CAAC;IAEd,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,OAAO;QACL,OAAO;QACP,SAAS,EAAE;YACT,aAAa,EAAE,UAAU;YACzB,iBAAiB,EAAE,cAAc;YACjC,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,uBAAuB,GAAG,CAAC;gBAC7B,CAAC,CAAC,EAAE,uBAAuB,EAAE;gBAC7B,CAAC,CAAC,EAAE,CAAC;SACR;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** USD rates in ai-profiles catalog are per 1M tokens. */
|
|
2
|
+
export declare const TOKENS_PER_MILLION = 1000000;
|
|
3
|
+
/** Tiered input/output rates switch at this prompt token count. */
|
|
4
|
+
export declare const PROFILE_TIERED_CONTEXT_THRESHOLD = 200000;
|
|
5
|
+
/** Applied to prompt/completion when routed via OpenRouter and catalog has no explicit markup. */
|
|
6
|
+
export declare const DEFAULT_OPENROUTER_MARKUP_RATE = 0.05;
|
|
7
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/cost/constants.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,eAAO,MAAM,kBAAkB,UAAY,CAAC;AAE5C,mEAAmE;AACnE,eAAO,MAAM,gCAAgC,SAAU,CAAC;AAExD,kGAAkG;AAClG,eAAO,MAAM,8BAA8B,OAAO,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** USD rates in ai-profiles catalog are per 1M tokens. */
|
|
2
|
+
export const TOKENS_PER_MILLION = 1_000_000;
|
|
3
|
+
/** Tiered input/output rates switch at this prompt token count. */
|
|
4
|
+
export const PROFILE_TIERED_CONTEXT_THRESHOLD = 200_000;
|
|
5
|
+
/** Applied to prompt/completion when routed via OpenRouter and catalog has no explicit markup. */
|
|
6
|
+
export const DEFAULT_OPENROUTER_MARKUP_RATE = 0.05;
|
|
7
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/cost/constants.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAE5C,mEAAmE;AACnE,MAAM,CAAC,MAAM,gCAAgC,GAAG,OAAO,CAAC;AAExD,kGAAkG;AAClG,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { AIProvider } from "../types.js";
|
|
2
|
+
import type { InvokeTokenUsage } from "./computeInvokeCost.js";
|
|
3
|
+
/**
|
|
4
|
+
* Activix-compatible snake_case usage keys (parity with ai-tools `calculateFromRecord`).
|
|
5
|
+
*/
|
|
6
|
+
export interface InvokeUsageTokens {
|
|
7
|
+
prompt_tokens: number;
|
|
8
|
+
completion_tokens: number;
|
|
9
|
+
total_tokens?: number;
|
|
10
|
+
cachedTokensPrompt?: number;
|
|
11
|
+
cached_prompt_tokens?: number;
|
|
12
|
+
cache_write_tokens?: number;
|
|
13
|
+
reasoning_tokens?: number;
|
|
14
|
+
audio_tokens?: number;
|
|
15
|
+
image_tokens?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Activix / FuncX invoke billing record shape (parity with ai-tools `calculateFromRecord` input).
|
|
19
|
+
*/
|
|
20
|
+
export interface InvokePricingRecord {
|
|
21
|
+
model?: string;
|
|
22
|
+
modelAlias?: string;
|
|
23
|
+
modelUsed?: string;
|
|
24
|
+
usedModel?: string;
|
|
25
|
+
provider?: string;
|
|
26
|
+
routing?: "openrouter" | "direct";
|
|
27
|
+
profileChoice?: {
|
|
28
|
+
profile: string;
|
|
29
|
+
choice: string;
|
|
30
|
+
};
|
|
31
|
+
usage: InvokeUsageTokens;
|
|
32
|
+
metadata?: {
|
|
33
|
+
maxTokensRequested?: number;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export declare function normalizeInvokeUsageTokens(usage: InvokeUsageTokens): InvokeTokenUsage;
|
|
37
|
+
export declare function resolveModelFromInvokeRecord(record: InvokePricingRecord): string | {
|
|
38
|
+
provider: AIProvider;
|
|
39
|
+
modelId: string;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Build an Activix-compatible invoke billing record from resolved invoke metadata.
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildInvokePricingRecord(input: {
|
|
45
|
+
model: string;
|
|
46
|
+
provider?: AIProvider;
|
|
47
|
+
routing?: "openrouter" | "direct";
|
|
48
|
+
profileChoice?: {
|
|
49
|
+
profile: string;
|
|
50
|
+
choice: string;
|
|
51
|
+
};
|
|
52
|
+
usage: InvokeTokenUsage | InvokeUsageTokens;
|
|
53
|
+
metadata?: InvokePricingRecord["metadata"];
|
|
54
|
+
}): InvokePricingRecord;
|
|
55
|
+
//# sourceMappingURL=invokePricingRecord.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invokePricingRecord.d.ts","sourceRoot":"","sources":["../../src/cost/invokePricingRecord.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;IAClC,aAAa,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,CAAC,EAAE;QACT,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,iBAAiB,GACvB,gBAAgB,CAkBlB;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,GAC1B,MAAM,GAAG;IAAE,QAAQ,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAepD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;IAClC,aAAa,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAAC;IAC5C,QAAQ,CAAC,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;CAC5C,GAAG,mBAAmB,CAmCtB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export function normalizeInvokeUsageTokens(usage) {
|
|
2
|
+
const cachedPrompt = usage.cachedTokensPrompt ?? usage.cached_prompt_tokens ?? 0;
|
|
3
|
+
return {
|
|
4
|
+
prompt: usage.prompt_tokens,
|
|
5
|
+
completion: usage.completion_tokens,
|
|
6
|
+
...(usage.total_tokens !== undefined ? { total: usage.total_tokens } : {}),
|
|
7
|
+
...(cachedPrompt > 0 ? { cachedPrompt } : {}),
|
|
8
|
+
...(usage.cache_write_tokens !== undefined
|
|
9
|
+
? { cacheWrite: usage.cache_write_tokens }
|
|
10
|
+
: {}),
|
|
11
|
+
...(usage.reasoning_tokens !== undefined
|
|
12
|
+
? { reasoning: usage.reasoning_tokens }
|
|
13
|
+
: {}),
|
|
14
|
+
...(usage.audio_tokens !== undefined ? { audio: usage.audio_tokens } : {}),
|
|
15
|
+
...(usage.image_tokens !== undefined ? { image: usage.image_tokens } : {}),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function resolveModelFromInvokeRecord(record) {
|
|
19
|
+
const runtime = record.usedModel ?? record.modelUsed ?? record.model ?? record.modelAlias;
|
|
20
|
+
if (!runtime) {
|
|
21
|
+
throw new Error("InvokePricingRecord requires model, usedModel, or modelUsed");
|
|
22
|
+
}
|
|
23
|
+
if (record.provider && !runtime.includes("/")) {
|
|
24
|
+
return {
|
|
25
|
+
provider: record.provider,
|
|
26
|
+
modelId: runtime,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return runtime;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Build an Activix-compatible invoke billing record from resolved invoke metadata.
|
|
33
|
+
*/
|
|
34
|
+
export function buildInvokePricingRecord(input) {
|
|
35
|
+
const usage = "prompt_tokens" in input.usage
|
|
36
|
+
? input.usage
|
|
37
|
+
: {
|
|
38
|
+
prompt_tokens: input.usage.prompt,
|
|
39
|
+
completion_tokens: input.usage.completion,
|
|
40
|
+
...(input.usage.total !== undefined
|
|
41
|
+
? { total_tokens: input.usage.total }
|
|
42
|
+
: {}),
|
|
43
|
+
...(input.usage.cachedPrompt !== undefined
|
|
44
|
+
? { cachedTokensPrompt: input.usage.cachedPrompt }
|
|
45
|
+
: {}),
|
|
46
|
+
...(input.usage.cacheWrite !== undefined
|
|
47
|
+
? { cache_write_tokens: input.usage.cacheWrite }
|
|
48
|
+
: {}),
|
|
49
|
+
...(input.usage.reasoning !== undefined
|
|
50
|
+
? { reasoning_tokens: input.usage.reasoning }
|
|
51
|
+
: {}),
|
|
52
|
+
...(input.usage.audio !== undefined
|
|
53
|
+
? { audio_tokens: input.usage.audio }
|
|
54
|
+
: {}),
|
|
55
|
+
...(input.usage.image !== undefined
|
|
56
|
+
? { image_tokens: input.usage.image }
|
|
57
|
+
: {}),
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
model: input.model,
|
|
61
|
+
...(input.provider ? { provider: input.provider } : {}),
|
|
62
|
+
...(input.routing ? { routing: input.routing } : {}),
|
|
63
|
+
...(input.profileChoice ? { profileChoice: input.profileChoice } : {}),
|
|
64
|
+
usage,
|
|
65
|
+
...(input.metadata ? { metadata: input.metadata } : {}),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=invokePricingRecord.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invokePricingRecord.js","sourceRoot":"","sources":["../../src/cost/invokePricingRecord.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CatalogModelEntry, CatalogOpenRouterCapabilities, CatalogOpenRouterPricing, InstructionTier } from "../types.js";
|
|
2
|
+
export interface OpenRouterReasoningWire {
|
|
3
|
+
/** Model supports OpenRouter `reasoning: { effort }` on chat requests. */
|
|
4
|
+
supportsOpenRouterReasoningParam: boolean;
|
|
5
|
+
/** Catalog defines a separate internal-reasoning token rate. */
|
|
6
|
+
hasReasoningPricing: boolean;
|
|
7
|
+
/** Suggested `reasoning.effort` for gateway callers when not overridden by runtime. */
|
|
8
|
+
suggestedReasoningEffort?: "low" | "medium" | "high";
|
|
9
|
+
}
|
|
10
|
+
export declare function suggestedReasoningEffortFromTier(tier?: InstructionTier): "low" | "medium" | "high" | undefined;
|
|
11
|
+
export declare function openRouterReasoningWireFromCatalog(capabilities?: CatalogOpenRouterCapabilities, pricing?: CatalogOpenRouterPricing, instructionTier?: InstructionTier): OpenRouterReasoningWire;
|
|
12
|
+
export declare function openRouterReasoningWireFromEntry(entry: CatalogModelEntry, instructionTier?: InstructionTier): OpenRouterReasoningWire;
|
|
13
|
+
//# sourceMappingURL=reasoningWire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoningWire.d.ts","sourceRoot":"","sources":["../../src/cost/reasoningWire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,6BAA6B,EAC7B,wBAAwB,EACxB,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,uBAAuB;IACtC,0EAA0E;IAC1E,gCAAgC,EAAE,OAAO,CAAC;IAC1C,gEAAgE;IAChE,mBAAmB,EAAE,OAAO,CAAC;IAC7B,uFAAuF;IACvF,wBAAwB,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtD;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,CAAC,EAAE,eAAe,GACrB,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAUvC;AAED,wBAAgB,kCAAkC,CAChD,YAAY,CAAC,EAAE,6BAA6B,EAC5C,OAAO,CAAC,EAAE,wBAAwB,EAClC,eAAe,CAAC,EAAE,eAAe,GAChC,uBAAuB,CAczB;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,iBAAiB,EACxB,eAAe,CAAC,EAAE,eAAe,GAChC,uBAAuB,CAMzB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function suggestedReasoningEffortFromTier(tier) {
|
|
2
|
+
switch (tier) {
|
|
3
|
+
case "default":
|
|
4
|
+
case "cpu":
|
|
5
|
+
return "low";
|
|
6
|
+
case "reasoning":
|
|
7
|
+
return "high";
|
|
8
|
+
default:
|
|
9
|
+
return "medium";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function openRouterReasoningWireFromCatalog(capabilities, pricing, instructionTier) {
|
|
13
|
+
const supportsOpenRouterReasoningParam = Boolean(capabilities?.reasoning);
|
|
14
|
+
const hasReasoningPricing = pricing?.internalReasoning !== undefined;
|
|
15
|
+
return {
|
|
16
|
+
supportsOpenRouterReasoningParam,
|
|
17
|
+
hasReasoningPricing,
|
|
18
|
+
...(supportsOpenRouterReasoningParam
|
|
19
|
+
? {
|
|
20
|
+
suggestedReasoningEffort: suggestedReasoningEffortFromTier(instructionTier) ?? "medium",
|
|
21
|
+
}
|
|
22
|
+
: {}),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function openRouterReasoningWireFromEntry(entry, instructionTier) {
|
|
26
|
+
return openRouterReasoningWireFromCatalog(entry.openrouter.capabilities, entry.openrouter.pricing, instructionTier);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=reasoningWire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoningWire.js","sourceRoot":"","sources":["../../src/cost/reasoningWire.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,gCAAgC,CAC9C,IAAsB;IAEtB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS,CAAC;QACf,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,WAAW;YACd,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,YAA4C,EAC5C,OAAkC,EAClC,eAAiC;IAEjC,MAAM,gCAAgC,GAAG,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC1E,MAAM,mBAAmB,GAAG,OAAO,EAAE,iBAAiB,KAAK,SAAS,CAAC;IAErE,OAAO;QACL,gCAAgC;QAChC,mBAAmB;QACnB,GAAG,CAAC,gCAAgC;YAClC,CAAC,CAAC;gBACE,wBAAwB,EACtB,gCAAgC,CAAC,eAAe,CAAC,IAAI,QAAQ;aAChE;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,KAAwB,EACxB,eAAiC;IAEjC,OAAO,kCAAkC,CACvC,KAAK,CAAC,UAAU,CAAC,YAAY,EAC7B,KAAK,CAAC,UAAU,CAAC,OAAO,EACxB,eAAe,CAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { AIProvider, AIModelPricing, CatalogOpenRouterPricing, ProfileCatalogLane, PreferOpenRouterInput, RegistrySourceMode } from "../types.js";
|
|
2
|
+
export interface ResolvedInvokePricing {
|
|
3
|
+
pricing?: AIModelPricing;
|
|
4
|
+
catalogPricing?: CatalogOpenRouterPricing;
|
|
5
|
+
provider: AIProvider;
|
|
6
|
+
modelId: string;
|
|
7
|
+
routing: "openrouter" | "direct";
|
|
8
|
+
profileChoice?: {
|
|
9
|
+
profile: string;
|
|
10
|
+
choice: string;
|
|
11
|
+
};
|
|
12
|
+
unknownModel: boolean;
|
|
13
|
+
localProvider: boolean;
|
|
14
|
+
}
|
|
15
|
+
export type InvokePricingModelInput = string | {
|
|
16
|
+
provider: AIProvider;
|
|
17
|
+
modelId: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function resolveInvokePricing(model: InvokePricingModelInput, options?: {
|
|
20
|
+
bundledOnly?: boolean;
|
|
21
|
+
catalogLane?: ProfileCatalogLane;
|
|
22
|
+
preferOpenRouter?: PreferOpenRouterInput;
|
|
23
|
+
profileChoice?: {
|
|
24
|
+
profile: string;
|
|
25
|
+
choice: string;
|
|
26
|
+
};
|
|
27
|
+
routing?: "openrouter" | "direct";
|
|
28
|
+
source?: RegistrySourceMode;
|
|
29
|
+
refresh?: boolean;
|
|
30
|
+
}): Promise<ResolvedInvokePricing>;
|
|
31
|
+
export declare function resolveInvokePricingBundled(model: InvokePricingModelInput, options?: {
|
|
32
|
+
catalogLane?: ProfileCatalogLane;
|
|
33
|
+
preferOpenRouter?: PreferOpenRouterInput;
|
|
34
|
+
profileChoice?: {
|
|
35
|
+
profile: string;
|
|
36
|
+
choice: string;
|
|
37
|
+
};
|
|
38
|
+
routing?: "openrouter" | "direct";
|
|
39
|
+
}): ResolvedInvokePricing;
|
|
40
|
+
//# sourceMappingURL=resolveInvokePricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveInvokePricing.d.ts","sourceRoot":"","sources":["../../src/cost/resolveInvokePricing.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,GAAG,QAAQ,CAAC;IACjC,aAAa,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,uBAAuB,GAC/B,MAAM,GACN;IAAE,QAAQ,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAoG9C,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,uBAAuB,EAC9B,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,aAAa,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,OAAO,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;IAClC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACd,GACL,OAAO,CAAC,qBAAqB,CAAC,CAoEhC;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,uBAAuB,EAC9B,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,aAAa,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,OAAO,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;CAC9B,GACL,qBAAqB,CA6DvB"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { getBundledRegistry } from "../bundledRegistry.js";
|
|
2
|
+
import { pricingFromCatalogEntry } from "../catalogEnrichment.js";
|
|
3
|
+
import { AIProfilesError } from "../errors.js";
|
|
4
|
+
import { loadBundledModelsCatalog } from "../loader/loadBundledModelsCatalog.js";
|
|
5
|
+
import { loadModelsCatalogWithWarnings } from "../loader/loadModelsCatalog.js";
|
|
6
|
+
import { matchStrictProfileInput } from "../profileChoiceKey.js";
|
|
7
|
+
import { resolveBundledAIProfile } from "../resolveBundledAIProfile.js";
|
|
8
|
+
import { isTrustedCatalogMatch, resolveModelFromCatalogResilient, } from "../catalogResilience.js";
|
|
9
|
+
import { catalogLookupKey } from "../resolveBundledCatalogModel.js";
|
|
10
|
+
import { resolveAIProfile } from "../resolveAIProfile.js";
|
|
11
|
+
import { resolvePreferOpenRouter } from "../resolveModelRouting.js";
|
|
12
|
+
function isProfileChoiceInput(input) {
|
|
13
|
+
const match = matchStrictProfileInput(getBundledRegistry(), input);
|
|
14
|
+
return match?.kind === "profileChoice";
|
|
15
|
+
}
|
|
16
|
+
async function resolveProfilePricingBundled(input, options) {
|
|
17
|
+
const resolved = resolveBundledAIProfile(input, {
|
|
18
|
+
catalogLane: options.catalogLane,
|
|
19
|
+
preferOpenRouter: options.preferOpenRouter,
|
|
20
|
+
includeCatalog: true,
|
|
21
|
+
});
|
|
22
|
+
const catalogModel = resolved.catalogModel;
|
|
23
|
+
const localProvider = resolved.provider === "local" || resolved.routing === "direct" && !catalogModel?.pricing;
|
|
24
|
+
return {
|
|
25
|
+
pricing: resolved.pricing ?? catalogModel?.pricing,
|
|
26
|
+
catalogPricing: catalogModel?.catalogPricing,
|
|
27
|
+
provider: resolved.provider,
|
|
28
|
+
modelId: resolved.modelId,
|
|
29
|
+
routing: resolved.routing,
|
|
30
|
+
profileChoice: { profile: resolved.profile, choice: resolved.choice },
|
|
31
|
+
unknownModel: !resolved.pricing && !catalogModel?.pricing,
|
|
32
|
+
localProvider,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
async function resolveProfilePricingAsync(input, options) {
|
|
36
|
+
const resolved = await resolveAIProfile(input, {
|
|
37
|
+
catalogLane: options.catalogLane,
|
|
38
|
+
preferOpenRouter: options.preferOpenRouter,
|
|
39
|
+
source: options.source,
|
|
40
|
+
refresh: options.refresh,
|
|
41
|
+
includeCatalog: true,
|
|
42
|
+
});
|
|
43
|
+
const catalogModel = resolved.catalogModel;
|
|
44
|
+
const localProvider = resolved.provider === "local";
|
|
45
|
+
return {
|
|
46
|
+
pricing: resolved.pricing ?? catalogModel?.pricing,
|
|
47
|
+
catalogPricing: catalogModel?.catalogPricing,
|
|
48
|
+
provider: resolved.provider,
|
|
49
|
+
modelId: resolved.modelId,
|
|
50
|
+
routing: resolved.routing,
|
|
51
|
+
profileChoice: { profile: resolved.profile, choice: resolved.choice },
|
|
52
|
+
unknownModel: !resolved.pricing && !catalogModel?.pricing,
|
|
53
|
+
localProvider,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function pricingFromCatalogMatch(lookupInput, catalog, preferOpenRouter, profileChoice) {
|
|
57
|
+
const routed = resolvePreferOpenRouter(preferOpenRouter);
|
|
58
|
+
const match = resolveModelFromCatalogResilient(lookupInput, catalog, {
|
|
59
|
+
skipBundledMerge: true,
|
|
60
|
+
});
|
|
61
|
+
if (!match || !isTrustedCatalogMatch(match)) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const endpoint = routed && match.invocation.openrouter
|
|
65
|
+
? match.invocation.openrouter
|
|
66
|
+
: match.invocation.direct;
|
|
67
|
+
const pricing = match.entry ? pricingFromCatalogEntry(match.entry) : undefined;
|
|
68
|
+
return {
|
|
69
|
+
pricing,
|
|
70
|
+
catalogPricing: match.entry?.openrouter.pricing,
|
|
71
|
+
provider: endpoint.provider,
|
|
72
|
+
modelId: endpoint.modelId,
|
|
73
|
+
routing: endpoint.provider === "openrouter" ? "openrouter" : "direct",
|
|
74
|
+
...(profileChoice ? { profileChoice } : {}),
|
|
75
|
+
unknownModel: !pricing,
|
|
76
|
+
localProvider: endpoint.provider === "local",
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export async function resolveInvokePricing(model, options = {}) {
|
|
80
|
+
const preferOpenRouter = options.routing === "direct"
|
|
81
|
+
? false
|
|
82
|
+
: options.routing === "openrouter"
|
|
83
|
+
? true
|
|
84
|
+
: options.preferOpenRouter;
|
|
85
|
+
if (typeof model === "string" && isProfileChoiceInput(model)) {
|
|
86
|
+
if (!options.catalogLane) {
|
|
87
|
+
throw new AIProfilesError("MISSING_CATALOG_LANE", "Profile/choice cost resolution requires options.catalogLane", { input: model });
|
|
88
|
+
}
|
|
89
|
+
if (options.bundledOnly ?? false) {
|
|
90
|
+
return resolveProfilePricingBundled(model, {
|
|
91
|
+
catalogLane: options.catalogLane,
|
|
92
|
+
preferOpenRouter: options.preferOpenRouter,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return resolveProfilePricingAsync(model, {
|
|
96
|
+
catalogLane: options.catalogLane,
|
|
97
|
+
preferOpenRouter: options.preferOpenRouter,
|
|
98
|
+
source: options.source,
|
|
99
|
+
refresh: options.refresh,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const lookupInput = typeof model === "string"
|
|
103
|
+
? catalogLookupKey(model).lookupInput
|
|
104
|
+
: catalogLookupKey(model).lookupInput;
|
|
105
|
+
const catalog = options.bundledOnly
|
|
106
|
+
? loadBundledModelsCatalog()
|
|
107
|
+
: (await loadModelsCatalogWithWarnings({
|
|
108
|
+
source: options.source ?? "auto",
|
|
109
|
+
refresh: options.refresh,
|
|
110
|
+
})).catalog;
|
|
111
|
+
const resolved = pricingFromCatalogMatch(lookupInput, catalog, preferOpenRouter, options.profileChoice);
|
|
112
|
+
if (!resolved) {
|
|
113
|
+
return {
|
|
114
|
+
provider: typeof model === "string" ? "custom" : model.provider,
|
|
115
|
+
modelId: typeof model === "string" ? model : model.modelId,
|
|
116
|
+
routing: resolvePreferOpenRouter(preferOpenRouter) ? "openrouter" : "direct",
|
|
117
|
+
unknownModel: true,
|
|
118
|
+
localProvider: false,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (options.routing) {
|
|
122
|
+
resolved.routing = options.routing;
|
|
123
|
+
}
|
|
124
|
+
return resolved;
|
|
125
|
+
}
|
|
126
|
+
export function resolveInvokePricingBundled(model, options = {}) {
|
|
127
|
+
const preferOpenRouter = options.routing === "direct"
|
|
128
|
+
? false
|
|
129
|
+
: options.routing === "openrouter"
|
|
130
|
+
? true
|
|
131
|
+
: options.preferOpenRouter;
|
|
132
|
+
if (typeof model === "string" && isProfileChoiceInput(model)) {
|
|
133
|
+
if (!options.catalogLane) {
|
|
134
|
+
throw new AIProfilesError("MISSING_CATALOG_LANE", "Profile/choice cost resolution requires options.catalogLane", { input: model });
|
|
135
|
+
}
|
|
136
|
+
const resolved = resolveBundledAIProfile(model, {
|
|
137
|
+
catalogLane: options.catalogLane,
|
|
138
|
+
preferOpenRouter: options.preferOpenRouter,
|
|
139
|
+
includeCatalog: true,
|
|
140
|
+
});
|
|
141
|
+
const catalogModel = resolved.catalogModel;
|
|
142
|
+
return {
|
|
143
|
+
pricing: resolved.pricing ?? catalogModel?.pricing,
|
|
144
|
+
catalogPricing: catalogModel?.catalogPricing,
|
|
145
|
+
provider: resolved.provider,
|
|
146
|
+
modelId: resolved.modelId,
|
|
147
|
+
routing: options.routing ?? resolved.routing,
|
|
148
|
+
profileChoice: { profile: resolved.profile, choice: resolved.choice },
|
|
149
|
+
unknownModel: !resolved.pricing && !catalogModel?.pricing,
|
|
150
|
+
localProvider: resolved.provider === "local",
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const { lookupInput } = typeof model === "string" ? catalogLookupKey(model) : catalogLookupKey(model);
|
|
154
|
+
const catalog = loadBundledModelsCatalog();
|
|
155
|
+
const resolved = pricingFromCatalogMatch(lookupInput, catalog, preferOpenRouter, options.profileChoice);
|
|
156
|
+
if (!resolved) {
|
|
157
|
+
return {
|
|
158
|
+
provider: typeof model === "string" ? "custom" : model.provider,
|
|
159
|
+
modelId: typeof model === "string" ? model : model.modelId,
|
|
160
|
+
routing: resolvePreferOpenRouter(preferOpenRouter) ? "openrouter" : "direct",
|
|
161
|
+
unknownModel: true,
|
|
162
|
+
localProvider: false,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
if (options.routing) {
|
|
166
|
+
resolved.routing = options.routing;
|
|
167
|
+
}
|
|
168
|
+
return resolved;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=resolveInvokePricing.js.map
|