Skip to content

Commit 827ca72

Browse files
authored
Merge pull request #8881 from uinstinct/gemini-3-support
chore: add support for gemini 3 pro preview
2 parents 9438924 + e13c68d commit 827ca72

File tree

8 files changed

+181
-8
lines changed

8 files changed

+181
-8
lines changed

core/llm/llms/CometAPI.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ class CometAPI extends OpenAI {
205205
"claude-3-5-haiku-latest",
206206

207207
// Gemini series
208+
"gemini-3-pro-preview",
208209
"gemini-2.5-pro",
209210
"gemini-2.5-flash",
210211
"gemini-2.5-flash-lite",

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+
});

core/llm/toolSupport.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ export function isRecommendedAgentModel(modelName: string): boolean {
391391
const recs: RegExp[][] = [
392392
[/o[134]/],
393393
[/deepseek/, /r1|reasoner/],
394-
[/gemini/, /2\.5/, /pro/],
394+
[/gemini/, /2\.5|3/, /pro/],
395395
[/gpt/, /-5|5\.1/],
396396
[/claude/, /sonnet/, /3\.7|3-7|-4/],
397397
[/claude/, /opus/, /-4/],

docs/customize/model-roles/chat.mdx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,20 +114,20 @@ If you prefer to use a model from [xAI](../model-providers/more/xAI), then we re
114114
</Tab>
115115
</Tabs>
116116
117-
### Gemini 2.0 Flash from Google
117+
### Gemini 3 Pro from Google
118118
119-
If you prefer to use a model from [Google](../model-providers/top-level/gemini), then we recommend Gemini 2.0 Flash.
119+
If you prefer to use a model from [Google](../model-providers/top-level/gemini), then we recommend Gemini 3 Pro.
120120
121121
<Tabs>
122122
<Tab title="Hub">
123-
Add the [Gemini 2.0 Flash block](https://hub.continue.dev/google/gemini-2.0-flash) from the hub
123+
Add the [Gemini 3 Pro block](https://hub.continue.dev/google/gemini-3-pro-preview) from the hub
124124
</Tab>
125125
<Tab title="YAML">
126126
```yaml title="config.yaml"
127127
models:
128-
- name: Gemini 2.0 Flash
128+
- name: Gemini 3 Pro
129129
provider: gemini
130-
model: gemini-2.0-flash
130+
model: gemini-3-pro-preview
131131
apiKey: <YOUR_GEMINI_API_KEY>
132132
```
133133
</Tab>

gui/src/pages/AddNewModel/configs/models.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -913,6 +913,20 @@ export const models: { [key: string]: ModelPackage } = {
913913
providerOptions: ["gemini"],
914914
isOpenSource: false,
915915
},
916+
gemini3ProPreview: {
917+
title: "Gemini 3 Pro",
918+
description:
919+
"Google's latest Pro model with up to 64k output context. Best for complex tasks involving reasoning.",
920+
params: {
921+
title: "Gemini 3 Pro",
922+
model: "gemini-3-pro-preview",
923+
contextLength: 1_048_576,
924+
apiKey: "<API_KEY>",
925+
},
926+
icon: "gemini.png",
927+
providerOptions: ["gemini"],
928+
isOpenSource: false,
929+
},
916930
c4aiAyaExpanse8B: {
917931
title: "C4AI Aya Expanse 8B",
918932
description:

gui/src/pages/AddNewModel/configs/providers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,7 @@ Select the \`GPT-4o\` model below to complete your provider configuration, but n
604604
models.gemini20FlashLite,
605605
models.gemini20FlashImageGeneration,
606606
models.gemini25ProExp,
607+
models.gemini3ProPreview,
607608
],
608609
apiKeyUrl: "https://aistudio.google.com/app/apikey",
609610
},

packages/llm-info/src/providers/cometapi.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,15 @@ export const CometAPI: ModelProvider = {
135135
},
136136

137137
// Gemini Series
138+
{
139+
model: "gemini-3-pro-preview",
140+
displayName: "Gemini 3 Pro Preview",
141+
contextLength: 2000000,
142+
maxCompletionTokens: 8192,
143+
description:
144+
"Gemini flagship model with high precision multimodal capabilities.",
145+
recommendedFor: ["chat"],
146+
},
138147
{
139148
model: "gemini-2.5-pro",
140149
displayName: "Gemini 2.5 Pro",

packages/llm-info/src/providers/gemini.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,22 @@ import { AllMediaTypes, ModelProvider } from "../types.js";
33
// See https://ai.google.dev/gemini-api/docs/models
44
export const Gemini: ModelProvider = {
55
models: [
6+
{
7+
model: "gemini-3-pro-preview",
8+
displayName: "Gemini 3 Pro Preview",
9+
description:
10+
"Google's flagship frontier model with high precision multimodal capabilities.",
11+
contextLength: 1048576,
12+
maxCompletionTokens: 65536,
13+
mediaTypes: AllMediaTypes,
14+
regex: /gemini-3-pro-preview/i,
15+
recommendedFor: ["chat"],
16+
},
617
{
718
model: "gemini-2.5-pro-preview-05-06",
819
displayName: "Gemini 2.5 Pro Preview",
920
description:
10-
"Google's most advanced model with strong reasoning, multimodal capabilities, and advanced coding skills",
21+
"Google's advanced model with strong reasoning, multimodal capabilities, and advanced coding skills",
1122
contextLength: 1048576,
1223
maxCompletionTokens: 65536,
1324
mediaTypes: AllMediaTypes,

0 commit comments

Comments
 (0)