model-price-fields.test.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { describe, expect, test } from "vitest";
  2. import {
  3. collectModelPriceFieldEntries,
  4. getEditableExtraPriceData,
  5. isPriceLikeFieldKey,
  6. } from "@/lib/utils/model-price-fields";
  7. describe("model-price-fields", () => {
  8. test("detects generic price-like keys", () => {
  9. expect(isPriceLikeFieldKey("input_cost_per_second")).toBe(true);
  10. expect(isPriceLikeFieldKey("file_search_cost_per_1k_calls")).toBe(true);
  11. expect(isPriceLikeFieldKey("display_name")).toBe(false);
  12. });
  13. test("collects supported, unsupported, and provider pricing entries", () => {
  14. const entries = collectModelPriceFieldEntries({
  15. mode: "chat",
  16. display_name: "Demo",
  17. input_cost_per_request: 0.25,
  18. input_cost_per_second: 0.5,
  19. supports_reasoning: true,
  20. long_context_pricing: {
  21. threshold_tokens: 128000,
  22. input_cost_per_token: 0.000005,
  23. },
  24. pricing: {
  25. openai: {
  26. input_cost_per_token: 0.0000025,
  27. output_cost_per_token: 0.000015,
  28. file_search_cost_per_1k_calls: 2,
  29. },
  30. },
  31. });
  32. expect(entries.find((entry) => entry.path === "input_cost_per_request")?.kind).toBe(
  33. "supported"
  34. );
  35. expect(entries.find((entry) => entry.path === "input_cost_per_second")?.kind).toBe(
  36. "unsupported"
  37. );
  38. expect(entries.find((entry) => entry.path === "supports_reasoning")?.kind).toBe("display");
  39. expect(
  40. entries.find((entry) => entry.path === "pricing.openai.file_search_cost_per_1k_calls")?.kind
  41. ).toBe("unsupported");
  42. expect(
  43. entries.find((entry) => entry.path === "long_context_pricing.input_cost_per_token")?.kind
  44. ).toBe("supported");
  45. });
  46. test("extracts editable extra price data by excluding managed fields", () => {
  47. const extra = getEditableExtraPriceData({
  48. mode: "chat",
  49. display_name: "Demo",
  50. input_cost_per_token: 0.000001,
  51. input_cost_per_request: 0.1,
  52. supports_reasoning: true,
  53. input_cost_per_second: 0.5,
  54. output_vector_size: 1024,
  55. });
  56. expect(extra).toEqual({
  57. supports_reasoning: true,
  58. input_cost_per_second: 0.5,
  59. output_vector_size: 1024,
  60. });
  61. });
  62. });