provider-model-redirects.test.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { describe, expect, it } from "vitest";
  2. import type { ProviderModelRedirectRule } from "@/types/provider";
  3. import {
  4. findMatchingProviderModelRedirectRule,
  5. normalizeProviderModelRedirectRules,
  6. } from "@/lib/provider-model-redirects";
  7. describe("provider model redirect rules", () => {
  8. it("supports prefix suffix contains and regex matching in rule order", () => {
  9. const rules: ProviderModelRedirectRule[] = [
  10. {
  11. matchType: "contains",
  12. source: "opus",
  13. target: "contains-opus",
  14. },
  15. {
  16. matchType: "prefix",
  17. source: "claude-opus",
  18. target: "prefix-opus",
  19. },
  20. {
  21. matchType: "suffix",
  22. source: "20251001",
  23. target: "suffix-version",
  24. },
  25. {
  26. matchType: "regex",
  27. source: "^claude-opus-4-.*$",
  28. target: "regex-opus",
  29. },
  30. ];
  31. expect(findMatchingProviderModelRedirectRule("claude-opus-4-5-20251001", rules)?.target).toBe(
  32. "contains-opus"
  33. );
  34. expect(findMatchingProviderModelRedirectRule("claude-opus-4-5", rules)?.target).toBe(
  35. "contains-opus"
  36. );
  37. expect(findMatchingProviderModelRedirectRule("foo-20251001", rules)?.target).toBe(
  38. "suffix-version"
  39. );
  40. expect(findMatchingProviderModelRedirectRule("claude-opus-4-6", rules)?.target).toBe(
  41. "contains-opus"
  42. );
  43. });
  44. it("returns null when no rule matches", () => {
  45. const rules: ProviderModelRedirectRule[] = [
  46. {
  47. matchType: "prefix",
  48. source: "claude-opus",
  49. target: "glm-4.6",
  50. },
  51. ];
  52. expect(findMatchingProviderModelRedirectRule("claude-sonnet-4-5", rules)).toBeNull();
  53. });
  54. it("normalizes legacy exact redirect maps into exact-match rules", () => {
  55. const normalized = normalizeProviderModelRedirectRules({
  56. "claude-opus-4-5": "glm-4.6",
  57. "gpt-4": "gpt-4o",
  58. });
  59. expect(normalized).toHaveLength(2);
  60. expect(normalized).toEqual(
  61. expect.arrayContaining([
  62. {
  63. matchType: "exact",
  64. source: "claude-opus-4-5",
  65. target: "glm-4.6",
  66. },
  67. {
  68. matchType: "exact",
  69. source: "gpt-4",
  70. target: "gpt-4o",
  71. },
  72. ])
  73. );
  74. });
  75. });