diff --git a/.changeset/cold-onions-refuse.md b/.changeset/cold-onions-refuse.md new file mode 100644 index 000000000..10c2805cd --- /dev/null +++ b/.changeset/cold-onions-refuse.md @@ -0,0 +1,5 @@ +--- +"@browserbasehq/stagehand": patch +--- + +add support for codex models diff --git a/packages/core/lib/v3/llm/aisdk.ts b/packages/core/lib/v3/llm/aisdk.ts index a30656b8d..f036d0732 100644 --- a/packages/core/lib/v3/llm/aisdk.ts +++ b/packages/core/lib/v3/llm/aisdk.ts @@ -130,9 +130,11 @@ export class AISdkClient extends LLMClient { let objectResponse: Awaited>; const isGPT5 = this.model.modelId.includes("gpt-5"); + const isCodex = this.model.modelId.includes("codex"); const usesLowReasoningEffort = - this.model.modelId.includes("gpt-5.1") || - this.model.modelId.includes("gpt-5.2"); + (this.model.modelId.includes("gpt-5.1") || + this.model.modelId.includes("gpt-5.2")) && + !isCodex; const isDeepSeek = this.model.modelId.includes("deepseek"); // Kimi models only support temperature=1 const isKimi = this.model.modelId.includes("kimi"); @@ -173,8 +175,12 @@ You must respond in JSON format. respond WITH JSON. Do not include any other tex providerOptions: isGPT5 ? { openai: { - textVerbosity: "low", // Making these the default for gpt-5 for now - reasoningEffort: usesLowReasoningEffort ? "low" : "minimal", + textVerbosity: isCodex ? "medium" : "low", // codex models only support 'medium' + reasoningEffort: isCodex + ? "medium" + : usesLowReasoningEffort + ? "low" + : "minimal", }, } : undefined, diff --git a/packages/evals/lib/AISdkClientWrapped.ts b/packages/evals/lib/AISdkClientWrapped.ts index 3b5dd5439..f5797859c 100644 --- a/packages/evals/lib/AISdkClientWrapped.ts +++ b/packages/evals/lib/AISdkClientWrapped.ts @@ -134,14 +134,15 @@ export class AISdkClientWrapped extends LLMClient { let objectResponse: Awaited>; const isGPT5 = this.model.modelId.includes("gpt-5"); + const isCodex = this.model.modelId.includes("codex"); const usesLowReasoningEffort = - this.model.modelId.includes("gpt-5.1") || - this.model.modelId.includes("gpt-5.2"); + (this.model.modelId.includes("gpt-5.1") || + this.model.modelId.includes("gpt-5.2")) && + !isCodex; const isDeepSeek = this.model.modelId.includes("deepseek"); // Kimi models only support temperature=1 const isKimi = this.model.modelId.includes("kimi"); const temperature = isKimi ? 1 : options.temperature; - if (options.response_model) { if (isDeepSeek || isKimi) { const parsedSchema = JSON.stringify( @@ -164,8 +165,12 @@ You must respond in JSON format. respond WITH JSON. Do not include any other tex providerOptions: isGPT5 ? { openai: { - textVerbosity: "low", // Making these the default for gpt-5 for now - reasoningEffort: usesLowReasoningEffort ? "low" : "minimal", + textVerbosity: isCodex ? "medium" : "low", // codex models only support 'medium' + reasoningEffort: isCodex + ? "medium" + : usesLowReasoningEffort + ? "low" + : "minimal", }, } : undefined,