@ai-billing/openai 0.0.1 → 0.0.2

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/dist/index.cjs CHANGED
@@ -102,7 +102,6 @@ function createOpenAIV3Middleware(options) {
102
102
  generationId: responseId ?? crypto.randomUUID(),
103
103
  modelId: model.modelId,
104
104
  provider: "openai",
105
- timestamp: Date.now(),
106
105
  tags,
107
106
  usage: {
108
107
  inputTokens: inputTokensTotal,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/cost/calculate-openai-cost.ts","../src/ai-sdk/language-model-middleware/v3/language-model-v3-openai-billing-middleware.ts"],"sourcesContent":["export * from './ai-sdk/index.js';\n","import {\n addCosts,\n applyDiscount,\n multiplyCost,\n rateToCost,\n} from '@ai-billing/core';\nimport type { ModelPricing, Cost } from '@ai-billing/core';\n\nexport interface OpenAICostInputs {\n promptTokens: number;\n completionTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n reasoningTokens: number;\n}\n\nexport const calculateOpenAICost = ({\n pricing,\n usage,\n}: {\n pricing: ModelPricing | undefined;\n usage: OpenAICostInputs;\n}): Cost | undefined => {\n if (!pricing) {\n return undefined;\n }\n\n const promptCost = multiplyCost(\n rateToCost(pricing.promptTokens),\n usage.promptTokens,\n );\n\n const completionCost = multiplyCost(\n rateToCost(pricing.completionTokens),\n usage.completionTokens,\n );\n\n const cacheReadCost = multiplyCost(\n rateToCost(pricing.inputCacheReadTokens),\n usage.cacheReadTokens,\n );\n\n const cacheWriteCost = multiplyCost(\n rateToCost(pricing.inputCacheWriteTokens),\n usage.cacheWriteTokens,\n );\n\n const reasoningCost = multiplyCost(\n rateToCost(pricing.internalReasoningTokens ?? pricing.completionTokens),\n usage.reasoningTokens,\n );\n\n const requestCost = rateToCost(pricing.request);\n\n const grossCost = addCosts(\n promptCost,\n completionCost,\n cacheReadCost,\n cacheWriteCost,\n reasoningCost,\n requestCost,\n );\n\n return applyDiscount(grossCost, pricing.discount ?? 0);\n};\n","import { calculateOpenAICost } from '../../../cost/index.js';\nimport type { OpenAICostInputs as OpenAIUsageInputs } from '../../../cost/calculate-openai-cost.js';\nimport { createV3BillingMiddleware } from '@ai-billing/core';\nimport type {\n BaseBillingMiddlewareOptions,\n PriceResolver,\n Cost,\n DefaultTags,\n PriceResolverContext,\n ModelPricing,\n} from '@ai-billing/core';\nimport { JSONObject, SharedV3ProviderMetadata } from '@ai-sdk/provider';\n\ninterface OpenAIUsageAccounting extends JSONObject {\n acceptedPredictionTokens?: number;\n rejectedPredictionTokens?: number;\n logprobs?: number | boolean;\n serviceTier?: string;\n}\n\ntype OpenAIProviderMetadata = SharedV3ProviderMetadata & {\n openai?: OpenAIUsageAccounting;\n};\n\nexport interface OpenAIV3MiddlewareOptions<\n TTags extends DefaultTags,\n> extends BaseBillingMiddlewareOptions<TTags> {\n priceResolver: PriceResolver;\n}\n\nexport function createOpenAIV3Middleware<TTags extends DefaultTags>(\n options: OpenAIV3MiddlewareOptions<TTags>,\n) {\n return createV3BillingMiddleware<TTags>({\n ...options,\n\n buildEvent: async ({\n model,\n usage,\n providerMetadata,\n responseId,\n tags,\n }) => {\n const _openaiMetadata = providerMetadata as\n | OpenAIProviderMetadata\n | undefined;\n\n const inputTokensTotal = usage?.inputTokens?.total ?? 0;\n const inputTokensCacheRead = usage?.inputTokens?.cacheRead ?? 0;\n const outputTokensTotal = usage?.outputTokens?.text ?? 0;\n const outputTokensReasoning = usage?.outputTokens?.reasoning ?? 0;\n\n const openAIUsage: OpenAIUsageInputs = {\n promptTokens: inputTokensTotal,\n completionTokens: usage?.outputTokens?.text ?? 0,\n cacheReadTokens: usage?.inputTokens?.cacheRead ?? 0,\n cacheWriteTokens: usage?.inputTokens?.cacheWrite ?? 0,\n reasoningTokens: usage?.outputTokens?.reasoning ?? 0,\n };\n\n const pricing: ModelPricing | undefined = await options.priceResolver({\n modelId: model.modelId,\n providerId: 'openai',\n } as PriceResolverContext);\n\n let calculatedCost: Cost | undefined = calculateOpenAICost({\n pricing,\n usage: openAIUsage,\n });\n\n return {\n generationId: responseId ?? crypto.randomUUID(),\n modelId: model.modelId,\n provider: 'openai',\n timestamp: Date.now(),\n tags: tags,\n usage: {\n inputTokens: inputTokensTotal,\n outputTokens: outputTokensTotal,\n cacheReadTokens: inputTokensCacheRead,\n reasoningTokens: outputTokensReasoning,\n totalTokens: inputTokensTotal + outputTokensTotal,\n },\n ...(calculatedCost !== undefined && {\n cost: calculatedCost,\n }),\n };\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAKO;AAWA,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AACF,MAGwB;AACtB,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,iBAAa;AAAA,QACjB,wBAAW,QAAQ,YAAY;AAAA,IAC/B,MAAM;AAAA,EACR;AAEA,QAAM,qBAAiB;AAAA,QACrB,wBAAW,QAAQ,gBAAgB;AAAA,IACnC,MAAM;AAAA,EACR;AAEA,QAAM,oBAAgB;AAAA,QACpB,wBAAW,QAAQ,oBAAoB;AAAA,IACvC,MAAM;AAAA,EACR;AAEA,QAAM,qBAAiB;AAAA,QACrB,wBAAW,QAAQ,qBAAqB;AAAA,IACxC,MAAM;AAAA,EACR;AAEA,QAAM,oBAAgB;AAAA,QACpB,wBAAW,QAAQ,2BAA2B,QAAQ,gBAAgB;AAAA,IACtE,MAAM;AAAA,EACR;AAEA,QAAM,kBAAc,wBAAW,QAAQ,OAAO;AAE9C,QAAM,gBAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAO,2BAAc,WAAW,QAAQ,YAAY,CAAC;AACvD;;;AC9DA,IAAAA,eAA0C;AA4BnC,SAAS,yBACd,SACA;AACA,aAAO,wCAAiC;AAAA,IACtC,GAAG;AAAA,IAEH,YAAY,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM;AACJ,YAAM,kBAAkB;AAIxB,YAAM,mBAAmB,OAAO,aAAa,SAAS;AACtD,YAAM,uBAAuB,OAAO,aAAa,aAAa;AAC9D,YAAM,oBAAoB,OAAO,cAAc,QAAQ;AACvD,YAAM,wBAAwB,OAAO,cAAc,aAAa;AAEhE,YAAM,cAAiC;AAAA,QACrC,cAAc;AAAA,QACd,kBAAkB,OAAO,cAAc,QAAQ;AAAA,QAC/C,iBAAiB,OAAO,aAAa,aAAa;AAAA,QAClD,kBAAkB,OAAO,aAAa,cAAc;AAAA,QACpD,iBAAiB,OAAO,cAAc,aAAa;AAAA,MACrD;AAEA,YAAM,UAAoC,MAAM,QAAQ,cAAc;AAAA,QACpE,SAAS,MAAM;AAAA,QACf,YAAY;AAAA,MACd,CAAyB;AAEzB,UAAI,iBAAmC,oBAAoB;AAAA,QACzD;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AAED,aAAO;AAAA,QACL,cAAc,cAAc,OAAO,WAAW;AAAA,QAC9C,SAAS,MAAM;AAAA,QACf,UAAU;AAAA,QACV,WAAW,KAAK,IAAI;AAAA,QACpB;AAAA,QACA,OAAO;AAAA,UACL,aAAa;AAAA,UACb,cAAc;AAAA,UACd,iBAAiB;AAAA,UACjB,iBAAiB;AAAA,UACjB,aAAa,mBAAmB;AAAA,QAClC;AAAA,QACA,GAAI,mBAAmB,UAAa;AAAA,UAClC,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":["import_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/cost/calculate-openai-cost.ts","../src/ai-sdk/language-model-middleware/v3/language-model-v3-openai-billing-middleware.ts"],"sourcesContent":["export * from './ai-sdk/index.js';\n","import {\n addCosts,\n applyDiscount,\n multiplyCost,\n rateToCost,\n} from '@ai-billing/core';\nimport type { ModelPricing, Cost } from '@ai-billing/core';\n\nexport interface OpenAICostInputs {\n promptTokens: number;\n completionTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n reasoningTokens: number;\n}\n\nexport const calculateOpenAICost = ({\n pricing,\n usage,\n}: {\n pricing: ModelPricing | undefined;\n usage: OpenAICostInputs;\n}): Cost | undefined => {\n if (!pricing) {\n return undefined;\n }\n\n const promptCost = multiplyCost(\n rateToCost(pricing.promptTokens),\n usage.promptTokens,\n );\n\n const completionCost = multiplyCost(\n rateToCost(pricing.completionTokens),\n usage.completionTokens,\n );\n\n const cacheReadCost = multiplyCost(\n rateToCost(pricing.inputCacheReadTokens),\n usage.cacheReadTokens,\n );\n\n const cacheWriteCost = multiplyCost(\n rateToCost(pricing.inputCacheWriteTokens),\n usage.cacheWriteTokens,\n );\n\n const reasoningCost = multiplyCost(\n rateToCost(pricing.internalReasoningTokens ?? pricing.completionTokens),\n usage.reasoningTokens,\n );\n\n const requestCost = rateToCost(pricing.request);\n\n const grossCost = addCosts(\n promptCost,\n completionCost,\n cacheReadCost,\n cacheWriteCost,\n reasoningCost,\n requestCost,\n );\n\n return applyDiscount(grossCost, pricing.discount ?? 0);\n};\n","import { calculateOpenAICost } from '../../../cost/index.js';\nimport type { OpenAICostInputs as OpenAIUsageInputs } from '../../../cost/calculate-openai-cost.js';\nimport { createV3BillingMiddleware } from '@ai-billing/core';\nimport type {\n BaseBillingMiddlewareOptions,\n PriceResolver,\n Cost,\n DefaultTags,\n PriceResolverContext,\n ModelPricing,\n BillingEvent,\n} from '@ai-billing/core';\nimport { JSONObject, SharedV3ProviderMetadata } from '@ai-sdk/provider';\n\ninterface OpenAIUsageAccounting extends JSONObject {\n acceptedPredictionTokens?: number;\n rejectedPredictionTokens?: number;\n logprobs?: number | boolean;\n serviceTier?: string;\n}\n\ntype OpenAIProviderMetadata = SharedV3ProviderMetadata & {\n openai?: OpenAIUsageAccounting;\n};\n\nexport interface OpenAIV3MiddlewareOptions<\n TTags extends DefaultTags,\n> extends BaseBillingMiddlewareOptions<TTags> {\n priceResolver: PriceResolver;\n}\n\nexport function createOpenAIV3Middleware<TTags extends DefaultTags>(\n options: OpenAIV3MiddlewareOptions<TTags>,\n) {\n return createV3BillingMiddleware<TTags>({\n ...options,\n\n buildEvent: async ({\n model,\n usage,\n providerMetadata,\n responseId,\n tags,\n }) => {\n const _openaiMetadata = providerMetadata as\n | OpenAIProviderMetadata\n | undefined;\n\n const inputTokensTotal = usage?.inputTokens?.total ?? 0;\n const inputTokensCacheRead = usage?.inputTokens?.cacheRead ?? 0;\n const outputTokensTotal = usage?.outputTokens?.text ?? 0;\n const outputTokensReasoning = usage?.outputTokens?.reasoning ?? 0;\n\n const openAIUsage: OpenAIUsageInputs = {\n promptTokens: inputTokensTotal,\n completionTokens: usage?.outputTokens?.text ?? 0,\n cacheReadTokens: usage?.inputTokens?.cacheRead ?? 0,\n cacheWriteTokens: usage?.inputTokens?.cacheWrite ?? 0,\n reasoningTokens: usage?.outputTokens?.reasoning ?? 0,\n };\n\n const pricing: ModelPricing | undefined = await options.priceResolver({\n modelId: model.modelId,\n providerId: 'openai',\n } as PriceResolverContext);\n\n let calculatedCost: Cost | undefined = calculateOpenAICost({\n pricing,\n usage: openAIUsage,\n });\n\n return {\n generationId: responseId ?? crypto.randomUUID(),\n modelId: model.modelId,\n provider: 'openai',\n tags: tags,\n usage: {\n inputTokens: inputTokensTotal,\n outputTokens: outputTokensTotal,\n cacheReadTokens: inputTokensCacheRead,\n reasoningTokens: outputTokensReasoning,\n totalTokens: inputTokensTotal + outputTokensTotal,\n },\n ...(calculatedCost !== undefined && {\n cost: calculatedCost,\n }),\n } satisfies BillingEvent<TTags>;\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAKO;AAWA,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AACF,MAGwB;AACtB,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,iBAAa;AAAA,QACjB,wBAAW,QAAQ,YAAY;AAAA,IAC/B,MAAM;AAAA,EACR;AAEA,QAAM,qBAAiB;AAAA,QACrB,wBAAW,QAAQ,gBAAgB;AAAA,IACnC,MAAM;AAAA,EACR;AAEA,QAAM,oBAAgB;AAAA,QACpB,wBAAW,QAAQ,oBAAoB;AAAA,IACvC,MAAM;AAAA,EACR;AAEA,QAAM,qBAAiB;AAAA,QACrB,wBAAW,QAAQ,qBAAqB;AAAA,IACxC,MAAM;AAAA,EACR;AAEA,QAAM,oBAAgB;AAAA,QACpB,wBAAW,QAAQ,2BAA2B,QAAQ,gBAAgB;AAAA,IACtE,MAAM;AAAA,EACR;AAEA,QAAM,kBAAc,wBAAW,QAAQ,OAAO;AAE9C,QAAM,gBAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAO,2BAAc,WAAW,QAAQ,YAAY,CAAC;AACvD;;;AC9DA,IAAAA,eAA0C;AA6BnC,SAAS,yBACd,SACA;AACA,aAAO,wCAAiC;AAAA,IACtC,GAAG;AAAA,IAEH,YAAY,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM;AACJ,YAAM,kBAAkB;AAIxB,YAAM,mBAAmB,OAAO,aAAa,SAAS;AACtD,YAAM,uBAAuB,OAAO,aAAa,aAAa;AAC9D,YAAM,oBAAoB,OAAO,cAAc,QAAQ;AACvD,YAAM,wBAAwB,OAAO,cAAc,aAAa;AAEhE,YAAM,cAAiC;AAAA,QACrC,cAAc;AAAA,QACd,kBAAkB,OAAO,cAAc,QAAQ;AAAA,QAC/C,iBAAiB,OAAO,aAAa,aAAa;AAAA,QAClD,kBAAkB,OAAO,aAAa,cAAc;AAAA,QACpD,iBAAiB,OAAO,cAAc,aAAa;AAAA,MACrD;AAEA,YAAM,UAAoC,MAAM,QAAQ,cAAc;AAAA,QACpE,SAAS,MAAM;AAAA,QACf,YAAY;AAAA,MACd,CAAyB;AAEzB,UAAI,iBAAmC,oBAAoB;AAAA,QACzD;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AAED,aAAO;AAAA,QACL,cAAc,cAAc,OAAO,WAAW;AAAA,QAC9C,SAAS,MAAM;AAAA,QACf,UAAU;AAAA,QACV;AAAA,QACA,OAAO;AAAA,UACL,aAAa;AAAA,UACb,cAAc;AAAA,UACd,iBAAiB;AAAA,UACjB,iBAAiB;AAAA,UACjB,aAAa,mBAAmB;AAAA,QAClC;AAAA,QACA,GAAI,mBAAmB,UAAa;AAAA,UAClC,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":["import_core"]}
package/dist/index.js CHANGED
@@ -80,7 +80,6 @@ function createOpenAIV3Middleware(options) {
80
80
  generationId: responseId ?? crypto.randomUUID(),
81
81
  modelId: model.modelId,
82
82
  provider: "openai",
83
- timestamp: Date.now(),
84
83
  tags,
85
84
  usage: {
86
85
  inputTokens: inputTokensTotal,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cost/calculate-openai-cost.ts","../src/ai-sdk/language-model-middleware/v3/language-model-v3-openai-billing-middleware.ts"],"sourcesContent":["import {\n addCosts,\n applyDiscount,\n multiplyCost,\n rateToCost,\n} from '@ai-billing/core';\nimport type { ModelPricing, Cost } from '@ai-billing/core';\n\nexport interface OpenAICostInputs {\n promptTokens: number;\n completionTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n reasoningTokens: number;\n}\n\nexport const calculateOpenAICost = ({\n pricing,\n usage,\n}: {\n pricing: ModelPricing | undefined;\n usage: OpenAICostInputs;\n}): Cost | undefined => {\n if (!pricing) {\n return undefined;\n }\n\n const promptCost = multiplyCost(\n rateToCost(pricing.promptTokens),\n usage.promptTokens,\n );\n\n const completionCost = multiplyCost(\n rateToCost(pricing.completionTokens),\n usage.completionTokens,\n );\n\n const cacheReadCost = multiplyCost(\n rateToCost(pricing.inputCacheReadTokens),\n usage.cacheReadTokens,\n );\n\n const cacheWriteCost = multiplyCost(\n rateToCost(pricing.inputCacheWriteTokens),\n usage.cacheWriteTokens,\n );\n\n const reasoningCost = multiplyCost(\n rateToCost(pricing.internalReasoningTokens ?? pricing.completionTokens),\n usage.reasoningTokens,\n );\n\n const requestCost = rateToCost(pricing.request);\n\n const grossCost = addCosts(\n promptCost,\n completionCost,\n cacheReadCost,\n cacheWriteCost,\n reasoningCost,\n requestCost,\n );\n\n return applyDiscount(grossCost, pricing.discount ?? 0);\n};\n","import { calculateOpenAICost } from '../../../cost/index.js';\nimport type { OpenAICostInputs as OpenAIUsageInputs } from '../../../cost/calculate-openai-cost.js';\nimport { createV3BillingMiddleware } from '@ai-billing/core';\nimport type {\n BaseBillingMiddlewareOptions,\n PriceResolver,\n Cost,\n DefaultTags,\n PriceResolverContext,\n ModelPricing,\n} from '@ai-billing/core';\nimport { JSONObject, SharedV3ProviderMetadata } from '@ai-sdk/provider';\n\ninterface OpenAIUsageAccounting extends JSONObject {\n acceptedPredictionTokens?: number;\n rejectedPredictionTokens?: number;\n logprobs?: number | boolean;\n serviceTier?: string;\n}\n\ntype OpenAIProviderMetadata = SharedV3ProviderMetadata & {\n openai?: OpenAIUsageAccounting;\n};\n\nexport interface OpenAIV3MiddlewareOptions<\n TTags extends DefaultTags,\n> extends BaseBillingMiddlewareOptions<TTags> {\n priceResolver: PriceResolver;\n}\n\nexport function createOpenAIV3Middleware<TTags extends DefaultTags>(\n options: OpenAIV3MiddlewareOptions<TTags>,\n) {\n return createV3BillingMiddleware<TTags>({\n ...options,\n\n buildEvent: async ({\n model,\n usage,\n providerMetadata,\n responseId,\n tags,\n }) => {\n const _openaiMetadata = providerMetadata as\n | OpenAIProviderMetadata\n | undefined;\n\n const inputTokensTotal = usage?.inputTokens?.total ?? 0;\n const inputTokensCacheRead = usage?.inputTokens?.cacheRead ?? 0;\n const outputTokensTotal = usage?.outputTokens?.text ?? 0;\n const outputTokensReasoning = usage?.outputTokens?.reasoning ?? 0;\n\n const openAIUsage: OpenAIUsageInputs = {\n promptTokens: inputTokensTotal,\n completionTokens: usage?.outputTokens?.text ?? 0,\n cacheReadTokens: usage?.inputTokens?.cacheRead ?? 0,\n cacheWriteTokens: usage?.inputTokens?.cacheWrite ?? 0,\n reasoningTokens: usage?.outputTokens?.reasoning ?? 0,\n };\n\n const pricing: ModelPricing | undefined = await options.priceResolver({\n modelId: model.modelId,\n providerId: 'openai',\n } as PriceResolverContext);\n\n let calculatedCost: Cost | undefined = calculateOpenAICost({\n pricing,\n usage: openAIUsage,\n });\n\n return {\n generationId: responseId ?? crypto.randomUUID(),\n modelId: model.modelId,\n provider: 'openai',\n timestamp: Date.now(),\n tags: tags,\n usage: {\n inputTokens: inputTokensTotal,\n outputTokens: outputTokensTotal,\n cacheReadTokens: inputTokensCacheRead,\n reasoningTokens: outputTokensReasoning,\n totalTokens: inputTokensTotal + outputTokensTotal,\n },\n ...(calculatedCost !== undefined && {\n cost: calculatedCost,\n }),\n };\n },\n });\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAWA,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AACF,MAGwB;AACtB,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,aAAa;AAAA,IACjB,WAAW,QAAQ,YAAY;AAAA,IAC/B,MAAM;AAAA,EACR;AAEA,QAAM,iBAAiB;AAAA,IACrB,WAAW,QAAQ,gBAAgB;AAAA,IACnC,MAAM;AAAA,EACR;AAEA,QAAM,gBAAgB;AAAA,IACpB,WAAW,QAAQ,oBAAoB;AAAA,IACvC,MAAM;AAAA,EACR;AAEA,QAAM,iBAAiB;AAAA,IACrB,WAAW,QAAQ,qBAAqB;AAAA,IACxC,MAAM;AAAA,EACR;AAEA,QAAM,gBAAgB;AAAA,IACpB,WAAW,QAAQ,2BAA2B,QAAQ,gBAAgB;AAAA,IACtE,MAAM;AAAA,EACR;AAEA,QAAM,cAAc,WAAW,QAAQ,OAAO;AAE9C,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,cAAc,WAAW,QAAQ,YAAY,CAAC;AACvD;;;AC9DA,SAAS,iCAAiC;AA4BnC,SAAS,yBACd,SACA;AACA,SAAO,0BAAiC;AAAA,IACtC,GAAG;AAAA,IAEH,YAAY,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM;AACJ,YAAM,kBAAkB;AAIxB,YAAM,mBAAmB,OAAO,aAAa,SAAS;AACtD,YAAM,uBAAuB,OAAO,aAAa,aAAa;AAC9D,YAAM,oBAAoB,OAAO,cAAc,QAAQ;AACvD,YAAM,wBAAwB,OAAO,cAAc,aAAa;AAEhE,YAAM,cAAiC;AAAA,QACrC,cAAc;AAAA,QACd,kBAAkB,OAAO,cAAc,QAAQ;AAAA,QAC/C,iBAAiB,OAAO,aAAa,aAAa;AAAA,QAClD,kBAAkB,OAAO,aAAa,cAAc;AAAA,QACpD,iBAAiB,OAAO,cAAc,aAAa;AAAA,MACrD;AAEA,YAAM,UAAoC,MAAM,QAAQ,cAAc;AAAA,QACpE,SAAS,MAAM;AAAA,QACf,YAAY;AAAA,MACd,CAAyB;AAEzB,UAAI,iBAAmC,oBAAoB;AAAA,QACzD;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AAED,aAAO;AAAA,QACL,cAAc,cAAc,OAAO,WAAW;AAAA,QAC9C,SAAS,MAAM;AAAA,QACf,UAAU;AAAA,QACV,WAAW,KAAK,IAAI;AAAA,QACpB;AAAA,QACA,OAAO;AAAA,UACL,aAAa;AAAA,UACb,cAAc;AAAA,UACd,iBAAiB;AAAA,UACjB,iBAAiB;AAAA,UACjB,aAAa,mBAAmB;AAAA,QAClC;AAAA,QACA,GAAI,mBAAmB,UAAa;AAAA,UAClC,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../src/cost/calculate-openai-cost.ts","../src/ai-sdk/language-model-middleware/v3/language-model-v3-openai-billing-middleware.ts"],"sourcesContent":["import {\n addCosts,\n applyDiscount,\n multiplyCost,\n rateToCost,\n} from '@ai-billing/core';\nimport type { ModelPricing, Cost } from '@ai-billing/core';\n\nexport interface OpenAICostInputs {\n promptTokens: number;\n completionTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n reasoningTokens: number;\n}\n\nexport const calculateOpenAICost = ({\n pricing,\n usage,\n}: {\n pricing: ModelPricing | undefined;\n usage: OpenAICostInputs;\n}): Cost | undefined => {\n if (!pricing) {\n return undefined;\n }\n\n const promptCost = multiplyCost(\n rateToCost(pricing.promptTokens),\n usage.promptTokens,\n );\n\n const completionCost = multiplyCost(\n rateToCost(pricing.completionTokens),\n usage.completionTokens,\n );\n\n const cacheReadCost = multiplyCost(\n rateToCost(pricing.inputCacheReadTokens),\n usage.cacheReadTokens,\n );\n\n const cacheWriteCost = multiplyCost(\n rateToCost(pricing.inputCacheWriteTokens),\n usage.cacheWriteTokens,\n );\n\n const reasoningCost = multiplyCost(\n rateToCost(pricing.internalReasoningTokens ?? pricing.completionTokens),\n usage.reasoningTokens,\n );\n\n const requestCost = rateToCost(pricing.request);\n\n const grossCost = addCosts(\n promptCost,\n completionCost,\n cacheReadCost,\n cacheWriteCost,\n reasoningCost,\n requestCost,\n );\n\n return applyDiscount(grossCost, pricing.discount ?? 0);\n};\n","import { calculateOpenAICost } from '../../../cost/index.js';\nimport type { OpenAICostInputs as OpenAIUsageInputs } from '../../../cost/calculate-openai-cost.js';\nimport { createV3BillingMiddleware } from '@ai-billing/core';\nimport type {\n BaseBillingMiddlewareOptions,\n PriceResolver,\n Cost,\n DefaultTags,\n PriceResolverContext,\n ModelPricing,\n BillingEvent,\n} from '@ai-billing/core';\nimport { JSONObject, SharedV3ProviderMetadata } from '@ai-sdk/provider';\n\ninterface OpenAIUsageAccounting extends JSONObject {\n acceptedPredictionTokens?: number;\n rejectedPredictionTokens?: number;\n logprobs?: number | boolean;\n serviceTier?: string;\n}\n\ntype OpenAIProviderMetadata = SharedV3ProviderMetadata & {\n openai?: OpenAIUsageAccounting;\n};\n\nexport interface OpenAIV3MiddlewareOptions<\n TTags extends DefaultTags,\n> extends BaseBillingMiddlewareOptions<TTags> {\n priceResolver: PriceResolver;\n}\n\nexport function createOpenAIV3Middleware<TTags extends DefaultTags>(\n options: OpenAIV3MiddlewareOptions<TTags>,\n) {\n return createV3BillingMiddleware<TTags>({\n ...options,\n\n buildEvent: async ({\n model,\n usage,\n providerMetadata,\n responseId,\n tags,\n }) => {\n const _openaiMetadata = providerMetadata as\n | OpenAIProviderMetadata\n | undefined;\n\n const inputTokensTotal = usage?.inputTokens?.total ?? 0;\n const inputTokensCacheRead = usage?.inputTokens?.cacheRead ?? 0;\n const outputTokensTotal = usage?.outputTokens?.text ?? 0;\n const outputTokensReasoning = usage?.outputTokens?.reasoning ?? 0;\n\n const openAIUsage: OpenAIUsageInputs = {\n promptTokens: inputTokensTotal,\n completionTokens: usage?.outputTokens?.text ?? 0,\n cacheReadTokens: usage?.inputTokens?.cacheRead ?? 0,\n cacheWriteTokens: usage?.inputTokens?.cacheWrite ?? 0,\n reasoningTokens: usage?.outputTokens?.reasoning ?? 0,\n };\n\n const pricing: ModelPricing | undefined = await options.priceResolver({\n modelId: model.modelId,\n providerId: 'openai',\n } as PriceResolverContext);\n\n let calculatedCost: Cost | undefined = calculateOpenAICost({\n pricing,\n usage: openAIUsage,\n });\n\n return {\n generationId: responseId ?? crypto.randomUUID(),\n modelId: model.modelId,\n provider: 'openai',\n tags: tags,\n usage: {\n inputTokens: inputTokensTotal,\n outputTokens: outputTokensTotal,\n cacheReadTokens: inputTokensCacheRead,\n reasoningTokens: outputTokensReasoning,\n totalTokens: inputTokensTotal + outputTokensTotal,\n },\n ...(calculatedCost !== undefined && {\n cost: calculatedCost,\n }),\n } satisfies BillingEvent<TTags>;\n },\n });\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAWA,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AACF,MAGwB;AACtB,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,aAAa;AAAA,IACjB,WAAW,QAAQ,YAAY;AAAA,IAC/B,MAAM;AAAA,EACR;AAEA,QAAM,iBAAiB;AAAA,IACrB,WAAW,QAAQ,gBAAgB;AAAA,IACnC,MAAM;AAAA,EACR;AAEA,QAAM,gBAAgB;AAAA,IACpB,WAAW,QAAQ,oBAAoB;AAAA,IACvC,MAAM;AAAA,EACR;AAEA,QAAM,iBAAiB;AAAA,IACrB,WAAW,QAAQ,qBAAqB;AAAA,IACxC,MAAM;AAAA,EACR;AAEA,QAAM,gBAAgB;AAAA,IACpB,WAAW,QAAQ,2BAA2B,QAAQ,gBAAgB;AAAA,IACtE,MAAM;AAAA,EACR;AAEA,QAAM,cAAc,WAAW,QAAQ,OAAO;AAE9C,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,cAAc,WAAW,QAAQ,YAAY,CAAC;AACvD;;;AC9DA,SAAS,iCAAiC;AA6BnC,SAAS,yBACd,SACA;AACA,SAAO,0BAAiC;AAAA,IACtC,GAAG;AAAA,IAEH,YAAY,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM;AACJ,YAAM,kBAAkB;AAIxB,YAAM,mBAAmB,OAAO,aAAa,SAAS;AACtD,YAAM,uBAAuB,OAAO,aAAa,aAAa;AAC9D,YAAM,oBAAoB,OAAO,cAAc,QAAQ;AACvD,YAAM,wBAAwB,OAAO,cAAc,aAAa;AAEhE,YAAM,cAAiC;AAAA,QACrC,cAAc;AAAA,QACd,kBAAkB,OAAO,cAAc,QAAQ;AAAA,QAC/C,iBAAiB,OAAO,aAAa,aAAa;AAAA,QAClD,kBAAkB,OAAO,aAAa,cAAc;AAAA,QACpD,iBAAiB,OAAO,cAAc,aAAa;AAAA,MACrD;AAEA,YAAM,UAAoC,MAAM,QAAQ,cAAc;AAAA,QACpE,SAAS,MAAM;AAAA,QACf,YAAY;AAAA,MACd,CAAyB;AAEzB,UAAI,iBAAmC,oBAAoB;AAAA,QACzD;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AAED,aAAO;AAAA,QACL,cAAc,cAAc,OAAO,WAAW;AAAA,QAC9C,SAAS,MAAM;AAAA,QACf,UAAU;AAAA,QACV;AAAA,QACA,OAAO;AAAA,UACL,aAAa;AAAA,UACb,cAAc;AAAA,UACd,iBAAiB;AAAA,UACjB,iBAAiB;AAAA,UACjB,aAAa,mBAAmB;AAAA,QAClC;AAAA,QACA,GAAI,mBAAmB,UAAa;AAAA,UAClC,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":[]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@ai-billing/openai",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/narevai/ai-billing.git",
9
- "directory": "packages/core"
9
+ "directory": "packages/openai"
10
10
  },
11
11
  "main": "./dist/index.js",
12
12
  "types": "./dist/index.d.ts",
@@ -30,7 +30,7 @@
30
30
  "dist"
31
31
  ],
32
32
  "dependencies": {
33
- "@ai-billing/core": "0.0.2"
33
+ "@ai-billing/core": "0.0.3"
34
34
  },
35
35
  "devDependencies": {
36
36
  "tsup": "^8.5.1",
@@ -39,8 +39,9 @@
39
39
  "ai": "^6.0.138",
40
40
  "@ai-sdk/provider": "^3.0.8",
41
41
  "@edge-runtime/vm": "^5.0.0",
42
+ "zod": "^4.3.6",
42
43
  "@ai-billing/typescript-config": "0.0.1",
43
- "@ai-billing/testing": "0.0.1"
44
+ "@ai-billing/testing": "0.0.2"
44
45
  },
45
46
  "peerDependencies": {
46
47
  "@ai-sdk/openai": "^3.0.0"