From 21b7b03bdb0fe16aba55c64398a1c2e2b2967f54 Mon Sep 17 00:00:00 2001 From: Jerry_Wu <409187100@qq.com> Date: Tue, 18 Nov 2025 13:47:12 +0800 Subject: [PATCH 1/4] Refactor LLMProvider to use MODEL_PROVIDER_MAP for model-provider mapping # what changed - Removed the old modelToProviderMap and replaced it with the new MODEL_PROVIDER_MAP for better maintainability and clarity. - Updated the LLMProvider class to utilize the new mapping, ensuring consistent handling of model names and providers. # test plan - Ensure existing functionality remains intact by running all relevant tests and verifying no regressions occur. --- packages/core/lib/v3/llm/LLMProvider.ts | 48 +++----------- packages/core/lib/v3/types/public/model.ts | 75 +++++++++++----------- 2 files changed, 47 insertions(+), 76 deletions(-) diff --git a/packages/core/lib/v3/llm/LLMProvider.ts b/packages/core/lib/v3/llm/LLMProvider.ts index 7c16f2118..492cca588 100644 --- a/packages/core/lib/v3/llm/LLMProvider.ts +++ b/packages/core/lib/v3/llm/LLMProvider.ts @@ -7,7 +7,9 @@ import { LogLine } from "../types/public/logs"; import { AvailableModel, ClientOptions, + KnownModel, ModelProvider, + MODEL_PROVIDER_MAP, } from "../types/public/model"; import { AISdkClient } from "./aisdk"; import { AnthropicClient } from "./AnthropicClient"; @@ -58,41 +60,6 @@ const AISDKProvidersWithAPIKey: Record = { perplexity: createPerplexity, }; -const modelToProviderMap: { [key in AvailableModel]: ModelProvider } = { - "gpt-4.1": "openai", - "gpt-4.1-mini": "openai", - "gpt-4.1-nano": "openai", - "o4-mini": "openai", - //prettier-ignore - "o3": "openai", - "o3-mini": "openai", - //prettier-ignore - "o1": "openai", - "o1-mini": "openai", - "gpt-4o": "openai", - "gpt-4o-mini": "openai", - "gpt-4o-2024-08-06": "openai", - "gpt-4.5-preview": "openai", - "o1-preview": "openai", - "claude-3-5-sonnet-latest": "anthropic", - "claude-3-5-sonnet-20240620": "anthropic", - "claude-3-5-sonnet-20241022": "anthropic", - "claude-3-7-sonnet-20250219": "anthropic", - "claude-3-7-sonnet-latest": "anthropic", - "cerebras-llama-3.3-70b": "cerebras", - "cerebras-llama-3.1-8b": "cerebras", - "groq-llama-3.3-70b-versatile": "groq", - "groq-llama-3.3-70b-specdec": "groq", - "moonshotai/kimi-k2-instruct": "groq", - "gemini-1.5-flash": "google", - "gemini-1.5-pro": "google", - "gemini-1.5-flash-8b": "google", - "gemini-2.0-flash-lite": "google", - "gemini-2.0-flash": "google", - "gemini-2.5-flash-preview-04-17": "google", - "gemini-2.5-pro-preview-03-25": "google", -}; - export function getAISDKLanguageModel( subProvider: string, subModelName: string, @@ -156,11 +123,11 @@ export class LLMProvider { }); } - const provider = modelToProviderMap[modelName]; + const provider = MODEL_PROVIDER_MAP[modelName as KnownModel]; if (!provider) { - throw new UnsupportedModelError(Object.keys(modelToProviderMap)); + throw new UnsupportedModelError(Object.keys(MODEL_PROVIDER_MAP)); } - const availableModel = modelName as AvailableModel; + const availableModel = modelName as KnownModel; switch (provider) { case "openai": return new OpenAIClient({ @@ -194,7 +161,7 @@ export class LLMProvider { }); default: throw new UnsupportedModelProviderError([ - ...new Set(Object.values(modelToProviderMap)), + ...new Set(Object.values(MODEL_PROVIDER_MAP)), ]); } } @@ -207,7 +174,8 @@ export class LLMProvider { return "aisdk"; } } - const provider = modelToProviderMap[modelName]; + const provider = + MODEL_PROVIDER_MAP[modelName as keyof typeof MODEL_PROVIDER_MAP]; return provider; } } diff --git a/packages/core/lib/v3/types/public/model.ts b/packages/core/lib/v3/types/public/model.ts index ea8aa57da..7b35b4c69 100644 --- a/packages/core/lib/v3/types/public/model.ts +++ b/packages/core/lib/v3/types/public/model.ts @@ -26,46 +26,49 @@ export type AISDKCustomProvider = (options: { apiKey: string; }) => AISDKProvider; -export type AvailableModel = - | "gpt-4.1" - | "gpt-4.1-mini" - | "gpt-4.1-nano" - | "o4-mini" - | "o3" - | "o3-mini" - | "o1" - | "o1-mini" - | "gpt-4o" - | "gpt-4o-mini" - | "gpt-4o-2024-08-06" - | "gpt-4.5-preview" - | "o1-preview" - | "claude-3-5-sonnet-latest" - | "claude-3-5-sonnet-20241022" - | "claude-3-5-sonnet-20240620" - | "claude-3-7-sonnet-latest" - | "claude-3-7-sonnet-20250219" - | "cerebras-llama-3.3-70b" - | "cerebras-llama-3.1-8b" - | "groq-llama-3.3-70b-versatile" - | "groq-llama-3.3-70b-specdec" - | "gemini-1.5-flash" - | "gemini-1.5-pro" - | "gemini-1.5-flash-8b" - | "gemini-2.0-flash-lite" - | "gemini-2.0-flash" - | "gemini-2.5-flash-preview-04-17" - | "gemini-2.5-pro-preview-03-25" - | string; +export const MODEL_PROVIDER_MAP = { + "gpt-4.1": "openai", + "gpt-4.1-mini": "openai", + "gpt-4.1-nano": "openai", + "o4-mini": "openai", + //prettier-ignore + o3: "openai", + "o3-mini": "openai", + //prettier-ignore + o1: "openai", + "o1-mini": "openai", + "gpt-4o": "openai", + "gpt-4o-mini": "openai", + "gpt-4o-2024-08-06": "openai", + "gpt-4.5-preview": "openai", + "o1-preview": "openai", + "claude-3-5-sonnet-latest": "anthropic", + "claude-3-5-sonnet-20241022": "anthropic", + "claude-3-5-sonnet-20240620": "anthropic", + "claude-3-7-sonnet-latest": "anthropic", + "claude-3-7-sonnet-20250219": "anthropic", + "cerebras-llama-3.3-70b": "cerebras", + "cerebras-llama-3.1-8b": "cerebras", + "groq-llama-3.3-70b-versatile": "groq", + "groq-llama-3.3-70b-specdec": "groq", + "moonshotai/kimi-k2-instruct": "groq", + "gemini-1.5-flash": "google", + "gemini-1.5-pro": "google", + "gemini-1.5-flash-8b": "google", + "gemini-2.0-flash-lite": "google", + "gemini-2.0-flash": "google", + "gemini-2.5-flash-preview-04-17": "google", + "gemini-2.5-pro-preview-03-25": "google", +} as const; export type ModelProvider = - | "openai" - | "anthropic" - | "cerebras" - | "groq" - | "google" + | (typeof MODEL_PROVIDER_MAP)[keyof typeof MODEL_PROVIDER_MAP] | "aisdk"; +export type KnownModel = keyof typeof MODEL_PROVIDER_MAP; +export type AvailableModel = KnownModel | string & {}; + + export type ClientOptions = OpenAIClientOptions | AnthropicClientOptions; export type ModelConfiguration = From bca652d0e18ef15d55d862f1d0a2cfd1212200de Mon Sep 17 00:00:00 2001 From: Jerry_Wu <409187100@qq.com> Date: Tue, 18 Nov 2025 13:49:26 +0800 Subject: [PATCH 2/4] add changeset --- .changeset/fuzzy-colts-sleep.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fuzzy-colts-sleep.md diff --git a/.changeset/fuzzy-colts-sleep.md b/.changeset/fuzzy-colts-sleep.md new file mode 100644 index 000000000..54a17396c --- /dev/null +++ b/.changeset/fuzzy-colts-sleep.md @@ -0,0 +1,5 @@ +--- +"@browserbasehq/stagehand": patch +--- + +Refactor LLMProvider to use MODEL_PROVIDER_MAP for model-provider mapping From 569deb869e7ca340be14dddfd3aa26b7c15b96d2 Mon Sep 17 00:00:00 2001 From: Jerry_Wu <409187100@qq.com> Date: Tue, 18 Nov 2025 13:50:22 +0800 Subject: [PATCH 3/4] format --- packages/core/lib/v3/types/public/model.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core/lib/v3/types/public/model.ts b/packages/core/lib/v3/types/public/model.ts index 7b35b4c69..96608ead3 100644 --- a/packages/core/lib/v3/types/public/model.ts +++ b/packages/core/lib/v3/types/public/model.ts @@ -66,8 +66,7 @@ export type ModelProvider = | "aisdk"; export type KnownModel = keyof typeof MODEL_PROVIDER_MAP; -export type AvailableModel = KnownModel | string & {}; - +export type AvailableModel = KnownModel | (string & {}); export type ClientOptions = OpenAIClientOptions | AnthropicClientOptions; From a7e65c1fc6e38b8ed4b3b28adc5e98b5edca2007 Mon Sep 17 00:00:00 2001 From: Jerry_Wu <409187100@qq.com> Date: Tue, 18 Nov 2025 13:56:01 +0800 Subject: [PATCH 4/4] fix test --- packages/core/tests/public-types.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/tests/public-types.test.ts b/packages/core/tests/public-types.test.ts index ec36d3b07..b2c0e3eaf 100644 --- a/packages/core/tests/public-types.test.ts +++ b/packages/core/tests/public-types.test.ts @@ -24,6 +24,7 @@ const publicApiShape = { LLMResponseError: Stagehand.LLMResponseError, LOG_LEVEL_NAMES: Stagehand.LOG_LEVEL_NAMES, MCPConnectionError: Stagehand.MCPConnectionError, + MODEL_PROVIDER_MAP: Stagehand.MODEL_PROVIDER_MAP, MissingEnvironmentVariableError: Stagehand.MissingEnvironmentVariableError, MissingLLMConfigurationError: Stagehand.MissingLLMConfigurationError, PageNotFoundError: Stagehand.PageNotFoundError,