@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.
Files changed (72) hide show
  1. package/README.md +74 -2
  2. package/dist/buildResolvedCatalogModel.d.ts +27 -0
  3. package/dist/buildResolvedCatalogModel.d.ts.map +1 -0
  4. package/dist/buildResolvedCatalogModel.js +179 -0
  5. package/dist/buildResolvedCatalogModel.js.map +1 -0
  6. package/dist/buildResolvedProfile.d.ts +2 -0
  7. package/dist/buildResolvedProfile.d.ts.map +1 -1
  8. package/dist/buildResolvedProfile.js +17 -1
  9. package/dist/buildResolvedProfile.js.map +1 -1
  10. package/dist/calculateInvokeCost.d.ts +57 -0
  11. package/dist/calculateInvokeCost.d.ts.map +1 -0
  12. package/dist/calculateInvokeCost.js +106 -0
  13. package/dist/calculateInvokeCost.js.map +1 -0
  14. package/dist/catalogEnrichment.d.ts +2 -2
  15. package/dist/catalogEnrichment.d.ts.map +1 -1
  16. package/dist/catalogEnrichment.js +16 -4
  17. package/dist/catalogEnrichment.js.map +1 -1
  18. package/dist/cost/computeInvokeCost.d.ts +33 -0
  19. package/dist/cost/computeInvokeCost.d.ts.map +1 -0
  20. package/dist/cost/computeInvokeCost.js +95 -0
  21. package/dist/cost/computeInvokeCost.js.map +1 -0
  22. package/dist/cost/constants.d.ts +7 -0
  23. package/dist/cost/constants.d.ts.map +1 -0
  24. package/dist/cost/constants.js +7 -0
  25. package/dist/cost/constants.js.map +1 -0
  26. package/dist/cost/invokePricingRecord.d.ts +55 -0
  27. package/dist/cost/invokePricingRecord.d.ts.map +1 -0
  28. package/dist/cost/invokePricingRecord.js +68 -0
  29. package/dist/cost/invokePricingRecord.js.map +1 -0
  30. package/dist/cost/reasoningWire.d.ts +13 -0
  31. package/dist/cost/reasoningWire.d.ts.map +1 -0
  32. package/dist/cost/reasoningWire.js +28 -0
  33. package/dist/cost/reasoningWire.js.map +1 -0
  34. package/dist/cost/resolveInvokePricing.d.ts +40 -0
  35. package/dist/cost/resolveInvokePricing.d.ts.map +1 -0
  36. package/dist/cost/resolveInvokePricing.js +170 -0
  37. package/dist/cost/resolveInvokePricing.js.map +1 -0
  38. package/dist/index.d.ts +9 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +4 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/lookupBundledCatalogCaps.d.ts +11 -1
  43. package/dist/lookupBundledCatalogCaps.d.ts.map +1 -1
  44. package/dist/lookupBundledCatalogCaps.js +25 -11
  45. package/dist/lookupBundledCatalogCaps.js.map +1 -1
  46. package/dist/modelInputFallback.d.ts.map +1 -1
  47. package/dist/modelInputFallback.js +1 -0
  48. package/dist/modelInputFallback.js.map +1 -1
  49. package/dist/requireCatalogModel.d.ts +12 -2
  50. package/dist/requireCatalogModel.d.ts.map +1 -1
  51. package/dist/requireCatalogModel.js +135 -9
  52. package/dist/requireCatalogModel.js.map +1 -1
  53. package/dist/resolveAIProfile.d.ts.map +1 -1
  54. package/dist/resolveAIProfile.js +2 -0
  55. package/dist/resolveAIProfile.js.map +1 -1
  56. package/dist/resolveBundledCatalogModel.d.ts +6 -0
  57. package/dist/resolveBundledCatalogModel.d.ts.map +1 -1
  58. package/dist/resolveBundledCatalogModel.js +1 -1
  59. package/dist/resolveBundledCatalogModel.js.map +1 -1
  60. package/dist/resolveCatalogModel.d.ts.map +1 -1
  61. package/dist/resolveCatalogModel.js +16 -1
  62. package/dist/resolveCatalogModel.js.map +1 -1
  63. package/dist/resolveCatalogModelDetails.d.ts +18 -0
  64. package/dist/resolveCatalogModelDetails.d.ts.map +1 -0
  65. package/dist/resolveCatalogModelDetails.js +79 -0
  66. package/dist/resolveCatalogModelDetails.js.map +1 -0
  67. package/dist/resolveProfileInputCore.d.ts.map +1 -1
  68. package/dist/resolveProfileInputCore.js +2 -0
  69. package/dist/resolveProfileInputCore.js.map +1 -1
  70. package/dist/types.d.ts +76 -0
  71. package/dist/types.d.ts.map +1 -1
  72. 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
- return capabilitiesFromSlice(entry.openrouter.capabilities, modalities, entry.openrouter.pricing);
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":"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"}
1
+ {"version":3,"file":"catalogEnrichment.js","sourceRoot":"","sources":["../src/catalogEnrichment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAC;AAC7E,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,EACxB,eAAsD;IAEtD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;IACnE,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,kCAAkC,CACtD,KAAK,CAAC,UAAU,CAAC,YAAY,EAC7B,KAAK,CAAC,UAAU,CAAC,OAAO,EACxB,eAAe,CAChB,CAAC;IAEF,OAAO;QACL,GAAG,qBAAqB,CACtB,KAAK,CAAC,UAAU,CAAC,YAAY,EAC7B,UAAU,EACV,KAAK,CAAC,UAAU,CAAC,OAAO,CACzB;QACD,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,gCAAgC,EAC9B,aAAa,CAAC,gCAAgC;QAChD,mBAAmB,EAAE,aAAa,CAAC,mBAAmB;QACtD,GAAG,CAAC,aAAa,CAAC,wBAAwB;YACxC,CAAC,CAAC,EAAE,wBAAwB,EAAE,aAAa,CAAC,wBAAwB,EAAE;YACtE,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAA0B,EAC1B,MAIC;IAED,MAAM,KAAK,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG;QACX,MAAM,CAAC,iBAAiB;QACxB,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE;QACtC,MAAM,CAAC,OAAO;KACf,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEvE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAC/B,CAAC,KAAK,EAAE,EAAE,CACR,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;YACtC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,CACtC,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CACxB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;QACzC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CACtE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,OAA0B,EAC1B,MAAuB,EACvB,MAAkD,EAClD,eAAsD;IAOtD,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,EAAE;QAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,sBAAsB,CAAC,MAAM,CAAC;QACvC,iBAAiB,EAAE,0BAA0B,CAAC,MAAM,EAAE,OAAO,CAAC;KAC/D,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,uBAAuB,CAAC,KAAK,CAAC;QACvC,MAAM,EAAE,sBAAsB,CAAC,KAAK,CAAC;QACrC,YAAY,EAAE,4BAA4B,CAAC,KAAK,EAAE,eAAe,CAAC;QAClE,YAAY,EAAE,KAAK;KACpB,CAAC;AACJ,CAAC"}
@@ -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":"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"}
@@ -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