Skip to content

Commit ed0a671

Browse files
Continuenate
andcommitted
test: add comprehensive tests for isRecommendedAgentModel function
Added tests for Gemini 3 Pro model recognition and other agent models. Tests cover: - OpenAI o1/o3/o4 models - DeepSeek R1/Reasoner models - Gemini 2.5 and 3.x Pro models (including new gemini-3-pro-preview) - Claude Sonnet 3.7+ and Opus 4 models - xAI Grok Code models - Case insensitivity and edge cases Co-authored-by: nate <[email protected]>
1 parent ecce71c commit ed0a671

File tree

1 file changed

+138
-1
lines changed

1 file changed

+138
-1
lines changed

core/llm/toolSupport.test.ts

Lines changed: 138 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// core/llm/toolSupport.test.ts
2-
import { PROVIDER_TOOL_SUPPORT } from "./toolSupport";
2+
import { PROVIDER_TOOL_SUPPORT, isRecommendedAgentModel } from "./toolSupport";
33

44
describe("PROVIDER_TOOL_SUPPORT", () => {
55
describe("continue-proxy", () => {
@@ -354,3 +354,140 @@ describe("PROVIDER_TOOL_SUPPORT", () => {
354354
});
355355
});
356356
});
357+
358+
describe("isRecommendedAgentModel", () => {
359+
describe("OpenAI models", () => {
360+
it("should return true for o1, o3, o4 models", () => {
361+
expect(isRecommendedAgentModel("o1")).toBe(true);
362+
expect(isRecommendedAgentModel("o1-preview")).toBe(true);
363+
expect(isRecommendedAgentModel("o3")).toBe(true);
364+
expect(isRecommendedAgentModel("o3-mini")).toBe(true);
365+
expect(isRecommendedAgentModel("o4")).toBe(true);
366+
});
367+
368+
it("should return true for GPT-5 models", () => {
369+
expect(isRecommendedAgentModel("gpt-5")).toBe(true);
370+
expect(isRecommendedAgentModel("gpt-5-turbo")).toBe(true);
371+
});
372+
373+
it("should return false for GPT-4 models", () => {
374+
expect(isRecommendedAgentModel("gpt-4")).toBe(false);
375+
expect(isRecommendedAgentModel("gpt-4-turbo")).toBe(false);
376+
});
377+
});
378+
379+
describe("DeepSeek models", () => {
380+
it("should return true for DeepSeek R1/Reasoner models", () => {
381+
expect(isRecommendedAgentModel("deepseek-r1")).toBe(true);
382+
expect(isRecommendedAgentModel("deepseek-r1-0528")).toBe(true);
383+
expect(isRecommendedAgentModel("deepseek-reasoner")).toBe(true);
384+
});
385+
386+
it("should return false for non-reasoner DeepSeek models", () => {
387+
expect(isRecommendedAgentModel("deepseek-chat")).toBe(false);
388+
expect(isRecommendedAgentModel("deepseek-coder")).toBe(false);
389+
});
390+
});
391+
392+
describe("Gemini models", () => {
393+
it("should return true for Gemini 2.5 Pro models", () => {
394+
expect(isRecommendedAgentModel("gemini-2.5-pro")).toBe(true);
395+
expect(isRecommendedAgentModel("gemini-2.5-pro-preview")).toBe(true);
396+
});
397+
398+
it("should return true for Gemini 3 Pro models", () => {
399+
expect(isRecommendedAgentModel("gemini-3-pro-preview")).toBe(true);
400+
expect(isRecommendedAgentModel("gemini-3-pro")).toBe(true);
401+
});
402+
403+
it("should return false for Gemini Flash models", () => {
404+
expect(isRecommendedAgentModel("gemini-2.5-flash")).toBe(false);
405+
expect(isRecommendedAgentModel("gemini-3-flash")).toBe(false);
406+
});
407+
408+
it("should return false for Gemini models without pro designation", () => {
409+
expect(isRecommendedAgentModel("gemini-2.5")).toBe(false);
410+
expect(isRecommendedAgentModel("gemini-3")).toBe(false);
411+
});
412+
413+
it("should return false for older Gemini versions", () => {
414+
expect(isRecommendedAgentModel("gemini-1.5-pro")).toBe(false);
415+
expect(isRecommendedAgentModel("gemini-2.0-pro")).toBe(false);
416+
});
417+
});
418+
419+
describe("Claude models", () => {
420+
it("should return true for Claude Sonnet 3.7 and later models", () => {
421+
expect(isRecommendedAgentModel("claude-3-7-sonnet")).toBe(true);
422+
expect(isRecommendedAgentModel("claude-3.7-sonnet")).toBe(true);
423+
expect(isRecommendedAgentModel("claude-sonnet-4")).toBe(true);
424+
expect(isRecommendedAgentModel("claude-4-sonnet")).toBe(true);
425+
});
426+
427+
it("should return true for Claude Opus 4 models", () => {
428+
expect(isRecommendedAgentModel("claude-opus-4")).toBe(true);
429+
});
430+
431+
it("should return true for Claude 4-5 models", () => {
432+
expect(isRecommendedAgentModel("claude-4-5")).toBe(true);
433+
});
434+
435+
it("should return false for Claude 3.5 Sonnet models", () => {
436+
expect(isRecommendedAgentModel("claude-3-5-sonnet")).toBe(false);
437+
expect(isRecommendedAgentModel("claude-3.5-sonnet")).toBe(false);
438+
});
439+
440+
it("should return false for Claude Haiku models", () => {
441+
expect(isRecommendedAgentModel("claude-3-7-haiku")).toBe(false);
442+
expect(isRecommendedAgentModel("claude-3.7-haiku")).toBe(false);
443+
});
444+
445+
it("should return false for older Claude models", () => {
446+
expect(isRecommendedAgentModel("claude-3-opus")).toBe(false);
447+
expect(isRecommendedAgentModel("claude-2")).toBe(false);
448+
});
449+
});
450+
451+
describe("xAI models", () => {
452+
it("should return true for Grok Code models", () => {
453+
expect(isRecommendedAgentModel("grok-code")).toBe(true);
454+
expect(isRecommendedAgentModel("grok-code-beta")).toBe(true);
455+
});
456+
457+
it("should return false for non-code Grok models", () => {
458+
expect(isRecommendedAgentModel("grok-3")).toBe(false);
459+
expect(isRecommendedAgentModel("grok-4")).toBe(false);
460+
});
461+
});
462+
463+
describe("case insensitivity", () => {
464+
it("should handle uppercase model names", () => {
465+
expect(isRecommendedAgentModel("GEMINI-3-PRO-PREVIEW")).toBe(true);
466+
expect(isRecommendedAgentModel("CLAUDE-4-SONNET")).toBe(true);
467+
expect(isRecommendedAgentModel("DEEPSEEK-R1")).toBe(true);
468+
expect(isRecommendedAgentModel("O3-MINI")).toBe(true);
469+
});
470+
471+
it("should handle mixed case model names", () => {
472+
expect(isRecommendedAgentModel("Gemini-3-Pro")).toBe(true);
473+
expect(isRecommendedAgentModel("Claude-Opus-4")).toBe(true);
474+
expect(isRecommendedAgentModel("DeepSeek-Reasoner")).toBe(true);
475+
});
476+
});
477+
478+
describe("edge cases", () => {
479+
it("should return false for empty string", () => {
480+
expect(isRecommendedAgentModel("")).toBe(false);
481+
});
482+
483+
it("should return false for random strings", () => {
484+
expect(isRecommendedAgentModel("random-model")).toBe(false);
485+
expect(isRecommendedAgentModel("test")).toBe(false);
486+
});
487+
488+
it("should return false for partial matches", () => {
489+
expect(isRecommendedAgentModel("gemini-pro")).toBe(false);
490+
expect(isRecommendedAgentModel("claude-sonnet")).toBe(false);
491+
});
492+
});
493+
});

0 commit comments

Comments
 (0)