gemini-vertex-model-extraction.test.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { describe, expect, it } from "vitest";
  2. import { extractModelFromPath } from "@/app/v1/_lib/proxy/session";
  3. import { detectFormatByEndpoint } from "@/app/v1/_lib/proxy/format-mapper";
  4. describe("extractModelFromPath - Vertex AI publishers path", () => {
  5. it("extracts model from /v1/publishers/google/models/{model}:generateContent", () => {
  6. expect(
  7. extractModelFromPath(
  8. "/v1/publishers/google/models/gemini-3-pro-image-preview:generateContent"
  9. )
  10. ).toBe("gemini-3-pro-image-preview");
  11. });
  12. it("extracts model from /v1/publishers/google/models/{model}:streamGenerateContent", () => {
  13. expect(
  14. extractModelFromPath("/v1/publishers/google/models/gemini-2.5-flash:streamGenerateContent")
  15. ).toBe("gemini-2.5-flash");
  16. });
  17. it("extracts model from /v1/publishers/google/models/{model}:countTokens", () => {
  18. expect(extractModelFromPath("/v1/publishers/google/models/gemini-2.5-pro:countTokens")).toBe(
  19. "gemini-2.5-pro"
  20. );
  21. });
  22. it("extracts model from path without action suffix", () => {
  23. expect(extractModelFromPath("/v1/publishers/google/models/gemini-2.5-flash")).toBe(
  24. "gemini-2.5-flash"
  25. );
  26. });
  27. // regression: existing patterns still work
  28. it("still extracts model from /v1beta/models/{model}:generateContent", () => {
  29. expect(extractModelFromPath("/v1beta/models/gemini-2.5-flash:generateContent")).toBe(
  30. "gemini-2.5-flash"
  31. );
  32. });
  33. it("still extracts model from /v1/models/{model}:generateContent", () => {
  34. expect(extractModelFromPath("/v1/models/gemini-2.5-pro:generateContent")).toBe(
  35. "gemini-2.5-pro"
  36. );
  37. });
  38. it("returns null for unrecognized paths", () => {
  39. expect(extractModelFromPath("/v1/messages")).toBeNull();
  40. expect(extractModelFromPath("/v1/chat/completions")).toBeNull();
  41. });
  42. });
  43. describe("detectFormatByEndpoint - Vertex AI publishers path", () => {
  44. it('returns "gemini" for /v1/publishers/google/models/{model}:generateContent', () => {
  45. expect(
  46. detectFormatByEndpoint(
  47. "/v1/publishers/google/models/gemini-3-pro-image-preview:generateContent"
  48. )
  49. ).toBe("gemini");
  50. });
  51. it('returns "gemini" for /v1/publishers/google/models/{model}:streamGenerateContent', () => {
  52. expect(
  53. detectFormatByEndpoint("/v1/publishers/google/models/gemini-2.5-flash:streamGenerateContent")
  54. ).toBe("gemini");
  55. });
  56. it('returns "gemini" for /v1/publishers/google/models/{model}:countTokens', () => {
  57. expect(detectFormatByEndpoint("/v1/publishers/google/models/gemini-2.5-pro:countTokens")).toBe(
  58. "gemini"
  59. );
  60. });
  61. // regression: existing patterns still work
  62. it('still returns "gemini" for /v1beta/models/ path', () => {
  63. expect(detectFormatByEndpoint("/v1beta/models/gemini-2.5-flash:generateContent")).toBe(
  64. "gemini"
  65. );
  66. });
  67. it('still returns "gemini-cli" for /v1internal/models/ path', () => {
  68. expect(detectFormatByEndpoint("/v1internal/models/gemini-2.5-flash:generateContent")).toBe(
  69. "gemini-cli"
  70. );
  71. });
  72. it("returns null for unknown publishers path actions", () => {
  73. expect(
  74. detectFormatByEndpoint("/v1/publishers/google/models/gemini-2.5-flash:unknownAction")
  75. ).toBeNull();
  76. });
  77. });