| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- import { describe, expect, test } from "vitest";
- import { calculateRequestCost } from "@/lib/utils/cost-calculation";
- import type { ModelPriceData } from "@/types/model-price";
- function makePriceData(overrides: Partial<ModelPriceData> = {}): ModelPriceData {
- return {
- mode: "responses",
- input_cost_per_token: 1,
- output_cost_per_token: 10,
- cache_read_input_token_cost: 0.1,
- input_cost_per_token_priority: 2,
- output_cost_per_token_priority: 20,
- cache_read_input_token_cost_priority: 0.2,
- ...overrides,
- };
- }
- describe("calculateRequestCost priority service tier", () => {
- test("uses priority pricing fields when priority service tier is applied", () => {
- const cost = calculateRequestCost(
- { input_tokens: 2, output_tokens: 3, cache_read_input_tokens: 5 },
- makePriceData(),
- 1,
- false,
- true
- );
- expect(Number(cost.toString())).toBe(65);
- });
- test("falls back to regular pricing when priority fields are absent", () => {
- const cost = calculateRequestCost(
- { input_tokens: 2, output_tokens: 3, cache_read_input_tokens: 5 },
- makePriceData({
- input_cost_per_token_priority: undefined,
- output_cost_per_token_priority: undefined,
- cache_read_input_token_cost_priority: undefined,
- }),
- 1,
- false,
- true
- );
- expect(Number(cost.toString())).toBe(32.5);
- });
- test("uses priority long-context pricing fields when available", () => {
- const cost = calculateRequestCost(
- {
- input_tokens: 272001,
- output_tokens: 2,
- cache_read_input_tokens: 10,
- },
- makePriceData({
- mode: "responses",
- model_family: "gpt",
- input_cost_per_token_above_272k_tokens: 5,
- output_cost_per_token_above_272k_tokens: 50,
- cache_read_input_token_cost_above_272k_tokens: 0.5,
- input_cost_per_token_above_272k_tokens_priority: 7,
- output_cost_per_token_above_272k_tokens_priority: 70,
- cache_read_input_token_cost_above_272k_tokens_priority: 0.7,
- }),
- 1,
- false,
- true
- );
- expect(Number(cost.toString())).toBe(1904154);
- });
- test("falls back to regular long-context pricing when priority long-context fields are absent", () => {
- const cost = calculateRequestCost(
- {
- input_tokens: 272001,
- output_tokens: 2,
- cache_read_input_tokens: 10,
- },
- makePriceData({
- mode: "responses",
- model_family: "gpt",
- input_cost_per_token_above_272k_tokens: 5,
- output_cost_per_token_above_272k_tokens: 50,
- cache_read_input_token_cost_above_272k_tokens: 0.5,
- input_cost_per_token_above_272k_tokens_priority: undefined,
- output_cost_per_token_above_272k_tokens_priority: undefined,
- cache_read_input_token_cost_above_272k_tokens_priority: undefined,
- }),
- 1,
- false,
- true
- );
- expect(Number(cost.toString())).toBe(1360110);
- });
- test("uses priority long-context fields by schema, not by model name", () => {
- const cost = calculateRequestCost(
- {
- input_tokens: 272001,
- output_tokens: 2,
- },
- makePriceData({
- mode: "responses",
- model_family: undefined,
- input_cost_per_token_above_272k_tokens: undefined,
- output_cost_per_token_above_272k_tokens: undefined,
- input_cost_per_token_above_272k_tokens_priority: 7,
- output_cost_per_token_above_272k_tokens_priority: 70,
- }),
- 1,
- false,
- true
- );
- expect(Number(cost.toString())).toBe(1904147);
- });
- });
|