provider-usage.test.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { describe, expect, test } from "bun:test"
  2. import { anthropicHelper } from "../src/routes/zen/util/provider/anthropic"
  3. import { googleHelper } from "../src/routes/zen/util/provider/google"
  4. import { openaiHelper } from "../src/routes/zen/util/provider/openai"
  5. import { oaCompatHelper } from "../src/routes/zen/util/provider/openai-compatible"
  6. describe("provider usage extraction", () => {
  7. test("reads OpenAI Responses usage from response.usage", () => {
  8. const helper = openaiHelper({ reqModel: "gpt-5.4", providerModel: "gpt-5.4" })
  9. expect(
  10. helper.extractBodyUsage({
  11. response: {
  12. usage: {
  13. input_tokens: 13,
  14. input_tokens_details: { cached_tokens: 3 },
  15. output_tokens: 5,
  16. output_tokens_details: { reasoning_tokens: 1 },
  17. },
  18. },
  19. }),
  20. ).toEqual({
  21. input_tokens: 13,
  22. input_tokens_details: { cached_tokens: 3 },
  23. output_tokens: 5,
  24. output_tokens_details: { reasoning_tokens: 1 },
  25. })
  26. })
  27. test("reads Anthropic usage from message.usage", () => {
  28. const helper = anthropicHelper({ reqModel: "claude-sonnet", providerModel: "claude-sonnet-4-5" })
  29. expect(
  30. helper.extractBodyUsage({
  31. message: {
  32. usage: {
  33. input_tokens: 10,
  34. output_tokens: 4,
  35. },
  36. },
  37. }),
  38. ).toEqual({
  39. input_tokens: 10,
  40. output_tokens: 4,
  41. })
  42. })
  43. test("reads OA-compatible usage from usage", () => {
  44. const helper = oaCompatHelper({ reqModel: "gpt-4o-mini", providerModel: "gpt-4o-mini" })
  45. expect(
  46. helper.extractBodyUsage({
  47. usage: {
  48. prompt_tokens: 8,
  49. completion_tokens: 2,
  50. },
  51. }),
  52. ).toEqual({
  53. prompt_tokens: 8,
  54. completion_tokens: 2,
  55. })
  56. })
  57. test("reads Google usage from usageMetadata", () => {
  58. const helper = googleHelper({ reqModel: "gemini-2.5-flash", providerModel: "gemini-2.5-flash" })
  59. expect(
  60. helper.extractBodyUsage({
  61. usageMetadata: {
  62. promptTokenCount: 11,
  63. candidatesTokenCount: 3,
  64. },
  65. }),
  66. ).toEqual({
  67. promptTokenCount: 11,
  68. candidatesTokenCount: 3,
  69. })
  70. })
  71. })