From 3ec90ef6e68be0961aa08719121eba8fb29d59a8 Mon Sep 17 00:00:00 2001 From: Brace Sproul Date: Fri, 25 Jul 2025 12:05:27 -0700 Subject: [PATCH] fix: Default model selection (#533) * fix: Default model selection * cr --- .../manager/nodes/classify-message/index.ts | 2 +- .../manager/utils/generate-issue-fields.ts | 2 +- .../planner/nodes/determine-needs-context.ts | 2 +- .../planner/nodes/generate-message/index.ts | 2 +- .../planner/nodes/generate-plan/index.ts | 2 +- .../src/graphs/planner/nodes/notetaker.ts | 2 +- .../src/graphs/planner/nodes/rewrite-plan.ts | 2 +- .../graphs/programmer/nodes/diagnose-error.ts | 2 +- .../programmer/nodes/generate-conclusion.ts | 2 +- .../nodes/generate-message/index.ts | 2 +- .../src/graphs/programmer/nodes/open-pr.ts | 2 +- .../programmer/nodes/summarize-history.ts | 2 +- .../graphs/programmer/nodes/update-plan.ts | 2 +- .../src/graphs/reviewer/nodes/final-review.ts | 2 +- .../nodes/generate-review-actions/index.ts | 2 +- .../src/graphs/shared/diagnose-error.ts | 2 +- .../src/tools/search-documents-for/index.ts | 2 +- apps/open-swe/src/utils/llms/constants.ts | 33 ++++++++++ apps/open-swe/src/utils/llms/index.ts | 2 + apps/open-swe/src/utils/llms/load-model.ts | 28 +++++++++ .../src/utils/{ => llms}/model-manager.ts | 13 ++-- apps/open-swe/src/utils/load-model.ts | 61 ------------------- apps/open-swe/src/utils/mcp-output/index.ts | 2 +- apps/open-swe/src/utils/runtime-fallback.ts | 4 +- packages/shared/src/open-swe/models.ts | 40 ++++++------ 25 files changed, 110 insertions(+), 107 deletions(-) create mode 100644 apps/open-swe/src/utils/llms/constants.ts create mode 100644 apps/open-swe/src/utils/llms/index.ts create mode 100644 apps/open-swe/src/utils/llms/load-model.ts rename apps/open-swe/src/utils/{ => llms}/model-manager.ts (96%) delete mode 100644 apps/open-swe/src/utils/load-model.ts diff --git a/apps/open-swe/src/graphs/manager/nodes/classify-message/index.ts b/apps/open-swe/src/graphs/manager/nodes/classify-message/index.ts index f25850ee..5a2201e3 100644 --- a/apps/open-swe/src/graphs/manager/nodes/classify-message/index.ts +++ b/apps/open-swe/src/graphs/manager/nodes/classify-message/index.ts @@ -15,7 +15,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../../../utils/load-model.js"; +} from "../../../../utils/llms/index.js"; import { Command, END } from "@langchain/langgraph"; import { getMessageContentString } from "@open-swe/shared/messages"; import { diff --git a/apps/open-swe/src/graphs/manager/utils/generate-issue-fields.ts b/apps/open-swe/src/graphs/manager/utils/generate-issue-fields.ts index 74a9f5e9..2ad73da3 100644 --- a/apps/open-swe/src/graphs/manager/utils/generate-issue-fields.ts +++ b/apps/open-swe/src/graphs/manager/utils/generate-issue-fields.ts @@ -5,7 +5,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../../utils/load-model.js"; +} from "../../../utils/llms/index.js"; import { getMessageString } from "../../../utils/message/content.js"; export async function createIssueFieldsFromMessages( diff --git a/apps/open-swe/src/graphs/planner/nodes/determine-needs-context.ts b/apps/open-swe/src/graphs/planner/nodes/determine-needs-context.ts index cf21d505..24cc2296 100644 --- a/apps/open-swe/src/graphs/planner/nodes/determine-needs-context.ts +++ b/apps/open-swe/src/graphs/planner/nodes/determine-needs-context.ts @@ -9,7 +9,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../../utils/load-model.js"; +} from "../../../utils/llms/index.js"; import { getMissingMessages } from "../../../utils/github/issue-messages.js"; import { getMessageString } from "../../../utils/message/content.js"; import { isHumanMessage } from "@langchain/core/messages"; diff --git a/apps/open-swe/src/graphs/planner/nodes/generate-message/index.ts b/apps/open-swe/src/graphs/planner/nodes/generate-message/index.ts index 40586f5b..73d9b83f 100644 --- a/apps/open-swe/src/graphs/planner/nodes/generate-message/index.ts +++ b/apps/open-swe/src/graphs/planner/nodes/generate-message/index.ts @@ -2,7 +2,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../../../utils/load-model.js"; +} from "../../../../utils/llms/index.js"; import { createGetURLContentTool, createShellTool, diff --git a/apps/open-swe/src/graphs/planner/nodes/generate-plan/index.ts b/apps/open-swe/src/graphs/planner/nodes/generate-plan/index.ts index acdd1900..ef5c2a04 100644 --- a/apps/open-swe/src/graphs/planner/nodes/generate-plan/index.ts +++ b/apps/open-swe/src/graphs/planner/nodes/generate-plan/index.ts @@ -6,7 +6,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../../../utils/load-model.js"; +} from "../../../../utils/llms/index.js"; import { PlannerGraphState, PlannerGraphUpdate, diff --git a/apps/open-swe/src/graphs/planner/nodes/notetaker.ts b/apps/open-swe/src/graphs/planner/nodes/notetaker.ts index 7b91283d..66979594 100644 --- a/apps/open-swe/src/graphs/planner/nodes/notetaker.ts +++ b/apps/open-swe/src/graphs/planner/nodes/notetaker.ts @@ -9,7 +9,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../../utils/load-model.js"; +} from "../../../utils/llms/index.js"; import { getMessageString } from "../../../utils/message/content.js"; import { formatUserRequestPrompt } from "../../../utils/user-request.js"; import { formatCustomRulesPrompt } from "../../../utils/custom-rules.js"; diff --git a/apps/open-swe/src/graphs/planner/nodes/rewrite-plan.ts b/apps/open-swe/src/graphs/planner/nodes/rewrite-plan.ts index c80b5360..c98f2766 100644 --- a/apps/open-swe/src/graphs/planner/nodes/rewrite-plan.ts +++ b/apps/open-swe/src/graphs/planner/nodes/rewrite-plan.ts @@ -17,7 +17,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../../utils/load-model.js"; +} from "../../../utils/llms/index.js"; import { FallbackRunnable } from "../../../utils/runtime-fallback.js"; const systemPromptIdentifyChanges = `You are operating as an agentic coding assistant built by LangChain. You've previously been given a task to generate a plan of action for, to address the user's initial request. diff --git a/apps/open-swe/src/graphs/programmer/nodes/diagnose-error.ts b/apps/open-swe/src/graphs/programmer/nodes/diagnose-error.ts index 545d456e..f8da05a0 100644 --- a/apps/open-swe/src/graphs/programmer/nodes/diagnose-error.ts +++ b/apps/open-swe/src/graphs/programmer/nodes/diagnose-error.ts @@ -18,7 +18,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../../utils/load-model.js"; +} from "../../../utils/llms/index.js"; import { z } from "zod"; import { createLogger, LogLevel } from "../../../utils/logger.js"; import { diff --git a/apps/open-swe/src/graphs/programmer/nodes/generate-conclusion.ts b/apps/open-swe/src/graphs/programmer/nodes/generate-conclusion.ts index 13259230..24a75c08 100644 --- a/apps/open-swe/src/graphs/programmer/nodes/generate-conclusion.ts +++ b/apps/open-swe/src/graphs/programmer/nodes/generate-conclusion.ts @@ -4,7 +4,7 @@ import { GraphUpdate, PlanItem, } from "@open-swe/shared/open-swe/types"; -import { loadModel, Task } from "../../../utils/load-model.js"; +import { loadModel, Task } from "../../../utils/llms/index.js"; import { getMessageContentString } from "@open-swe/shared/messages"; import { getMessageString } from "../../../utils/message/content.js"; import { createLogger, LogLevel } from "../../../utils/logger.js"; diff --git a/apps/open-swe/src/graphs/programmer/nodes/generate-message/index.ts b/apps/open-swe/src/graphs/programmer/nodes/generate-message/index.ts index 50428af5..442d8ffe 100644 --- a/apps/open-swe/src/graphs/programmer/nodes/generate-message/index.ts +++ b/apps/open-swe/src/graphs/programmer/nodes/generate-message/index.ts @@ -8,7 +8,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../../../utils/load-model.js"; +} from "../../../../utils/llms/index.js"; import { createShellTool, createApplyPatchTool, diff --git a/apps/open-swe/src/graphs/programmer/nodes/open-pr.ts b/apps/open-swe/src/graphs/programmer/nodes/open-pr.ts index 90bf253e..10f0b6b6 100644 --- a/apps/open-swe/src/graphs/programmer/nodes/open-pr.ts +++ b/apps/open-swe/src/graphs/programmer/nodes/open-pr.ts @@ -20,7 +20,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../../utils/load-model.js"; +} from "../../../utils/llms/index.js"; import { formatPlanPromptWithSummaries } from "../../../utils/plan-prompt.js"; import { formatUserRequestPrompt } from "../../../utils/user-request.js"; import { AIMessage, BaseMessage, ToolMessage } from "@langchain/core/messages"; diff --git a/apps/open-swe/src/graphs/programmer/nodes/summarize-history.ts b/apps/open-swe/src/graphs/programmer/nodes/summarize-history.ts index bab3319e..ad6fb489 100644 --- a/apps/open-swe/src/graphs/programmer/nodes/summarize-history.ts +++ b/apps/open-swe/src/graphs/programmer/nodes/summarize-history.ts @@ -5,7 +5,7 @@ import { GraphUpdate, PlanItem, } from "@open-swe/shared/open-swe/types"; -import { loadModel, Task } from "../../../utils/load-model.js"; +import { loadModel, Task } from "../../../utils/llms/index.js"; import { AIMessage, BaseMessage, diff --git a/apps/open-swe/src/graphs/programmer/nodes/update-plan.ts b/apps/open-swe/src/graphs/programmer/nodes/update-plan.ts index 41781f40..4016ea00 100644 --- a/apps/open-swe/src/graphs/programmer/nodes/update-plan.ts +++ b/apps/open-swe/src/graphs/programmer/nodes/update-plan.ts @@ -10,7 +10,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../../utils/load-model.js"; +} from "../../../utils/llms/index.js"; import { z } from "zod"; import { getActiveTask, diff --git a/apps/open-swe/src/graphs/reviewer/nodes/final-review.ts b/apps/open-swe/src/graphs/reviewer/nodes/final-review.ts index af9d3df4..3a5341f9 100644 --- a/apps/open-swe/src/graphs/reviewer/nodes/final-review.ts +++ b/apps/open-swe/src/graphs/reviewer/nodes/final-review.ts @@ -18,7 +18,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../../utils/load-model.js"; +} from "../../../utils/llms/index.js"; import { GraphConfig, PlanItem } from "@open-swe/shared/open-swe/types"; import { z } from "zod"; import { addTaskPlanToIssue } from "../../../utils/github/issue-task.js"; diff --git a/apps/open-swe/src/graphs/reviewer/nodes/generate-review-actions/index.ts b/apps/open-swe/src/graphs/reviewer/nodes/generate-review-actions/index.ts index 85357cfd..548ea70f 100644 --- a/apps/open-swe/src/graphs/reviewer/nodes/generate-review-actions/index.ts +++ b/apps/open-swe/src/graphs/reviewer/nodes/generate-review-actions/index.ts @@ -2,7 +2,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../../../utils/load-model.js"; +} from "../../../../utils/llms/index.js"; import { ReviewerGraphState, ReviewerGraphUpdate, diff --git a/apps/open-swe/src/graphs/shared/diagnose-error.ts b/apps/open-swe/src/graphs/shared/diagnose-error.ts index f373e2c3..cf99d832 100644 --- a/apps/open-swe/src/graphs/shared/diagnose-error.ts +++ b/apps/open-swe/src/graphs/shared/diagnose-error.ts @@ -15,7 +15,7 @@ import { loadModel, supportsParallelToolCallsParam, Task, -} from "../../utils/load-model.js"; +} from "../../utils/llms/index.js"; import { trackCachePerformance } from "../../utils/caching.js"; const logger = createLogger(LogLevel.INFO, "SharedDiagnoseError"); diff --git a/apps/open-swe/src/tools/search-documents-for/index.ts b/apps/open-swe/src/tools/search-documents-for/index.ts index 2d43e98e..dab09533 100644 --- a/apps/open-swe/src/tools/search-documents-for/index.ts +++ b/apps/open-swe/src/tools/search-documents-for/index.ts @@ -2,7 +2,7 @@ import { tool } from "@langchain/core/tools"; import { createLogger, LogLevel } from "../../utils/logger.js"; import { createSearchDocumentForToolFields } from "@open-swe/shared/open-swe/tools"; import { FireCrawlLoader } from "@langchain/community/document_loaders/web/firecrawl"; -import { loadModel, Task } from "../../utils/load-model.js"; +import { loadModel, Task } from "../../utils/llms/index.js"; import { GraphConfig, GraphState } from "@open-swe/shared/open-swe/types"; import { getMessageContentString } from "@open-swe/shared/messages"; import { DOCUMENT_SEARCH_PROMPT } from "./prompt.js"; diff --git a/apps/open-swe/src/utils/llms/constants.ts b/apps/open-swe/src/utils/llms/constants.ts new file mode 100644 index 00000000..af971b9a --- /dev/null +++ b/apps/open-swe/src/utils/llms/constants.ts @@ -0,0 +1,33 @@ +export enum Task { + /** + * Used for programmer tasks. This includes: writing code, + * generating plans, taking context gathering actions, etc. + */ + PROGRAMMER = "programmer", + /** + * Used for routing tasks. This includes: initial request + * routing to different agents. + */ + ROUTER = "router", + /** + * Used for summarizing tasks. This includes: summarizing + * the conversation history, summarizing actions taken during + * a task execution, etc. Should be a slightly advanced model. + */ + SUMMARIZER = "summarizer", +} + +export const TASK_TO_CONFIG_DEFAULTS_MAP = { + [Task.PROGRAMMER]: { + modelName: "anthropic:claude-sonnet-4-0", + temperature: 0, + }, + [Task.ROUTER]: { + modelName: "anthropic:claude-3-5-haiku-latest", + temperature: 0, + }, + [Task.SUMMARIZER]: { + modelName: "openai:gpt-4.1-mini", + temperature: 0, + }, +}; diff --git a/apps/open-swe/src/utils/llms/index.ts b/apps/open-swe/src/utils/llms/index.ts new file mode 100644 index 00000000..02da7f36 --- /dev/null +++ b/apps/open-swe/src/utils/llms/index.ts @@ -0,0 +1,2 @@ +export * from "./load-model.js"; +export * from "./constants.js"; diff --git a/apps/open-swe/src/utils/llms/load-model.ts b/apps/open-swe/src/utils/llms/load-model.ts new file mode 100644 index 00000000..089af472 --- /dev/null +++ b/apps/open-swe/src/utils/llms/load-model.ts @@ -0,0 +1,28 @@ +import { GraphConfig } from "@open-swe/shared/open-swe/types"; +import { getModelManager } from "./model-manager.js"; +import { FallbackRunnable } from "../runtime-fallback.js"; +import { Task, TASK_TO_CONFIG_DEFAULTS_MAP } from "./constants.js"; + +export async function loadModel(config: GraphConfig, task: Task) { + const modelManager = getModelManager(); + + const model = await modelManager.loadModel(config, task); + if (!model) { + throw new Error(`Model loading returned undefined for task: ${task}`); + } + const fallbackModel = new FallbackRunnable(model, config, task, modelManager); + return fallbackModel; +} + +const MODELS_NO_PARALLEL_TOOL_CALLING = ["openai:o3", "openai:o3-mini"]; + +export function supportsParallelToolCallsParam( + config: GraphConfig, + task: Task, +): boolean { + const modelStr = + config.configurable?.[`${task}ModelName`] ?? + TASK_TO_CONFIG_DEFAULTS_MAP[task].modelName; + + return !MODELS_NO_PARALLEL_TOOL_CALLING.some((model) => modelStr === model); +} diff --git a/apps/open-swe/src/utils/model-manager.ts b/apps/open-swe/src/utils/llms/model-manager.ts similarity index 96% rename from apps/open-swe/src/utils/model-manager.ts rename to apps/open-swe/src/utils/llms/model-manager.ts index c5a64bc7..076db70a 100644 --- a/apps/open-swe/src/utils/model-manager.ts +++ b/apps/open-swe/src/utils/llms/model-manager.ts @@ -3,10 +3,11 @@ import { initChatModel, } from "langchain/chat_models/universal"; import { GraphConfig } from "@open-swe/shared/open-swe/types"; -import { createLogger, LogLevel } from "./logger.js"; -import { Task } from "./load-model.js"; +import { createLogger, LogLevel } from "../logger.js"; +import { Task } from "./constants.js"; import { isAllowedUser } from "@open-swe/shared/github/allowed-users"; import { decryptSecret } from "@open-swe/shared/crypto"; +import { TASK_TO_CONFIG_DEFAULTS_MAP } from "./constants.js"; const logger = createLogger(LogLevel.INFO, "ModelManager"); @@ -242,19 +243,19 @@ export class ModelManager { [Task.PROGRAMMER]: { modelName: config.configurable?.[`${task}ModelName`] ?? - "anthropic:claude-sonnet-4-0", + TASK_TO_CONFIG_DEFAULTS_MAP[task].modelName, temperature: config.configurable?.[`${task}Temperature`] ?? 0, }, [Task.ROUTER]: { modelName: config.configurable?.[`${task}ModelName`] ?? - "anthropic:claude-3-5-haiku-latest", + TASK_TO_CONFIG_DEFAULTS_MAP[task].modelName, temperature: config.configurable?.[`${task}Temperature`] ?? 0, }, [Task.SUMMARIZER]: { modelName: config.configurable?.[`${task}ModelName`] ?? - "google-genai:gemini-2.5-pro", + TASK_TO_CONFIG_DEFAULTS_MAP[task].modelName, temperature: config.configurable?.[`${task}Temperature`] ?? 0, }, }; @@ -307,7 +308,7 @@ export class ModelManager { openai: { [Task.PROGRAMMER]: "gpt-4o", [Task.ROUTER]: "gpt-4o-mini", - [Task.SUMMARIZER]: "gpt-4o", + [Task.SUMMARIZER]: "gpt-4.1-mini", }, }; diff --git a/apps/open-swe/src/utils/load-model.ts b/apps/open-swe/src/utils/load-model.ts deleted file mode 100644 index fed98606..00000000 --- a/apps/open-swe/src/utils/load-model.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { GraphConfig } from "@open-swe/shared/open-swe/types"; -import { getModelManager } from "./model-manager.js"; -import { FallbackRunnable } from "./runtime-fallback.js"; - -export enum Task { - /** - * Used for programmer tasks. This includes: writing code, - * generating plans, taking context gathering actions, etc. - */ - PROGRAMMER = "programmer", - /** - * Used for routing tasks. This includes: initial request - * routing to different agents. - */ - ROUTER = "router", - /** - * Used for summarizing tasks. This includes: summarizing - * the conversation history, summarizing actions taken during - * a task execution, etc. Should be a slightly advanced model. - */ - SUMMARIZER = "summarizer", -} - -const TASK_TO_CONFIG_DEFAULTS_MAP = { - [Task.PROGRAMMER]: { - modelName: "anthropic:claude-sonnet-4-0", - temperature: 0, - }, - [Task.ROUTER]: { - modelName: "anthropic:claude-3-5-haiku-latest", - temperature: 0, - }, - [Task.SUMMARIZER]: { - modelName: "openai:gpt-4.1-mini", - temperature: 0, - }, -}; - -export async function loadModel(config: GraphConfig, task: Task) { - const modelManager = getModelManager(); - - const model = await modelManager.loadModel(config, task); - if (!model) { - throw new Error(`Model loading returned undefined for task: ${task}`); - } - const fallbackModel = new FallbackRunnable(model, config, task, modelManager); - return fallbackModel; -} - -const MODELS_NO_PARALLEL_TOOL_CALLING = ["openai:o3", "openai:o3-mini"]; - -export function supportsParallelToolCallsParam( - config: GraphConfig, - task: Task, -): boolean { - const modelStr = - config.configurable?.[`${task}ModelName`] ?? - TASK_TO_CONFIG_DEFAULTS_MAP[task].modelName; - - return !MODELS_NO_PARALLEL_TOOL_CALLING.some((model) => modelStr === model); -} diff --git a/apps/open-swe/src/utils/mcp-output/index.ts b/apps/open-swe/src/utils/mcp-output/index.ts index 24c19a78..db126df3 100644 --- a/apps/open-swe/src/utils/mcp-output/index.ts +++ b/apps/open-swe/src/utils/mcp-output/index.ts @@ -1,5 +1,5 @@ import { GraphConfig } from "@open-swe/shared/open-swe/types"; -import { loadModel, Task } from "../load-model.js"; +import { loadModel, Task } from "../llms/index.js"; import { createLogger, LogLevel } from "../logger.js"; import { DOCUMENT_TOC_GENERATION_PROMPT } from "./prompt.js"; import { getMessageContentString } from "@open-swe/shared/messages"; diff --git a/apps/open-swe/src/utils/runtime-fallback.ts b/apps/open-swe/src/utils/runtime-fallback.ts index eef7d3a0..bb14b2ba 100644 --- a/apps/open-swe/src/utils/runtime-fallback.ts +++ b/apps/open-swe/src/utils/runtime-fallback.ts @@ -1,6 +1,6 @@ import { GraphConfig } from "@open-swe/shared/open-swe/types"; -import { Task } from "./load-model.js"; -import { ModelManager } from "./model-manager.js"; +import { Task } from "./llms/index.js"; +import { ModelManager } from "./llms/model-manager.js"; import { createLogger, LogLevel } from "./logger.js"; import { Runnable, RunnableConfig } from "@langchain/core/runnables"; import { StructuredToolInterface } from "@langchain/core/tools"; diff --git a/packages/shared/src/open-swe/models.ts b/packages/shared/src/open-swe/models.ts index cc9d7e2d..039763e8 100644 --- a/packages/shared/src/open-swe/models.ts +++ b/packages/shared/src/open-swe/models.ts @@ -1,20 +1,20 @@ export const MODEL_OPTIONS = [ - // { - // label: "Claude Sonnet 4 (Extended Thinking)", - // value: "anthropic:extended-thinking:claude-sonnet-4-0", - // }, - // { - // label: "Claude Opus 4 (Extended Thinking)", - // value: "anthropic:extended-thinking:claude-opus-4-0", - // }, + { + label: "Claude Sonnet 4 (Extended Thinking)", + value: "anthropic:extended-thinking:claude-sonnet-4-0", + }, + { + label: "Claude Opus 4 (Extended Thinking)", + value: "anthropic:extended-thinking:claude-opus-4-0", + }, { label: "Claude Sonnet 4", value: "anthropic:claude-sonnet-4-0", }, - // { - // label: "Claude Opus 4", - // value: "anthropic:claude-opus-4-0", - // }, + { + label: "Claude Opus 4", + value: "anthropic:claude-opus-4-0", + }, { label: "Claude 3.7 Sonnet", value: "anthropic:claude-3-7-sonnet-latest", @@ -27,10 +27,10 @@ export const MODEL_OPTIONS = [ label: "Claude 3.5 Haiku", value: "anthropic:claude-3-5-haiku-latest", }, - // { - // label: "o4", - // value: "openai:o4", - // }, + { + label: "o4", + value: "openai:o4", + }, { label: "o4 mini", value: "openai:o4-mini", @@ -60,12 +60,12 @@ export const MODEL_OPTIONS = [ value: "openai:gpt-4.1-mini", }, { - label: "Gemini 2.5 Pro Preview", - value: "google-genai:gemini-2.5-pro-preview-05-06", + label: "Gemini 2.5 Pro", + value: "google-genai:gemini-2.5-pro", }, { - label: "Gemini 2.5 Flash Preview", - value: "google-genai:gemini-2.5-flash-preview-05-20", + label: "Gemini 2.5 Flash", + value: "google-genai:gemini-2.5-flash", }, ];