From 7cdaa0c3888ff3e27acc40288e5dbea3ed2c807c Mon Sep 17 00:00:00 2001 From: tkattkat Date: Wed, 22 Oct 2025 10:28:43 -0700 Subject: [PATCH 01/38] zodv4 --- packages/core/examples/2048.ts | 2 +- packages/core/examples/custom_client_aisdk.ts | 2 +- .../core/examples/custom_client_langchain.ts | 2 +- .../core/examples/custom_client_openai.ts | 2 +- .../examples/external_clients/customOpenAI.ts | 2 +- packages/core/examples/parameterizeApiKey.ts | 2 +- packages/core/examples/v3/patchright.ts | 2 +- packages/core/examples/v3/playwright.ts | 2 +- packages/core/examples/v3/targetedExtract.ts | 28 +- packages/core/examples/v3_example.ts | 2 +- packages/core/lib/inference.ts | 29 +- packages/core/lib/utils.ts | 291 ++++++++++++++---- .../core/lib/v3/agent/AnthropicCUAClient.ts | 2 +- packages/core/lib/v3/agent/tools/v3-act.ts | 2 +- .../core/lib/v3/agent/tools/v3-ariaTree.ts | 2 +- packages/core/lib/v3/agent/tools/v3-close.ts | 2 +- .../core/lib/v3/agent/tools/v3-extract.ts | 2 +- .../core/lib/v3/agent/tools/v3-fillform.ts | 2 +- packages/core/lib/v3/agent/tools/v3-goto.ts | 2 +- .../core/lib/v3/agent/tools/v3-navback.ts | 2 +- .../core/lib/v3/agent/tools/v3-screenshot.ts | 2 +- packages/core/lib/v3/agent/tools/v3-scroll.ts | 2 +- packages/core/lib/v3/agent/tools/v3-wait.ts | 2 +- .../core/lib/v3/handlers/extractHandler.ts | 4 +- packages/core/lib/v3/llm/LLMClient.ts | 25 +- packages/core/lib/v3/tests/timeouts.spec.ts | 2 +- .../core/lib/v3/types/private/handlers.ts | 2 +- packages/core/lib/v3/types/public/methods.ts | 4 +- .../core/lib/v3/types/public/sdkErrors.ts | 2 +- packages/core/lib/v3/v3.ts | 4 +- packages/core/lib/v3Evaluator.ts | 2 +- packages/core/package.json | 2 +- packages/evals/llm_clients/hn_aisdk.ts | 2 +- packages/evals/llm_clients/hn_customOpenAI.ts | 2 +- packages/evals/llm_clients/hn_langchain.ts | 2 +- packages/evals/tasks/agent/google_maps_2.ts | 2 +- packages/evals/tasks/allrecipes.ts | 2 +- packages/evals/tasks/arxiv.ts | 2 +- packages/evals/tasks/combination_sauce.ts | 2 +- packages/evals/tasks/costar.ts | 2 +- .../evals/tasks/extract_aigrant_companies.ts | 2 +- .../evals/tasks/extract_aigrant_targeted.ts | 2 +- .../evals/tasks/extract_aigrant_targeted_2.ts | 2 +- packages/evals/tasks/extract_apartments.ts | 2 +- packages/evals/tasks/extract_area_codes.ts | 2 +- .../evals/tasks/extract_baptist_health.ts | 2 +- .../evals/tasks/extract_capacitor_info.ts | 2 +- packages/evals/tasks/extract_collaborators.ts | 2 +- packages/evals/tasks/extract_csa.ts | 2 +- packages/evals/tasks/extract_geniusee.ts | 2 +- packages/evals/tasks/extract_geniusee_2.ts | 2 +- .../evals/tasks/extract_github_commits.ts | 2 +- packages/evals/tasks/extract_github_stars.ts | 2 +- .../evals/tasks/extract_hamilton_weather.ts | 2 +- packages/evals/tasks/extract_jfk_links.ts | 2 +- packages/evals/tasks/extract_jstor_news.ts | 2 +- .../tasks/extract_memorial_healthcare.ts | 2 +- packages/evals/tasks/extract_nhl_stats.ts | 2 +- packages/evals/tasks/extract_partners.ts | 2 +- .../evals/tasks/extract_press_releases.ts | 2 +- .../evals/tasks/extract_professional_info.ts | 2 +- .../evals/tasks/extract_public_notices.ts | 2 +- packages/evals/tasks/extract_recipe.ts | 2 +- .../evals/tasks/extract_regulations_table.ts | 2 +- packages/evals/tasks/extract_resistor_info.ts | 2 +- packages/evals/tasks/extract_rockauto.ts | 2 +- packages/evals/tasks/extract_single_link.ts | 2 +- .../tasks/extract_snowshoeing_destinations.ts | 2 +- packages/evals/tasks/extract_staff_members.ts | 2 +- packages/evals/tasks/extract_zillow.ts | 2 +- packages/evals/tasks/homedepot.ts | 2 +- packages/evals/tasks/iframe_hn.ts | 2 +- packages/evals/tasks/imdb_movie_details.ts | 2 +- packages/evals/tasks/peeler_complex.ts | 2 +- packages/evals/tasks/sciquest.ts | 2 +- packages/evals/tasks/ted_talk.ts | 2 +- packages/evals/tasks/wichita.ts | 2 +- packages/evals/types/evals.ts | 2 +- pnpm-lock.yaml | 212 +++++++++---- 79 files changed, 493 insertions(+), 246 deletions(-) diff --git a/packages/core/examples/2048.ts b/packages/core/examples/2048.ts index c97e96a87..5cb76b3d9 100644 --- a/packages/core/examples/2048.ts +++ b/packages/core/examples/2048.ts @@ -1,5 +1,5 @@ import { Stagehand } from "../lib/v3"; -import { z } from "zod/v3"; +import { z } from "zod"; async function example() { console.log("🎮 Starting 2048 bot..."); diff --git a/packages/core/examples/custom_client_aisdk.ts b/packages/core/examples/custom_client_aisdk.ts index 18cb76a46..7d7708574 100644 --- a/packages/core/examples/custom_client_aisdk.ts +++ b/packages/core/examples/custom_client_aisdk.ts @@ -7,7 +7,7 @@ */ import { Stagehand } from "../lib/v3"; import { AISdkClient } from "./external_clients/aisdk"; -import { z } from "zod/v3"; +import { z } from "zod"; import { openai } from "@ai-sdk/openai"; async function example() { diff --git a/packages/core/examples/custom_client_langchain.ts b/packages/core/examples/custom_client_langchain.ts index f15d0beb2..5a9604374 100644 --- a/packages/core/examples/custom_client_langchain.ts +++ b/packages/core/examples/custom_client_langchain.ts @@ -3,7 +3,7 @@ * * You will need to reference the Langchain Client in /external_clients/langchain.ts */ -import { z } from "zod/v3"; +import { z } from "zod"; import { Stagehand } from "../lib/v3"; import { LangchainClient } from "./external_clients/langchain"; import { ChatOpenAI } from "@langchain/openai"; diff --git a/packages/core/examples/custom_client_openai.ts b/packages/core/examples/custom_client_openai.ts index 499d7db67..e92c4c4ba 100644 --- a/packages/core/examples/custom_client_openai.ts +++ b/packages/core/examples/custom_client_openai.ts @@ -6,7 +6,7 @@ * You will need to reference the Custom OpenAI Client in /external_clients/customOpenAI.ts */ import { Stagehand } from "../lib/v3"; -import { z } from "zod/v3"; +import { z } from "zod"; import { CustomOpenAIClient } from "./external_clients/customOpenAI"; import OpenAI from "openai"; diff --git a/packages/core/examples/external_clients/customOpenAI.ts b/packages/core/examples/external_clients/customOpenAI.ts index d43f37cc4..40510ecca 100644 --- a/packages/core/examples/external_clients/customOpenAI.ts +++ b/packages/core/examples/external_clients/customOpenAI.ts @@ -22,7 +22,7 @@ import type { ChatCompletionSystemMessageParam, ChatCompletionUserMessageParam, } from "openai/resources/chat/completions"; -import { z } from "zod/v3"; +import { z } from "zod"; import { CreateChatCompletionResponseError } from "../../lib/v3"; function validateZodSchema(schema: z.ZodTypeAny, data: unknown) { diff --git a/packages/core/examples/parameterizeApiKey.ts b/packages/core/examples/parameterizeApiKey.ts index afdeedec3..5da677321 100644 --- a/packages/core/examples/parameterizeApiKey.ts +++ b/packages/core/examples/parameterizeApiKey.ts @@ -1,5 +1,5 @@ import { Stagehand } from "../lib/v3"; -import { z } from "zod/v3"; +import { z } from "zod"; /** * This example shows how to parameterize the API key for the LLM provider. diff --git a/packages/core/examples/v3/patchright.ts b/packages/core/examples/v3/patchright.ts index 1b901b2bd..023cc726c 100644 --- a/packages/core/examples/v3/patchright.ts +++ b/packages/core/examples/v3/patchright.ts @@ -1,6 +1,6 @@ import { Stagehand } from "../../lib/v3"; import { chromium } from "patchright-core"; -import { z } from "zod/v3"; +import { z } from "zod"; async function example(stagehand: Stagehand) { const browser = await chromium.connectOverCDP({ diff --git a/packages/core/examples/v3/playwright.ts b/packages/core/examples/v3/playwright.ts index ea3ab5af7..dce44dc99 100644 --- a/packages/core/examples/v3/playwright.ts +++ b/packages/core/examples/v3/playwright.ts @@ -1,6 +1,6 @@ import { Stagehand } from "../../lib/v3"; import { chromium } from "playwright-core"; -import { z } from "zod/v3"; +import { z } from "zod"; async function example(stagehand: Stagehand) { const browser = await chromium.connectOverCDP({ diff --git a/packages/core/examples/v3/targetedExtract.ts b/packages/core/examples/v3/targetedExtract.ts index cf6b6a4f8..a54134c73 100644 --- a/packages/core/examples/v3/targetedExtract.ts +++ b/packages/core/examples/v3/targetedExtract.ts @@ -1,26 +1,24 @@ import { Stagehand } from "../../lib/v3"; -import { z } from "zod/v3"; +import { z } from "zod"; async function example(stagehand: Stagehand) { const page = stagehand.context.pages()[0]; await page.goto( - "https://ambarc.github.io/web-element-test/stagehand-breaking-test.html", + "https://browserbase.github.io/stagehand-eval-sites/sites/jfk/", ); - await page - .deepLocator("/html/body/div[2]/div[3]/iframe/html/body/p") - .highlight({ - durationMs: 5000, - contentColor: { r: 255, g: 0, b: 0 }, - }); - - const reason = await stagehand.extract( - "extract the reason why script injection fails", - z.string(), - // selector: "// body > div.test-container > div:nth-child(3) > iframe >> body > p:nth-child(3)", - { selector: "/html/body/div[2]/div[3]/iframe/html/body/p[2]" }, + const extraction = await stagehand.extract( + "extract all the record file name and their corresponding links", + z.object({ + records: z.array( + z.object({ + file_name: z.string().describe("the file name of the record"), + link: z.url().describe("the link to the record"), + }), + ), + }), ); - console.log(reason); + console.log(extraction); } (async () => { diff --git a/packages/core/examples/v3_example.ts b/packages/core/examples/v3_example.ts index 9304e1b5a..a30f30e9d 100644 --- a/packages/core/examples/v3_example.ts +++ b/packages/core/examples/v3_example.ts @@ -1,5 +1,5 @@ import { V3 } from "../lib/v3"; -import { z } from "zod/v3"; +import { z } from "zod"; async function example(v3: V3) { const page = v3.context.pages()[0]; diff --git a/packages/core/lib/inference.ts b/packages/core/lib/inference.ts index 946923911..72dd0c767 100644 --- a/packages/core/lib/inference.ts +++ b/packages/core/lib/inference.ts @@ -1,4 +1,4 @@ -import { z } from "zod/v3"; +import { z } from "zod"; import { LogLine } from "./v3/types/public/logs"; import { ChatMessage, LLMClient } from "./v3/llm/LLMClient"; import { @@ -12,20 +12,8 @@ import { } from "./prompt"; import { appendSummary, writeTimestampedTxtFile } from "./inferenceLogUtils"; -/** Simple usage shape if your LLM returns usage tokens. */ -interface LLMUsage { - prompt_tokens: number; - completion_tokens: number; - total_tokens: number; -} - -/** - * For calls that use a schema: the LLMClient may return { data: T; usage?: LLMUsage } - */ -export interface LLMParsedResponse { - data: T; - usage?: LLMUsage; -} +// Re-export for backward compatibility +export type { LLMParsedResponse } from "./v3/llm/LLMClient"; export async function extract({ instruction, @@ -101,8 +89,7 @@ export async function extract({ }); const extractEndTime = Date.now(); - const { data: extractedData, usage: extractUsage } = - extractionResponse as LLMParsedResponse; + const { data: extractedData, usage: extractUsage } = extractionResponse; let extractResponseFile = ""; if (logInferenceToFile) { @@ -171,7 +158,7 @@ export async function extract({ progress: metadataResponseProgress, }, usage: metadataResponseUsage, - } = metadataResponse as LLMParsedResponse; + } = metadataResponse; let metadataResponseFile = ""; if (logInferenceToFile) { @@ -308,8 +295,7 @@ export async function observe({ const end = Date.now(); const usageTimeMs = end - start; - const { data: observeData, usage: observeUsage } = - rawResponse as LLMParsedResponse; + const { data: observeData, usage: observeUsage } = rawResponse; const promptTokens = observeUsage?.prompt_tokens ?? 0; const completionTokens = observeUsage?.completion_tokens ?? 0; @@ -440,8 +426,7 @@ export async function act({ const end = Date.now(); const usageTimeMs = end - start; - const { data: actData, usage: actUsage } = - rawResponse as LLMParsedResponse; + const { data: actData, usage: actUsage } = rawResponse; const promptTokens = actUsage?.prompt_tokens ?? 0; const completionTokens = actUsage?.completion_tokens ?? 0; diff --git a/packages/core/lib/utils.ts b/packages/core/lib/utils.ts index 9feb03bb1..1cc343a51 100644 --- a/packages/core/lib/utils.ts +++ b/packages/core/lib/utils.ts @@ -1,6 +1,6 @@ import { ZodSchemaValidationError } from "./v3/types/public/sdkErrors"; import { Schema, Type } from "@google/genai"; -import { ZodFirstPartyTypeKind as Kind, z, ZodTypeAny } from "zod/v3"; +import { z, ZodTypeAny } from "zod"; import { LogLine } from "./v3/types/public/logs"; import { ModelProvider } from "./v3/types/public/model"; import { ZodPathSegments } from "./v3/types/private/internal"; @@ -47,32 +47,45 @@ function decorateGeminiSchema( } export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { - const zodType = getZodType(zodSchema); + let zodType: string; + try { + zodType = getZodType(zodSchema); + } catch (error) { + console.error("Error getting Zod type:", error); + console.error("Schema object keys:", Object.keys(zodSchema)); + console.error("Schema:", zodSchema); + throw error; + } switch (zodType) { - case "ZodArray": { + case "array": { + // In Zod 4, array element is accessed via _zod.def.element + const element = ( + zodSchema as unknown as { _zod?: { def?: { element?: z.ZodTypeAny } } } + )._zod?.def?.element as unknown as z.ZodTypeAny; return decorateGeminiSchema( { type: Type.ARRAY, - items: toGeminiSchema( - (zodSchema as z.ZodArray).element, - ), + items: toGeminiSchema(element ?? z.any()), }, zodSchema, ); } - case "ZodObject": { + case "object": { const properties: Record = {}; const required: string[] = []; - Object.entries((zodSchema as z.ZodObject).shape).forEach( - ([key, value]: [string, z.ZodTypeAny]) => { - properties[key] = toGeminiSchema(value); - if (getZodType(value) !== "ZodOptional") { - required.push(key); - } - }, - ); + const shape = ( + zodSchema as unknown as { + _zod: { def: { shape: Record } }; + } + )._zod.def.shape; + Object.entries(shape).forEach(([key, value]: [string, z.ZodTypeAny]) => { + properties[key] = toGeminiSchema(value); + if (getZodType(value) !== "optional") { + required.push(key); + } + }); return decorateGeminiSchema( { @@ -83,39 +96,52 @@ export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { zodSchema, ); } - case "ZodString": + case "string": + case "url": + // URL type in Zod 4 is still a string at the schema level return decorateGeminiSchema( { type: Type.STRING, }, zodSchema, ); - case "ZodNumber": + case "number": return decorateGeminiSchema( { type: Type.NUMBER, }, zodSchema, ); - case "ZodBoolean": + case "boolean": return decorateGeminiSchema( { type: Type.BOOLEAN, }, zodSchema, ); - case "ZodEnum": + case "enum": { + // In Zod 4, enum entries are in _zod.def.entries + const entries = ( + zodSchema as unknown as { + _zod: { def: { entries: Record } }; + } + )._zod.def.entries; + const values = Object.values(entries); return decorateGeminiSchema( { type: Type.STRING, - enum: zodSchema._def.values, + enum: values as string[], }, zodSchema, ); - case "ZodDefault": - case "ZodNullable": - case "ZodOptional": { - const innerSchema = toGeminiSchema(zodSchema._def.innerType); + } + case "default": + case "nullable": + case "optional": { + const innerType = ( + zodSchema as unknown as { _zod: { def: { innerType: z.ZodTypeAny } } } + )._zod.def.innerType; + const innerSchema = toGeminiSchema(innerType); return decorateGeminiSchema( { ...innerSchema, @@ -124,14 +150,29 @@ export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { zodSchema, ); } - case "ZodLiteral": + case "literal": { + // In Zod 4, literal values are stored as an array + const values = ( + zodSchema as unknown as { + _zod: { def: { values: (string | number | boolean)[] } }; + } + )._zod.def.values; return decorateGeminiSchema( { type: Type.STRING, - enum: [zodSchema._def.value], + enum: values as string[], }, zodSchema, ); + } + case "pipe": { + // For pipes (which include transforms), use the input schema + const inSchema = ( + zodSchema as unknown as { _zod: { def: { in: z.ZodTypeAny } } } + )._zod.def.in; + return toGeminiSchema(inSchema); + } + // Standalone transforms and any unknown types fall through to default default: return decorateGeminiSchema( { @@ -145,7 +186,42 @@ export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { // Helper function to check the type of Zod schema export function getZodType(schema: z.ZodTypeAny): string { - return schema._def.typeName; + // In Zod 4, the type is accessed via _zod.def.type + const schemaWithDef = schema as unknown as { + _zod?: { def?: { type?: string } }; + _def?: { typeName?: string }; + }; + + // Try Zod 4 structure first + if (schemaWithDef._zod?.def?.type) { + return schemaWithDef._zod.def.type; + } + + // Fallback to Zod 3 structure if needed + if (schemaWithDef._def?.typeName) { + // Convert Zod 3 type names to Zod 4 format + const typeName = schemaWithDef._def.typeName; + const typeMap: Record = { + ZodString: "string", + ZodNumber: "number", + ZodBoolean: "boolean", + ZodArray: "array", + ZodObject: "object", + ZodUnion: "union", + ZodIntersection: "intersection", + ZodOptional: "optional", + ZodNullable: "nullable", + ZodEnum: "enum", + ZodLiteral: "literal", + ZodEffects: "transform", + ZodDefault: "default", + }; + return typeMap[typeName] || typeName; + } + + throw new Error( + `Unable to determine Zod schema type. Schema: ${JSON.stringify(schema)}`, + ); } /** @@ -165,22 +241,47 @@ export function transformSchema( schema: z.ZodTypeAny, currentPath: Array, ): [z.ZodTypeAny, ZodPathSegments[]] { - // 1) If it's a string with .url(), convert to z.number() - if (isKind(schema, Kind.ZodString)) { + // 1) If it's a URL type (z.url() in Zod 4), convert to ID string pattern + if (isKind(schema, "url")) { + const transformed = makeIdStringSchema(schema as z.ZodString); + console.log("[transformSchema] Found URL type, transforming to ID pattern"); + console.log("[transformSchema] Original schema type:", getZodType(schema)); + console.log( + "[transformSchema] Transformed schema type:", + getZodType(transformed), + ); + return [transformed, [{ segments: [] }]]; + } + + // 2) If it's a string with .url() check, convert to z.number() + if (isKind(schema, "string")) { + const schemaWithDef = schema as unknown as { + _zod?: { + def?: { checks?: Array<{ _zod: { kind: string } }> }; + bag?: { format?: string }; + }; + }; + const checks = schemaWithDef._zod?.def?.checks; + const format = schemaWithDef._zod?.bag?.format; const hasUrlCheck = - schema._def.checks?.some( - (check: { kind: string }) => check.kind === "url", - ) ?? false; + (checks?.some((check) => check._zod?.kind === "url") ?? false) || + format === "url"; if (hasUrlCheck) { return [makeIdStringSchema(schema as z.ZodString), [{ segments: [] }]]; } return [schema, []]; } - // 2) If it's an object, transform each field - if (isKind(schema, Kind.ZodObject)) { + // 3) If it's an object, transform each field + if (isKind(schema, "object")) { // The shape is a raw object containing fields keyed by string (no symbols): - const shape = schema._def.shape() as Record; + const schemaWithShape = schema as unknown as { + _zod?: { def?: { shape?: Record } }; + }; + const shape = schemaWithShape._zod?.def?.shape; + if (!shape) { + return [schema, []]; + } const newShape: Record = {}; const urlPaths: ZodPathSegments[] = []; let changed = false; @@ -207,14 +308,24 @@ export function transformSchema( } if (changed) { - return [z.object(newShape), urlPaths]; + const newSchema = z.object(newShape); + console.log("[transformSchema] Reconstructed object with changed fields"); + console.log("[transformSchema] URL paths found:", urlPaths); + return [newSchema, urlPaths]; } return [schema, urlPaths]; } - // 3) If it's an array, transform its item type - if (isKind(schema, Kind.ZodArray)) { - const itemType = schema._def.type as z.ZodTypeAny; + // 4) If it's an array, transform its item type + if (isKind(schema, "array")) { + const schemaWithElement = schema as unknown as { + _zod?: { def?: { element?: z.ZodTypeAny } }; + }; + const itemType = schemaWithElement._zod?.def + ?.element as unknown as z.ZodTypeAny; + if (!itemType) { + return [schema, []]; + } const [transformedItem, childPaths] = transformSchema(itemType, [ ...currentPath, "*", @@ -225,15 +336,25 @@ export function transformSchema( })); if (changed) { - return [z.array(transformedItem), arrayPaths]; + const newSchema = z.array(transformedItem); + console.log( + "[transformSchema] Reconstructed array with changed item type", + ); + return [newSchema, arrayPaths]; } return [schema, arrayPaths]; } - // 4) If it's a union, transform each option - if (isKind(schema, Kind.ZodUnion)) { - // Cast the union’s options to an array of ZodTypeAny - const unionOptions = schema._def.options as z.ZodTypeAny[]; + // 5) If it's a union, transform each option + if (isKind(schema, "union")) { + // Cast the union's options to an array of ZodTypeAny + const schemaWithOptions = schema as unknown as { + _zod?: { def?: { options?: z.ZodTypeAny[] } }; + }; + const unionOptions = schemaWithOptions._zod?.def?.options; + if (!unionOptions || unionOptions.length === 0) { + return [schema, []]; + } const newOptions: z.ZodTypeAny[] = []; let changed = false; let allPaths: ZodPathSegments[] = []; @@ -260,10 +381,16 @@ export function transformSchema( return [schema, allPaths]; } - // 5) If it's an intersection, transform left and right - if (isKind(schema, Kind.ZodIntersection)) { - const leftType = schema._def.left as z.ZodTypeAny; - const rightType = schema._def.right as z.ZodTypeAny; + // 6) If it's an intersection, transform left and right + if (isKind(schema, "intersection")) { + const schemaWithIntersection = schema as unknown as { + _zod?: { def?: { left?: z.ZodTypeAny; right?: z.ZodTypeAny } }; + }; + const leftType = schemaWithIntersection._zod?.def?.left; + const rightType = schemaWithIntersection._zod?.def?.right; + if (!leftType || !rightType) { + return [schema, []]; + } const [left, leftPaths] = transformSchema(leftType, [ ...currentPath, @@ -281,9 +408,15 @@ export function transformSchema( return [schema, allPaths]; } - // 6) If it's optional, transform inner - if (isKind(schema, Kind.ZodOptional)) { - const innerType = schema._def.innerType as z.ZodTypeAny; + // 7) If it's optional, transform inner + if (isKind(schema, "optional")) { + const schemaWithInner = schema as unknown as { + _zod?: { def?: { innerType?: z.ZodTypeAny } }; + }; + const innerType = schemaWithInner._zod?.def?.innerType; + if (!innerType) { + return [schema, []]; + } const [inner, innerPaths] = transformSchema(innerType, currentPath); if (inner !== innerType) { return [z.optional(inner), innerPaths]; @@ -291,9 +424,15 @@ export function transformSchema( return [schema, innerPaths]; } - // 7) If it's nullable, transform inner - if (isKind(schema, Kind.ZodNullable)) { - const innerType = schema._def.innerType as z.ZodTypeAny; + // 8) If it's nullable, transform inner + if (isKind(schema, "nullable")) { + const schemaWithInner = schema as unknown as { + _zod?: { def?: { innerType?: z.ZodTypeAny } }; + }; + const innerType = schemaWithInner._zod?.def?.innerType; + if (!innerType) { + return [schema, []]; + } const [inner, innerPaths] = transformSchema(innerType, currentPath); if (inner !== innerType) { return [z.nullable(inner), innerPaths]; @@ -301,17 +440,36 @@ export function transformSchema( return [schema, innerPaths]; } - // 8) If it's an effect, transform base schema - if (isKind(schema, Kind.ZodEffects)) { - const baseSchema = schema._def.schema as z.ZodTypeAny; - const [newBaseSchema, basePaths] = transformSchema(baseSchema, currentPath); - if (newBaseSchema !== baseSchema) { - return [z.effect(newBaseSchema, schema._def.effect), basePaths]; + // 9) If it's a pipe (which is what .transform() creates in Zod 4) + if (isKind(schema, "pipe")) { + const schemaWithPipe = schema as unknown as { + _zod?: { def?: { in?: z.ZodTypeAny; out?: z.ZodTypeAny } }; + }; + const inSchema = schemaWithPipe._zod?.def?.in; + const outSchema = schemaWithPipe._zod?.def?.out; + if (!inSchema || !outSchema) { + return [schema, []]; + } + + const [newIn, inPaths] = transformSchema(inSchema, currentPath); + const [newOut, outPaths] = transformSchema(outSchema, currentPath); + const allPaths = [...inPaths, ...outPaths]; + + const changed = newIn !== inSchema || newOut !== outSchema; + if (changed) { + // Reconstruct the pipe with transformed schemas + // In Zod 4, we use z.pipe() to create pipes + const result = z.pipe(newIn as never, newOut as never) as z.ZodTypeAny; + + // Note: Transform functions from the original pipe are not preserved + // This is a limitation of the current implementation + return [result, allPaths]; } - return [schema, basePaths]; + return [schema, allPaths]; } - // 9) If none of the above, return as-is + // 10) For any other type (including standalone transforms), return as-is + // Standalone transforms (z.transform(fn)) don't have nested schemas to recurse into return [schema, []]; } @@ -368,8 +526,13 @@ export function injectUrls( } } -function isKind(s: z.ZodTypeAny, kind: Kind): boolean { - return (s as z.ZodTypeAny)._def.typeName === kind; +// Helper to check if a schema is of a specific type +function isKind(s: z.ZodTypeAny, kind: string): boolean { + try { + return getZodType(s) === kind; + } catch { + return false; + } } function makeIdStringSchema(orig: z.ZodString): z.ZodString { diff --git a/packages/core/lib/v3/agent/AnthropicCUAClient.ts b/packages/core/lib/v3/agent/AnthropicCUAClient.ts index 69d883585..55c781378 100644 --- a/packages/core/lib/v3/agent/AnthropicCUAClient.ts +++ b/packages/core/lib/v3/agent/AnthropicCUAClient.ts @@ -14,7 +14,7 @@ import { AgentScreenshotProviderError } from "../types/public/sdkErrors"; import Anthropic from "@anthropic-ai/sdk"; import { ToolSet } from "ai"; import { zodToJsonSchema } from "zod-to-json-schema"; -import { z } from "zod/v3"; +import { z } from "zod"; import { AgentClient } from "./AgentClient"; import { mapKeyToPlaywright } from "./utils/cuaKeyMapping"; import { compressConversationImages } from "./utils/imageCompression"; diff --git a/packages/core/lib/v3/agent/tools/v3-act.ts b/packages/core/lib/v3/agent/tools/v3-act.ts index a5e32aefc..e39f043ee 100644 --- a/packages/core/lib/v3/agent/tools/v3-act.ts +++ b/packages/core/lib/v3/agent/tools/v3-act.ts @@ -1,5 +1,5 @@ import { tool } from "ai"; -import { z } from "zod/v3"; +import { z } from "zod"; import type { V3 } from "../../v3"; import type { Action } from "../../types/public/methods"; diff --git a/packages/core/lib/v3/agent/tools/v3-ariaTree.ts b/packages/core/lib/v3/agent/tools/v3-ariaTree.ts index 252a23eda..82c883ae8 100644 --- a/packages/core/lib/v3/agent/tools/v3-ariaTree.ts +++ b/packages/core/lib/v3/agent/tools/v3-ariaTree.ts @@ -1,5 +1,5 @@ import { tool } from "ai"; -import { z } from "zod/v3"; +import { z } from "zod"; import type { V3 } from "../../v3"; export const createAriaTreeTool = (v3: V3) => diff --git a/packages/core/lib/v3/agent/tools/v3-close.ts b/packages/core/lib/v3/agent/tools/v3-close.ts index 4f492787c..258d92724 100644 --- a/packages/core/lib/v3/agent/tools/v3-close.ts +++ b/packages/core/lib/v3/agent/tools/v3-close.ts @@ -1,5 +1,5 @@ import { tool } from "ai"; -import { z } from "zod/v3"; +import { z } from "zod"; export const createCloseTool = () => tool({ diff --git a/packages/core/lib/v3/agent/tools/v3-extract.ts b/packages/core/lib/v3/agent/tools/v3-extract.ts index 3106a0989..c2d38830c 100644 --- a/packages/core/lib/v3/agent/tools/v3-extract.ts +++ b/packages/core/lib/v3/agent/tools/v3-extract.ts @@ -1,5 +1,5 @@ import { tool } from "ai"; -import { z } from "zod/v3"; +import { z } from "zod"; import type { V3 } from "../../v3"; import type { LogLine } from "../../types/public/logs"; diff --git a/packages/core/lib/v3/agent/tools/v3-fillform.ts b/packages/core/lib/v3/agent/tools/v3-fillform.ts index 1c3cb9eeb..76e5a95cc 100644 --- a/packages/core/lib/v3/agent/tools/v3-fillform.ts +++ b/packages/core/lib/v3/agent/tools/v3-fillform.ts @@ -1,5 +1,5 @@ import { tool } from "ai"; -import { z } from "zod/v3"; +import { z } from "zod"; import type { V3 } from "../../v3"; import type { Action } from "../../types/public/methods"; diff --git a/packages/core/lib/v3/agent/tools/v3-goto.ts b/packages/core/lib/v3/agent/tools/v3-goto.ts index 45dcf49b5..3093977e1 100644 --- a/packages/core/lib/v3/agent/tools/v3-goto.ts +++ b/packages/core/lib/v3/agent/tools/v3-goto.ts @@ -1,5 +1,5 @@ import { tool } from "ai"; -import { z } from "zod/v3"; +import { z } from "zod"; import type { V3 } from "../../v3"; export const createGotoTool = (v3: V3) => diff --git a/packages/core/lib/v3/agent/tools/v3-navback.ts b/packages/core/lib/v3/agent/tools/v3-navback.ts index 3b9e3b105..2d9abba45 100644 --- a/packages/core/lib/v3/agent/tools/v3-navback.ts +++ b/packages/core/lib/v3/agent/tools/v3-navback.ts @@ -1,5 +1,5 @@ import { tool } from "ai"; -import { z } from "zod/v3"; +import { z } from "zod"; import type { V3 } from "../../v3"; export const createNavBackTool = (v3: V3) => diff --git a/packages/core/lib/v3/agent/tools/v3-screenshot.ts b/packages/core/lib/v3/agent/tools/v3-screenshot.ts index 3ebcca546..1ef81cf90 100644 --- a/packages/core/lib/v3/agent/tools/v3-screenshot.ts +++ b/packages/core/lib/v3/agent/tools/v3-screenshot.ts @@ -1,5 +1,5 @@ import { tool } from "ai"; -import { z } from "zod/v3"; +import { z } from "zod"; import type { V3 } from "../../v3"; export const createScreenshotTool = (v3: V3) => diff --git a/packages/core/lib/v3/agent/tools/v3-scroll.ts b/packages/core/lib/v3/agent/tools/v3-scroll.ts index 311a4ed75..65229b495 100644 --- a/packages/core/lib/v3/agent/tools/v3-scroll.ts +++ b/packages/core/lib/v3/agent/tools/v3-scroll.ts @@ -1,5 +1,5 @@ import { tool } from "ai"; -import { z } from "zod/v3"; +import { z } from "zod"; import type { V3 } from "../../v3"; export const createScrollTool = (v3: V3) => diff --git a/packages/core/lib/v3/agent/tools/v3-wait.ts b/packages/core/lib/v3/agent/tools/v3-wait.ts index 2d6de2f63..567ad8ead 100644 --- a/packages/core/lib/v3/agent/tools/v3-wait.ts +++ b/packages/core/lib/v3/agent/tools/v3-wait.ts @@ -1,5 +1,5 @@ import { tool } from "ai"; -import { z } from "zod/v3"; +import { z } from "zod"; import type { V3 } from "../../v3"; export const createWaitTool = (v3: V3) => diff --git a/packages/core/lib/v3/handlers/extractHandler.ts b/packages/core/lib/v3/handlers/extractHandler.ts index c686470a2..1794d08c3 100644 --- a/packages/core/lib/v3/handlers/extractHandler.ts +++ b/packages/core/lib/v3/handlers/extractHandler.ts @@ -4,7 +4,7 @@ import { injectUrls, transformSchema } from "../../utils"; import { v3Logger } from "../logger"; import { V3FunctionName } from "../types/public/methods"; import { captureHybridSnapshot } from "../understudy/a11y/snapshot"; -import { z, ZodTypeAny } from "zod/v3"; +import { z, ZodTypeAny } from "zod"; import { LLMClient } from "../llm/LLMClient"; import { ExtractHandlerParams } from "../types/private/handlers"; import { EncodedId, ZodPathSegments } from "../types/private/internal"; @@ -39,7 +39,7 @@ interface ExtractionResponseBase { inference_time_ms: number; } -type ExtractionResponse = ExtractionResponseBase & +type ExtractionResponse = ExtractionResponseBase & z.infer; export class ExtractHandler { diff --git a/packages/core/lib/v3/llm/LLMClient.ts b/packages/core/lib/v3/llm/LLMClient.ts index a2a317c43..a6b03c5f8 100644 --- a/packages/core/lib/v3/llm/LLMClient.ts +++ b/packages/core/lib/v3/llm/LLMClient.ts @@ -11,7 +11,7 @@ import { streamText, } from "ai"; import type { LanguageModelV2 } from "@ai-sdk/provider"; -import { ZodType } from "zod/v3"; +import { ZodType } from "zod"; import { LogLine } from "../types/public/logs"; import { AvailableModel, ClientOptions } from "../types/public/model"; @@ -97,6 +97,15 @@ export interface CreateChatCompletionOptions { retries?: number; } +export interface LLMParsedResponse { + data: T; + usage?: { + prompt_tokens: number; + completion_tokens: number; + total_tokens: number; + }; +} + export abstract class LLMClient { public type: "openai" | "anthropic" | "cerebras" | "groq" | (string & {}); public modelName: AvailableModel | (string & {}); @@ -109,11 +118,17 @@ export abstract class LLMClient { this.userProvidedInstructions = userProvidedInstructions; } - abstract createChatCompletion< - T = LLMResponse & { - usage?: LLMResponse["usage"]; + // Overload 1: When response_model is provided, returns LLMParsedResponse + abstract createChatCompletion( + options: CreateChatCompletionOptions & { + options: { response_model: { name: string; schema: ZodType } }; }, - >(options: CreateChatCompletionOptions): Promise; + ): Promise>; + + // Overload 2: When response_model is not provided, returns T (defaults to LLMResponse) + abstract createChatCompletion( + options: CreateChatCompletionOptions, + ): Promise; public generateObject = generateObject; public generateText = generateText; diff --git a/packages/core/lib/v3/tests/timeouts.spec.ts b/packages/core/lib/v3/tests/timeouts.spec.ts index eafdbf83b..cbcca04b9 100644 --- a/packages/core/lib/v3/tests/timeouts.spec.ts +++ b/packages/core/lib/v3/tests/timeouts.spec.ts @@ -1,7 +1,7 @@ import { test, expect } from "@playwright/test"; import { V3 } from "../v3"; import { v3TestConfig } from "./v3.config"; -import { z } from "zod/v3"; +import { z } from "zod"; test.describe("V3 hard timeouts", () => { let v3: V3; diff --git a/packages/core/lib/v3/types/private/handlers.ts b/packages/core/lib/v3/types/private/handlers.ts index 72cba746c..33f88a9e4 100644 --- a/packages/core/lib/v3/types/private/handlers.ts +++ b/packages/core/lib/v3/types/private/handlers.ts @@ -1,4 +1,4 @@ -import { ZodTypeAny } from "zod/v3"; +import { ZodTypeAny } from "zod"; import { Page } from "../../understudy/page"; import { ModelConfiguration } from "../public/model"; diff --git a/packages/core/lib/v3/types/public/methods.ts b/packages/core/lib/v3/types/public/methods.ts index d2b9dbfa1..2a8ca4d4e 100644 --- a/packages/core/lib/v3/types/public/methods.ts +++ b/packages/core/lib/v3/types/public/methods.ts @@ -1,7 +1,7 @@ import { Page as PatchrightPage } from "patchright-core"; import { Page as PlaywrightPage } from "playwright-core"; import { Page as PuppeteerPage } from "puppeteer-core"; -import { z } from "zod/v3"; +import { z } from "zod"; import { Page } from "../../understudy/page"; import { ModelConfiguration } from "../public/model"; @@ -19,7 +19,7 @@ export interface ActResult { actions: Action[]; } -export type ExtractResult = z.infer; +export type ExtractResult = z.infer; export interface Action { selector: string; diff --git a/packages/core/lib/v3/types/public/sdkErrors.ts b/packages/core/lib/v3/types/public/sdkErrors.ts index a5a3ac127..f67c2f110 100644 --- a/packages/core/lib/v3/types/public/sdkErrors.ts +++ b/packages/core/lib/v3/types/public/sdkErrors.ts @@ -1,4 +1,4 @@ -import { ZodError } from "zod/v3"; +import { ZodError } from "zod"; // Avoid .js extension so tsup/esbuild resolves TS source import { STAGEHAND_VERSION } from "../../../version"; diff --git a/packages/core/lib/v3/v3.ts b/packages/core/lib/v3/v3.ts index 6788333bb..e244c5d43 100644 --- a/packages/core/lib/v3/v3.ts +++ b/packages/core/lib/v3/v3.ts @@ -3,8 +3,8 @@ import fs from "fs"; import os from "os"; import path from "path"; import process from "process"; -import type { ZodTypeAny } from "zod/v3"; -import { z } from "zod/v3"; +import type { ZodTypeAny } from "zod"; +import { z } from "zod"; import { loadApiKeyFromEnv } from "../utils"; import { ActCache } from "./cache/ActCache"; import { AgentCache } from "./cache/AgentCache"; diff --git a/packages/core/lib/v3Evaluator.ts b/packages/core/lib/v3Evaluator.ts index 858716df7..72043b8d5 100644 --- a/packages/core/lib/v3Evaluator.ts +++ b/packages/core/lib/v3Evaluator.ts @@ -5,7 +5,7 @@ */ import dotenv from "dotenv"; -import { z } from "zod/v3"; +import { z } from "zod"; import type { AvailableModel, ClientOptions } from "./v3/types/public/model"; import type { EvaluateOptions, diff --git a/packages/core/package.json b/packages/core/package.json index b3ac849f7..e60ffba1a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -35,7 +35,7 @@ "peerDependencies": { "deepmerge": "^4.3.1", "dotenv": "^16.4.5", - "zod": "3.25.67" + "zod": "4.0.0" }, "dependencies": { "@ai-sdk/provider": "^2.0.0", diff --git a/packages/evals/llm_clients/hn_aisdk.ts b/packages/evals/llm_clients/hn_aisdk.ts index 822ba5b79..f69211e85 100644 --- a/packages/evals/llm_clients/hn_aisdk.ts +++ b/packages/evals/llm_clients/hn_aisdk.ts @@ -1,6 +1,6 @@ // import { Stagehand } from "@browserbasehq/stagehand"; // import { EvalFunction } from "@/types/evals"; -// import { z } from "zod/v3"; +// import { z } from "zod"; // // export const hn_aisdk: EvalFunction = async ({ // debugUrl, diff --git a/packages/evals/llm_clients/hn_customOpenAI.ts b/packages/evals/llm_clients/hn_customOpenAI.ts index a6007dcdb..8dd35f31b 100644 --- a/packages/evals/llm_clients/hn_customOpenAI.ts +++ b/packages/evals/llm_clients/hn_customOpenAI.ts @@ -1,5 +1,5 @@ // import { EvalFunction } from "@/types/evals"; -// import { z } from "zod/v3"; +// import { z } from "zod"; // import { CustomOpenAIClient } from "@/examples/external_clients/customOpenAI"; // import OpenAI from "openai"; // import { Stagehand } from "@browserbasehq/stagehand"; diff --git a/packages/evals/llm_clients/hn_langchain.ts b/packages/evals/llm_clients/hn_langchain.ts index 012d9198f..a86fecb87 100644 --- a/packages/evals/llm_clients/hn_langchain.ts +++ b/packages/evals/llm_clients/hn_langchain.ts @@ -1,5 +1,5 @@ // import { EvalFunction } from "@/types/evals"; -// import { z } from "zod/v3"; +// import { z } from "zod"; // import { LangchainClient } from "@/examples/external_clients/langchain"; // import { ChatOpenAI } from "@langchain/openai"; // import { Stagehand } from "@browserbasehq/stagehand"; diff --git a/packages/evals/tasks/agent/google_maps_2.ts b/packages/evals/tasks/agent/google_maps_2.ts index 16315b2da..cc669cf18 100644 --- a/packages/evals/tasks/agent/google_maps_2.ts +++ b/packages/evals/tasks/agent/google_maps_2.ts @@ -1,7 +1,7 @@ import { EvalFunction } from "../../types/evals"; import { V3Evaluator } from "@browserbasehq/orca"; import type { AvailableModel } from "@browserbasehq/orca"; -import { z } from "zod/v3"; +import { z } from "zod"; export const google_maps_2: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/allrecipes.ts b/packages/evals/tasks/allrecipes.ts index c5c46fcef..c6d85f8ec 100644 --- a/packages/evals/tasks/allrecipes.ts +++ b/packages/evals/tasks/allrecipes.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const allrecipes: EvalFunction = async ({ logger, diff --git a/packages/evals/tasks/arxiv.ts b/packages/evals/tasks/arxiv.ts index ea58937fa..932cad5d1 100644 --- a/packages/evals/tasks/arxiv.ts +++ b/packages/evals/tasks/arxiv.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const arxiv: EvalFunction = async ({ logger, diff --git a/packages/evals/tasks/combination_sauce.ts b/packages/evals/tasks/combination_sauce.ts index e5fd71234..54110dd01 100644 --- a/packages/evals/tasks/combination_sauce.ts +++ b/packages/evals/tasks/combination_sauce.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const combination_sauce: EvalFunction = async ({ logger, diff --git a/packages/evals/tasks/costar.ts b/packages/evals/tasks/costar.ts index e62518b48..98364fc32 100644 --- a/packages/evals/tasks/costar.ts +++ b/packages/evals/tasks/costar.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const costar: EvalFunction = async ({ logger, diff --git a/packages/evals/tasks/extract_aigrant_companies.ts b/packages/evals/tasks/extract_aigrant_companies.ts index 8f75173c5..bbc09bb3a 100644 --- a/packages/evals/tasks/extract_aigrant_companies.ts +++ b/packages/evals/tasks/extract_aigrant_companies.ts @@ -1,4 +1,4 @@ -import { z } from "zod/v3"; +import { z } from "zod"; import { EvalFunction } from "../types/evals"; export const extract_aigrant_companies: EvalFunction = async ({ diff --git a/packages/evals/tasks/extract_aigrant_targeted.ts b/packages/evals/tasks/extract_aigrant_targeted.ts index 7cfe4d27d..677da27cf 100644 --- a/packages/evals/tasks/extract_aigrant_targeted.ts +++ b/packages/evals/tasks/extract_aigrant_targeted.ts @@ -1,4 +1,4 @@ -import { z } from "zod/v3"; +import { z } from "zod"; import { EvalFunction } from "../types/evals"; export const extract_aigrant_targeted: EvalFunction = async ({ diff --git a/packages/evals/tasks/extract_aigrant_targeted_2.ts b/packages/evals/tasks/extract_aigrant_targeted_2.ts index c793040d0..6a9b76e7a 100644 --- a/packages/evals/tasks/extract_aigrant_targeted_2.ts +++ b/packages/evals/tasks/extract_aigrant_targeted_2.ts @@ -1,4 +1,4 @@ -import { z } from "zod/v3"; +import { z } from "zod"; import { EvalFunction } from "../types/evals"; export const extract_aigrant_targeted_2: EvalFunction = async ({ diff --git a/packages/evals/tasks/extract_apartments.ts b/packages/evals/tasks/extract_apartments.ts index 6634f291f..75fe13b07 100644 --- a/packages/evals/tasks/extract_apartments.ts +++ b/packages/evals/tasks/extract_apartments.ts @@ -1,4 +1,4 @@ -import { z } from "zod/v3"; +import { z } from "zod"; import { EvalFunction } from "../types/evals"; export const extract_apartments: EvalFunction = async ({ diff --git a/packages/evals/tasks/extract_area_codes.ts b/packages/evals/tasks/extract_area_codes.ts index 8759d5800..719170e41 100644 --- a/packages/evals/tasks/extract_area_codes.ts +++ b/packages/evals/tasks/extract_area_codes.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_area_codes: EvalFunction = async ({ logger, diff --git a/packages/evals/tasks/extract_baptist_health.ts b/packages/evals/tasks/extract_baptist_health.ts index f619f4ae3..c586ebbbb 100644 --- a/packages/evals/tasks/extract_baptist_health.ts +++ b/packages/evals/tasks/extract_baptist_health.ts @@ -1,6 +1,6 @@ import { EvalFunction } from "../types/evals"; import { compareStrings } from "../utils"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_baptist_health: EvalFunction = async ({ logger, diff --git a/packages/evals/tasks/extract_capacitor_info.ts b/packages/evals/tasks/extract_capacitor_info.ts index 6328c990f..5b9e8aa1c 100644 --- a/packages/evals/tasks/extract_capacitor_info.ts +++ b/packages/evals/tasks/extract_capacitor_info.ts @@ -1,6 +1,6 @@ import { EvalFunction } from "../types/evals"; import { normalizeString } from "../utils"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_capacitor_info: EvalFunction = async ({ logger, diff --git a/packages/evals/tasks/extract_collaborators.ts b/packages/evals/tasks/extract_collaborators.ts index 5b5e571a7..944679636 100644 --- a/packages/evals/tasks/extract_collaborators.ts +++ b/packages/evals/tasks/extract_collaborators.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_collaborators: EvalFunction = async ({ logger, diff --git a/packages/evals/tasks/extract_csa.ts b/packages/evals/tasks/extract_csa.ts index aa986f1a7..9ab07e855 100644 --- a/packages/evals/tasks/extract_csa.ts +++ b/packages/evals/tasks/extract_csa.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_csa: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/extract_geniusee.ts b/packages/evals/tasks/extract_geniusee.ts index da6f51f8e..2561b1897 100644 --- a/packages/evals/tasks/extract_geniusee.ts +++ b/packages/evals/tasks/extract_geniusee.ts @@ -1,4 +1,4 @@ -import { z } from "zod/v3"; +import { z } from "zod"; import { EvalFunction } from "../types/evals"; export const extract_geniusee: EvalFunction = async ({ diff --git a/packages/evals/tasks/extract_geniusee_2.ts b/packages/evals/tasks/extract_geniusee_2.ts index 90d0d6281..52fff6660 100644 --- a/packages/evals/tasks/extract_geniusee_2.ts +++ b/packages/evals/tasks/extract_geniusee_2.ts @@ -1,4 +1,4 @@ -import { z } from "zod/v3"; +import { z } from "zod"; import { EvalFunction } from "../types/evals"; export const extract_geniusee_2: EvalFunction = async ({ diff --git a/packages/evals/tasks/extract_github_commits.ts b/packages/evals/tasks/extract_github_commits.ts index 6635ef92e..fcf35aa92 100644 --- a/packages/evals/tasks/extract_github_commits.ts +++ b/packages/evals/tasks/extract_github_commits.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_github_commits: EvalFunction = async ({ logger, diff --git a/packages/evals/tasks/extract_github_stars.ts b/packages/evals/tasks/extract_github_stars.ts index 1725465b4..d0651a186 100644 --- a/packages/evals/tasks/extract_github_stars.ts +++ b/packages/evals/tasks/extract_github_stars.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_github_stars: EvalFunction = async ({ logger, diff --git a/packages/evals/tasks/extract_hamilton_weather.ts b/packages/evals/tasks/extract_hamilton_weather.ts index 9519676c5..a1501e4a9 100644 --- a/packages/evals/tasks/extract_hamilton_weather.ts +++ b/packages/evals/tasks/extract_hamilton_weather.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; import { compareStrings } from "../utils"; export const extract_hamilton_weather: EvalFunction = async ({ diff --git a/packages/evals/tasks/extract_jfk_links.ts b/packages/evals/tasks/extract_jfk_links.ts index d4c285c07..049ff5ca6 100644 --- a/packages/evals/tasks/extract_jfk_links.ts +++ b/packages/evals/tasks/extract_jfk_links.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_jfk_links: EvalFunction = async ({ logger, diff --git a/packages/evals/tasks/extract_jstor_news.ts b/packages/evals/tasks/extract_jstor_news.ts index 7dbe40d15..5d5a449eb 100644 --- a/packages/evals/tasks/extract_jstor_news.ts +++ b/packages/evals/tasks/extract_jstor_news.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_jstor_news: EvalFunction = async ({ logger, diff --git a/packages/evals/tasks/extract_memorial_healthcare.ts b/packages/evals/tasks/extract_memorial_healthcare.ts index d7fcbe062..37015d2d4 100644 --- a/packages/evals/tasks/extract_memorial_healthcare.ts +++ b/packages/evals/tasks/extract_memorial_healthcare.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; import { compareStrings } from "../utils"; export const extract_memorial_healthcare: EvalFunction = async ({ diff --git a/packages/evals/tasks/extract_nhl_stats.ts b/packages/evals/tasks/extract_nhl_stats.ts index 00301f718..8701fd405 100644 --- a/packages/evals/tasks/extract_nhl_stats.ts +++ b/packages/evals/tasks/extract_nhl_stats.ts @@ -1,6 +1,6 @@ import { EvalFunction } from "../types/evals"; import { normalizeString } from "../utils"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_nhl_stats: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/extract_partners.ts b/packages/evals/tasks/extract_partners.ts index 328413597..1c1e7a18f 100644 --- a/packages/evals/tasks/extract_partners.ts +++ b/packages/evals/tasks/extract_partners.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_partners: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/extract_press_releases.ts b/packages/evals/tasks/extract_press_releases.ts index 52b75c52e..3b86a745a 100644 --- a/packages/evals/tasks/extract_press_releases.ts +++ b/packages/evals/tasks/extract_press_releases.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; import { compareStrings } from "../utils"; export const extract_press_releases: EvalFunction = async ({ diff --git a/packages/evals/tasks/extract_professional_info.ts b/packages/evals/tasks/extract_professional_info.ts index 941cd1695..3c77caada 100644 --- a/packages/evals/tasks/extract_professional_info.ts +++ b/packages/evals/tasks/extract_professional_info.ts @@ -1,6 +1,6 @@ import { EvalFunction } from "../types/evals"; import { normalizeString } from "../utils"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_professional_info: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/extract_public_notices.ts b/packages/evals/tasks/extract_public_notices.ts index 85db71626..72d612874 100644 --- a/packages/evals/tasks/extract_public_notices.ts +++ b/packages/evals/tasks/extract_public_notices.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; import { compareStrings } from "../utils"; export const extract_public_notices: EvalFunction = async ({ diff --git a/packages/evals/tasks/extract_recipe.ts b/packages/evals/tasks/extract_recipe.ts index 9ba0f34b1..b50e55b70 100644 --- a/packages/evals/tasks/extract_recipe.ts +++ b/packages/evals/tasks/extract_recipe.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_recipe: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/extract_regulations_table.ts b/packages/evals/tasks/extract_regulations_table.ts index 1ca130f20..2c645f97f 100644 --- a/packages/evals/tasks/extract_regulations_table.ts +++ b/packages/evals/tasks/extract_regulations_table.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_regulations_table: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/extract_resistor_info.ts b/packages/evals/tasks/extract_resistor_info.ts index 7e214e868..ff6d05e7f 100644 --- a/packages/evals/tasks/extract_resistor_info.ts +++ b/packages/evals/tasks/extract_resistor_info.ts @@ -1,6 +1,6 @@ import { EvalFunction } from "../types/evals"; import { normalizeString } from "../utils"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_resistor_info: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/extract_rockauto.ts b/packages/evals/tasks/extract_rockauto.ts index eada3e9ed..9bcd361df 100644 --- a/packages/evals/tasks/extract_rockauto.ts +++ b/packages/evals/tasks/extract_rockauto.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_rockauto: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/extract_single_link.ts b/packages/evals/tasks/extract_single_link.ts index b4ca2c0d1..eee2584b0 100644 --- a/packages/evals/tasks/extract_single_link.ts +++ b/packages/evals/tasks/extract_single_link.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const extract_single_link: EvalFunction = async ({ logger, diff --git a/packages/evals/tasks/extract_snowshoeing_destinations.ts b/packages/evals/tasks/extract_snowshoeing_destinations.ts index 02dd18012..067f0ad9f 100644 --- a/packages/evals/tasks/extract_snowshoeing_destinations.ts +++ b/packages/evals/tasks/extract_snowshoeing_destinations.ts @@ -1,4 +1,4 @@ -import { z } from "zod/v3"; +import { z } from "zod"; import { EvalFunction } from "../types/evals"; export const extract_snowshoeing_destinations: EvalFunction = async ({ diff --git a/packages/evals/tasks/extract_staff_members.ts b/packages/evals/tasks/extract_staff_members.ts index 82f82b5d4..a67958d7a 100644 --- a/packages/evals/tasks/extract_staff_members.ts +++ b/packages/evals/tasks/extract_staff_members.ts @@ -1,4 +1,4 @@ -import { z } from "zod/v3"; +import { z } from "zod"; import { EvalFunction } from "../types/evals"; export const extract_staff_members: EvalFunction = async ({ diff --git a/packages/evals/tasks/extract_zillow.ts b/packages/evals/tasks/extract_zillow.ts index d6f75ca9a..76fd567ac 100644 --- a/packages/evals/tasks/extract_zillow.ts +++ b/packages/evals/tasks/extract_zillow.ts @@ -1,4 +1,4 @@ -import { z } from "zod/v3"; +import { z } from "zod"; import { EvalFunction } from "../types/evals"; export const extract_zillow: EvalFunction = async ({ diff --git a/packages/evals/tasks/homedepot.ts b/packages/evals/tasks/homedepot.ts index 884a94025..aa904f6b8 100644 --- a/packages/evals/tasks/homedepot.ts +++ b/packages/evals/tasks/homedepot.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const homedepot: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/iframe_hn.ts b/packages/evals/tasks/iframe_hn.ts index 69a50b57b..5984f1fb4 100644 --- a/packages/evals/tasks/iframe_hn.ts +++ b/packages/evals/tasks/iframe_hn.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const iframe_hn: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/imdb_movie_details.ts b/packages/evals/tasks/imdb_movie_details.ts index 28a9f5dbe..400fa72d3 100644 --- a/packages/evals/tasks/imdb_movie_details.ts +++ b/packages/evals/tasks/imdb_movie_details.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const imdb_movie_details: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/peeler_complex.ts b/packages/evals/tasks/peeler_complex.ts index 3cadd106d..ea442415c 100644 --- a/packages/evals/tasks/peeler_complex.ts +++ b/packages/evals/tasks/peeler_complex.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const peeler_complex: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/sciquest.ts b/packages/evals/tasks/sciquest.ts index 0d8f50e29..7aa13be92 100644 --- a/packages/evals/tasks/sciquest.ts +++ b/packages/evals/tasks/sciquest.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const sciquest: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/ted_talk.ts b/packages/evals/tasks/ted_talk.ts index 0fe243bf1..057c63836 100644 --- a/packages/evals/tasks/ted_talk.ts +++ b/packages/evals/tasks/ted_talk.ts @@ -1,6 +1,6 @@ import { EvalFunction } from "../types/evals"; import { normalizeString } from "../utils"; -import { z } from "zod/v3"; +import { z } from "zod"; export const ted_talk: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/tasks/wichita.ts b/packages/evals/tasks/wichita.ts index a729652ac..0ecf69fdc 100644 --- a/packages/evals/tasks/wichita.ts +++ b/packages/evals/tasks/wichita.ts @@ -1,5 +1,5 @@ import { EvalFunction } from "../types/evals"; -import { z } from "zod/v3"; +import { z } from "zod"; export const wichita: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/types/evals.ts b/packages/evals/types/evals.ts index c3f9ce9c7..eac337e78 100644 --- a/packages/evals/types/evals.ts +++ b/packages/evals/types/evals.ts @@ -1,4 +1,4 @@ -import { z } from "zod/v3"; +import { z } from "zod"; import type { AvailableModel } from "@browserbasehq/orca"; import type { LogLine } from "@browserbasehq/orca"; import type { AgentInstance } from "@browserbasehq/orca"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fbf3431bc..8c9d55a0f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -124,13 +124,13 @@ importers: version: 1.24.0(@modelcontextprotocol/sdk@1.17.2) '@langchain/openai': specifier: ^0.4.4 - version: 0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3) + version: 0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.0.0)))(ws@8.18.3) '@modelcontextprotocol/sdk': specifier: ^1.17.2 version: 1.17.2 ai: specifier: ^5.0.0 - version: 5.0.76(zod@3.25.67) + version: 5.0.76(zod@4.0.0) deepmerge: specifier: ^4.3.1 version: 4.3.1 @@ -145,7 +145,7 @@ importers: version: 3.1.0 openai: specifier: ^4.87.1 - version: 4.96.2(ws@8.18.3)(zod@3.25.67) + version: 4.96.2(ws@8.18.3)(zod@4.0.0) pino: specifier: ^9.6.0 version: 9.6.0 @@ -159,54 +159,54 @@ importers: specifier: ^8.18.0 version: 8.18.3 zod: - specifier: 3.25.67 - version: 3.25.67 + specifier: 4.0.0 + version: 4.0.0 zod-to-json-schema: specifier: ^3.23.5 - version: 3.24.5(zod@3.25.67) + version: 3.24.5(zod@4.0.0) optionalDependencies: '@ai-sdk/anthropic': specifier: ^2.0.34 - version: 2.0.34(zod@3.25.67) + version: 2.0.34(zod@4.0.0) '@ai-sdk/azure': specifier: ^2.0.54 - version: 2.0.54(zod@3.25.67) + version: 2.0.54(zod@4.0.0) '@ai-sdk/cerebras': specifier: ^1.0.25 - version: 1.0.25(zod@3.25.67) + version: 1.0.25(zod@4.0.0) '@ai-sdk/deepseek': specifier: ^1.0.23 - version: 1.0.23(zod@3.25.67) + version: 1.0.23(zod@4.0.0) '@ai-sdk/google': specifier: ^2.0.23 - version: 2.0.23(zod@3.25.67) + version: 2.0.23(zod@4.0.0) '@ai-sdk/groq': specifier: ^2.0.24 - version: 2.0.24(zod@3.25.67) + version: 2.0.24(zod@4.0.0) '@ai-sdk/mistral': specifier: ^2.0.19 - version: 2.0.19(zod@3.25.67) + version: 2.0.19(zod@4.0.0) '@ai-sdk/openai': specifier: ^2.0.53 - version: 2.0.53(zod@3.25.67) + version: 2.0.53(zod@4.0.0) '@ai-sdk/perplexity': specifier: ^2.0.13 - version: 2.0.13(zod@3.25.67) + version: 2.0.13(zod@4.0.0) '@ai-sdk/togetherai': specifier: ^1.0.23 - version: 1.0.23(zod@3.25.67) + version: 1.0.23(zod@4.0.0) '@ai-sdk/xai': specifier: ^2.0.26 - version: 2.0.26(zod@3.25.67) + version: 2.0.26(zod@4.0.0) '@langchain/core': specifier: ^0.3.40 - version: 0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.67)) + version: 0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.0.0)) chrome-launcher: specifier: ^1.2.0 version: 1.2.0 ollama-ai-provider-v2: specifier: ^1.5.0 - version: 1.5.0(zod@3.25.67) + version: 1.5.0(zod@4.0.0) patchright-core: specifier: ^1.55.2 version: 1.55.2 @@ -5493,40 +5493,43 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.0.0: + resolution: {integrity: sha512-9diLdTPc/L7w/5jI4C3gHYNiGHDV9IZYxo1e5LSD8cabi65WVTWWb+g2BGPEpUUCOxR4D+6O5B0AzyMdUAXwrw==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@ai-sdk/anthropic@2.0.34(zod@3.25.67)': + '@ai-sdk/anthropic@2.0.34(zod@4.0.0)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) - zod: 3.25.67 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + zod: 4.0.0 optional: true - '@ai-sdk/azure@2.0.54(zod@3.25.67)': + '@ai-sdk/azure@2.0.54(zod@4.0.0)': dependencies: - '@ai-sdk/openai': 2.0.53(zod@3.25.67) + '@ai-sdk/openai': 2.0.53(zod@4.0.0) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) - zod: 3.25.67 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + zod: 4.0.0 optional: true - '@ai-sdk/cerebras@1.0.25(zod@3.25.67)': + '@ai-sdk/cerebras@1.0.25(zod@4.0.0)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.67) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.0.0) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) - zod: 3.25.67 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + zod: 4.0.0 optional: true - '@ai-sdk/deepseek@1.0.23(zod@3.25.67)': + '@ai-sdk/deepseek@1.0.23(zod@4.0.0)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.67) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.0.0) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) - zod: 3.25.67 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + zod: 4.0.0 optional: true '@ai-sdk/gateway@2.0.0(zod@3.25.67)': @@ -5536,46 +5539,53 @@ snapshots: '@vercel/oidc': 3.0.3 zod: 3.25.67 - '@ai-sdk/google@2.0.23(zod@3.25.67)': + '@ai-sdk/gateway@2.0.0(zod@4.0.0)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) - zod: 3.25.67 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + '@vercel/oidc': 3.0.3 + zod: 4.0.0 + + '@ai-sdk/google@2.0.23(zod@4.0.0)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + zod: 4.0.0 optional: true - '@ai-sdk/groq@2.0.24(zod@3.25.67)': + '@ai-sdk/groq@2.0.24(zod@4.0.0)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) - zod: 3.25.67 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + zod: 4.0.0 optional: true - '@ai-sdk/mistral@2.0.19(zod@3.25.67)': + '@ai-sdk/mistral@2.0.19(zod@4.0.0)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) - zod: 3.25.67 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + zod: 4.0.0 optional: true - '@ai-sdk/openai-compatible@1.0.22(zod@3.25.67)': + '@ai-sdk/openai-compatible@1.0.22(zod@4.0.0)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) - zod: 3.25.67 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + zod: 4.0.0 optional: true - '@ai-sdk/openai@2.0.53(zod@3.25.67)': + '@ai-sdk/openai@2.0.53(zod@4.0.0)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) - zod: 3.25.67 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + zod: 4.0.0 optional: true - '@ai-sdk/perplexity@2.0.13(zod@3.25.67)': + '@ai-sdk/perplexity@2.0.13(zod@4.0.0)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) - zod: 3.25.67 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + zod: 4.0.0 optional: true '@ai-sdk/provider-utils@3.0.12(zod@3.25.67)': @@ -5585,6 +5595,13 @@ snapshots: eventsource-parser: 3.0.6 zod: 3.25.67 + '@ai-sdk/provider-utils@3.0.12(zod@4.0.0)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 4.0.0 + '@ai-sdk/provider@1.1.3': dependencies: json-schema: 0.4.0 @@ -5593,20 +5610,20 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/togetherai@1.0.23(zod@3.25.67)': + '@ai-sdk/togetherai@1.0.23(zod@4.0.0)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.67) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.0.0) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) - zod: 3.25.67 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + zod: 4.0.0 optional: true - '@ai-sdk/xai@2.0.26(zod@3.25.67)': + '@ai-sdk/xai@2.0.26(zod@4.0.0)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.67) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.0.0) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) - zod: 3.25.67 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + zod: 4.0.0 optional: true '@alcalzone/ansi-tokenize@0.1.3': @@ -6404,6 +6421,23 @@ snapshots: transitivePeerDependencies: - openai + '@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.0.0))': + dependencies: + '@cfworker/json-schema': 4.1.1 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.20 + langsmith: 0.3.23(openai@4.96.2(ws@8.18.3)(zod@4.0.0)) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.25.67 + zod-to-json-schema: 3.24.5(zod@3.25.67) + transitivePeerDependencies: + - openai + '@langchain/openai@0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3)': dependencies: '@langchain/core': 0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.67)) @@ -6415,6 +6449,17 @@ snapshots: - encoding - ws + '@langchain/openai@0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.0.0)))(ws@8.18.3)': + dependencies: + '@langchain/core': 0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.0.0)) + js-tiktoken: 1.0.20 + openai: 4.96.2(ws@8.18.3)(zod@3.25.67) + zod: 3.25.67 + zod-to-json-schema: 3.24.5(zod@3.25.67) + transitivePeerDependencies: + - encoding + - ws + '@leichtgewicht/ip-codec@2.0.5': {} '@manypkg/find-root@1.1.0': @@ -7300,6 +7345,14 @@ snapshots: '@opentelemetry/api': 1.9.0 zod: 3.25.67 + ai@5.0.76(zod@4.0.0): + dependencies: + '@ai-sdk/gateway': 2.0.0(zod@4.0.0) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + '@opentelemetry/api': 1.9.0 + zod: 4.0.0 + ajv-draft-04@1.0.0(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 @@ -9449,6 +9502,18 @@ snapshots: optionalDependencies: openai: 4.96.2(ws@8.18.3)(zod@3.25.67) + langsmith@0.3.23(openai@4.96.2(ws@8.18.3)(zod@4.0.0)): + dependencies: + '@types/uuid': 10.0.0 + chalk: 4.1.2 + console-table-printer: 2.12.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.7.1 + uuid: 10.0.0 + optionalDependencies: + openai: 4.96.2(ws@8.18.3)(zod@4.0.0) + lcm@0.0.3: dependencies: gcd: 0.0.1 @@ -10213,11 +10278,11 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - ollama-ai-provider-v2@1.5.0(zod@3.25.67): + ollama-ai-provider-v2@1.5.0(zod@4.0.0): dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) - zod: 3.25.67 + '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) + zod: 4.0.0 optional: true on-exit-leak-free@2.1.2: {} @@ -10277,6 +10342,21 @@ snapshots: transitivePeerDependencies: - encoding + openai@4.96.2(ws@8.18.3)(zod@4.0.0): + dependencies: + '@types/node': 18.19.87 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + ws: 8.18.3 + zod: 4.0.0 + transitivePeerDependencies: + - encoding + openapi-types@12.1.3: {} openapi3-ts@4.4.0: @@ -11948,10 +12028,16 @@ snapshots: dependencies: zod: 3.25.67 + zod-to-json-schema@3.24.5(zod@4.0.0): + dependencies: + zod: 4.0.0 + zod@3.23.8: {} zod@3.25.67: {} zod@3.25.76: {} + zod@4.0.0: {} + zwitch@2.0.4: {} From 004614a848dec384f1ebb6f34994884381d740e4 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Wed, 22 Oct 2025 10:47:46 -0700 Subject: [PATCH 02/38] cleanup --- packages/core/lib/utils.ts | 156 +++++++++++++------------------------ 1 file changed, 55 insertions(+), 101 deletions(-) diff --git a/packages/core/lib/utils.ts b/packages/core/lib/utils.ts index 1cc343a51..b2c039b7c 100644 --- a/packages/core/lib/utils.ts +++ b/packages/core/lib/utils.ts @@ -4,9 +4,24 @@ import { z, ZodTypeAny } from "zod"; import { LogLine } from "./v3/types/public/logs"; import { ModelProvider } from "./v3/types/public/model"; import { ZodPathSegments } from "./v3/types/private/internal"; +import type { + $ZodArrayInternals, + $ZodObjectInternals, + $ZodStringInternals, + $ZodUnionInternals, + $ZodIntersectionInternals, + $ZodOptionalInternals, + $ZodNullableInternals, + $ZodPipeInternals, + $ZodEnumInternals, + $ZodLiteralInternals, +} from "zod/v4/core"; const ID_PATTERN = /^\d+-\d+$/; +// Helper type for accessing Zod 4 internals +type ZodWithInternals = z.ZodTypeAny & { _zod: T }; + export function validateZodSchema(schema: z.ZodTypeAny, data: unknown) { const result = schema.safeParse(data); @@ -59,10 +74,8 @@ export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { switch (zodType) { case "array": { - // In Zod 4, array element is accessed via _zod.def.element - const element = ( - zodSchema as unknown as { _zod?: { def?: { element?: z.ZodTypeAny } } } - )._zod?.def?.element as unknown as z.ZodTypeAny; + const arraySchema = zodSchema as ZodWithInternals<$ZodArrayInternals>; + const element = arraySchema._zod.def.element as z.ZodTypeAny; return decorateGeminiSchema( { type: Type.ARRAY, @@ -75,11 +88,8 @@ export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { const properties: Record = {}; const required: string[] = []; - const shape = ( - zodSchema as unknown as { - _zod: { def: { shape: Record } }; - } - )._zod.def.shape; + const objectSchema = zodSchema as ZodWithInternals<$ZodObjectInternals>; + const shape = objectSchema._zod.def.shape; Object.entries(shape).forEach(([key, value]: [string, z.ZodTypeAny]) => { properties[key] = toGeminiSchema(value); if (getZodType(value) !== "optional") { @@ -120,13 +130,8 @@ export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { zodSchema, ); case "enum": { - // In Zod 4, enum entries are in _zod.def.entries - const entries = ( - zodSchema as unknown as { - _zod: { def: { entries: Record } }; - } - )._zod.def.entries; - const values = Object.values(entries); + const enumSchema = zodSchema as ZodWithInternals<$ZodEnumInternals>; + const values = Object.values(enumSchema._zod.def.entries); return decorateGeminiSchema( { type: Type.STRING, @@ -138,9 +143,10 @@ export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { case "default": case "nullable": case "optional": { - const innerType = ( - zodSchema as unknown as { _zod: { def: { innerType: z.ZodTypeAny } } } - )._zod.def.innerType; + const wrapperSchema = zodSchema as ZodWithInternals< + $ZodOptionalInternals | $ZodNullableInternals + >; + const innerType = wrapperSchema._zod.def.innerType as z.ZodTypeAny; const innerSchema = toGeminiSchema(innerType); return decorateGeminiSchema( { @@ -151,12 +157,8 @@ export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { ); } case "literal": { - // In Zod 4, literal values are stored as an array - const values = ( - zodSchema as unknown as { - _zod: { def: { values: (string | number | boolean)[] } }; - } - )._zod.def.values; + const literalSchema = zodSchema as ZodWithInternals<$ZodLiteralInternals>; + const values = literalSchema._zod.def.values; return decorateGeminiSchema( { type: Type.STRING, @@ -166,10 +168,8 @@ export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { ); } case "pipe": { - // For pipes (which include transforms), use the input schema - const inSchema = ( - zodSchema as unknown as { _zod: { def: { in: z.ZodTypeAny } } } - )._zod.def.in; + const pipeSchema = zodSchema as ZodWithInternals<$ZodPipeInternals>; + const inSchema = pipeSchema._zod.def.in as z.ZodTypeAny; return toGeminiSchema(inSchema); } // Standalone transforms and any unknown types fall through to default @@ -189,36 +189,12 @@ export function getZodType(schema: z.ZodTypeAny): string { // In Zod 4, the type is accessed via _zod.def.type const schemaWithDef = schema as unknown as { _zod?: { def?: { type?: string } }; - _def?: { typeName?: string }; }; - // Try Zod 4 structure first if (schemaWithDef._zod?.def?.type) { return schemaWithDef._zod.def.type; } - // Fallback to Zod 3 structure if needed - if (schemaWithDef._def?.typeName) { - // Convert Zod 3 type names to Zod 4 format - const typeName = schemaWithDef._def.typeName; - const typeMap: Record = { - ZodString: "string", - ZodNumber: "number", - ZodBoolean: "boolean", - ZodArray: "array", - ZodObject: "object", - ZodUnion: "union", - ZodIntersection: "intersection", - ZodOptional: "optional", - ZodNullable: "nullable", - ZodEnum: "enum", - ZodLiteral: "literal", - ZodEffects: "transform", - ZodDefault: "default", - }; - return typeMap[typeName] || typeName; - } - throw new Error( `Unable to determine Zod schema type. Schema: ${JSON.stringify(schema)}`, ); @@ -253,18 +229,15 @@ export function transformSchema( return [transformed, [{ segments: [] }]]; } - // 2) If it's a string with .url() check, convert to z.number() + // 2) If it's a string with .url() check, convert to ID string pattern if (isKind(schema, "string")) { - const schemaWithDef = schema as unknown as { - _zod?: { - def?: { checks?: Array<{ _zod: { kind: string } }> }; - bag?: { format?: string }; - }; - }; - const checks = schemaWithDef._zod?.def?.checks; - const format = schemaWithDef._zod?.bag?.format; + const stringSchema = schema as ZodWithInternals< + $ZodStringInternals + >; + const checks = stringSchema._zod.def.checks; + const format = stringSchema._zod.bag?.format; const hasUrlCheck = - (checks?.some((check) => check._zod?.kind === "url") ?? false) || + (checks?.some((check) => check._zod?.def?.check === "url") ?? false) || format === "url"; if (hasUrlCheck) { return [makeIdStringSchema(schema as z.ZodString), [{ segments: [] }]]; @@ -274,11 +247,8 @@ export function transformSchema( // 3) If it's an object, transform each field if (isKind(schema, "object")) { - // The shape is a raw object containing fields keyed by string (no symbols): - const schemaWithShape = schema as unknown as { - _zod?: { def?: { shape?: Record } }; - }; - const shape = schemaWithShape._zod?.def?.shape; + const objectSchema = schema as ZodWithInternals<$ZodObjectInternals>; + const shape = objectSchema._zod.def.shape as Record; if (!shape) { return [schema, []]; } @@ -318,11 +288,8 @@ export function transformSchema( // 4) If it's an array, transform its item type if (isKind(schema, "array")) { - const schemaWithElement = schema as unknown as { - _zod?: { def?: { element?: z.ZodTypeAny } }; - }; - const itemType = schemaWithElement._zod?.def - ?.element as unknown as z.ZodTypeAny; + const arraySchema = schema as ZodWithInternals<$ZodArrayInternals>; + const itemType = arraySchema._zod.def.element as z.ZodTypeAny; if (!itemType) { return [schema, []]; } @@ -347,11 +314,8 @@ export function transformSchema( // 5) If it's a union, transform each option if (isKind(schema, "union")) { - // Cast the union's options to an array of ZodTypeAny - const schemaWithOptions = schema as unknown as { - _zod?: { def?: { options?: z.ZodTypeAny[] } }; - }; - const unionOptions = schemaWithOptions._zod?.def?.options; + const unionSchema = schema as ZodWithInternals<$ZodUnionInternals>; + const unionOptions = unionSchema._zod.def.options; if (!unionOptions || unionOptions.length === 0) { return [schema, []]; } @@ -383,11 +347,10 @@ export function transformSchema( // 6) If it's an intersection, transform left and right if (isKind(schema, "intersection")) { - const schemaWithIntersection = schema as unknown as { - _zod?: { def?: { left?: z.ZodTypeAny; right?: z.ZodTypeAny } }; - }; - const leftType = schemaWithIntersection._zod?.def?.left; - const rightType = schemaWithIntersection._zod?.def?.right; + const intersectionSchema = + schema as ZodWithInternals<$ZodIntersectionInternals>; + const leftType = intersectionSchema._zod.def.left as z.ZodTypeAny; + const rightType = intersectionSchema._zod.def.right as z.ZodTypeAny; if (!leftType || !rightType) { return [schema, []]; } @@ -410,10 +373,8 @@ export function transformSchema( // 7) If it's optional, transform inner if (isKind(schema, "optional")) { - const schemaWithInner = schema as unknown as { - _zod?: { def?: { innerType?: z.ZodTypeAny } }; - }; - const innerType = schemaWithInner._zod?.def?.innerType; + const optionalSchema = schema as ZodWithInternals<$ZodOptionalInternals>; + const innerType = optionalSchema._zod.def.innerType as z.ZodTypeAny; if (!innerType) { return [schema, []]; } @@ -426,10 +387,8 @@ export function transformSchema( // 8) If it's nullable, transform inner if (isKind(schema, "nullable")) { - const schemaWithInner = schema as unknown as { - _zod?: { def?: { innerType?: z.ZodTypeAny } }; - }; - const innerType = schemaWithInner._zod?.def?.innerType; + const nullableSchema = schema as ZodWithInternals<$ZodNullableInternals>; + const innerType = nullableSchema._zod.def.innerType as z.ZodTypeAny; if (!innerType) { return [schema, []]; } @@ -442,11 +401,9 @@ export function transformSchema( // 9) If it's a pipe (which is what .transform() creates in Zod 4) if (isKind(schema, "pipe")) { - const schemaWithPipe = schema as unknown as { - _zod?: { def?: { in?: z.ZodTypeAny; out?: z.ZodTypeAny } }; - }; - const inSchema = schemaWithPipe._zod?.def?.in; - const outSchema = schemaWithPipe._zod?.def?.out; + const pipeSchema = schema as ZodWithInternals<$ZodPipeInternals>; + const inSchema = pipeSchema._zod.def.in as z.ZodTypeAny; + const outSchema = pipeSchema._zod.def.out as z.ZodTypeAny; if (!inSchema || !outSchema) { return [schema, []]; } @@ -536,12 +493,9 @@ function isKind(s: z.ZodTypeAny, kind: string): boolean { } function makeIdStringSchema(orig: z.ZodString): z.ZodString { + // In Zod 4, description is accessed via .description property const userDesc = - // Zod ≥3.23 exposes .description directly; fall back to _def for older minor versions - (orig as unknown as { description?: string }).description ?? - (orig as unknown as { _def?: { description?: string } })._def - ?.description ?? - ""; + (orig as unknown as { description?: string }).description ?? ""; const base = "This field must be the element-ID in the form 'frameId-backendId' " + From e9d554831a0523199be3234594fc224728da62a8 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Wed, 22 Oct 2025 10:52:30 -0700 Subject: [PATCH 03/38] add comment --- packages/core/lib/utils.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/core/lib/utils.ts b/packages/core/lib/utils.ts index b2c039b7c..a0ad6b111 100644 --- a/packages/core/lib/utils.ts +++ b/packages/core/lib/utils.ts @@ -4,6 +4,16 @@ import { z, ZodTypeAny } from "zod"; import { LogLine } from "./v3/types/public/logs"; import { ModelProvider } from "./v3/types/public/model"; import { ZodPathSegments } from "./v3/types/private/internal"; + +/** + * Zod 4 Internal Types + * + * We import these from zod/v4/core to access the internal structure of Zod schemas. + * Note: zod/v4/core uses `$ZodType` while the main zod module uses `z.ZodTypeAny`. + * These are functionally identical at runtime but TypeScript sees them as incompatible types. + * Therefore, when extracting properties from these internals (e.g., `def.element`, `def.innerType`), + * we must cast them to `z.ZodTypeAny` to work with the public Zod API. + */ import type { $ZodArrayInternals, $ZodObjectInternals, From 3306f21d4938a0c7fc10d22a60756cfb0dc27974 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Wed, 22 Oct 2025 11:04:07 -0700 Subject: [PATCH 04/38] remove logging --- packages/core/lib/utils.ts | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/packages/core/lib/utils.ts b/packages/core/lib/utils.ts index a0ad6b111..7a684e0a8 100644 --- a/packages/core/lib/utils.ts +++ b/packages/core/lib/utils.ts @@ -72,16 +72,7 @@ function decorateGeminiSchema( } export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { - let zodType: string; - try { - zodType = getZodType(zodSchema); - } catch (error) { - console.error("Error getting Zod type:", error); - console.error("Schema object keys:", Object.keys(zodSchema)); - console.error("Schema:", zodSchema); - throw error; - } - + const zodType = getZodType(zodSchema); switch (zodType) { case "array": { const arraySchema = zodSchema as ZodWithInternals<$ZodArrayInternals>; @@ -230,12 +221,6 @@ export function transformSchema( // 1) If it's a URL type (z.url() in Zod 4), convert to ID string pattern if (isKind(schema, "url")) { const transformed = makeIdStringSchema(schema as z.ZodString); - console.log("[transformSchema] Found URL type, transforming to ID pattern"); - console.log("[transformSchema] Original schema type:", getZodType(schema)); - console.log( - "[transformSchema] Transformed schema type:", - getZodType(transformed), - ); return [transformed, [{ segments: [] }]]; } @@ -289,8 +274,6 @@ export function transformSchema( if (changed) { const newSchema = z.object(newShape); - console.log("[transformSchema] Reconstructed object with changed fields"); - console.log("[transformSchema] URL paths found:", urlPaths); return [newSchema, urlPaths]; } return [schema, urlPaths]; @@ -314,9 +297,6 @@ export function transformSchema( if (changed) { const newSchema = z.array(transformedItem); - console.log( - "[transformSchema] Reconstructed array with changed item type", - ); return [newSchema, arrayPaths]; } return [schema, arrayPaths]; From c5c8c62a3fba93c6a2f0a428b97ae7e2158d73a2 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Wed, 22 Oct 2025 11:04:37 -0700 Subject: [PATCH 05/38] rm --- packages/core/lib/utils.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/core/lib/utils.ts b/packages/core/lib/utils.ts index 7a684e0a8..a0376761f 100644 --- a/packages/core/lib/utils.ts +++ b/packages/core/lib/utils.ts @@ -407,9 +407,6 @@ export function transformSchema( // Reconstruct the pipe with transformed schemas // In Zod 4, we use z.pipe() to create pipes const result = z.pipe(newIn as never, newOut as never) as z.ZodTypeAny; - - // Note: Transform functions from the original pipe are not preserved - // This is a limitation of the current implementation return [result, allPaths]; } return [schema, allPaths]; From 0a791271f81bb5f0dd83af8c675b72d85e6e37eb Mon Sep 17 00:00:00 2001 From: tkattkat Date: Wed, 22 Oct 2025 11:07:31 -0700 Subject: [PATCH 06/38] clean --- packages/core/lib/utils.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/core/lib/utils.ts b/packages/core/lib/utils.ts index a0376761f..3da917f5a 100644 --- a/packages/core/lib/utils.ts +++ b/packages/core/lib/utils.ts @@ -411,9 +411,6 @@ export function transformSchema( } return [schema, allPaths]; } - - // 10) For any other type (including standalone transforms), return as-is - // Standalone transforms (z.transform(fn)) don't have nested schemas to recurse into return [schema, []]; } @@ -480,7 +477,6 @@ function isKind(s: z.ZodTypeAny, kind: string): boolean { } function makeIdStringSchema(orig: z.ZodString): z.ZodString { - // In Zod 4, description is accessed via .description property const userDesc = (orig as unknown as { description?: string }).description ?? ""; From 6e18601bf91d2d8d20eb03499ddad4a0742825b0 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Wed, 22 Oct 2025 11:09:11 -0700 Subject: [PATCH 07/38] rm --- packages/core/lib/utils.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/lib/utils.ts b/packages/core/lib/utils.ts index 3da917f5a..ce0155d6f 100644 --- a/packages/core/lib/utils.ts +++ b/packages/core/lib/utils.ts @@ -109,7 +109,6 @@ export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { } case "string": case "url": - // URL type in Zod 4 is still a string at the schema level return decorateGeminiSchema( { type: Type.STRING, From ed6e6eb0c15b644d897c2c32dab6b6456841dbdb Mon Sep 17 00:00:00 2001 From: tkattkat Date: Tue, 28 Oct 2025 12:41:25 -0700 Subject: [PATCH 08/38] remove json schema to zod --- .../core/examples/custom_client_langchain.ts | 2 + .../examples/external_clients/langchain.ts | 7 +- .../v3/agent/utils/googleCustomToolHandler.ts | 5 +- packages/core/lib/v3/api.ts | 7 +- packages/core/lib/v3/types/private/api.ts | 2 +- packages/core/package.json | 5 +- packages/evals/package.json | 2 +- pnpm-lock.yaml | 230 ++++++++---------- 8 files changed, 120 insertions(+), 140 deletions(-) diff --git a/packages/core/examples/custom_client_langchain.ts b/packages/core/examples/custom_client_langchain.ts index 5a9604374..3f1f1c62f 100644 --- a/packages/core/examples/custom_client_langchain.ts +++ b/packages/core/examples/custom_client_langchain.ts @@ -9,9 +9,11 @@ import { LangchainClient } from "./external_clients/langchain"; import { ChatOpenAI } from "@langchain/openai"; async function example() { + // @ts-expect-error Type instantiation is excessively deep and possibly infinite const stagehand = new Stagehand({ env: "BROWSERBASE", verbose: 1, + // @ts-expect-error Type instantiation is excessively deep and possibly infinite llmClient: new LangchainClient( new ChatOpenAI({ model: "gpt-4o", diff --git a/packages/core/examples/external_clients/langchain.ts b/packages/core/examples/external_clients/langchain.ts index 8bb6b9566..7950fd9af 100644 --- a/packages/core/examples/external_clients/langchain.ts +++ b/packages/core/examples/external_clients/langchain.ts @@ -4,7 +4,7 @@ import { LLMClient, AvailableModel, } from "../../lib/v3"; -import { zodToJsonSchema } from "zod-to-json-schema"; +import { z } from "zod"; import { AIMessage, BaseMessageLike, @@ -60,9 +60,8 @@ export class LangchainClient extends LLMClient { ); if (options.response_model) { - const responseSchema = zodToJsonSchema(options.response_model.schema, { - $refStrategy: "none", - }); + //ref string no longer needed, this is now default behavior + const responseSchema = z.toJSONSchema(options.response_model.schema); const structuredModel = this.model.withStructuredOutput(responseSchema); const response = await structuredModel.invoke(formattedMessages); diff --git a/packages/core/lib/v3/agent/utils/googleCustomToolHandler.ts b/packages/core/lib/v3/agent/utils/googleCustomToolHandler.ts index 3343c775b..9cf709e55 100644 --- a/packages/core/lib/v3/agent/utils/googleCustomToolHandler.ts +++ b/packages/core/lib/v3/agent/utils/googleCustomToolHandler.ts @@ -1,8 +1,7 @@ import { Part, FunctionCall, FunctionDeclaration, Type } from "@google/genai"; import { ToolSet } from "ai"; import { LogLine } from "../../types/public/logs"; -import { zodToJsonSchema } from "zod-to-json-schema"; -import { z } from "zod/v3"; +import { z } from "zod"; /** * Result of executing a custom tool for Google CUA @@ -122,7 +121,7 @@ function convertToolToFunctionDeclaration( ): FunctionDeclaration | null { try { // Convert Zod schema to JSON schema - const jsonSchema = zodToJsonSchema(tool.inputSchema as z.ZodType) as { + const jsonSchema = z.toJSONSchema(tool.inputSchema as z.ZodType) as { properties?: Record; required?: string[]; type?: string; diff --git a/packages/core/lib/v3/api.ts b/packages/core/lib/v3/api.ts index c38629e91..fca9ab21b 100644 --- a/packages/core/lib/v3/api.ts +++ b/packages/core/lib/v3/api.ts @@ -1,6 +1,5 @@ import makeFetchCookie from "fetch-cookie"; -import zodToJsonSchema from "zod-to-json-schema"; -import z from "zod/v3"; +import { z } from "zod"; import { Action } from "./types/public"; import { STAGEHAND_VERSION } from "../version"; import { @@ -132,13 +131,13 @@ export class StagehandAPIClient { }); } - async extract({ + async extract({ instruction, schema: zodSchema, options, frameId, }: APIExtractParameters): Promise> { - const jsonSchema = zodSchema ? zodToJsonSchema(zodSchema) : undefined; + const jsonSchema = zodSchema ? z.toJSONSchema(zodSchema) : undefined; const args: Record = { schema: jsonSchema, diff --git a/packages/core/lib/v3/types/private/api.ts b/packages/core/lib/v3/types/private/api.ts index 643ef3fcb..204c9f0f2 100644 --- a/packages/core/lib/v3/types/private/api.ts +++ b/packages/core/lib/v3/types/private/api.ts @@ -1,5 +1,5 @@ import Browserbase from "@browserbasehq/sdk"; -import { ZodTypeAny } from "zod/v3"; +import { ZodTypeAny } from "zod"; import { Action, ActOptions, diff --git a/packages/core/package.json b/packages/core/package.json index 785a4f6ac..7b01551de 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -36,7 +36,7 @@ "peerDependencies": { "deepmerge": "^4.3.1", "dotenv": "^16.4.5", - "zod": "4.0.0" + "zod": "^4.1.8" }, "dependencies": { "@ai-sdk/provider": "^2.0.0", @@ -52,8 +52,7 @@ "pino": "^9.6.0", "pino-pretty": "^13.0.0", "playwright": "^1.52.0", - "ws": "^8.18.0", - "zod-to-json-schema": "^3.23.5" + "ws": "^8.18.0" }, "optionalDependencies": { "@ai-sdk/anthropic": "^2.0.34", diff --git a/packages/evals/package.json b/packages/evals/package.json index f691b12fb..b92793931 100644 --- a/packages/evals/package.json +++ b/packages/evals/package.json @@ -19,7 +19,7 @@ "@ai-sdk/provider": "^2.0.0", "openai": "^4.87.1", "dotenv": "16.4.5", - "zod": "3.25.67" + "zod": "^4.1.8" }, "devDependencies": { "tsx": "^4.10.5" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8c9d55a0f..4f72da145 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -124,13 +124,13 @@ importers: version: 1.24.0(@modelcontextprotocol/sdk@1.17.2) '@langchain/openai': specifier: ^0.4.4 - version: 0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.0.0)))(ws@8.18.3) + version: 0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)))(ws@8.18.3) '@modelcontextprotocol/sdk': specifier: ^1.17.2 version: 1.17.2 ai: specifier: ^5.0.0 - version: 5.0.76(zod@4.0.0) + version: 5.0.76(zod@4.1.12) deepmerge: specifier: ^4.3.1 version: 4.3.1 @@ -145,7 +145,7 @@ importers: version: 3.1.0 openai: specifier: ^4.87.1 - version: 4.96.2(ws@8.18.3)(zod@4.0.0) + version: 4.96.2(ws@8.18.3)(zod@4.1.12) pino: specifier: ^9.6.0 version: 9.6.0 @@ -159,54 +159,54 @@ importers: specifier: ^8.18.0 version: 8.18.3 zod: - specifier: 4.0.0 - version: 4.0.0 + specifier: ^4.1.8 + version: 4.1.12 zod-to-json-schema: specifier: ^3.23.5 - version: 3.24.5(zod@4.0.0) + version: 3.24.5(zod@4.1.12) optionalDependencies: '@ai-sdk/anthropic': specifier: ^2.0.34 - version: 2.0.34(zod@4.0.0) + version: 2.0.34(zod@4.1.12) '@ai-sdk/azure': specifier: ^2.0.54 - version: 2.0.54(zod@4.0.0) + version: 2.0.54(zod@4.1.12) '@ai-sdk/cerebras': specifier: ^1.0.25 - version: 1.0.25(zod@4.0.0) + version: 1.0.25(zod@4.1.12) '@ai-sdk/deepseek': specifier: ^1.0.23 - version: 1.0.23(zod@4.0.0) + version: 1.0.23(zod@4.1.12) '@ai-sdk/google': specifier: ^2.0.23 - version: 2.0.23(zod@4.0.0) + version: 2.0.23(zod@4.1.12) '@ai-sdk/groq': specifier: ^2.0.24 - version: 2.0.24(zod@4.0.0) + version: 2.0.24(zod@4.1.12) '@ai-sdk/mistral': specifier: ^2.0.19 - version: 2.0.19(zod@4.0.0) + version: 2.0.19(zod@4.1.12) '@ai-sdk/openai': specifier: ^2.0.53 - version: 2.0.53(zod@4.0.0) + version: 2.0.53(zod@4.1.12) '@ai-sdk/perplexity': specifier: ^2.0.13 - version: 2.0.13(zod@4.0.0) + version: 2.0.13(zod@4.1.12) '@ai-sdk/togetherai': specifier: ^1.0.23 - version: 1.0.23(zod@4.0.0) + version: 1.0.23(zod@4.1.12) '@ai-sdk/xai': specifier: ^2.0.26 - version: 2.0.26(zod@4.0.0) + version: 2.0.26(zod@4.1.12) '@langchain/core': specifier: ^0.3.40 - version: 0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.0.0)) + version: 0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) chrome-launcher: specifier: ^1.2.0 version: 1.2.0 ollama-ai-provider-v2: specifier: ^1.5.0 - version: 1.5.0(zod@4.0.0) + version: 1.5.0(zod@4.1.12) patchright-core: specifier: ^1.55.2 version: 1.55.2 @@ -258,16 +258,16 @@ importers: version: link:../core ai: specifier: ^5.0.0 - version: 5.0.76(zod@3.25.67) + version: 5.0.76(zod@4.1.12) dotenv: specifier: 16.4.5 version: 16.4.5 openai: specifier: ^4.87.1 - version: 4.96.2(ws@8.18.3)(zod@3.25.67) + version: 4.96.2(ws@8.18.3)(zod@4.1.12) zod: - specifier: 3.25.67 - version: 3.25.67 + specifier: ^4.1.8 + version: 4.1.12 devDependencies: tsx: specifier: ^4.10.5 @@ -5493,114 +5493,100 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.0.0: - resolution: {integrity: sha512-9diLdTPc/L7w/5jI4C3gHYNiGHDV9IZYxo1e5LSD8cabi65WVTWWb+g2BGPEpUUCOxR4D+6O5B0AzyMdUAXwrw==} + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@ai-sdk/anthropic@2.0.34(zod@4.0.0)': + '@ai-sdk/anthropic@2.0.34(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - zod: 4.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true - '@ai-sdk/azure@2.0.54(zod@4.0.0)': + '@ai-sdk/azure@2.0.54(zod@4.1.12)': dependencies: - '@ai-sdk/openai': 2.0.53(zod@4.0.0) + '@ai-sdk/openai': 2.0.53(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - zod: 4.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true - '@ai-sdk/cerebras@1.0.25(zod@4.0.0)': + '@ai-sdk/cerebras@1.0.25(zod@4.1.12)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@4.0.0) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - zod: 4.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true - '@ai-sdk/deepseek@1.0.23(zod@4.0.0)': + '@ai-sdk/deepseek@1.0.23(zod@4.1.12)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@4.0.0) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - zod: 4.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true - '@ai-sdk/gateway@2.0.0(zod@3.25.67)': + '@ai-sdk/gateway@2.0.0(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) '@vercel/oidc': 3.0.3 - zod: 3.25.67 - - '@ai-sdk/gateway@2.0.0(zod@4.0.0)': - dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - '@vercel/oidc': 3.0.3 - zod: 4.0.0 + zod: 4.1.12 - '@ai-sdk/google@2.0.23(zod@4.0.0)': + '@ai-sdk/google@2.0.23(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - zod: 4.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true - '@ai-sdk/groq@2.0.24(zod@4.0.0)': + '@ai-sdk/groq@2.0.24(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - zod: 4.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true - '@ai-sdk/mistral@2.0.19(zod@4.0.0)': + '@ai-sdk/mistral@2.0.19(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - zod: 4.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true - '@ai-sdk/openai-compatible@1.0.22(zod@4.0.0)': + '@ai-sdk/openai-compatible@1.0.22(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - zod: 4.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true - '@ai-sdk/openai@2.0.53(zod@4.0.0)': + '@ai-sdk/openai@2.0.53(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - zod: 4.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true - '@ai-sdk/perplexity@2.0.13(zod@4.0.0)': + '@ai-sdk/perplexity@2.0.13(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - zod: 4.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true - '@ai-sdk/provider-utils@3.0.12(zod@3.25.67)': + '@ai-sdk/provider-utils@3.0.12(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 '@standard-schema/spec': 1.0.0 eventsource-parser: 3.0.6 - zod: 3.25.67 - - '@ai-sdk/provider-utils@3.0.12(zod@4.0.0)': - dependencies: - '@ai-sdk/provider': 2.0.0 - '@standard-schema/spec': 1.0.0 - eventsource-parser: 3.0.6 - zod: 4.0.0 + zod: 4.1.12 '@ai-sdk/provider@1.1.3': dependencies: @@ -5610,20 +5596,20 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/togetherai@1.0.23(zod@4.0.0)': + '@ai-sdk/togetherai@1.0.23(zod@4.1.12)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@4.0.0) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - zod: 4.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true - '@ai-sdk/xai@2.0.26(zod@4.0.0)': + '@ai-sdk/xai@2.0.26(zod@4.1.12)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@4.0.0) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - zod: 4.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true '@alcalzone/ansi-tokenize@0.1.3': @@ -5651,10 +5637,10 @@ snapshots: '@ark/util@0.46.0': {} - '@asteasolutions/zod-to-openapi@6.4.0(zod@3.25.67)': + '@asteasolutions/zod-to-openapi@6.4.0(zod@3.25.76)': dependencies: openapi3-ts: 4.4.0 - zod: 3.25.67 + zod: 3.25.76 '@asyncapi/parser@3.4.0': dependencies: @@ -5696,9 +5682,9 @@ snapshots: '@braintrust/core@0.0.34': dependencies: - '@asteasolutions/zod-to-openapi': 6.4.0(zod@3.25.67) + '@asteasolutions/zod-to-openapi': 6.4.0(zod@3.25.76) uuid: 9.0.1 - zod: 3.25.67 + zod: 3.25.76 '@browserbasehq/sdk@2.5.0': dependencies: @@ -6416,25 +6402,25 @@ snapshots: p-queue: 6.6.2 p-retry: 4.6.2 uuid: 10.0.0 - zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod: 3.25.76 + zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: - openai - '@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.0.0))': + '@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12))': dependencies: '@cfworker/json-schema': 4.1.1 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.20 - langsmith: 0.3.23(openai@4.96.2(ws@8.18.3)(zod@4.0.0)) + langsmith: 0.3.23(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 uuid: 10.0.0 - zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod: 3.25.76 + zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: - openai @@ -6449,9 +6435,9 @@ snapshots: - encoding - ws - '@langchain/openai@0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.0.0)))(ws@8.18.3)': + '@langchain/openai@0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.0.0)) + '@langchain/core': 0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) js-tiktoken: 1.0.20 openai: 4.96.2(ws@8.18.3)(zod@3.25.67) zod: 3.25.67 @@ -6737,7 +6723,7 @@ snapshots: unified: 11.0.5 unist-util-visit: 5.0.0 yargs: 17.7.2 - zod: 3.25.67 + zod: 3.25.76 transitivePeerDependencies: - '@types/react' - bare-buffer @@ -6758,8 +6744,8 @@ snapshots: lcm: 0.0.3 lodash: 4.17.21 openapi-types: 12.1.3 - zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod: 3.25.76 + zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: - debug @@ -6775,8 +6761,8 @@ snapshots: express-rate-limit: 7.5.1(express@5.1.0) pkce-challenge: 5.0.0 raw-body: 3.0.0 - zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod: 3.25.76 + zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: - supports-color @@ -7337,21 +7323,13 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ai@5.0.76(zod@3.25.67): + ai@5.0.76(zod@4.1.12): dependencies: - '@ai-sdk/gateway': 2.0.0(zod@3.25.67) + '@ai-sdk/gateway': 2.0.0(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) '@opentelemetry/api': 1.9.0 - zod: 3.25.67 - - ai@5.0.76(zod@4.0.0): - dependencies: - '@ai-sdk/gateway': 2.0.0(zod@4.0.0) - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - '@opentelemetry/api': 1.9.0 - zod: 4.0.0 + zod: 4.1.12 ajv-draft-04@1.0.0(ajv@8.17.1): optionalDependencies: @@ -9502,7 +9480,7 @@ snapshots: optionalDependencies: openai: 4.96.2(ws@8.18.3)(zod@3.25.67) - langsmith@0.3.23(openai@4.96.2(ws@8.18.3)(zod@4.0.0)): + langsmith@0.3.23(openai@4.96.2(ws@8.18.3)(zod@4.1.12)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 @@ -9512,7 +9490,7 @@ snapshots: semver: 7.7.1 uuid: 10.0.0 optionalDependencies: - openai: 4.96.2(ws@8.18.3)(zod@4.0.0) + openai: 4.96.2(ws@8.18.3)(zod@4.1.12) lcm@0.0.3: dependencies: @@ -10278,11 +10256,11 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - ollama-ai-provider-v2@1.5.0(zod@4.0.0): + ollama-ai-provider-v2@1.5.0(zod@4.1.12): dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.0.0) - zod: 4.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true on-exit-leak-free@2.1.2: {} @@ -10342,7 +10320,7 @@ snapshots: transitivePeerDependencies: - encoding - openai@4.96.2(ws@8.18.3)(zod@4.0.0): + openai@4.96.2(ws@8.18.3)(zod@4.1.12): dependencies: '@types/node': 18.19.87 '@types/node-fetch': 2.6.12 @@ -10353,7 +10331,7 @@ snapshots: node-fetch: 2.7.0 optionalDependencies: ws: 8.18.3 - zod: 4.0.0 + zod: 4.1.12 transitivePeerDependencies: - encoding @@ -12028,9 +12006,13 @@ snapshots: dependencies: zod: 3.25.67 - zod-to-json-schema@3.24.5(zod@4.0.0): + zod-to-json-schema@3.24.5(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod-to-json-schema@3.24.5(zod@4.1.12): dependencies: - zod: 4.0.0 + zod: 4.1.12 zod@3.23.8: {} @@ -12038,6 +12020,6 @@ snapshots: zod@3.25.76: {} - zod@4.0.0: {} + zod@4.1.12: {} zwitch@2.0.4: {} From 3998f54ceb2e238a00223be5791cc1e8e3c8baae Mon Sep 17 00:00:00 2001 From: tkattkat Date: Tue, 28 Oct 2025 13:16:44 -0700 Subject: [PATCH 09/38] remove zod to schema --- packages/core/lib/v3/agent/AnthropicCUAClient.ts | 3 +-- packages/core/lib/v3/llm/AnthropicClient.ts | 4 ++-- packages/core/lib/v3/llm/CerebrasClient.ts | 4 ++-- packages/core/lib/v3/llm/GroqClient.ts | 4 ++-- packages/core/lib/v3/llm/OpenAIClient.ts | 4 ++-- pnpm-lock.yaml | 7 ------- 6 files changed, 9 insertions(+), 17 deletions(-) diff --git a/packages/core/lib/v3/agent/AnthropicCUAClient.ts b/packages/core/lib/v3/agent/AnthropicCUAClient.ts index 29a04e719..76d0caaf9 100644 --- a/packages/core/lib/v3/agent/AnthropicCUAClient.ts +++ b/packages/core/lib/v3/agent/AnthropicCUAClient.ts @@ -13,7 +13,6 @@ import { LogLine } from "../types/public/logs"; import { AgentScreenshotProviderError } from "../types/public/sdkErrors"; import Anthropic from "@anthropic-ai/sdk"; import { ToolSet } from "ai"; -import { zodToJsonSchema } from "zod-to-json-schema"; import { z } from "zod"; import { AgentClient } from "./AgentClient"; import { mapKeyToPlaywright } from "./utils/cuaKeyMapping"; @@ -444,7 +443,7 @@ export class AnthropicCUAClient extends AgentClient { if (this.tools && Object.keys(this.tools).length > 0) { const customTools = Object.entries(this.tools).map(([name, tool]) => { // Convert Zod schema to proper JSON schema format for Anthropic - const jsonSchema = zodToJsonSchema(tool.inputSchema as z.ZodType) as { + const jsonSchema = z.toJSONSchema(tool.inputSchema as z.ZodType) as { properties?: Record; required?: string[]; }; diff --git a/packages/core/lib/v3/llm/AnthropicClient.ts b/packages/core/lib/v3/llm/AnthropicClient.ts index 2a06e8219..ce8a6326e 100644 --- a/packages/core/lib/v3/llm/AnthropicClient.ts +++ b/packages/core/lib/v3/llm/AnthropicClient.ts @@ -5,7 +5,7 @@ import { TextBlockParam, Tool, } from "@anthropic-ai/sdk/resources"; -import { zodToJsonSchema } from "zod-to-json-schema"; +import { z } from "zod"; import { LogLine } from "../types/public/logs"; import { AnthropicJsonSchemaObject, @@ -145,7 +145,7 @@ export class AnthropicClient extends LLMClient { let toolDefinition: Tool | undefined; if (options.response_model) { - const jsonSchema = zodToJsonSchema(options.response_model.schema); + const jsonSchema = z.toJSONSchema(options.response_model.schema); const { properties: schemaProperties, required: schemaRequired } = extractSchemaProperties(jsonSchema); diff --git a/packages/core/lib/v3/llm/CerebrasClient.ts b/packages/core/lib/v3/llm/CerebrasClient.ts index cfbc56051..ad4d6e6c3 100644 --- a/packages/core/lib/v3/llm/CerebrasClient.ts +++ b/packages/core/lib/v3/llm/CerebrasClient.ts @@ -1,6 +1,6 @@ import OpenAI from "openai"; import type { ClientOptions } from "openai"; -import { zodToJsonSchema } from "zod-to-json-schema"; +import { z } from "zod"; import { LogLine } from "../types/public/logs"; import { AvailableModel } from "../types/public/model"; import { @@ -100,7 +100,7 @@ export class CerebrasClient extends LLMClient { // Add response model as a tool if provided if (options.response_model) { - const jsonSchema = zodToJsonSchema(options.response_model.schema) as { + const jsonSchema = z.toJSONSchema(options.response_model.schema) as { properties?: Record; required?: string[]; }; diff --git a/packages/core/lib/v3/llm/GroqClient.ts b/packages/core/lib/v3/llm/GroqClient.ts index af967295e..229e22652 100644 --- a/packages/core/lib/v3/llm/GroqClient.ts +++ b/packages/core/lib/v3/llm/GroqClient.ts @@ -1,6 +1,6 @@ import type { ClientOptions } from "openai"; import OpenAI from "openai"; -import { zodToJsonSchema } from "zod-to-json-schema"; +import { z } from "zod"; import { LogLine } from "../types/public/logs"; import { AvailableModel } from "../types/public/model"; import { @@ -100,7 +100,7 @@ export class GroqClient extends LLMClient { // Add response model as a tool if provided if (options.response_model) { - const jsonSchema = zodToJsonSchema(options.response_model.schema) as { + const jsonSchema = z.toJSONSchema(options.response_model.schema) as { properties?: Record; required?: string[]; }; diff --git a/packages/core/lib/v3/llm/OpenAIClient.ts b/packages/core/lib/v3/llm/OpenAIClient.ts index ba1d052cb..cf68c9eb9 100644 --- a/packages/core/lib/v3/llm/OpenAIClient.ts +++ b/packages/core/lib/v3/llm/OpenAIClient.ts @@ -9,10 +9,10 @@ import { ChatCompletionSystemMessageParam, ChatCompletionUserMessageParam, } from "openai/resources/chat"; -import zodToJsonSchema from "zod-to-json-schema"; import { LogLine } from "../types/public/logs"; import { AvailableModel } from "../types/public/model"; import { validateZodSchema } from "../../utils"; +import { z } from "zod"; import { ChatCompletionOptions, ChatMessage, @@ -158,7 +158,7 @@ export class OpenAIClient extends LLMClient { if (this.modelName.startsWith("o1") || this.modelName.startsWith("o3")) { try { const parsedSchema = JSON.stringify( - zodToJsonSchema(options.response_model.schema), + z.toJSONSchema(options.response_model.schema), ); options.messages.push({ role: "user", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4f72da145..37f0d3c98 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -161,9 +161,6 @@ importers: zod: specifier: ^4.1.8 version: 4.1.12 - zod-to-json-schema: - specifier: ^3.23.5 - version: 3.24.5(zod@4.1.12) optionalDependencies: '@ai-sdk/anthropic': specifier: ^2.0.34 @@ -12010,10 +12007,6 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-json-schema@3.24.5(zod@4.1.12): - dependencies: - zod: 4.1.12 - zod@3.23.8: {} zod@3.25.67: {} From 6e0075936b83233f1f47d98a41a3212bb0efba08 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Tue, 28 Oct 2025 13:18:01 -0700 Subject: [PATCH 10/38] remove zod v3 --- packages/core/lib/v3/tests/timeouts.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/lib/v3/tests/timeouts.spec.ts b/packages/core/lib/v3/tests/timeouts.spec.ts index 605904e96..623b11ea2 100644 --- a/packages/core/lib/v3/tests/timeouts.spec.ts +++ b/packages/core/lib/v3/tests/timeouts.spec.ts @@ -1,7 +1,7 @@ import { test, expect } from "@playwright/test"; import { V3 } from "../v3"; import { v3DynamicTestConfig } from "./v3.dynamic.config"; -import { z } from "zod/v3"; +import { z } from "zod"; test.describe("V3 hard timeouts", () => { let v3: V3; From b15fd50b06c6e6398c753e1ebf3dfbd6eec4b67a Mon Sep 17 00:00:00 2001 From: tkattkat Date: Tue, 28 Oct 2025 13:40:42 -0700 Subject: [PATCH 11/38] move zod out of peer dependencies --- packages/core/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index a30bba1cf..831d31fd2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -38,8 +38,7 @@ "license": "MIT", "peerDependencies": { "deepmerge": "^4.3.1", - "dotenv": "^16.4.5", - "zod": "^4.1.8" + "dotenv": "^16.4.5" }, "dependencies": { "@ai-sdk/provider": "^2.0.0", @@ -55,7 +54,8 @@ "pino": "^9.6.0", "pino-pretty": "^13.0.0", "playwright": "^1.52.0", - "ws": "^8.18.0" + "ws": "^8.18.0", + "zod": "^4.1.8" }, "optionalDependencies": { "@ai-sdk/anthropic": "^2.0.34", From 465886043532e38e1f8c1d76b9e77d95bac676a1 Mon Sep 17 00:00:00 2001 From: miguel Date: Tue, 28 Oct 2025 14:10:37 -0700 Subject: [PATCH 12/38] test release --- packages/core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/package.json b/packages/core/package.json index 831d31fd2..72b239b8c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@browserbasehq/orca", - "version": "3.0.0-preview.7", + "version": "3.0.0-test.1", "description": "An AI web browsing framework focused on simplicity and extensibility.", "main": "./dist/index.js", "module": "./dist/index.js", From b34151530c42e2aaf02a45a289756ea8558bea9f Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 3 Nov 2025 12:01:02 -0800 Subject: [PATCH 13/38] revert testing changes --- packages/core/examples/v3/targetedExtract.ts | 28 +++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/core/examples/v3/targetedExtract.ts b/packages/core/examples/v3/targetedExtract.ts index a54134c73..9e903ca35 100644 --- a/packages/core/examples/v3/targetedExtract.ts +++ b/packages/core/examples/v3/targetedExtract.ts @@ -4,21 +4,23 @@ import { z } from "zod"; async function example(stagehand: Stagehand) { const page = stagehand.context.pages()[0]; await page.goto( - "https://browserbase.github.io/stagehand-eval-sites/sites/jfk/", + "https://ambarc.github.io/web-element-test/stagehand-breaking-test.html", ); - const extraction = await stagehand.extract( - "extract all the record file name and their corresponding links", - z.object({ - records: z.array( - z.object({ - file_name: z.string().describe("the file name of the record"), - link: z.url().describe("the link to the record"), - }), - ), - }), + await page + .deepLocator("/html/body/div[2]/div[3]/iframe/html/body/p") + .highlight({ + durationMs: 5000, + contentColor: { r: 255, g: 0, b: 0 }, + }); + + const reason = await stagehand.extract( + "extract the reason why script injection fails", + z.string(), + // selector: "// body > div.test-container > div:nth-child(3) > iframe >> body > p:nth-child(3)", + { selector: "/html/body/div[2]/div[3]/iframe/html/body/p[2]" }, ); - console.log(extraction); + console.log(reason); } (async () => { @@ -30,4 +32,4 @@ async function example(stagehand: Stagehand) { }); await stagehand.init(); await example(stagehand); -})(); +})(); \ No newline at end of file From f5d2a3124df0de9a3afcf2aed59456550315ad73 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 3 Nov 2025 12:07:15 -0800 Subject: [PATCH 14/38] remove zod version pinning from few examples --- packages/core/examples/agent-custom-tools.ts | 2 +- packages/evals/tasks/agent/google_maps_2.ts | 2 +- packages/evals/types/evals.ts | 2 +- pnpm-lock.yaml | 316 ++++++++++++++----- 4 files changed, 237 insertions(+), 85 deletions(-) diff --git a/packages/core/examples/agent-custom-tools.ts b/packages/core/examples/agent-custom-tools.ts index 115c0f485..ad5d63dc9 100644 --- a/packages/core/examples/agent-custom-tools.ts +++ b/packages/core/examples/agent-custom-tools.ts @@ -1,7 +1,7 @@ /** * This example shows how to pass custom tools to stagehand agent (both CUA and non-CUA) */ -import { z } from "zod/v3"; +import { z } from "zod"; import { tool } from "ai"; import { Stagehand } from "../lib/v3"; import chalk from "chalk"; diff --git a/packages/evals/tasks/agent/google_maps_2.ts b/packages/evals/tasks/agent/google_maps_2.ts index c0fdb45c2..bf0d386b9 100644 --- a/packages/evals/tasks/agent/google_maps_2.ts +++ b/packages/evals/tasks/agent/google_maps_2.ts @@ -1,7 +1,7 @@ import { EvalFunction } from "../../types/evals"; import { V3Evaluator } from "@browserbasehq/stagehand"; import type { AvailableModel } from "@browserbasehq/stagehand"; -import { z } from "zod/v3"; +import { z } from "zod"; export const google_maps_2: EvalFunction = async ({ debugUrl, diff --git a/packages/evals/types/evals.ts b/packages/evals/types/evals.ts index ea5c3ce85..4ccbe1637 100644 --- a/packages/evals/types/evals.ts +++ b/packages/evals/types/evals.ts @@ -1,4 +1,4 @@ -import { z } from "zod/v3"; +import { z } from "zod"; import type { AvailableModel } from "@browserbasehq/stagehand"; import type { LogLine } from "@browserbasehq/stagehand"; import type { AgentInstance } from "@browserbasehq/stagehand"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff5888332..b7b378336 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,16 +19,16 @@ importers: version: 9.25.1 '@langchain/community': specifier: ^1.0.0 - version: 1.0.0(@browserbasehq/sdk@2.5.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.54.2)(deepmerge@4.3.1)(dotenv@16.5.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(zod@3.25.67))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(google-auth-library@9.15.1)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.2)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(playwright@1.54.2)(puppeteer@22.15.0(typescript@5.8.3))(ws@8.18.3) + version: 1.0.0(@browserbasehq/sdk@2.5.0)(@browserbasehq/stagehand@3.0.1(@opentelemetry/api@1.9.0)(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(google-auth-library@9.15.1)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.2)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(playwright@1.54.2)(puppeteer@22.15.0(typescript@5.8.3))(ws@8.18.3) '@langchain/core': specifier: ^0.3.40 - version: 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) + version: 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) '@langchain/langgraph': specifier: ^1.0.1 - version: 1.0.1(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zod-to-json-schema@3.24.5(zod@3.25.67))(zod@3.25.67) + version: 1.0.1(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zod-to-json-schema@3.24.5(zod@3.25.67))(zod@3.25.67) '@langchain/openai': specifier: ^0.4.4 - version: 0.4.9(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3) + version: 0.4.9(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3) '@playwright/test': specifier: ^1.42.1 version: 1.54.2 @@ -67,7 +67,7 @@ importers: version: 1.2.0 chromium-bidi: specifier: ^0.10.0 - version: 0.10.2(devtools-protocol@0.0.1312386) + version: 0.10.2(devtools-protocol@0.0.1464554) esbuild: specifier: ^0.21.4 version: 0.21.5 @@ -130,7 +130,7 @@ importers: version: 1.24.0(@modelcontextprotocol/sdk@1.17.2) '@langchain/openai': specifier: ^0.4.4 - version: 0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)))(ws@8.18.3) + version: 0.4.9(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@4.96.2(ws@8.18.3)(zod@4.1.12)))(ws@8.18.3) '@modelcontextprotocol/sdk': specifier: ^1.17.2 version: 1.17.2 @@ -203,7 +203,7 @@ importers: version: 2.0.26(zod@4.1.12) '@langchain/core': specifier: ^0.3.40 - version: 0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) + version: 0.3.50(@opentelemetry/api@1.9.0)(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) chrome-launcher: specifier: ^1.2.0 version: 1.2.0 @@ -378,9 +378,6 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@anthropic-ai/sdk@0.27.3': - resolution: {integrity: sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==} - '@anthropic-ai/sdk@0.39.0': resolution: {integrity: sha512-eMyDIPRZbt1CCLErRCi3exlAvNkBtRe+kW5vvJyef93PmNr/clstYgHhtvmkxN82nlKgzyGPCyGxrm0JQ1ZIdg==} @@ -419,14 +416,12 @@ packages: '@browserbasehq/sdk@2.5.0': resolution: {integrity: sha512-bcnbYZvm5Ht1nrHUfWDK4crspiTy1ESJYMApsMiOTUnlKOan0ocRD6m7hZH34iSC2c2XWsoryR80cwsYgCBWzQ==} - '@browserbasehq/stagehand@1.14.0': - resolution: {integrity: sha512-Hi/EzgMFWz+FKyepxHTrqfTPjpsuBS4zRy3e9sbMpBgLPv+9c0R+YZEvS7Bw4mTS66QtvvURRT6zgDGFotthVQ==} + '@browserbasehq/stagehand@3.0.1': + resolution: {integrity: sha512-GfI6qWAGBj3obGvIgi8wbE1e65y29hB7u9FUmlQIz2wUX/izFFchlq+PszafPr9d2q4ZzbqzqNoc9WSjhxT65w==} peerDependencies: - '@playwright/test': ^1.42.1 deepmerge: ^4.3.1 dotenv: ^16.4.5 - openai: ^4.62.1 - zod: ^3.23.8 + zod: 3.25.67 '@cfworker/json-schema@4.1.1': resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} @@ -4078,14 +4073,6 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - langsmith@0.3.23: - resolution: {integrity: sha512-6gfotO1YS3vqznSJutdFmJXL2Vxy27/RV2JA7YTsfWoJtxlmBR/1QE7kMIyEvuoEE5KGFHyZMuAh/fVeiRffLA==} - peerDependencies: - openai: '*' - peerDependenciesMeta: - openai: - optional: true - langsmith@0.3.75: resolution: {integrity: sha512-4cl/KOxq99/c0MtlzXd6rpmOvMUuRHrJTRFzEwz/G+zDygeFm6bbKaa5XRu/VDZs1FsFGKL2WJYNbjFfL2Cg3Q==} peerDependencies: @@ -6114,6 +6101,13 @@ packages: snapshots: + '@ai-sdk/anthropic@2.0.34(zod@3.25.67)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + zod: 3.25.67 + optional: true + '@ai-sdk/anthropic@2.0.34(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6121,6 +6115,14 @@ snapshots: zod: 4.1.12 optional: true + '@ai-sdk/azure@2.0.54(zod@3.25.67)': + dependencies: + '@ai-sdk/openai': 2.0.53(zod@3.25.67) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + zod: 3.25.67 + optional: true + '@ai-sdk/azure@2.0.54(zod@4.1.12)': dependencies: '@ai-sdk/openai': 2.0.53(zod@4.1.12) @@ -6129,6 +6131,14 @@ snapshots: zod: 4.1.12 optional: true + '@ai-sdk/cerebras@1.0.25(zod@3.25.67)': + dependencies: + '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.67) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + zod: 3.25.67 + optional: true + '@ai-sdk/cerebras@1.0.25(zod@4.1.12)': dependencies: '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) @@ -6137,6 +6147,14 @@ snapshots: zod: 4.1.12 optional: true + '@ai-sdk/deepseek@1.0.23(zod@3.25.67)': + dependencies: + '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.67) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + zod: 3.25.67 + optional: true + '@ai-sdk/deepseek@1.0.23(zod@4.1.12)': dependencies: '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) @@ -6145,6 +6163,13 @@ snapshots: zod: 4.1.12 optional: true + '@ai-sdk/gateway@2.0.0(zod@3.25.67)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + '@vercel/oidc': 3.0.3 + zod: 3.25.67 + '@ai-sdk/gateway@2.0.0(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6152,6 +6177,13 @@ snapshots: '@vercel/oidc': 3.0.3 zod: 4.1.12 + '@ai-sdk/google@2.0.23(zod@3.25.67)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + zod: 3.25.67 + optional: true + '@ai-sdk/google@2.0.23(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6159,6 +6191,13 @@ snapshots: zod: 4.1.12 optional: true + '@ai-sdk/groq@2.0.24(zod@3.25.67)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + zod: 3.25.67 + optional: true + '@ai-sdk/groq@2.0.24(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6166,6 +6205,13 @@ snapshots: zod: 4.1.12 optional: true + '@ai-sdk/mistral@2.0.19(zod@3.25.67)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + zod: 3.25.67 + optional: true + '@ai-sdk/mistral@2.0.19(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6173,6 +6219,13 @@ snapshots: zod: 4.1.12 optional: true + '@ai-sdk/openai-compatible@1.0.22(zod@3.25.67)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + zod: 3.25.67 + optional: true + '@ai-sdk/openai-compatible@1.0.22(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6180,6 +6233,13 @@ snapshots: zod: 4.1.12 optional: true + '@ai-sdk/openai@2.0.53(zod@3.25.67)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + zod: 3.25.67 + optional: true + '@ai-sdk/openai@2.0.53(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6187,6 +6247,13 @@ snapshots: zod: 4.1.12 optional: true + '@ai-sdk/perplexity@2.0.13(zod@3.25.67)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + zod: 3.25.67 + optional: true + '@ai-sdk/perplexity@2.0.13(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6194,6 +6261,13 @@ snapshots: zod: 4.1.12 optional: true + '@ai-sdk/provider-utils@3.0.12(zod@3.25.67)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 3.25.67 + '@ai-sdk/provider-utils@3.0.12(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6209,6 +6283,14 @@ snapshots: dependencies: json-schema: 0.4.0 + '@ai-sdk/togetherai@1.0.23(zod@3.25.67)': + dependencies: + '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.67) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + zod: 3.25.67 + optional: true + '@ai-sdk/togetherai@1.0.23(zod@4.1.12)': dependencies: '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) @@ -6217,6 +6299,14 @@ snapshots: zod: 4.1.12 optional: true + '@ai-sdk/xai@2.0.26(zod@3.25.67)': + dependencies: + '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.67) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + zod: 3.25.67 + optional: true + '@ai-sdk/xai@2.0.26(zod@4.1.12)': dependencies: '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) @@ -6232,18 +6322,6 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@anthropic-ai/sdk@0.27.3': - dependencies: - '@types/node': 18.19.87 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.6.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - '@anthropic-ai/sdk@0.39.0': dependencies: '@types/node': 18.19.87 @@ -6323,20 +6401,52 @@ snapshots: transitivePeerDependencies: - encoding - '@browserbasehq/stagehand@1.14.0(@playwright/test@1.54.2)(deepmerge@4.3.1)(dotenv@16.5.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(zod@3.25.67)': + '@browserbasehq/stagehand@3.0.1(@opentelemetry/api@1.9.0)(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67)': dependencies: - '@anthropic-ai/sdk': 0.27.3 + '@ai-sdk/provider': 2.0.0 + '@anthropic-ai/sdk': 0.39.0 '@browserbasehq/sdk': 2.5.0 - '@playwright/test': 1.54.2 + '@google/genai': 1.24.0(@modelcontextprotocol/sdk@1.17.2) + '@langchain/openai': 0.4.9(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3) + '@modelcontextprotocol/sdk': 1.17.2 + ai: 5.0.76(zod@3.25.67) deepmerge: 4.3.1 + devtools-protocol: 0.0.1464554 dotenv: 16.5.0 - openai: 6.7.0(ws@8.18.3)(zod@3.25.67) + fetch-cookie: 3.1.0 + openai: 4.96.2(ws@8.18.3)(zod@3.25.67) + pino: 9.6.0 + pino-pretty: 13.0.0 + playwright: 1.54.2 ws: 8.18.3 zod: 3.25.67 zod-to-json-schema: 3.24.5(zod@3.25.67) + optionalDependencies: + '@ai-sdk/anthropic': 2.0.34(zod@3.25.67) + '@ai-sdk/azure': 2.0.54(zod@3.25.67) + '@ai-sdk/cerebras': 1.0.25(zod@3.25.67) + '@ai-sdk/deepseek': 1.0.23(zod@3.25.67) + '@ai-sdk/google': 2.0.23(zod@3.25.67) + '@ai-sdk/groq': 2.0.24(zod@3.25.67) + '@ai-sdk/mistral': 2.0.19(zod@3.25.67) + '@ai-sdk/openai': 2.0.53(zod@3.25.67) + '@ai-sdk/perplexity': 2.0.13(zod@3.25.67) + '@ai-sdk/togetherai': 1.0.23(zod@3.25.67) + '@ai-sdk/xai': 2.0.26(zod@3.25.67) + '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@4.96.2(ws@8.18.3)(zod@3.25.67)) + chrome-launcher: 1.2.0 + ollama-ai-provider-v2: 1.5.0(zod@3.25.67) + patchright-core: 1.55.2 + playwright-core: 1.54.2 + puppeteer-core: 22.15.0 transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - bare-buffer - bufferutil - encoding + - supports-color - utf-8-validate '@cfworker/json-schema@4.1.1': {} @@ -7040,11 +7150,11 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} - '@langchain/classic@1.0.0(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(ws@8.18.3)': + '@langchain/classic@1.0.0(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) - '@langchain/openai': 1.0.0-alpha.3(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3) - '@langchain/textsplitters': 1.0.0(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67))) + '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) + '@langchain/openai': 1.0.0-alpha.3(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3) + '@langchain/textsplitters': 1.0.0(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))) handlebars: 4.7.8 js-yaml: 4.1.0 jsonpointer: 5.0.1 @@ -7063,13 +7173,13 @@ snapshots: - openai - ws - '@langchain/community@1.0.0(@browserbasehq/sdk@2.5.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.54.2)(deepmerge@4.3.1)(dotenv@16.5.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(zod@3.25.67))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(google-auth-library@9.15.1)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.2)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(playwright@1.54.2)(puppeteer@22.15.0(typescript@5.8.3))(ws@8.18.3)': + '@langchain/community@1.0.0(@browserbasehq/sdk@2.5.0)(@browserbasehq/stagehand@3.0.1(@opentelemetry/api@1.9.0)(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(google-auth-library@9.15.1)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.2)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(playwright@1.54.2)(puppeteer@22.15.0(typescript@5.8.3))(ws@8.18.3)': dependencies: - '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.54.2)(deepmerge@4.3.1)(dotenv@16.5.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(zod@3.25.67) + '@browserbasehq/stagehand': 3.0.1(@opentelemetry/api@1.9.0)(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67) '@ibm-cloud/watsonx-ai': 1.7.0 - '@langchain/classic': 1.0.0(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(ws@8.18.3) - '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) - '@langchain/openai': 1.0.0(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3) + '@langchain/classic': 1.0.0(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(ws@8.18.3) + '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) + '@langchain/openai': 1.0.0(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3) binary-extensions: 2.3.0 expr-eval: 2.0.2 flat: 5.0.2 @@ -7094,14 +7204,14 @@ snapshots: - '@opentelemetry/sdk-trace-base' - peggy - '@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.67))': + '@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@4.96.2(ws@8.18.3)(zod@3.25.67))': dependencies: '@cfworker/json-schema': 4.1.1 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.20 - langsmith: 0.3.23(openai@4.96.2(ws@8.18.3)(zod@3.25.67)) + langsmith: 0.3.75(@opentelemetry/api@1.9.0)(openai@4.96.2(ws@8.18.3)(zod@3.25.67)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -7109,16 +7219,20 @@ snapshots: zod: 3.25.76 zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' - openai + optional: true - '@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12))': + '@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@4.96.2(ws@8.18.3)(zod@4.1.12))': dependencies: '@cfworker/json-schema': 4.1.1 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.20 - langsmith: 0.3.23(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) + langsmith: 0.3.75(@opentelemetry/api@1.9.0)(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -7126,45 +7240,51 @@ snapshots: zod: 3.25.76 zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' - openai - '@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67))': + '@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))': dependencies: '@cfworker/json-schema': 4.1.1 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.20 - langsmith: 0.3.23(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) + langsmith: 0.3.75(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 uuid: 10.0.0 - zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod: 3.25.76 + zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' - openai - '@langchain/langgraph-checkpoint@1.0.0(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))': + '@langchain/langgraph-checkpoint@1.0.0(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))': dependencies: - '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) + '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) uuid: 10.0.0 - '@langchain/langgraph-sdk@1.0.0(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@langchain/langgraph-sdk@1.0.0(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: p-queue: 6.6.2 p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) + '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@langchain/langgraph@1.0.1(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zod-to-json-schema@3.24.5(zod@3.25.67))(zod@3.25.67)': + '@langchain/langgraph@1.0.1(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zod-to-json-schema@3.24.5(zod@3.25.67))(zod@3.25.67)': dependencies: - '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) - '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67))) - '@langchain/langgraph-sdk': 1.0.0(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) + '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))) + '@langchain/langgraph-sdk': 1.0.0(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) uuid: 10.0.0 zod: 3.25.67 optionalDependencies: @@ -7173,9 +7293,9 @@ snapshots: - react - react-dom - '@langchain/openai@0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3)': + '@langchain/openai@0.4.9(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@4.96.2(ws@8.18.3)(zod@4.1.12)))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.67)) + '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) js-tiktoken: 1.0.20 openai: 4.96.2(ws@8.18.3)(zod@3.25.67) zod: 3.25.67 @@ -7184,9 +7304,9 @@ snapshots: - encoding - ws - '@langchain/openai@0.4.9(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3)': + '@langchain/openai@0.4.9(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) + '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) js-tiktoken: 1.0.20 openai: 4.96.2(ws@8.18.3)(zod@3.25.67) zod: 3.25.67 @@ -7195,27 +7315,27 @@ snapshots: - encoding - ws - '@langchain/openai@1.0.0(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3)': + '@langchain/openai@1.0.0(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) + '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) js-tiktoken: 1.0.20 openai: 6.7.0(ws@8.18.3)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - ws - '@langchain/openai@1.0.0-alpha.3(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3)': + '@langchain/openai@1.0.0-alpha.3(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) + '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) js-tiktoken: 1.0.20 openai: 6.7.0(ws@8.18.3)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - ws - '@langchain/textsplitters@1.0.0(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))': + '@langchain/textsplitters@1.0.0(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))': dependencies: - '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) + '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) js-tiktoken: 1.0.20 '@leichtgewicht/ip-codec@2.0.5': {} @@ -8099,6 +8219,14 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 + ai@5.0.76(zod@3.25.67): + dependencies: + '@ai-sdk/gateway': 2.0.0(zod@3.25.67) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + '@opentelemetry/api': 1.9.0 + zod: 3.25.67 + ai@5.0.76(zod@4.1.12): dependencies: '@ai-sdk/gateway': 2.0.0(zod@4.1.12) @@ -8516,9 +8644,9 @@ snapshots: transitivePeerDependencies: - supports-color - chromium-bidi@0.10.2(devtools-protocol@0.0.1312386): + chromium-bidi@0.10.2(devtools-protocol@0.0.1464554): dependencies: - devtools-protocol: 0.0.1312386 + devtools-protocol: 0.0.1464554 mitt: 3.0.1 zod: 3.23.8 @@ -10334,29 +10462,32 @@ snapshots: kind-of@6.0.3: {} - langsmith@0.3.23(openai@4.96.2(ws@8.18.3)(zod@3.25.67)): + langsmith@0.3.75(@opentelemetry/api@1.9.0)(openai@4.96.2(ws@8.18.3)(zod@3.25.67)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 console-table-printer: 2.12.1 p-queue: 6.6.2 p-retry: 4.6.2 - semver: 7.7.1 + semver: 7.7.2 uuid: 10.0.0 optionalDependencies: + '@opentelemetry/api': 1.9.0 openai: 4.96.2(ws@8.18.3)(zod@3.25.67) + optional: true - langsmith@0.3.23(openai@6.7.0(ws@8.18.3)(zod@3.25.67)): + langsmith@0.3.75(@opentelemetry/api@1.9.0)(openai@4.96.2(ws@8.18.3)(zod@4.1.12)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 console-table-printer: 2.12.1 p-queue: 6.6.2 p-retry: 4.6.2 - semver: 7.7.1 + semver: 7.7.2 uuid: 10.0.0 optionalDependencies: - openai: 6.7.0(ws@8.18.3)(zod@3.25.67) + '@opentelemetry/api': 1.9.0 + openai: 4.96.2(ws@8.18.3)(zod@4.1.12) langsmith@0.3.75(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)): dependencies: @@ -10370,7 +10501,6 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 openai: 6.7.0(ws@8.18.3)(zod@3.25.67) - optional: true lcm@0.0.3: dependencies: @@ -11152,6 +11282,13 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 + ollama-ai-provider-v2@1.5.0(zod@3.25.67): + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.67) + zod: 3.25.67 + optional: true + ollama-ai-provider-v2@1.5.0(zod@4.1.12): dependencies: '@ai-sdk/provider': 2.0.0 @@ -11216,6 +11353,21 @@ snapshots: transitivePeerDependencies: - encoding + openai@4.96.2(ws@8.18.3)(zod@4.1.12): + dependencies: + '@types/node': 18.19.87 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + ws: 8.18.3 + zod: 4.1.12 + transitivePeerDependencies: + - encoding + openai@6.7.0(ws@8.18.3)(zod@3.25.67): optionalDependencies: ws: 8.18.3 From 606d0ede56facc070405e7a95256d6f7a001d2b8 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 3 Nov 2025 12:13:40 -0800 Subject: [PATCH 15/38] add changeset --- .changeset/dark-pans-carry.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dark-pans-carry.md diff --git a/.changeset/dark-pans-carry.md b/.changeset/dark-pans-carry.md new file mode 100644 index 000000000..6c2f2b85d --- /dev/null +++ b/.changeset/dark-pans-carry.md @@ -0,0 +1,5 @@ +--- +"@browserbasehq/stagehand": patch +--- + +Migrate from zodv3 to zodv4 From ad1e4618687800af9b50a88c20061620f3048a6c Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 3 Nov 2025 14:11:59 -0800 Subject: [PATCH 16/38] format --- packages/core/examples/v3/targetedExtract.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/examples/v3/targetedExtract.ts b/packages/core/examples/v3/targetedExtract.ts index 9e903ca35..c95c67a99 100644 --- a/packages/core/examples/v3/targetedExtract.ts +++ b/packages/core/examples/v3/targetedExtract.ts @@ -32,4 +32,4 @@ async function example(stagehand: Stagehand) { }); await stagehand.init(); await example(stagehand); -})(); \ No newline at end of file +})(); From 2acd94928a2f4940d0260de30b1ad1bf652e8b2c Mon Sep 17 00:00:00 2001 From: tkattkat Date: Fri, 14 Nov 2025 14:41:35 -0800 Subject: [PATCH 17/38] remove /v3 from record video script --- packages/core/examples/v3/recordVideo.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/examples/v3/recordVideo.ts b/packages/core/examples/v3/recordVideo.ts index aa8e142b7..23c355874 100644 --- a/packages/core/examples/v3/recordVideo.ts +++ b/packages/core/examples/v3/recordVideo.ts @@ -2,7 +2,7 @@ import path from "node:path"; import { mkdir } from "node:fs/promises"; import { Stagehand } from "../../lib/v3"; import { chromium } from "playwright-core"; -import { z } from "zod/v3"; +import { z } from "zod"; async function recordPlaywrightVideo(stagehand: Stagehand): Promise { const browser = await chromium.connectOverCDP({ From 8d70d31c2fbc92c0adb06764786e0b350df4bcf5 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Fri, 14 Nov 2025 16:34:41 -0800 Subject: [PATCH 18/38] zodv34 --- .../examples/external_clients/customOpenAI.ts | 31 +- .../examples/external_clients/langchain.ts | 4 +- packages/core/examples/operator-example.ts | 24 +- packages/core/lib/inference.ts | 7 +- packages/core/lib/utils.ts | 482 ++++++++++++------ .../core/lib/v3/agent/AnthropicCUAClient.ts | 18 +- .../v3/agent/utils/googleCustomToolHandler.ts | 10 +- packages/core/lib/v3/api.ts | 7 +- .../core/lib/v3/handlers/extractHandler.ts | 81 +-- packages/core/lib/v3/llm/AnthropicClient.ts | 4 +- packages/core/lib/v3/llm/CerebrasClient.ts | 4 +- packages/core/lib/v3/llm/GroqClient.ts | 4 +- packages/core/lib/v3/llm/LLMClient.ts | 8 +- packages/core/lib/v3/llm/OpenAIClient.ts | 18 +- packages/core/lib/v3/types/private/api.ts | 4 +- .../core/lib/v3/types/private/handlers.ts | 4 +- packages/core/lib/v3/types/public/methods.ts | 4 +- packages/core/lib/v3/v3.ts | 21 +- packages/core/lib/v3/zodCompat.ts | 55 ++ packages/core/package.json | 8 +- pnpm-lock.yaml | 29 +- 21 files changed, 574 insertions(+), 253 deletions(-) create mode 100644 packages/core/lib/v3/zodCompat.ts diff --git a/packages/core/examples/external_clients/customOpenAI.ts b/packages/core/examples/external_clients/customOpenAI.ts index 40510ecca..3456d4513 100644 --- a/packages/core/examples/external_clients/customOpenAI.ts +++ b/packages/core/examples/external_clients/customOpenAI.ts @@ -22,10 +22,14 @@ import type { ChatCompletionSystemMessageParam, ChatCompletionUserMessageParam, } from "openai/resources/chat/completions"; -import { z } from "zod"; import { CreateChatCompletionResponseError } from "../../lib/v3"; +import { + StagehandZodSchema, + isZod4Schema, + toJsonSchema, +} from "../../lib/v3/zodCompat"; -function validateZodSchema(schema: z.ZodTypeAny, data: unknown) { +function validateZodSchema(schema: StagehandZodSchema, data: unknown) { try { schema.parse(data); return true; @@ -83,12 +87,25 @@ export class CustomOpenAIClient extends LLMClient { ); } - let responseFormat = undefined; + let responseFormat: + | ChatCompletionCreateParamsNonStreaming["response_format"] + | undefined; if (options.response_model) { - responseFormat = zodResponseFormat( - options.response_model.schema, - options.response_model.name, - ); + const responseModelSchema = options.response_model.schema; + if (isZod4Schema(responseModelSchema)) { + responseFormat = zodResponseFormat( + responseModelSchema, + options.response_model.name, + ); + } else { + responseFormat = { + type: "json_schema", + json_schema: { + name: options.response_model.name, + schema: toJsonSchema(responseModelSchema), + }, + }; + } } /* eslint-disable */ diff --git a/packages/core/examples/external_clients/langchain.ts b/packages/core/examples/external_clients/langchain.ts index 7950fd9af..7394daeb6 100644 --- a/packages/core/examples/external_clients/langchain.ts +++ b/packages/core/examples/external_clients/langchain.ts @@ -4,7 +4,6 @@ import { LLMClient, AvailableModel, } from "../../lib/v3"; -import { z } from "zod"; import { AIMessage, BaseMessageLike, @@ -12,6 +11,7 @@ import { SystemMessage, } from "@langchain/core/messages"; import { ChatCompletion } from "openai/resources"; +import { toJsonSchema } from "../../lib/v3/zodCompat"; export class LangchainClient extends LLMClient { public type = "langchainClient" as const; @@ -61,7 +61,7 @@ export class LangchainClient extends LLMClient { if (options.response_model) { //ref string no longer needed, this is now default behavior - const responseSchema = z.toJSONSchema(options.response_model.schema); + const responseSchema = toJsonSchema(options.response_model.schema); const structuredModel = this.model.withStructuredOutput(responseSchema); const response = await structuredModel.invoke(formattedMessages); diff --git a/packages/core/examples/operator-example.ts b/packages/core/examples/operator-example.ts index d09ba63da..374b4d743 100644 --- a/packages/core/examples/operator-example.ts +++ b/packages/core/examples/operator-example.ts @@ -9,6 +9,7 @@ import { Stagehand } from "../lib/v3"; import dotenv from "dotenv"; import chalk from "chalk"; +import z from "zod"; // Load environment variables dotenv.config(); @@ -22,6 +23,7 @@ async function main() { verbose: 2, cacheDir: "stagehand-agent-cache", logInferenceToFile: false, + model: "google/gemini-2.5-flash", }); await stagehand.init(); @@ -29,19 +31,25 @@ async function main() { try { const page = stagehand.context.pages()[0]; await page.goto( - "https://browserbase.github.io/stagehand-eval-sites/sites/shadow-dom/", + "https://browserbase.github.io/stagehand-eval-sites/sites/jfk/", ); - const agent = stagehand.agent(); - const result = await agent.execute({ - instruction: "click the button", - maxSteps: 20, - }); + const extraction = await stagehand.extract( + "extract all the record file name and their corresponding links", + z.object({ + records: z.array( + z.object({ + file_name: z.string().describe("the file name of the record"), + link: z.string().url(), + }), + ), + }), + ); + + console.log(extraction); console.log(`${chalk.green("✓")} Execution complete`); console.log(`${chalk.yellow("⤷")} Result:`); - console.log(JSON.stringify(result, null, 2)); - console.log(chalk.white(result.message)); } catch (error) { console.log(`${chalk.red("✗")} Error: ${error}`); } finally { diff --git a/packages/core/lib/inference.ts b/packages/core/lib/inference.ts index a1a8ce78c..9b843e043 100644 --- a/packages/core/lib/inference.ts +++ b/packages/core/lib/inference.ts @@ -11,11 +11,12 @@ import { buildObserveUserMessage, } from "./prompt"; import { appendSummary, writeTimestampedTxtFile } from "./inferenceLogUtils"; +import type { InferStagehandSchema, StagehandZodObject } from "./v3/zodCompat"; // Re-export for backward compatibility export type { LLMParsedResponse, LLMUsage } from "./v3/llm/LLMClient"; -export async function extract({ +export async function extract({ instruction, domElements, schema, @@ -26,7 +27,7 @@ export async function extract({ }: { instruction: string; domElements: string; - schema: z.ZodObject; + schema: T; llmClient: LLMClient; userProvidedInstructions?: string; logger: (message: LogLine) => void; @@ -45,7 +46,7 @@ export async function extract({ ), }); - type ExtractionResponse = z.infer; + type ExtractionResponse = InferStagehandSchema; type MetadataResponse = z.infer; const isUsingAnthropic = llmClient.type === "anthropic"; diff --git a/packages/core/lib/utils.ts b/packages/core/lib/utils.ts index b37776016..26e484e7b 100644 --- a/packages/core/lib/utils.ts +++ b/packages/core/lib/utils.ts @@ -1,38 +1,207 @@ import { ZodSchemaValidationError } from "./v3/types/public/sdkErrors"; import { Schema, Type } from "@google/genai"; import { z, ZodTypeAny } from "zod"; +import z3 from "zod/v3"; import { LogLine } from "./v3/types/public/logs"; import { ModelProvider } from "./v3/types/public/model"; import { ZodPathSegments } from "./v3/types/private/internal"; - -/** - * Zod 4 Internal Types - * - * We import these from zod/v4/core to access the internal structure of Zod schemas. - * Note: zod/v4/core uses `$ZodType` while the main zod module uses `z.ZodTypeAny`. - * These are functionally identical at runtime but TypeScript sees them as incompatible types. - * Therefore, when extracting properties from these internals (e.g., `def.element`, `def.innerType`), - * we must cast them to `z.ZodTypeAny` to work with the public Zod API. - */ -import type { - $ZodArrayInternals, - $ZodObjectInternals, - $ZodStringInternals, - $ZodUnionInternals, - $ZodIntersectionInternals, - $ZodOptionalInternals, - $ZodNullableInternals, - $ZodPipeInternals, - $ZodEnumInternals, - $ZodLiteralInternals, -} from "zod/v4/core"; +import type { StagehandZodSchema } from "./v3/zodCompat"; +import { isZod4Schema } from "./v3/zodCompat"; const ID_PATTERN = /^\d+-\d+$/; -// Helper type for accessing Zod 4 internals -type ZodWithInternals = z.ZodTypeAny & { _zod: T }; +const zFactories = { + v4: z, + v3: z3 as unknown as typeof z, +}; + +function getZFactory(schema: StagehandZodSchema): typeof z { + return isZod4Schema(schema) ? zFactories.v4 : zFactories.v3; +} + +const TYPE_NAME_MAP: Record = { + ZodString: "string", + string: "string", + ZodNumber: "number", + number: "number", + ZodBoolean: "boolean", + boolean: "boolean", + ZodObject: "object", + object: "object", + ZodArray: "array", + array: "array", + ZodUnion: "union", + union: "union", + ZodIntersection: "intersection", + intersection: "intersection", + ZodOptional: "optional", + optional: "optional", + ZodNullable: "nullable", + nullable: "nullable", + ZodLiteral: "literal", + literal: "literal", + ZodEnum: "enum", + enum: "enum", + ZodDefault: "default", + default: "default", + ZodEffects: "effects", + effects: "effects", + pipe: "pipe", +}; + +function getZ4Def(schema: StagehandZodSchema) { + return (schema as SchemaInternals)._zod?.def as + | Record + | undefined; +} + +function getZ4Bag(schema: StagehandZodSchema) { + return (schema as SchemaInternals)._zod?.bag as + | Record + | undefined; +} + +function getZ3Def(schema: StagehandZodSchema) { + return (schema as SchemaInternals)._def as + | Record + | undefined; +} + +function getObjectShape( + schema: StagehandZodSchema, +): Record | undefined { + const z4Shape = getZ4Def(schema)?.shape as + | Record + | undefined; + if (z4Shape) { + return z4Shape; + } + + const z3Shape = getZ3Def(schema)?.shape; + if (!z3Shape) { + return undefined; + } + + if (typeof z3Shape === "function") { + return (z3Shape as () => Record)(); + } + + return z3Shape as Record; +} + +function getArrayElement( + schema: StagehandZodSchema, +): StagehandZodSchema | undefined { + return (getZ4Def(schema)?.element ?? getZ3Def(schema)?.type) as + | StagehandZodSchema + | undefined; +} + +function getInnerType( + schema: StagehandZodSchema, +): StagehandZodSchema | undefined { + return (getZ4Def(schema)?.innerType ?? getZ3Def(schema)?.innerType) as + | StagehandZodSchema + | undefined; +} + +function getUnionOptions( + schema: StagehandZodSchema, +): StagehandZodSchema[] | undefined { + const z4Options = getZ4Def(schema)?.options; + if (Array.isArray(z4Options)) { + return z4Options as StagehandZodSchema[]; + } + const z3Options = getZ3Def(schema)?.options; + return Array.isArray(z3Options) + ? (z3Options as StagehandZodSchema[]) + : undefined; +} + +function getIntersectionSides(schema: StagehandZodSchema): { + left?: StagehandZodSchema; + right?: StagehandZodSchema; +} { + const z4Def = getZ4Def(schema); + if (z4Def?.left || z4Def?.right) { + return { + left: z4Def?.left as StagehandZodSchema | undefined, + right: z4Def?.right as StagehandZodSchema | undefined, + }; + } + const z3Def = getZ3Def(schema); + return { + left: z3Def?.left as StagehandZodSchema | undefined, + right: z3Def?.right as StagehandZodSchema | undefined, + }; +} + +function getEnumValues(schema: StagehandZodSchema): string[] | undefined { + const z4Entries = getZ4Def(schema)?.entries; + if (z4Entries && typeof z4Entries === "object") { + return Object.values(z4Entries as Record); + } + const z3Values = getZ3Def(schema)?.values; + return Array.isArray(z3Values) ? (z3Values as string[]) : undefined; +} + +function getLiteralValues(schema: StagehandZodSchema): unknown[] { + const z4Values = getZ4Def(schema)?.values; + if (Array.isArray(z4Values)) { + return z4Values as unknown[]; + } + const value = getZ3Def(schema)?.value; + return typeof value !== "undefined" ? [value] : []; +} + +function getStringChecks(schema: StagehandZodSchema): unknown[] { + const z4Checks = getZ4Def(schema)?.checks; + if (Array.isArray(z4Checks)) { + return z4Checks; + } + const z3Checks = getZ3Def(schema)?.checks; + return Array.isArray(z3Checks) ? z3Checks : []; +} + +function getStringFormat(schema: StagehandZodSchema): string | undefined { + const bagFormat = getZ4Bag(schema)?.format; + if (typeof bagFormat === "string") { + return bagFormat; + } + const z4Format = getZ4Def(schema)?.format; + if (typeof z4Format === "string") { + return z4Format; + } + const z3Format = getZ3Def(schema)?.format; + return typeof z3Format === "string" ? z3Format : undefined; +} + +function getPipeEndpoints(schema: StagehandZodSchema): { + in?: StagehandZodSchema; + out?: StagehandZodSchema; +} { + const z4Def = getZ4Def(schema); + if (z4Def?.in || z4Def?.out) { + return { + in: z4Def?.in as StagehandZodSchema | undefined, + out: z4Def?.out as StagehandZodSchema | undefined, + }; + } + return {}; +} + +function getEffectsBaseSchema( + schema: StagehandZodSchema, +): StagehandZodSchema | undefined { + return getZ3Def(schema)?.schema as StagehandZodSchema | undefined; +} -export function validateZodSchema(schema: z.ZodTypeAny, data: unknown) { +type SchemaInternals = { + _zod?: { def?: Record; bag?: Record }; + _def?: Record; +}; + +export function validateZodSchema(schema: StagehandZodSchema, data: unknown) { const result = schema.safeParse(data); if (result.success) { @@ -71,32 +240,35 @@ function decorateGeminiSchema( return geminiSchema; } -export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { +export function toGeminiSchema(zodSchema: StagehandZodSchema): Schema { + const normalizedSchema = zodSchema as z.ZodTypeAny; const zodType = getZodType(zodSchema); switch (zodType) { case "array": { - const arraySchema = zodSchema as ZodWithInternals<$ZodArrayInternals>; - const element = arraySchema._zod.def.element as z.ZodTypeAny; + const element = getArrayElement(zodSchema) ?? z.any(); return decorateGeminiSchema( { type: Type.ARRAY, - items: toGeminiSchema(element ?? z.any()), + items: toGeminiSchema(element), }, - zodSchema, + normalizedSchema, ); } case "object": { const properties: Record = {}; const required: string[] = []; - const objectSchema = zodSchema as ZodWithInternals<$ZodObjectInternals>; - const shape = objectSchema._zod.def.shape; - Object.entries(shape).forEach(([key, value]: [string, z.ZodTypeAny]) => { - properties[key] = toGeminiSchema(value); - if (getZodType(value) !== "optional") { - required.push(key); - } - }); + const shape = getObjectShape(zodSchema); + if (shape) { + Object.entries(shape).forEach( + ([key, value]: [string, StagehandZodSchema]) => { + properties[key] = toGeminiSchema(value); + if (getZodType(value) !== "optional") { + required.push(key); + } + }, + ); + } return decorateGeminiSchema( { @@ -104,100 +276,101 @@ export function toGeminiSchema(zodSchema: z.ZodTypeAny): Schema { properties, required: required.length > 0 ? required : undefined, }, - zodSchema, + normalizedSchema, ); } case "string": - case "url": return decorateGeminiSchema( { type: Type.STRING, }, - zodSchema, + normalizedSchema, ); case "number": return decorateGeminiSchema( { type: Type.NUMBER, }, - zodSchema, + normalizedSchema, ); case "boolean": return decorateGeminiSchema( { type: Type.BOOLEAN, }, - zodSchema, + normalizedSchema, ); case "enum": { - const enumSchema = zodSchema as ZodWithInternals<$ZodEnumInternals>; - const values = Object.values(enumSchema._zod.def.entries); + const values = getEnumValues(zodSchema); return decorateGeminiSchema( { type: Type.STRING, - enum: values as string[], + enum: values, }, - zodSchema, + normalizedSchema, ); } case "default": case "nullable": case "optional": { - const wrapperSchema = zodSchema as ZodWithInternals< - $ZodOptionalInternals | $ZodNullableInternals - >; - const innerType = wrapperSchema._zod.def.innerType as z.ZodTypeAny; + const innerType = getInnerType(zodSchema) ?? z.any(); const innerSchema = toGeminiSchema(innerType); return decorateGeminiSchema( { ...innerSchema, nullable: true, }, - zodSchema, + normalizedSchema, ); } case "literal": { - const literalSchema = zodSchema as ZodWithInternals<$ZodLiteralInternals>; - const values = literalSchema._zod.def.values; + const values = getLiteralValues(zodSchema); return decorateGeminiSchema( { type: Type.STRING, enum: values as string[], }, - zodSchema, + normalizedSchema, ); } case "pipe": { - const pipeSchema = zodSchema as ZodWithInternals<$ZodPipeInternals>; - const inSchema = pipeSchema._zod.def.in as z.ZodTypeAny; - return toGeminiSchema(inSchema); + const endpoints = getPipeEndpoints(zodSchema); + if (endpoints.in) { + return toGeminiSchema(endpoints.in); + } + return decorateGeminiSchema( + { + type: Type.STRING, + }, + normalizedSchema, + ); } // Standalone transforms and any unknown types fall through to default default: return decorateGeminiSchema( { - type: Type.OBJECT, - nullable: true, + type: Type.STRING, }, - zodSchema, + normalizedSchema, ); } } // Helper function to check the type of Zod schema -export function getZodType(schema: z.ZodTypeAny): string { - // In Zod 4, the type is accessed via _zod.def.type - const schemaWithDef = schema as unknown as { +export function getZodType(schema: StagehandZodSchema): string { + const schemaWithDef = schema as SchemaInternals & { _zod?: { def?: { type?: string } }; }; + const rawType = + (schemaWithDef._zod?.def?.type as string | undefined) ?? + (schemaWithDef._def?.typeName as string | undefined) ?? + (schemaWithDef._def?.type as string | undefined); - if (schemaWithDef._zod?.def?.type) { - return schemaWithDef._zod.def.type; + if (!rawType) { + return "unknown"; } - throw new Error( - `Unable to determine Zod schema type. Schema: ${JSON.stringify(schema)}`, - ); + return TYPE_NAME_MAP[rawType] ?? rawType; } /** @@ -214,74 +387,69 @@ export function getZodType(schema: z.ZodTypeAny): string { * 2. An array of {@link ZodPathSegments} objects representing each replaced field, including the path segments. */ export function transformSchema( - schema: z.ZodTypeAny, + schema: StagehandZodSchema, currentPath: Array, -): [z.ZodTypeAny, ZodPathSegments[]] { - // 1) If it's a URL type (z.url() in Zod 4), convert to ID string pattern - if (isKind(schema, "url")) { - const transformed = makeIdStringSchema(schema as z.ZodString); - return [transformed, [{ segments: [] }]]; - } - - // 2) If it's a string with .url() check, convert to ID string pattern +): [StagehandZodSchema, ZodPathSegments[]] { if (isKind(schema, "string")) { - const stringSchema = schema as ZodWithInternals< - $ZodStringInternals - >; - const checks = stringSchema._zod.def.checks; - const format = stringSchema._zod.bag?.format; + const checks = getStringChecks(schema); + const format = getStringFormat(schema); const hasUrlCheck = - (checks?.some((check) => check._zod?.def?.check === "url") ?? false) || - format === "url"; + checks.some((check) => { + const candidate = check as { + kind?: string; + format?: string; + _zod?: { def?: { check?: string; format?: string } }; + }; + return ( + candidate.kind === "url" || + candidate.format === "url" || + candidate._zod?.def?.check === "url" || + candidate._zod?.def?.format === "url" + ); + }) || format === "url"; + if (hasUrlCheck) { - return [makeIdStringSchema(schema as z.ZodString), [{ segments: [] }]]; + return [makeIdStringSchema(schema), [{ segments: [] }]]; } return [schema, []]; } - // 3) If it's an object, transform each field if (isKind(schema, "object")) { - const objectSchema = schema as ZodWithInternals<$ZodObjectInternals>; - const shape = objectSchema._zod.def.shape as Record; + const shape = getObjectShape(schema); if (!shape) { return [schema, []]; } - const newShape: Record = {}; + const newShape: Record = {}; const urlPaths: ZodPathSegments[] = []; let changed = false; - const shapeKeys = Object.keys(shape); - - for (const key of shapeKeys) { + for (const key of Object.keys(shape)) { const child = shape[key]; const [transformedChild, childPaths] = transformSchema(child, [ ...currentPath, key, ]); - if (transformedChild !== child) { changed = true; } newShape[key] = transformedChild; - - if (childPaths.length > 0) { - for (const cp of childPaths) { - urlPaths.push({ segments: [key, ...cp.segments] }); - } - } + childPaths.forEach((cp) => { + urlPaths.push({ segments: [key, ...cp.segments] }); + }); } if (changed) { - const newSchema = z.object(newShape); - return [newSchema, urlPaths]; + const factory = getZFactory(schema); + return [ + factory.object(newShape as Record), + urlPaths, + ]; } return [schema, urlPaths]; } - // 4) If it's an array, transform its item type if (isKind(schema, "array")) { - const arraySchema = schema as ZodWithInternals<$ZodArrayInternals>; - const itemType = arraySchema._zod.def.element as z.ZodTypeAny; + const itemType = getArrayElement(schema); if (!itemType) { return [schema, []]; } @@ -289,30 +457,29 @@ export function transformSchema( ...currentPath, "*", ]); - const changed = transformedItem !== itemType; const arrayPaths: ZodPathSegments[] = childPaths.map((cp) => ({ segments: ["*", ...cp.segments], })); - - if (changed) { - const newSchema = z.array(transformedItem); - return [newSchema, arrayPaths]; + if (transformedItem !== itemType) { + const factory = getZFactory(schema); + return [ + factory.array(transformedItem as unknown as z.ZodTypeAny), + arrayPaths, + ]; } return [schema, arrayPaths]; } - // 5) If it's a union, transform each option if (isKind(schema, "union")) { - const unionSchema = schema as ZodWithInternals<$ZodUnionInternals>; - const unionOptions = unionSchema._zod.def.options; + const unionOptions = getUnionOptions(schema); if (!unionOptions || unionOptions.length === 0) { return [schema, []]; } - const newOptions: z.ZodTypeAny[] = []; + const newOptions: StagehandZodSchema[] = []; let changed = false; let allPaths: ZodPathSegments[] = []; - unionOptions.forEach((option: z.ZodTypeAny, idx: number) => { + unionOptions.forEach((option, idx) => { const [newOption, childPaths] = transformSchema(option, [ ...currentPath, `union_${idx}`, @@ -325,74 +492,81 @@ export function transformSchema( }); if (changed) { - // We assume at least two options remain: + const factory = getZFactory(schema); return [ - z.union(newOptions as [z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]), + factory.union( + newOptions as unknown as [ + z.ZodTypeAny, + z.ZodTypeAny, + ...z.ZodTypeAny[], + ], + ), allPaths, ]; } return [schema, allPaths]; } - // 6) If it's an intersection, transform left and right if (isKind(schema, "intersection")) { - const intersectionSchema = - schema as ZodWithInternals<$ZodIntersectionInternals>; - const leftType = intersectionSchema._zod.def.left as z.ZodTypeAny; - const rightType = intersectionSchema._zod.def.right as z.ZodTypeAny; - if (!leftType || !rightType) { + const { left, right } = getIntersectionSides(schema); + if (!left || !right) { return [schema, []]; } - - const [left, leftPaths] = transformSchema(leftType, [ + const [newLeft, leftPaths] = transformSchema(left, [ ...currentPath, "intersection_left", ]); - const [right, rightPaths] = transformSchema(rightType, [ + const [newRight, rightPaths] = transformSchema(right, [ ...currentPath, "intersection_right", ]); - const changed = left !== leftType || right !== rightType; + const changed = newLeft !== left || newRight !== right; const allPaths = [...leftPaths, ...rightPaths]; if (changed) { - return [z.intersection(left, right), allPaths]; + const factory = getZFactory(schema); + return [ + factory.intersection( + newLeft as unknown as z.ZodTypeAny, + newRight as unknown as z.ZodTypeAny, + ), + allPaths, + ]; } return [schema, allPaths]; } - // 7) If it's optional, transform inner if (isKind(schema, "optional")) { - const optionalSchema = schema as ZodWithInternals<$ZodOptionalInternals>; - const innerType = optionalSchema._zod.def.innerType as z.ZodTypeAny; + const innerType = getInnerType(schema); if (!innerType) { return [schema, []]; } const [inner, innerPaths] = transformSchema(innerType, currentPath); if (inner !== innerType) { - return [z.optional(inner), innerPaths]; + return [ + (inner as z.ZodTypeAny).optional() as unknown as StagehandZodSchema, + innerPaths, + ]; } return [schema, innerPaths]; } - // 8) If it's nullable, transform inner if (isKind(schema, "nullable")) { - const nullableSchema = schema as ZodWithInternals<$ZodNullableInternals>; - const innerType = nullableSchema._zod.def.innerType as z.ZodTypeAny; + const innerType = getInnerType(schema); if (!innerType) { return [schema, []]; } const [inner, innerPaths] = transformSchema(innerType, currentPath); if (inner !== innerType) { - return [z.nullable(inner), innerPaths]; + return [ + (inner as z.ZodTypeAny).nullable() as unknown as StagehandZodSchema, + innerPaths, + ]; } return [schema, innerPaths]; } - // 9) If it's a pipe (which is what .transform() creates in Zod 4) - if (isKind(schema, "pipe")) { - const pipeSchema = schema as ZodWithInternals<$ZodPipeInternals>; - const inSchema = pipeSchema._zod.def.in as z.ZodTypeAny; - const outSchema = pipeSchema._zod.def.out as z.ZodTypeAny; + if (isKind(schema, "pipe") && isZod4Schema(schema)) { + const { in: inSchema, out: outSchema } = getPipeEndpoints(schema); if (!inSchema || !outSchema) { return [schema, []]; } @@ -401,15 +575,24 @@ export function transformSchema( const [newOut, outPaths] = transformSchema(outSchema, currentPath); const allPaths = [...inPaths, ...outPaths]; - const changed = newIn !== inSchema || newOut !== outSchema; - if (changed) { - // Reconstruct the pipe with transformed schemas - // In Zod 4, we use z.pipe() to create pipes - const result = z.pipe(newIn as never, newOut as never) as z.ZodTypeAny; + if (newIn !== inSchema || newOut !== outSchema) { + const result = z.pipe( + newIn as unknown as z.ZodTypeAny, + newOut as unknown as z.ZodTypeAny, + ) as StagehandZodSchema; return [result, allPaths]; } return [schema, allPaths]; } + + if (isKind(schema, "effects")) { + const baseSchema = getEffectsBaseSchema(schema); + if (!baseSchema) { + return [schema, []]; + } + return transformSchema(baseSchema, currentPath); + } + return [schema, []]; } @@ -467,7 +650,7 @@ export function injectUrls( } // Helper to check if a schema is of a specific type -function isKind(s: z.ZodTypeAny, kind: string): boolean { +function isKind(s: StagehandZodSchema, kind: string): boolean { try { return getZodType(s) === kind; } catch { @@ -475,7 +658,7 @@ function isKind(s: z.ZodTypeAny, kind: string): boolean { } } -function makeIdStringSchema(orig: z.ZodString): z.ZodString { +function makeIdStringSchema(orig: StagehandZodSchema): StagehandZodSchema { const userDesc = (orig as unknown as { description?: string }).description ?? ""; @@ -487,7 +670,8 @@ function makeIdStringSchema(orig: z.ZodString): z.ZodString { ? `${base} that follows this user-defined description: ${userDesc}` : base; - return z.string().regex(ID_PATTERN).describe(composed); + const factory = getZFactory(orig); + return factory.string().regex(ID_PATTERN).describe(composed); } /** diff --git a/packages/core/lib/v3/agent/AnthropicCUAClient.ts b/packages/core/lib/v3/agent/AnthropicCUAClient.ts index 76d0caaf9..7df044151 100644 --- a/packages/core/lib/v3/agent/AnthropicCUAClient.ts +++ b/packages/core/lib/v3/agent/AnthropicCUAClient.ts @@ -13,10 +13,11 @@ import { LogLine } from "../types/public/logs"; import { AgentScreenshotProviderError } from "../types/public/sdkErrors"; import Anthropic from "@anthropic-ai/sdk"; import { ToolSet } from "ai"; -import { z } from "zod"; import { AgentClient } from "./AgentClient"; import { mapKeyToPlaywright } from "./utils/cuaKeyMapping"; import { compressConversationImages } from "./utils/imageCompression"; +import { toJsonSchema } from "../zodCompat"; +import type { StagehandZodSchema } from "../zodCompat"; export type ResponseInputItem = AnthropicMessage | AnthropicToolResult; @@ -442,8 +443,21 @@ export class AnthropicCUAClient extends AgentClient { // Add custom tools if available if (this.tools && Object.keys(this.tools).length > 0) { const customTools = Object.entries(this.tools).map(([name, tool]) => { + const schema = tool.inputSchema as StagehandZodSchema | undefined; + if (!schema) { + return { + name, + description: tool.description, + input_schema: { + type: "object", + properties: {}, + required: [], + }, + }; + } + // Convert Zod schema to proper JSON schema format for Anthropic - const jsonSchema = z.toJSONSchema(tool.inputSchema as z.ZodType) as { + const jsonSchema = toJsonSchema(schema) as { properties?: Record; required?: string[]; }; diff --git a/packages/core/lib/v3/agent/utils/googleCustomToolHandler.ts b/packages/core/lib/v3/agent/utils/googleCustomToolHandler.ts index 9cf709e55..345138a06 100644 --- a/packages/core/lib/v3/agent/utils/googleCustomToolHandler.ts +++ b/packages/core/lib/v3/agent/utils/googleCustomToolHandler.ts @@ -1,7 +1,8 @@ import { Part, FunctionCall, FunctionDeclaration, Type } from "@google/genai"; import { ToolSet } from "ai"; import { LogLine } from "../../types/public/logs"; -import { z } from "zod"; +import { toJsonSchema } from "../../zodCompat"; +import type { StagehandZodSchema } from "../../zodCompat"; /** * Result of executing a custom tool for Google CUA @@ -121,7 +122,12 @@ function convertToolToFunctionDeclaration( ): FunctionDeclaration | null { try { // Convert Zod schema to JSON schema - const jsonSchema = z.toJSONSchema(tool.inputSchema as z.ZodType) as { + const schema = tool.inputSchema as StagehandZodSchema | undefined; + if (!schema) { + return null; + } + + const jsonSchema = toJsonSchema(schema) as { properties?: Record; required?: string[]; type?: string; diff --git a/packages/core/lib/v3/api.ts b/packages/core/lib/v3/api.ts index dc686d885..e873db32b 100644 --- a/packages/core/lib/v3/api.ts +++ b/packages/core/lib/v3/api.ts @@ -1,5 +1,4 @@ import makeFetchCookie from "fetch-cookie"; -import { z } from "zod"; import { Action } from "./types/public"; import { STAGEHAND_VERSION } from "../version"; import { @@ -29,6 +28,8 @@ import { ExperimentalNotConfiguredError, } from "./types/public"; import type { SerializableResponse } from "./types/private"; +import { toJsonSchema } from "./zodCompat"; +import type { StagehandZodSchema } from "./zodCompat"; /** * API response structure for replay metrics endpoint @@ -156,13 +157,13 @@ export class StagehandAPIClient { }); } - async extract({ + async extract({ instruction, schema: zodSchema, options, frameId, }: APIExtractParameters): Promise> { - const jsonSchema = zodSchema ? z.toJSONSchema(zodSchema) : undefined; + const jsonSchema = zodSchema ? toJsonSchema(zodSchema) : undefined; const args: Record = { schema: jsonSchema, diff --git a/packages/core/lib/v3/handlers/extractHandler.ts b/packages/core/lib/v3/handlers/extractHandler.ts index 6ab9d4e26..20d8282a0 100644 --- a/packages/core/lib/v3/handlers/extractHandler.ts +++ b/packages/core/lib/v3/handlers/extractHandler.ts @@ -1,10 +1,11 @@ // lib/v3/handlers/extractHandler.ts import { extract as runExtract } from "../../inference"; -import { injectUrls, transformSchema } from "../../utils"; +import { getZodType, injectUrls, transformSchema } from "../../utils"; import { v3Logger } from "../logger"; import { V3FunctionName } from "../types/public/methods"; import { captureHybridSnapshot } from "../understudy/a11y/snapshot"; -import { z, ZodTypeAny } from "zod"; +import { z } from "zod"; +import type { ZodTypeAny } from "zod"; import { LLMClient } from "../llm/LLMClient"; import { ExtractHandlerParams } from "../types/private/handlers"; import { EncodedId, ZodPathSegments } from "../types/private/internal"; @@ -15,6 +16,11 @@ import { ModelConfiguration, } from "../types/public/model"; import { StagehandInvalidArgumentError } from "../types/public/sdkErrors"; +import type { + InferStagehandSchema, + StagehandZodObject, + StagehandZodSchema, +} from "../zodCompat"; /** * Scans the provided Zod schema for any `z.string().url()` fields and @@ -26,11 +32,11 @@ import { StagehandInvalidArgumentError } from "../types/public/sdkErrors"; * 2. An array of {@link ZodPathSegments} objects representing all the replaced URL fields, * with each path segment showing where in the schema the replacement occurred. */ -export function transformUrlStringsToNumericIds( +export function transformUrlStringsToNumericIds( schema: T, -): [T, ZodPathSegments[]] { +): [StagehandZodSchema, ZodPathSegments[]] { const [finalSchema, urlPaths] = transformSchema(schema, []); - return [finalSchema as T, urlPaths]; + return [finalSchema, urlPaths]; } interface ExtractionResponseBase { @@ -42,8 +48,8 @@ interface ExtractionResponseBase { inference_time_ms: number; } -type ExtractionResponse = ExtractionResponseBase & - z.infer; +type ExtractionResponse = ExtractionResponseBase & + InferStagehandSchema; export class ExtractHandler { private readonly llmClient: LLMClient; @@ -89,14 +95,16 @@ export class ExtractHandler { this.onMetrics = onMetrics; } - async extract( + async extract( params: ExtractHandlerParams, - ): Promise | { pageText: string }> { + ): Promise | { pageText: string }> { const { instruction, schema, page, selector, timeout, model } = params; const llmClient = this.resolveLlmClient(model); - const doExtract = async (): Promise | { pageText: string }> => { + const doExtract = async (): Promise< + InferStagehandSchema | { pageText: string } + > => { // No-args → page text (parity with v2) const noArgs = !instruction && !schema; if (noArgs) { @@ -138,29 +146,30 @@ export class ExtractHandler { }); // Normalize schema: if instruction provided without schema, use defaultExtractSchema - const baseSchema: ZodTypeAny = (schema ?? - defaultExtractSchema) as ZodTypeAny; + const baseSchema: StagehandZodSchema = (schema ?? + defaultExtractSchema) as StagehandZodSchema; // Ensure we pass an object schema into inference; wrap non-object schemas - const isObjectSchema = !!( - baseSchema as unknown as { _def?: { shape?: unknown } } - )._def?.shape; + const isObjectSchema = getZodType(baseSchema) === "object"; const WRAP_KEY = "value" as const; - const objectSchema = isObjectSchema - ? (baseSchema as unknown as z.ZodObject) - : z.object({ [WRAP_KEY]: baseSchema }); + const objectSchema: StagehandZodObject = isObjectSchema + ? (baseSchema as StagehandZodObject) + : (z.object({ + [WRAP_KEY]: baseSchema as unknown as ZodTypeAny, + }) as StagehandZodObject); const [transformedSchema, urlFieldPaths] = transformUrlStringsToNumericIds(objectSchema); - const extractionResponse = (await runExtract({ - instruction, - domElements: combinedTree, - schema: transformedSchema as z.ZodObject, - llmClient, - userProvidedInstructions: this.systemPrompt, - logger: v3Logger, - logInferenceToFile: this.logInferenceToFile, - })) as ExtractionResponse>; + const extractionResponse: ExtractionResponse = + await runExtract({ + instruction, + domElements: combinedTree, + schema: transformedSchema as StagehandZodObject, + llmClient, + userProvidedInstructions: this.systemPrompt, + logger: v3Logger, + logInferenceToFile: this.logInferenceToFile, + }); const { metadata: { completed }, @@ -171,7 +180,7 @@ export class ExtractHandler { inference_time_ms, ...rest } = extractionResponse; - let output: unknown = rest; + let output = rest as InferStagehandSchema; v3Logger({ category: "extraction", @@ -218,18 +227,20 @@ export class ExtractHandler { output = (output as Record)[WRAP_KEY]; } - return output as z.infer; + return output as InferStagehandSchema; }; if (!timeout) return doExtract(); return await Promise.race([ doExtract(), - new Promise | { pageText: string }>((_, reject) => { - setTimeout( - () => reject(new Error(`extract() timed out after ${timeout}ms`)), - timeout, - ); - }), + new Promise | { pageText: string }>( + (_, reject) => { + setTimeout( + () => reject(new Error(`extract() timed out after ${timeout}ms`)), + timeout, + ); + }, + ), ]); } } diff --git a/packages/core/lib/v3/llm/AnthropicClient.ts b/packages/core/lib/v3/llm/AnthropicClient.ts index ce8a6326e..90b10035e 100644 --- a/packages/core/lib/v3/llm/AnthropicClient.ts +++ b/packages/core/lib/v3/llm/AnthropicClient.ts @@ -5,7 +5,6 @@ import { TextBlockParam, Tool, } from "@anthropic-ai/sdk/resources"; -import { z } from "zod"; import { LogLine } from "../types/public/logs"; import { AnthropicJsonSchemaObject, @@ -17,6 +16,7 @@ import { LLMResponse, } from "./LLMClient"; import { CreateChatCompletionResponseError } from "../types/public/sdkErrors"; +import { toJsonSchema } from "../zodCompat"; export class AnthropicClient extends LLMClient { public type = "anthropic" as const; @@ -145,7 +145,7 @@ export class AnthropicClient extends LLMClient { let toolDefinition: Tool | undefined; if (options.response_model) { - const jsonSchema = z.toJSONSchema(options.response_model.schema); + const jsonSchema = toJsonSchema(options.response_model.schema); const { properties: schemaProperties, required: schemaRequired } = extractSchemaProperties(jsonSchema); diff --git a/packages/core/lib/v3/llm/CerebrasClient.ts b/packages/core/lib/v3/llm/CerebrasClient.ts index ad4d6e6c3..281ce5be4 100644 --- a/packages/core/lib/v3/llm/CerebrasClient.ts +++ b/packages/core/lib/v3/llm/CerebrasClient.ts @@ -1,6 +1,5 @@ import OpenAI from "openai"; import type { ClientOptions } from "openai"; -import { z } from "zod"; import { LogLine } from "../types/public/logs"; import { AvailableModel } from "../types/public/model"; import { @@ -10,6 +9,7 @@ import { LLMResponse, } from "./LLMClient"; import { CreateChatCompletionResponseError } from "../types/public/sdkErrors"; +import { toJsonSchema } from "../zodCompat"; export class CerebrasClient extends LLMClient { public type = "cerebras" as const; @@ -100,7 +100,7 @@ export class CerebrasClient extends LLMClient { // Add response model as a tool if provided if (options.response_model) { - const jsonSchema = z.toJSONSchema(options.response_model.schema) as { + const jsonSchema = toJsonSchema(options.response_model.schema) as { properties?: Record; required?: string[]; }; diff --git a/packages/core/lib/v3/llm/GroqClient.ts b/packages/core/lib/v3/llm/GroqClient.ts index 229e22652..e4cff6266 100644 --- a/packages/core/lib/v3/llm/GroqClient.ts +++ b/packages/core/lib/v3/llm/GroqClient.ts @@ -1,6 +1,5 @@ import type { ClientOptions } from "openai"; import OpenAI from "openai"; -import { z } from "zod"; import { LogLine } from "../types/public/logs"; import { AvailableModel } from "../types/public/model"; import { @@ -10,6 +9,7 @@ import { LLMResponse, } from "./LLMClient"; import { CreateChatCompletionResponseError } from "../types/public/sdkErrors"; +import { toJsonSchema } from "../zodCompat"; export class GroqClient extends LLMClient { public type = "groq" as const; @@ -100,7 +100,7 @@ export class GroqClient extends LLMClient { // Add response model as a tool if provided if (options.response_model) { - const jsonSchema = z.toJSONSchema(options.response_model.schema) as { + const jsonSchema = toJsonSchema(options.response_model.schema) as { properties?: Record; required?: string[]; }; diff --git a/packages/core/lib/v3/llm/LLMClient.ts b/packages/core/lib/v3/llm/LLMClient.ts index fd0ed9f16..70bf2b7a1 100644 --- a/packages/core/lib/v3/llm/LLMClient.ts +++ b/packages/core/lib/v3/llm/LLMClient.ts @@ -11,9 +11,9 @@ import { streamText, } from "ai"; import type { LanguageModelV2 } from "@ai-sdk/provider"; -import { ZodType } from "zod"; import { LogLine } from "../types/public/logs"; import { AvailableModel, ClientOptions } from "../types/public/model"; +import type { StagehandZodSchema } from "../zodCompat"; export interface ChatMessage { role: "system" | "user" | "assistant"; @@ -55,7 +55,7 @@ export interface ChatCompletionOptions { }; response_model?: { name: string; - schema: ZodType; + schema: StagehandZodSchema; }; tools?: LLMTool[]; tool_choice?: "auto" | "none" | "required"; @@ -129,7 +129,9 @@ export abstract class LLMClient { // Overload 1: When response_model is provided, returns LLMParsedResponse abstract createChatCompletion( options: CreateChatCompletionOptions & { - options: { response_model: { name: string; schema: ZodType } }; + options: { + response_model: { name: string; schema: StagehandZodSchema }; + }; }, ): Promise>; diff --git a/packages/core/lib/v3/llm/OpenAIClient.ts b/packages/core/lib/v3/llm/OpenAIClient.ts index cf68c9eb9..8030cf6fc 100644 --- a/packages/core/lib/v3/llm/OpenAIClient.ts +++ b/packages/core/lib/v3/llm/OpenAIClient.ts @@ -12,7 +12,6 @@ import { import { LogLine } from "../types/public/logs"; import { AvailableModel } from "../types/public/model"; import { validateZodSchema } from "../../utils"; -import { z } from "zod"; import { ChatCompletionOptions, ChatMessage, @@ -25,6 +24,7 @@ import { StagehandError, ZodSchemaValidationError, } from "../types/public/sdkErrors"; +import { isZod4Schema, toJsonSchema } from "../zodCompat"; export class OpenAIClient extends LLMClient { public type = "openai" as const; @@ -152,13 +152,15 @@ export class OpenAIClient extends LLMClient { options.messages.push(screenshotMessage); } - let responseFormat = undefined; + let responseFormat: + | ChatCompletionCreateParamsNonStreaming["response_format"] + | undefined; if (options.response_model) { // For O1 models, we need to add the schema as a user message. if (this.modelName.startsWith("o1") || this.modelName.startsWith("o3")) { try { const parsedSchema = JSON.stringify( - z.toJSONSchema(options.response_model.schema), + toJsonSchema(options.response_model.schema), ); options.messages.push({ role: "user", @@ -184,11 +186,19 @@ export class OpenAIClient extends LLMClient { throw error; } - } else { + } else if (isZod4Schema(options.response_model.schema)) { responseFormat = zodResponseFormat( options.response_model.schema, options.response_model.name, ); + } else { + responseFormat = { + type: "json_schema", + json_schema: { + name: options.response_model.name, + schema: toJsonSchema(options.response_model.schema), + }, + }; } } diff --git a/packages/core/lib/v3/types/private/api.ts b/packages/core/lib/v3/types/private/api.ts index ecf99bc83..230584d28 100644 --- a/packages/core/lib/v3/types/private/api.ts +++ b/packages/core/lib/v3/types/private/api.ts @@ -1,5 +1,4 @@ import Browserbase from "@browserbasehq/sdk"; -import { ZodTypeAny } from "zod"; import { Action, ActOptions, @@ -8,6 +7,7 @@ import { ObserveOptions, } from "../public"; import type { Protocol } from "devtools-protocol"; +import type { StagehandZodSchema } from "../../zodCompat"; export interface StagehandAPIConstructorParams { apiKey: string; @@ -60,7 +60,7 @@ export interface APIActParameters { export interface APIExtractParameters { instruction?: string; - schema?: ZodTypeAny; + schema?: StagehandZodSchema; options?: ExtractOptions; frameId?: string; } diff --git a/packages/core/lib/v3/types/private/handlers.ts b/packages/core/lib/v3/types/private/handlers.ts index f1dd6dac1..5bab7f3c0 100644 --- a/packages/core/lib/v3/types/private/handlers.ts +++ b/packages/core/lib/v3/types/private/handlers.ts @@ -1,6 +1,6 @@ -import { ZodTypeAny } from "zod"; import { Page } from "../../understudy/page"; import { ModelConfiguration } from "../public/model"; +import type { StagehandZodSchema } from "../../zodCompat"; export interface ActHandlerParams { instruction: string; @@ -10,7 +10,7 @@ export interface ActHandlerParams { page: Page; } -export interface ExtractHandlerParams { +export interface ExtractHandlerParams { instruction?: string; schema?: T; model?: ModelConfiguration; diff --git a/packages/core/lib/v3/types/public/methods.ts b/packages/core/lib/v3/types/public/methods.ts index a7dad9865..d0e17fe81 100644 --- a/packages/core/lib/v3/types/public/methods.ts +++ b/packages/core/lib/v3/types/public/methods.ts @@ -2,6 +2,7 @@ import { Page as PatchrightPage } from "patchright-core"; import { Page as PlaywrightPage } from "playwright-core"; import { Page as PuppeteerPage } from "puppeteer-core"; import { z } from "zod"; +import type { InferStagehandSchema, StagehandZodSchema } from "../../zodCompat"; import { Page } from "../../understudy/page"; import { ModelConfiguration } from "../public/model"; @@ -19,7 +20,8 @@ export interface ActResult { actions: Action[]; } -export type ExtractResult = z.infer; +export type ExtractResult = + InferStagehandSchema; export interface Action { selector: string; diff --git a/packages/core/lib/v3/v3.ts b/packages/core/lib/v3/v3.ts index 676645d35..b559042be 100644 --- a/packages/core/lib/v3/v3.ts +++ b/packages/core/lib/v3/v3.ts @@ -3,8 +3,8 @@ import fs from "fs"; import os from "os"; import path from "path"; import process from "process"; -import type { ZodTypeAny } from "zod"; import { z } from "zod"; +import type { InferStagehandSchema, StagehandZodSchema } from "./zodCompat"; import { loadApiKeyFromEnv } from "../utils"; import { StagehandLogger, LoggerOptions } from "../logger"; import { ActCache } from "./cache/ActCache"; @@ -1073,15 +1073,15 @@ export class V3 { instruction: string, options?: ExtractOptions, ): Promise>; - async extract( + async extract( instruction: string, schema: T, options?: ExtractOptions, - ): Promise>; + ): Promise>; async extract( a?: string | ExtractOptions, - b?: ZodTypeAny | ExtractOptions, + b?: StagehandZodSchema | ExtractOptions, c?: ExtractOptions, ): Promise { return await withInstanceLogContext(this.instanceId, async () => { @@ -1091,18 +1091,18 @@ export class V3 { // Normalize args let instruction: string | undefined; - let schema: ZodTypeAny | undefined; + let schema: StagehandZodSchema | undefined; let options: ExtractOptions | undefined; if (typeof a === "string") { instruction = a; - const isZodSchema = (val: unknown): val is ZodTypeAny => + const isZodSchema = (val: unknown): val is StagehandZodSchema => !!val && typeof val === "object" && "parse" in val && "safeParse" in val; if (isZodSchema(b)) { - schema = b as ZodTypeAny; + schema = b as StagehandZodSchema; options = c as ExtractOptions | undefined; } else { options = b as ExtractOptions | undefined; @@ -1125,9 +1125,9 @@ export class V3 { // Resolve page from options or use active page const page = await this.resolvePage(options?.page); - const handlerParams: ExtractHandlerParams = { + const handlerParams: ExtractHandlerParams = { instruction, - schema: effectiveSchema as unknown as ZodTypeAny | undefined, + schema: effectiveSchema as StagehandZodSchema | undefined, model: options?.model, timeout: options?.timeout, selector: options?.selector, @@ -1143,7 +1143,8 @@ export class V3 { frameId, }); } else { - result = await this.extractHandler.extract(handlerParams); + result = + await this.extractHandler.extract(handlerParams); } return result; }); diff --git a/packages/core/lib/v3/zodCompat.ts b/packages/core/lib/v3/zodCompat.ts new file mode 100644 index 000000000..026076e32 --- /dev/null +++ b/packages/core/lib/v3/zodCompat.ts @@ -0,0 +1,55 @@ +import { z } from "zod"; +import type { + ZodObject as Zod4Object, + ZodRawShape as Zod4RawShape, + ZodTypeAny as Zod4TypeAny, +} from "zod"; +import type * as z3 from "zod/v3"; +import { zodToJsonSchema } from "zod-to-json-schema"; + +export type StagehandZodSchema = Zod4TypeAny | z3.ZodTypeAny; + +export type StagehandZodObject = + | Zod4Object + | z3.ZodObject; + +export type InferStagehandSchema = + T extends z3.ZodTypeAny + ? z3.infer + : T extends Zod4TypeAny + ? z.infer + : never; + +export const isZod4Schema = ( + schema: StagehandZodSchema, +): schema is Zod4TypeAny & { _zod: unknown } => + typeof (schema as { _zod?: unknown })._zod !== "undefined"; + +export const isZod3Schema = ( + schema: StagehandZodSchema, +): schema is z3.ZodTypeAny => !isZod4Schema(schema); + +export type JsonSchemaDocument = Record; + +export function toJsonSchema( + schema: StagehandZodSchema, + options?: Parameters[1], +): JsonSchemaDocument { + if ( + isZod4Schema(schema) && + typeof (z as unknown as { toJSONSchema?: unknown }).toJSONSchema === + "function" && + !options + ) { + return ( + z as unknown as { + toJSONSchema: (input: Zod4TypeAny) => JsonSchemaDocument; + } + ).toJSONSchema(schema as Zod4TypeAny); + } + + return zodToJsonSchema( + schema as unknown as z.ZodTypeAny, + options ?? { $refStrategy: "none" }, + ) as JsonSchemaDocument; +} diff --git a/packages/core/package.json b/packages/core/package.json index c8a464080..2e4dcecbe 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -38,7 +38,8 @@ "license": "MIT", "peerDependencies": { "deepmerge": "^4.3.1", - "dotenv": "^16.4.5" + "dotenv": "^16.4.5", + "zod": "^3.25.0 || ^4.0.0" }, "dependencies": { "@ai-sdk/provider": "^2.0.0", @@ -55,7 +56,7 @@ "pino-pretty": "^13.0.0", "playwright": "^1.52.0", "ws": "^8.18.0", - "zod": "^4.1.8" + "zod-to-json-schema": "^3.24.5" }, "optionalDependencies": { "@ai-sdk/anthropic": "^2.0.34", @@ -82,7 +83,8 @@ "prettier": "^3.2.5", "tsup": "^8.2.1", "tsx": "^4.10.5", - "typescript": "^5.2.2" + "typescript": "^5.2.2", + "zod": "^4.1.8" }, "repository": { "type": "git", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7b378336..fd4c51ce3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: 9.25.1 '@langchain/community': specifier: ^1.0.0 - version: 1.0.0(@browserbasehq/sdk@2.5.0)(@browserbasehq/stagehand@3.0.1(@opentelemetry/api@1.9.0)(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(google-auth-library@9.15.1)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.2)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(playwright@1.54.2)(puppeteer@22.15.0(typescript@5.8.3))(ws@8.18.3) + version: 1.0.0(@browserbasehq/sdk@2.5.0)(@browserbasehq/stagehand@3.0.2(@opentelemetry/api@1.9.0)(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(google-auth-library@9.15.1)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.2)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(playwright@1.54.2)(puppeteer@22.15.0(typescript@5.8.3))(ws@8.18.3) '@langchain/core': specifier: ^0.3.40 version: 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) @@ -164,9 +164,9 @@ importers: ws: specifier: ^8.18.0 version: 8.18.3 - zod: - specifier: ^4.1.8 - version: 4.1.12 + zod-to-json-schema: + specifier: ^3.24.5 + version: 3.24.5(zod@4.1.12) optionalDependencies: '@ai-sdk/anthropic': specifier: ^2.0.34 @@ -238,6 +238,9 @@ importers: typescript: specifier: ^5.2.2 version: 5.8.3 + zod: + specifier: ^4.1.8 + version: 4.1.12 packages/docs: dependencies: @@ -416,8 +419,8 @@ packages: '@browserbasehq/sdk@2.5.0': resolution: {integrity: sha512-bcnbYZvm5Ht1nrHUfWDK4crspiTy1ESJYMApsMiOTUnlKOan0ocRD6m7hZH34iSC2c2XWsoryR80cwsYgCBWzQ==} - '@browserbasehq/stagehand@3.0.1': - resolution: {integrity: sha512-GfI6qWAGBj3obGvIgi8wbE1e65y29hB7u9FUmlQIz2wUX/izFFchlq+PszafPr9d2q4ZzbqzqNoc9WSjhxT65w==} + '@browserbasehq/stagehand@3.0.2': + resolution: {integrity: sha512-m5GSOgHtRlC8wj4cdfJzB6sY6oQsTznmR2fjao0QRbtQd71Eh2dCYzmN/jZtc0K60Ga9ARMVTrix4iSaKaY2eQ==} peerDependencies: deepmerge: ^4.3.1 dotenv: ^16.4.5 @@ -6401,7 +6404,7 @@ snapshots: transitivePeerDependencies: - encoding - '@browserbasehq/stagehand@3.0.1(@opentelemetry/api@1.9.0)(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67)': + '@browserbasehq/stagehand@3.0.2(@opentelemetry/api@1.9.0)(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67)': dependencies: '@ai-sdk/provider': 2.0.0 '@anthropic-ai/sdk': 0.39.0 @@ -7173,9 +7176,9 @@ snapshots: - openai - ws - '@langchain/community@1.0.0(@browserbasehq/sdk@2.5.0)(@browserbasehq/stagehand@3.0.1(@opentelemetry/api@1.9.0)(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(google-auth-library@9.15.1)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.2)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(playwright@1.54.2)(puppeteer@22.15.0(typescript@5.8.3))(ws@8.18.3)': + '@langchain/community@1.0.0(@browserbasehq/sdk@2.5.0)(@browserbasehq/stagehand@3.0.2(@opentelemetry/api@1.9.0)(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(google-auth-library@9.15.1)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.2)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(playwright@1.54.2)(puppeteer@22.15.0(typescript@5.8.3))(ws@8.18.3)': dependencies: - '@browserbasehq/stagehand': 3.0.1(@opentelemetry/api@1.9.0)(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67) + '@browserbasehq/stagehand': 3.0.2(@opentelemetry/api@1.9.0)(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67) '@ibm-cloud/watsonx-ai': 1.7.0 '@langchain/classic': 1.0.0(@langchain/core@0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(ws@8.18.3) '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) @@ -10073,7 +10076,7 @@ snapshots: isstream: 0.1.2 jsonwebtoken: 9.0.2 mime-types: 2.1.35 - retry-axios: 2.6.0(axios@1.13.0(debug@4.4.1)) + retry-axios: 2.6.0(axios@1.13.0) tough-cookie: 4.1.4 transitivePeerDependencies: - supports-color @@ -12057,7 +12060,7 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - retry-axios@2.6.0(axios@1.13.0(debug@4.4.1)): + retry-axios@2.6.0(axios@1.13.0): dependencies: axios: 1.13.0(debug@4.4.1) @@ -13113,6 +13116,10 @@ snapshots: dependencies: zod: 3.25.76 + zod-to-json-schema@3.24.5(zod@4.1.12): + dependencies: + zod: 4.1.12 + zod@3.23.8: {} zod@3.25.67: {} From d43a25fb39355436975ee4b93c66de7be320e995 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 17 Nov 2025 09:26:46 -0800 Subject: [PATCH 19/38] package --- package.json | 67 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 52ad35591..ee4bd17b3 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,62 @@ { - "name": "stagehand-workspace", - "version": "0.0.0", - "private": true, - "description": "Stagehand monorepo workspace", + "name": "@browserbasehq/stagehand", + "version": "3.0.1", + "description": "An AI web browsing framework focused on simplicity and extensibility.", + "main": "./packages/core/dist/index.js", + "module": "./packages/core/dist/index.js", + "types": "./packages/core/dist/index.d.ts", + "exports": { + ".": { + "types": "./packages/core/dist/index.d.ts", + "import": "./packages/core/dist/index.js", + "default": "./packages/core/dist/index.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "packages/core/dist/**/*" + ], + "peerDependencies": { + "deepmerge": "^4.3.1", + "dotenv": "^16.4.5", + "zod": "^3.25.0 || ^4.0.0" + }, + "dependencies": { + "@ai-sdk/provider": "^2.0.0", + "@anthropic-ai/sdk": "0.39.0", + "@browserbasehq/sdk": "^2.4.0", + "@google/genai": "^1.22.0", + "@langchain/openai": "^0.4.4", + "@modelcontextprotocol/sdk": "^1.17.2", + "ai": "^5.0.0", + "devtools-protocol": "^0.0.1464554", + "fetch-cookie": "^3.1.0", + "openai": "^4.87.1", + "pino": "^9.6.0", + "pino-pretty": "^13.0.0", + "playwright": "^1.52.0", + "ws": "^8.18.0", + "zod-to-json-schema": "^3.23.5" + }, + "optionalDependencies": { + "@ai-sdk/anthropic": "^2.0.34", + "@ai-sdk/azure": "^2.0.54", + "@ai-sdk/cerebras": "^1.0.25", + "@ai-sdk/deepseek": "^1.0.23", + "@ai-sdk/google": "^2.0.23", + "@ai-sdk/groq": "^2.0.24", + "@ai-sdk/mistral": "^2.0.19", + "@ai-sdk/openai": "^2.0.53", + "@ai-sdk/perplexity": "^2.0.13", + "@ai-sdk/togetherai": "^1.0.23", + "@ai-sdk/xai": "^2.0.26", + "@langchain/core": "^0.3.40", + "chrome-launcher": "^1.2.0", + "ollama-ai-provider-v2": "^1.5.0", + "patchright-core": "^1.55.2", + "playwright-core": "^1.54.1", + "puppeteer-core": "^22.8.0" + }, "scripts": { "build": "turbo run build", "build:cli": "turbo run build:cli", @@ -60,6 +114,10 @@ "typescript": "^5.2.2", "typescript-eslint": "^8.17.0" }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + }, "repository": { "type": "git", "url": "git+https://github.com/browserbase/stagehand.git" @@ -73,3 +131,4 @@ }, "packageManager": "pnpm@9.15.0+sha512.76e2379760a4328ec4415815bcd6628dee727af3779aaa4c914e3944156c4299921a89f976381ee107d41f12cfa4b66681ca9c718f0668fa0831ed4c6d8ba56c" } + From 3d67515f2586eda533a7ec4f1409402923343bd8 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 17 Nov 2025 09:40:37 -0800 Subject: [PATCH 20/38] rv --- package.json | 67 ++++------------------------------------------------ 1 file changed, 4 insertions(+), 63 deletions(-) diff --git a/package.json b/package.json index ee4bd17b3..52ad35591 100644 --- a/package.json +++ b/package.json @@ -1,62 +1,8 @@ { - "name": "@browserbasehq/stagehand", - "version": "3.0.1", - "description": "An AI web browsing framework focused on simplicity and extensibility.", - "main": "./packages/core/dist/index.js", - "module": "./packages/core/dist/index.js", - "types": "./packages/core/dist/index.d.ts", - "exports": { - ".": { - "types": "./packages/core/dist/index.d.ts", - "import": "./packages/core/dist/index.js", - "default": "./packages/core/dist/index.js" - }, - "./package.json": "./package.json" - }, - "files": [ - "packages/core/dist/**/*" - ], - "peerDependencies": { - "deepmerge": "^4.3.1", - "dotenv": "^16.4.5", - "zod": "^3.25.0 || ^4.0.0" - }, - "dependencies": { - "@ai-sdk/provider": "^2.0.0", - "@anthropic-ai/sdk": "0.39.0", - "@browserbasehq/sdk": "^2.4.0", - "@google/genai": "^1.22.0", - "@langchain/openai": "^0.4.4", - "@modelcontextprotocol/sdk": "^1.17.2", - "ai": "^5.0.0", - "devtools-protocol": "^0.0.1464554", - "fetch-cookie": "^3.1.0", - "openai": "^4.87.1", - "pino": "^9.6.0", - "pino-pretty": "^13.0.0", - "playwright": "^1.52.0", - "ws": "^8.18.0", - "zod-to-json-schema": "^3.23.5" - }, - "optionalDependencies": { - "@ai-sdk/anthropic": "^2.0.34", - "@ai-sdk/azure": "^2.0.54", - "@ai-sdk/cerebras": "^1.0.25", - "@ai-sdk/deepseek": "^1.0.23", - "@ai-sdk/google": "^2.0.23", - "@ai-sdk/groq": "^2.0.24", - "@ai-sdk/mistral": "^2.0.19", - "@ai-sdk/openai": "^2.0.53", - "@ai-sdk/perplexity": "^2.0.13", - "@ai-sdk/togetherai": "^1.0.23", - "@ai-sdk/xai": "^2.0.26", - "@langchain/core": "^0.3.40", - "chrome-launcher": "^1.2.0", - "ollama-ai-provider-v2": "^1.5.0", - "patchright-core": "^1.55.2", - "playwright-core": "^1.54.1", - "puppeteer-core": "^22.8.0" - }, + "name": "stagehand-workspace", + "version": "0.0.0", + "private": true, + "description": "Stagehand monorepo workspace", "scripts": { "build": "turbo run build", "build:cli": "turbo run build:cli", @@ -114,10 +60,6 @@ "typescript": "^5.2.2", "typescript-eslint": "^8.17.0" }, - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, "repository": { "type": "git", "url": "git+https://github.com/browserbase/stagehand.git" @@ -131,4 +73,3 @@ }, "packageManager": "pnpm@9.15.0+sha512.76e2379760a4328ec4415815bcd6628dee727af3779aaa4c914e3944156c4299921a89f976381ee107d41f12cfa4b66681ca9c718f0668fa0831ed4c6d8ba56c" } - From cb5a68584d660d929bc061e18bcbcb993c02ad28 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 17 Nov 2025 11:59:53 -0800 Subject: [PATCH 21/38] export new type --- packages/core/lib/v3/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/lib/v3/index.ts b/packages/core/lib/v3/index.ts index 838e15298..ad799c2df 100644 --- a/packages/core/lib/v3/index.ts +++ b/packages/core/lib/v3/index.ts @@ -6,5 +6,6 @@ export * from "./llm/LLMClient"; export * from "./types/public"; export * from "./agent/AgentProvider"; export * from "../utils"; +export * from "./zodCompat"; export { connectToMCPServer } from "./mcp/connection"; export { V3Evaluator } from "../v3Evaluator"; From 7afc1d72f46d54ae585df7f41c09d2e7cb66c0be Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 17 Nov 2025 14:45:28 -0800 Subject: [PATCH 22/38] remove zod to json schema --- packages/core/lib/utils.ts | 12 +++ packages/core/lib/v3/zodCompat.ts | 135 ++++++++++++++++++++++++++---- packages/core/package.json | 3 +- pnpm-lock.yaml | 7 -- 4 files changed, 130 insertions(+), 27 deletions(-) diff --git a/packages/core/lib/utils.ts b/packages/core/lib/utils.ts index 26e484e7b..dde9102df 100644 --- a/packages/core/lib/utils.ts +++ b/packages/core/lib/utils.ts @@ -747,6 +747,7 @@ export interface JsonSchemaProperty { minimum?: number; maximum?: number; description?: string; + format?: string; // JSON Schema format field (e.g., "uri", "url", "email", etc.) } export interface JsonSchema extends JsonSchemaProperty { type: string; @@ -795,6 +796,17 @@ export function jsonSchemaToZod(schema: JsonSchema): ZodTypeAny { return z.string().refine((val) => schema.enum!.includes(val)); } let zodString = z.string(); + + // Handle JSON Schema format field + if (schema.format === "uri" || schema.format === "url") { + zodString = zodString.url(); + } else if (schema.format === "email") { + zodString = zodString.email(); + } else if (schema.format === "uuid") { + zodString = zodString.uuid(); + } + // Add more format handlers as needed + if (schema.description) { zodString = zodString.describe(schema.description); } diff --git a/packages/core/lib/v3/zodCompat.ts b/packages/core/lib/v3/zodCompat.ts index 026076e32..f52badd84 100644 --- a/packages/core/lib/v3/zodCompat.ts +++ b/packages/core/lib/v3/zodCompat.ts @@ -5,7 +5,6 @@ import type { ZodTypeAny as Zod4TypeAny, } from "zod"; import type * as z3 from "zod/v3"; -import { zodToJsonSchema } from "zod-to-json-schema"; export type StagehandZodSchema = Zod4TypeAny | z3.ZodTypeAny; @@ -31,25 +30,125 @@ export const isZod3Schema = ( export type JsonSchemaDocument = Record; +// Manual converter for zod/v3 schemas to JSON Schema +function ZodToJsonSchema(schema: z3.ZodTypeAny): JsonSchemaDocument { + const _def = (schema as unknown as { _def?: Record })._def; + + if (!_def) { + return { type: "null" }; + } + + const typeName = _def.typeName; + + switch (typeName) { + case "ZodObject": { + const shape = typeof _def.shape === "function" ? _def.shape() : _def.shape; + const properties: Record = {}; + const required: string[] = []; + + for (const [key, value] of Object.entries(shape as Record)) { + properties[key] = ZodToJsonSchema(value); + // Check if field is not optional + const valueDef = (value as unknown as { _def?: { typeName?: string } })._def; + if (valueDef?.typeName !== "ZodOptional") { + required.push(key); + } + } + + return { + type: "object", + properties, + required, + additionalProperties: _def.unknownKeys === "passthrough", + }; + } + + case "ZodArray": { + const itemType = _def.type as z3.ZodTypeAny; + return { + type: "array", + items: ZodToJsonSchema(itemType), + }; + } + + case "ZodString": { + const result: JsonSchemaDocument = { type: "string" }; + // Check for URL validation + const checks = _def.checks as Array<{ kind?: string }> | undefined; + if (checks) { + for (const check of checks) { + if (check.kind === "url") { + result.format = "url"; + break; + } + } + } + return result; + } + + case "ZodNumber": + return { type: "number" }; + + case "ZodBoolean": + return { type: "boolean" }; + + case "ZodOptional": + return ZodToJsonSchema(_def.innerType as z3.ZodTypeAny); + + case "ZodNullable": { + const innerSchema = ZodToJsonSchema(_def.innerType as z3.ZodTypeAny); + return { + ...innerSchema, + nullable: true, + }; + } + + case "ZodEnum": + return { + type: "string", + enum: _def.values, + }; + + case "ZodLiteral": + return { + type: typeof _def.value, + const: _def.value, + }; + + case "ZodUnion": + return { + anyOf: (_def.options as z3.ZodTypeAny[]).map((opt) => ZodToJsonSchema(opt)), + }; + + default: + console.warn(`Unknown Zod type: ${typeName}`); + return { type: "null" }; + } +} + export function toJsonSchema( schema: StagehandZodSchema, - options?: Parameters[1], ): JsonSchemaDocument { - if ( - isZod4Schema(schema) && - typeof (z as unknown as { toJSONSchema?: unknown }).toJSONSchema === - "function" && - !options - ) { - return ( - z as unknown as { - toJSONSchema: (input: Zod4TypeAny) => JsonSchemaDocument; - } - ).toJSONSchema(schema as Zod4TypeAny); + // For v3 schemas, use manual converter + // Note: We can't use zod-to-json-schema for v3 schemas when zod v4 is installed + // because the library imports 'zod' (v4) and tries to access ZodFirstPartyTypeKind which doesn't exist in v4 + if (!isZod4Schema(schema)) { + const result = { + $schema: "http://json-schema.org/draft-07/schema#", + ...ZodToJsonSchema(schema), + }; + return result; } - - return zodToJsonSchema( - schema as unknown as z.ZodTypeAny, - options ?? { $refStrategy: "none" }, - ) as JsonSchemaDocument; + + // For v4 schemas, use built-in z.toJSONSchema() method + const zodWithJsonSchema = z as typeof z & { + toJSONSchema?: (schema: Zod4TypeAny) => JsonSchemaDocument; + }; + + if (zodWithJsonSchema.toJSONSchema) { + return zodWithJsonSchema.toJSONSchema(schema as Zod4TypeAny); + } + + // This should never happen with Zod v4.1+ + throw new Error("Zod v4 toJSONSchema method not found"); } diff --git a/packages/core/package.json b/packages/core/package.json index 2e4dcecbe..e7f9c6934 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -55,8 +55,7 @@ "pino": "^9.6.0", "pino-pretty": "^13.0.0", "playwright": "^1.52.0", - "ws": "^8.18.0", - "zod-to-json-schema": "^3.24.5" + "ws": "^8.18.0" }, "optionalDependencies": { "@ai-sdk/anthropic": "^2.0.34", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd4c51ce3..7c4f642ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -164,9 +164,6 @@ importers: ws: specifier: ^8.18.0 version: 8.18.3 - zod-to-json-schema: - specifier: ^3.24.5 - version: 3.24.5(zod@4.1.12) optionalDependencies: '@ai-sdk/anthropic': specifier: ^2.0.34 @@ -13116,10 +13113,6 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-json-schema@3.24.5(zod@4.1.12): - dependencies: - zod: 4.1.12 - zod@3.23.8: {} zod@3.25.67: {} From 546b38e5235931b12e12ad7423aac326292d0650 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 17 Nov 2025 14:57:02 -0800 Subject: [PATCH 23/38] remove dev dependencies for zod --- packages/core/package.json | 3 +-- pnpm-lock.yaml | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index e7f9c6934..f0beaf272 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -82,8 +82,7 @@ "prettier": "^3.2.5", "tsup": "^8.2.1", "tsx": "^4.10.5", - "typescript": "^5.2.2", - "zod": "^4.1.8" + "typescript": "^5.2.2" }, "repository": { "type": "git", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7c4f642ea..84e9f5835 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -164,6 +164,9 @@ importers: ws: specifier: ^8.18.0 version: 8.18.3 + zod: + specifier: ^3.25.0 || ^4.0.0 + version: 4.1.12 optionalDependencies: '@ai-sdk/anthropic': specifier: ^2.0.34 @@ -235,9 +238,6 @@ importers: typescript: specifier: ^5.2.2 version: 5.8.3 - zod: - specifier: ^4.1.8 - version: 4.1.12 packages/docs: dependencies: @@ -7162,7 +7162,7 @@ snapshots: p-retry: 4.6.2 uuid: 10.0.0 yaml: 2.7.1 - zod: 3.25.76 + zod: 4.1.12 optionalDependencies: cheerio: 1.0.0 langsmith: 0.3.75(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) @@ -7319,8 +7319,8 @@ snapshots: dependencies: '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) js-tiktoken: 1.0.20 - openai: 6.7.0(ws@8.18.3)(zod@3.25.76) - zod: 3.25.76 + openai: 6.7.0(ws@8.18.3)(zod@4.1.12) + zod: 4.1.12 transitivePeerDependencies: - ws @@ -7328,8 +7328,8 @@ snapshots: dependencies: '@langchain/core': 0.3.50(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) js-tiktoken: 1.0.20 - openai: 6.7.0(ws@8.18.3)(zod@3.25.76) - zod: 3.25.76 + openai: 6.7.0(ws@8.18.3)(zod@4.1.12) + zod: 4.1.12 transitivePeerDependencies: - ws @@ -10073,7 +10073,7 @@ snapshots: isstream: 0.1.2 jsonwebtoken: 9.0.2 mime-types: 2.1.35 - retry-axios: 2.6.0(axios@1.13.0) + retry-axios: 2.6.0(axios@1.13.0(debug@4.4.1)) tough-cookie: 4.1.4 transitivePeerDependencies: - supports-color @@ -11373,10 +11373,10 @@ snapshots: ws: 8.18.3 zod: 3.25.67 - openai@6.7.0(ws@8.18.3)(zod@3.25.76): + openai@6.7.0(ws@8.18.3)(zod@4.1.12): optionalDependencies: ws: 8.18.3 - zod: 3.25.76 + zod: 4.1.12 openapi-types@12.1.3: {} @@ -12057,7 +12057,7 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - retry-axios@2.6.0(axios@1.13.0): + retry-axios@2.6.0(axios@1.13.0(debug@4.4.1)): dependencies: axios: 1.13.0(debug@4.4.1) From 2b384cb18524477222dc76f53ad4de419ae29f3f Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 17 Nov 2025 14:58:19 -0800 Subject: [PATCH 24/38] vitest --- packages/core/package.json | 3 +- pnpm-lock.yaml | 538 +++++++++++++++++++++++++++++++++++++ 2 files changed, 540 insertions(+), 1 deletion(-) diff --git a/packages/core/package.json b/packages/core/package.json index f0beaf272..db68aacae 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -82,7 +82,8 @@ "prettier": "^3.2.5", "tsup": "^8.2.1", "tsx": "^4.10.5", - "typescript": "^5.2.2" + "typescript": "^5.2.2", + "vitest": "^4.0.8" }, "repository": { "type": "git", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 84e9f5835..f7da2970e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -238,6 +238,9 @@ importers: typescript: specifier: ^5.2.2 version: 5.8.3 + vitest: + specifier: ^4.0.8 + version: 4.0.10(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) packages/docs: dependencies: @@ -1250,6 +1253,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -1818,51 +1824,106 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.53.2': + resolution: {integrity: sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.40.1': resolution: {integrity: sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.53.2': + resolution: {integrity: sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.40.1': resolution: {integrity: sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.53.2': + resolution: {integrity: sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.40.1': resolution: {integrity: sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.53.2': + resolution: {integrity: sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.40.1': resolution: {integrity: sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.53.2': + resolution: {integrity: sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.40.1': resolution: {integrity: sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.53.2': + resolution: {integrity: sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.40.1': resolution: {integrity: sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.53.2': + resolution: {integrity: sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.40.1': resolution: {integrity: sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.53.2': + resolution: {integrity: sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.40.1': resolution: {integrity: sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.53.2': + resolution: {integrity: sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.40.1': resolution: {integrity: sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.53.2': + resolution: {integrity: sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.53.2': + resolution: {integrity: sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.40.1': resolution: {integrity: sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==} cpu: [loong64] @@ -1873,46 +1934,101 @@ packages: cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.53.2': + resolution: {integrity: sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.40.1': resolution: {integrity: sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.53.2': + resolution: {integrity: sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.40.1': resolution: {integrity: sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.53.2': + resolution: {integrity: sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.40.1': resolution: {integrity: sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.53.2': + resolution: {integrity: sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.40.1': resolution: {integrity: sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.53.2': + resolution: {integrity: sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.40.1': resolution: {integrity: sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.53.2': + resolution: {integrity: sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.53.2': + resolution: {integrity: sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.40.1': resolution: {integrity: sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.53.2': + resolution: {integrity: sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.40.1': resolution: {integrity: sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.53.2': + resolution: {integrity: sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.53.2': + resolution: {integrity: sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.40.1': resolution: {integrity: sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.53.2': + resolution: {integrity: sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==} + cpu: [x64] + os: [win32] + '@shikijs/core@3.11.0': resolution: {integrity: sha512-oJwU+DxGqp6lUZpvtQgVOXNZcVsirN76tihOLBmwILkKuRuwHteApP8oTXmL4tF5vS5FbOY0+8seXmiCoslk4g==} @@ -2040,6 +2156,9 @@ packages: '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/cheerio@0.22.35': resolution: {integrity: sha512-yD57BchKRvTV+JD53UZ6PD8KWY5g5rvvMLRnZR3EQBCZXiDT/HR+pKpMzFGlWNhFrXlo7VPZXtKvIEwZkAWOIA==} @@ -2052,6 +2171,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/es-aggregate-error@1.0.6': resolution: {integrity: sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg==} @@ -2214,6 +2336,35 @@ packages: resolution: {integrity: sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg==} engines: {node: '>= 20'} + '@vitest/expect@4.0.10': + resolution: {integrity: sha512-3QkTX/lK39FBNwARCQRSQr0TP9+ywSdxSX+LgbJ2M1WmveXP72anTbnp2yl5fH+dU6SUmBzNMrDHs80G8G2DZg==} + + '@vitest/mocker@4.0.10': + resolution: {integrity: sha512-e2OfdexYkjkg8Hh3L9NVEfbwGXq5IZbDovkf30qW2tOh7Rh9sVtmSr2ztEXOFbymNxS4qjzLXUQIvATvN4B+lg==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.10': + resolution: {integrity: sha512-99EQbpa/zuDnvVjthwz5bH9o8iPefoQZ63WV8+bsRJZNw3qQSvSltfut8yu1Jc9mqOYi7pEbsKxYTi/rjaq6PA==} + + '@vitest/runner@4.0.10': + resolution: {integrity: sha512-EXU2iSkKvNwtlL8L8doCpkyclw0mc/t4t9SeOnfOFPyqLmQwuceMPA4zJBa6jw0MKsZYbw7kAn+gl7HxrlB8UQ==} + + '@vitest/snapshot@4.0.10': + resolution: {integrity: sha512-2N4X2ZZl7kZw0qeGdQ41H0KND96L3qX1RgwuCfy6oUsF2ISGD/HpSbmms+CkIOsQmg2kulwfhJ4CI0asnZlvkg==} + + '@vitest/spy@4.0.10': + resolution: {integrity: sha512-AsY6sVS8OLb96GV5RoG8B6I35GAbNrC49AO+jNRF9YVGb/g9t+hzNm1H6kD0NDp8tt7VJLs6hb7YMkDXqu03iw==} + + '@vitest/utils@4.0.10': + resolution: {integrity: sha512-kOuqWnEwZNtQxMKg3WmPK1vmhZu9WcoX69iwWjVz+jvKTsF1emzsv3eoPcDr6ykA3qP2bsCQE7CwqfNtAVzsmg==} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -2374,6 +2525,10 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} @@ -2580,6 +2735,10 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@6.2.1: + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} + engines: {node: '>=18'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -2867,6 +3026,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -3076,6 +3244,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -3235,6 +3406,10 @@ packages: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + expr-eval@2.0.2: resolution: {integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==} @@ -3324,6 +3499,15 @@ packages: picomatch: optional: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fetch-cookie@3.1.0: resolution: {integrity: sha512-s/XhhreJpqH0ftkGVcQt8JE9bqk+zRn4jF5mPJXWZeQMCI5odV9K+wEWYbnzFPHgQZlvPSMjS4n4yawWE8RINw==} @@ -4184,6 +4368,9 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -4828,6 +5015,9 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + peek-readable@4.1.0: resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} engines: {node: '>=8'} @@ -4846,6 +5036,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -5245,6 +5439,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.53.2: + resolution: {integrity: sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -5379,6 +5578,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -5478,10 +5680,16 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -5604,6 +5812,9 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} @@ -5611,6 +5822,14 @@ packages: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} @@ -5927,6 +6146,80 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite@7.2.2: + resolution: {integrity: sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.0.10: + resolution: {integrity: sha512-2Fqty3MM9CDwOVet/jaQalYlbcjATZwPYGcqpiYQqgQ/dLC7GuHdISKgTYIVF/kaishKxLzleKWWfbSDklyIKg==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.10 + '@vitest/browser-preview': 4.0.10 + '@vitest/browser-webdriverio': 4.0.10 + '@vitest/ui': 4.0.10 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -5979,6 +6272,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + widest-line@5.0.0: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} @@ -7125,6 +7423,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -7702,63 +8002,129 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.40.1': optional: true + '@rollup/rollup-android-arm-eabi@4.53.2': + optional: true + '@rollup/rollup-android-arm64@4.40.1': optional: true + '@rollup/rollup-android-arm64@4.53.2': + optional: true + '@rollup/rollup-darwin-arm64@4.40.1': optional: true + '@rollup/rollup-darwin-arm64@4.53.2': + optional: true + '@rollup/rollup-darwin-x64@4.40.1': optional: true + '@rollup/rollup-darwin-x64@4.53.2': + optional: true + '@rollup/rollup-freebsd-arm64@4.40.1': optional: true + '@rollup/rollup-freebsd-arm64@4.53.2': + optional: true + '@rollup/rollup-freebsd-x64@4.40.1': optional: true + '@rollup/rollup-freebsd-x64@4.53.2': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.40.1': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.53.2': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.40.1': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.53.2': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.40.1': optional: true + '@rollup/rollup-linux-arm64-gnu@4.53.2': + optional: true + '@rollup/rollup-linux-arm64-musl@4.40.1': optional: true + '@rollup/rollup-linux-arm64-musl@4.53.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.53.2': + optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.40.1': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.53.2': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.40.1': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.53.2': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.40.1': optional: true + '@rollup/rollup-linux-riscv64-musl@4.53.2': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.40.1': optional: true + '@rollup/rollup-linux-s390x-gnu@4.53.2': + optional: true + '@rollup/rollup-linux-x64-gnu@4.40.1': optional: true + '@rollup/rollup-linux-x64-gnu@4.53.2': + optional: true + '@rollup/rollup-linux-x64-musl@4.40.1': optional: true + '@rollup/rollup-linux-x64-musl@4.53.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.53.2': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.40.1': optional: true + '@rollup/rollup-win32-arm64-msvc@4.53.2': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.40.1': optional: true + '@rollup/rollup-win32-ia32-msvc@4.53.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.53.2': + optional: true + '@rollup/rollup-win32-x64-msvc@4.40.1': optional: true + '@rollup/rollup-win32-x64-msvc@4.53.2': + optional: true + '@shikijs/core@3.11.0': dependencies: '@shikijs/types': 3.11.0 @@ -7972,6 +8338,11 @@ snapshots: '@types/connect': 3.4.38 '@types/node': 20.17.32 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/cheerio@0.22.35': dependencies: '@types/node': 20.17.32 @@ -7988,6 +8359,8 @@ snapshots: dependencies: '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/es-aggregate-error@1.0.6': dependencies: '@types/node': 20.17.32 @@ -8178,6 +8551,45 @@ snapshots: '@vercel/oidc@3.0.3': {} + '@vitest/expect@4.0.10': + dependencies: + '@standard-schema/spec': 1.0.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.10 + '@vitest/utils': 4.0.10 + chai: 6.2.1 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.10(vite@7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1))': + dependencies: + '@vitest/spy': 4.0.10 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) + + '@vitest/pretty-format@4.0.10': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.10': + dependencies: + '@vitest/utils': 4.0.10 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.10': + dependencies: + '@vitest/pretty-format': 4.0.10 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.10': {} + + '@vitest/utils@4.0.10': + dependencies: + '@vitest/pretty-format': 4.0.10 + tinyrainbow: 3.0.3 + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -8330,6 +8742,8 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + assertion-error@2.0.1: {} + ast-types@0.13.4: dependencies: tslib: 2.8.1 @@ -8573,6 +8987,8 @@ snapshots: ccount@2.0.1: {} + chai@6.2.1: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -8852,6 +9268,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decamelize@1.2.0: {} decode-named-character-reference@1.1.0: @@ -9099,6 +9519,8 @@ snapshots: es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -9355,6 +9777,8 @@ snapshots: dependencies: eventsource-parser: 3.0.3 + expect-type@1.2.2: {} + expr-eval@2.0.2: {} express-rate-limit@7.5.1(express@5.1.0): @@ -9501,6 +9925,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + fetch-cookie@3.1.0: dependencies: set-cookie-parser: 2.7.1 @@ -10579,6 +11007,10 @@ snapshots: lru-cache@7.18.3: {} + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} @@ -11547,6 +11979,8 @@ snapshots: path-type@4.0.0: {} + pathe@2.0.3: {} + peek-readable@4.1.0: {} pend@1.2.0: {} @@ -11557,6 +11991,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + pify@2.3.0: {} pify@4.0.1: {} @@ -12091,6 +12527,34 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.40.1 fsevents: 2.3.3 + rollup@4.53.2: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.53.2 + '@rollup/rollup-android-arm64': 4.53.2 + '@rollup/rollup-darwin-arm64': 4.53.2 + '@rollup/rollup-darwin-x64': 4.53.2 + '@rollup/rollup-freebsd-arm64': 4.53.2 + '@rollup/rollup-freebsd-x64': 4.53.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.2 + '@rollup/rollup-linux-arm-musleabihf': 4.53.2 + '@rollup/rollup-linux-arm64-gnu': 4.53.2 + '@rollup/rollup-linux-arm64-musl': 4.53.2 + '@rollup/rollup-linux-loong64-gnu': 4.53.2 + '@rollup/rollup-linux-ppc64-gnu': 4.53.2 + '@rollup/rollup-linux-riscv64-gnu': 4.53.2 + '@rollup/rollup-linux-riscv64-musl': 4.53.2 + '@rollup/rollup-linux-s390x-gnu': 4.53.2 + '@rollup/rollup-linux-x64-gnu': 4.53.2 + '@rollup/rollup-linux-x64-musl': 4.53.2 + '@rollup/rollup-openharmony-arm64': 4.53.2 + '@rollup/rollup-win32-arm64-msvc': 4.53.2 + '@rollup/rollup-win32-ia32-msvc': 4.53.2 + '@rollup/rollup-win32-x64-gnu': 4.53.2 + '@rollup/rollup-win32-x64-msvc': 4.53.2 + fsevents: 2.3.3 + router@2.2.0: dependencies: debug: 4.4.0 @@ -12310,6 +12774,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -12422,8 +12888,12 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stackback@0.0.2: {} + statuses@2.0.1: {} + std-env@3.10.0: {} + streamsearch@1.1.0: {} streamx@2.22.0: @@ -12604,6 +13074,8 @@ snapshots: through@2.3.8: {} + tinybench@2.9.0: {} + tinyexec@0.3.2: {} tinyglobby@0.2.13: @@ -12611,6 +13083,13 @@ snapshots: fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyrainbow@3.0.3: {} + tldts-core@6.1.86: {} tldts@6.1.86: @@ -12957,6 +13436,60 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 + vite@7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1): + dependencies: + esbuild: 0.25.11 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.53.2 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 20.17.32 + fsevents: 2.3.3 + jiti: 1.21.7 + tsx: 4.19.4 + yaml: 2.7.1 + + vitest@4.0.10(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1): + dependencies: + '@vitest/expect': 4.0.10 + '@vitest/mocker': 4.0.10(vite@7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1)) + '@vitest/pretty-format': 4.0.10 + '@vitest/runner': 4.0.10 + '@vitest/snapshot': 4.0.10 + '@vitest/spy': 4.0.10 + '@vitest/utils': 4.0.10 + debug: 4.4.3 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 20.17.32 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + web-namespaces@2.0.1: {} web-streams-polyfill@3.3.3: {} @@ -13029,6 +13562,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + widest-line@5.0.0: dependencies: string-width: 7.2.0 From 2d5f674e0c5d73829d41d601524a04aa05f6b528 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 17 Nov 2025 14:58:59 -0800 Subject: [PATCH 25/38] spacing --- packages/core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/package.json b/packages/core/package.json index db68aacae..a534c43c1 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -83,7 +83,7 @@ "tsup": "^8.2.1", "tsx": "^4.10.5", "typescript": "^5.2.2", - "vitest": "^4.0.8" + "vitest": "^4.0.8" }, "repository": { "type": "git", From dce8c83e340d9be663c689f7a9f0aad8d3df6824 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 17 Nov 2025 15:05:06 -0800 Subject: [PATCH 26/38] update lock file --- pnpm-lock.yaml | 319 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 264 insertions(+), 55 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd2a88bcc..914452b18 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: 9.25.1 '@langchain/community': specifier: ^1.0.0 - version: 1.0.0(@browserbasehq/sdk@2.5.0)(@browserbasehq/stagehand@3.0.1(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(google-auth-library@9.15.1)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.2)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(playwright@1.54.2)(puppeteer@22.15.0(typescript@5.8.3))(ws@8.18.3) + version: 1.0.0(@browserbasehq/sdk@2.5.0)(@browserbasehq/stagehand@3.0.3(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(google-auth-library@9.15.1)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.2)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(playwright@1.54.2)(puppeteer@22.15.0(typescript@5.8.3))(ws@8.18.3) '@langchain/core': specifier: ^0.3.40 version: 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) @@ -130,13 +130,13 @@ importers: version: 1.24.0(@modelcontextprotocol/sdk@1.17.2) '@langchain/openai': specifier: ^0.4.4 - version: 0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3) + version: 0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) '@modelcontextprotocol/sdk': specifier: ^1.17.2 version: 1.17.2 ai: specifier: ^5.0.0 - version: 5.0.76(zod@3.25.67) + version: 5.0.76(zod@3.25.76) deepmerge: specifier: ^4.3.1 version: 4.3.1 @@ -151,7 +151,7 @@ importers: version: 3.1.0 openai: specifier: ^4.87.1 - version: 4.96.2(ws@8.18.3)(zod@3.25.67) + version: 4.96.2(ws@8.18.3)(zod@3.25.76) pino: specifier: ^9.6.0 version: 9.6.0 @@ -165,54 +165,51 @@ importers: specifier: ^8.18.0 version: 8.18.3 zod: - specifier: 3.25.67 - version: 3.25.67 - zod-to-json-schema: - specifier: ^3.23.5 - version: 3.24.5(zod@3.25.67) + specifier: ^3.25.0 || ^4.0.0 + version: 3.25.76 optionalDependencies: '@ai-sdk/anthropic': specifier: ^2.0.34 - version: 2.0.34(zod@3.25.67) + version: 2.0.34(zod@3.25.76) '@ai-sdk/azure': specifier: ^2.0.54 - version: 2.0.54(zod@3.25.67) + version: 2.0.54(zod@3.25.76) '@ai-sdk/cerebras': specifier: ^1.0.25 - version: 1.0.25(zod@3.25.67) + version: 1.0.25(zod@3.25.76) '@ai-sdk/deepseek': specifier: ^1.0.23 - version: 1.0.23(zod@3.25.67) + version: 1.0.23(zod@3.25.76) '@ai-sdk/google': specifier: ^2.0.23 - version: 2.0.23(zod@3.25.67) + version: 2.0.23(zod@3.25.76) '@ai-sdk/groq': specifier: ^2.0.24 - version: 2.0.24(zod@3.25.67) + version: 2.0.24(zod@3.25.76) '@ai-sdk/mistral': specifier: ^2.0.19 - version: 2.0.19(zod@3.25.67) + version: 2.0.19(zod@3.25.76) '@ai-sdk/openai': specifier: ^2.0.53 - version: 2.0.53(zod@3.25.67) + version: 2.0.53(zod@3.25.76) '@ai-sdk/perplexity': specifier: ^2.0.13 - version: 2.0.13(zod@3.25.67) + version: 2.0.13(zod@3.25.76) '@ai-sdk/togetherai': specifier: ^1.0.23 - version: 1.0.23(zod@3.25.67) + version: 1.0.23(zod@3.25.76) '@ai-sdk/xai': specifier: ^2.0.26 - version: 2.0.26(zod@3.25.67) + version: 2.0.26(zod@3.25.76) '@langchain/core': specifier: ^0.3.40 - version: 0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.67)) + version: 0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.76)) chrome-launcher: specifier: ^1.2.0 version: 1.2.0 ollama-ai-provider-v2: specifier: ^1.5.0 - version: 1.5.0(zod@3.25.67) + version: 1.5.0(zod@3.25.76) patchright-core: specifier: ^1.55.2 version: 1.55.2 @@ -243,7 +240,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.0.8 - version: 4.0.8(@types/debug@4.1.12)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) + version: 4.0.8(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) packages/docs: dependencies: @@ -267,16 +264,16 @@ importers: version: link:../core ai: specifier: ^5.0.0 - version: 5.0.76(zod@3.25.67) + version: 5.0.76(zod@4.1.12) dotenv: specifier: 16.4.5 version: 16.4.5 openai: specifier: ^4.87.1 - version: 4.96.2(ws@8.18.3)(zod@3.25.67) + version: 4.96.2(ws@8.18.3)(zod@4.1.12) zod: - specifier: 3.25.67 - version: 3.25.67 + specifier: ^4.1.8 + version: 4.1.12 devDependencies: tsx: specifier: ^4.10.5 @@ -422,8 +419,8 @@ packages: '@browserbasehq/sdk@2.5.0': resolution: {integrity: sha512-bcnbYZvm5Ht1nrHUfWDK4crspiTy1ESJYMApsMiOTUnlKOan0ocRD6m7hZH34iSC2c2XWsoryR80cwsYgCBWzQ==} - '@browserbasehq/stagehand@3.0.1': - resolution: {integrity: sha512-GfI6qWAGBj3obGvIgi8wbE1e65y29hB7u9FUmlQIz2wUX/izFFchlq+PszafPr9d2q4ZzbqzqNoc9WSjhxT65w==} + '@browserbasehq/stagehand@3.0.3': + resolution: {integrity: sha512-O/9VgmOmIX4ZYuu2hgQ+7BmK8wkSgPX/kLzGQ/SJLCNYRW9yuU6/b4NRdFU5uJ7OlCKdEOcV1u4Cc4PhY67S0w==} peerDependencies: deepmerge: ^4.3.1 dotenv: ^16.4.5 @@ -6402,6 +6399,9 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -6414,6 +6414,13 @@ snapshots: zod: 3.25.67 optional: true + '@ai-sdk/anthropic@2.0.34(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + optional: true + '@ai-sdk/azure@2.0.54(zod@3.25.67)': dependencies: '@ai-sdk/openai': 2.0.53(zod@3.25.67) @@ -6422,6 +6429,14 @@ snapshots: zod: 3.25.67 optional: true + '@ai-sdk/azure@2.0.54(zod@3.25.76)': + dependencies: + '@ai-sdk/openai': 2.0.53(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + optional: true + '@ai-sdk/cerebras@1.0.25(zod@3.25.67)': dependencies: '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.67) @@ -6430,6 +6445,14 @@ snapshots: zod: 3.25.67 optional: true + '@ai-sdk/cerebras@1.0.25(zod@3.25.76)': + dependencies: + '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + optional: true + '@ai-sdk/deepseek@1.0.23(zod@3.25.67)': dependencies: '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.67) @@ -6438,6 +6461,14 @@ snapshots: zod: 3.25.67 optional: true + '@ai-sdk/deepseek@1.0.23(zod@3.25.76)': + dependencies: + '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + optional: true + '@ai-sdk/gateway@2.0.0(zod@3.25.67)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6445,6 +6476,20 @@ snapshots: '@vercel/oidc': 3.0.3 zod: 3.25.67 + '@ai-sdk/gateway@2.0.0(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + '@vercel/oidc': 3.0.3 + zod: 3.25.76 + + '@ai-sdk/gateway@2.0.0(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@vercel/oidc': 3.0.3 + zod: 4.1.12 + '@ai-sdk/google@2.0.23(zod@3.25.67)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6452,6 +6497,13 @@ snapshots: zod: 3.25.67 optional: true + '@ai-sdk/google@2.0.23(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + optional: true + '@ai-sdk/groq@2.0.24(zod@3.25.67)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6459,6 +6511,13 @@ snapshots: zod: 3.25.67 optional: true + '@ai-sdk/groq@2.0.24(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + optional: true + '@ai-sdk/mistral@2.0.19(zod@3.25.67)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6466,6 +6525,13 @@ snapshots: zod: 3.25.67 optional: true + '@ai-sdk/mistral@2.0.19(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + optional: true + '@ai-sdk/openai-compatible@1.0.22(zod@3.25.67)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6473,6 +6539,13 @@ snapshots: zod: 3.25.67 optional: true + '@ai-sdk/openai-compatible@1.0.22(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + optional: true + '@ai-sdk/openai@2.0.53(zod@3.25.67)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6480,6 +6553,13 @@ snapshots: zod: 3.25.67 optional: true + '@ai-sdk/openai@2.0.53(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + optional: true + '@ai-sdk/perplexity@2.0.13(zod@3.25.67)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6487,6 +6567,13 @@ snapshots: zod: 3.25.67 optional: true + '@ai-sdk/perplexity@2.0.13(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + optional: true + '@ai-sdk/provider-utils@3.0.12(zod@3.25.67)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6494,6 +6581,20 @@ snapshots: eventsource-parser: 3.0.6 zod: 3.25.67 + '@ai-sdk/provider-utils@3.0.12(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 3.25.76 + + '@ai-sdk/provider-utils@3.0.12(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 4.1.12 + '@ai-sdk/provider@1.1.3': dependencies: json-schema: 0.4.0 @@ -6510,6 +6611,14 @@ snapshots: zod: 3.25.67 optional: true + '@ai-sdk/togetherai@1.0.23(zod@3.25.76)': + dependencies: + '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + optional: true + '@ai-sdk/xai@2.0.26(zod@3.25.67)': dependencies: '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.67) @@ -6518,6 +6627,14 @@ snapshots: zod: 3.25.67 optional: true + '@ai-sdk/xai@2.0.26(zod@3.25.76)': + dependencies: + '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + optional: true + '@alcalzone/ansi-tokenize@0.1.3': dependencies: ansi-styles: 6.2.1 @@ -6543,10 +6660,10 @@ snapshots: '@ark/util@0.46.0': {} - '@asteasolutions/zod-to-openapi@6.4.0(zod@3.25.67)': + '@asteasolutions/zod-to-openapi@6.4.0(zod@3.25.76)': dependencies: openapi3-ts: 4.4.0 - zod: 3.25.67 + zod: 3.25.76 '@asyncapi/parser@3.4.0': dependencies: @@ -6588,9 +6705,9 @@ snapshots: '@braintrust/core@0.0.34': dependencies: - '@asteasolutions/zod-to-openapi': 6.4.0(zod@3.25.67) + '@asteasolutions/zod-to-openapi': 6.4.0(zod@3.25.76) uuid: 9.0.1 - zod: 3.25.67 + zod: 3.25.76 '@browserbasehq/sdk@2.5.0': dependencies: @@ -6604,7 +6721,7 @@ snapshots: transitivePeerDependencies: - encoding - '@browserbasehq/stagehand@3.0.1(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67)': + '@browserbasehq/stagehand@3.0.3(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67)': dependencies: '@ai-sdk/provider': 2.0.0 '@anthropic-ai/sdk': 0.39.0 @@ -7375,9 +7492,9 @@ snapshots: - openai - ws - '@langchain/community@1.0.0(@browserbasehq/sdk@2.5.0)(@browserbasehq/stagehand@3.0.1(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(google-auth-library@9.15.1)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.2)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(playwright@1.54.2)(puppeteer@22.15.0(typescript@5.8.3))(ws@8.18.3)': + '@langchain/community@1.0.0(@browserbasehq/sdk@2.5.0)(@browserbasehq/stagehand@3.0.3(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(google-auth-library@9.15.1)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.2)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(playwright@1.54.2)(puppeteer@22.15.0(typescript@5.8.3))(ws@8.18.3)': dependencies: - '@browserbasehq/stagehand': 3.0.1(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67) + '@browserbasehq/stagehand': 3.0.3(deepmerge@4.3.1)(dotenv@16.5.0)(zod@3.25.67) '@ibm-cloud/watsonx-ai': 1.7.0 '@langchain/classic': 1.0.0(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(@opentelemetry/api@1.9.0)(cheerio@1.0.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67))(ws@8.18.3) '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) @@ -7418,8 +7535,26 @@ snapshots: p-queue: 6.6.2 p-retry: 4.6.2 uuid: 10.0.0 - zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod: 3.25.76 + zod-to-json-schema: 3.24.5(zod@3.25.76) + transitivePeerDependencies: + - openai + optional: true + + '@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.76))': + dependencies: + '@cfworker/json-schema': 4.1.1 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.20 + langsmith: 0.3.23(openai@4.96.2(ws@8.18.3)(zod@3.25.76)) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.25.76 + zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: - openai @@ -7435,8 +7570,8 @@ snapshots: p-queue: 6.6.2 p-retry: 4.6.2 uuid: 10.0.0 - zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod: 3.25.76 + zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: - openai @@ -7468,9 +7603,9 @@ snapshots: - react - react-dom - '@langchain/openai@0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3)': + '@langchain/openai@0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.67)) + '@langchain/core': 0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.76)) js-tiktoken: 1.0.20 openai: 4.96.2(ws@8.18.3)(zod@3.25.67) zod: 3.25.67 @@ -7790,7 +7925,7 @@ snapshots: unified: 11.0.5 unist-util-visit: 5.0.0 yargs: 17.7.2 - zod: 3.25.67 + zod: 3.25.76 transitivePeerDependencies: - '@types/react' - bare-buffer @@ -7811,8 +7946,8 @@ snapshots: lcm: 0.0.3 lodash: 4.17.21 openapi-types: 12.1.3 - zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod: 3.25.76 + zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: - debug @@ -7828,8 +7963,8 @@ snapshots: express-rate-limit: 7.5.1(express@5.1.0) pkce-challenge: 5.0.0 raw-body: 3.0.0 - zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod: 3.25.76 + zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: - supports-color @@ -8435,13 +8570,13 @@ snapshots: chai: 6.2.0 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.8(vite@7.2.2(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1))': + '@vitest/mocker@4.0.8(vite@7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1))': dependencies: '@vitest/spy': 4.0.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.2.2(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) + vite: 7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) '@vitest/pretty-format@4.0.8': dependencies: @@ -8514,6 +8649,22 @@ snapshots: '@opentelemetry/api': 1.9.0 zod: 3.25.67 + ai@5.0.76(zod@3.25.76): + dependencies: + '@ai-sdk/gateway': 2.0.0(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + zod: 3.25.76 + + ai@5.0.76(zod@4.1.12): + dependencies: + '@ai-sdk/gateway': 2.0.0(zod@4.1.12) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@opentelemetry/api': 1.9.0 + zod: 4.1.12 + ajv-draft-04@1.0.0(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 @@ -10368,7 +10519,7 @@ snapshots: isstream: 0.1.2 jsonwebtoken: 9.0.2 mime-types: 2.1.35 - retry-axios: 2.6.0(axios@1.13.0(debug@4.4.3)) + retry-axios: 2.6.0(axios@1.13.0) tough-cookie: 4.1.4 transitivePeerDependencies: - supports-color @@ -10768,6 +10919,19 @@ snapshots: uuid: 10.0.0 optionalDependencies: openai: 4.96.2(ws@8.18.3)(zod@3.25.67) + optional: true + + langsmith@0.3.23(openai@4.96.2(ws@8.18.3)(zod@3.25.76)): + dependencies: + '@types/uuid': 10.0.0 + chalk: 4.1.2 + console-table-printer: 2.12.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.7.1 + uuid: 10.0.0 + optionalDependencies: + openai: 4.96.2(ws@8.18.3)(zod@3.25.76) langsmith@0.3.23(openai@6.7.0(ws@8.18.3)(zod@3.25.67)): dependencies: @@ -11586,6 +11750,13 @@ snapshots: zod: 3.25.67 optional: true + ollama-ai-provider-v2@1.5.0(zod@3.25.76): + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + optional: true + on-exit-leak-free@2.1.2: {} on-finished@2.4.1: @@ -11643,6 +11814,36 @@ snapshots: transitivePeerDependencies: - encoding + openai@4.96.2(ws@8.18.3)(zod@3.25.76): + dependencies: + '@types/node': 18.19.87 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + ws: 8.18.3 + zod: 3.25.76 + transitivePeerDependencies: + - encoding + + openai@4.96.2(ws@8.18.3)(zod@4.1.12): + dependencies: + '@types/node': 18.19.87 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + ws: 8.18.3 + zod: 4.1.12 + transitivePeerDependencies: + - encoding + openai@6.7.0(ws@8.18.3)(zod@3.25.67): optionalDependencies: ws: 8.18.3 @@ -12336,7 +12537,7 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - retry-axios@2.6.0(axios@1.13.0(debug@4.4.3)): + retry-axios@2.6.0(axios@1.13.0): dependencies: axios: 1.13.0(debug@4.4.3) @@ -13279,7 +13480,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@7.2.2(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1): + vite@7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1): dependencies: esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) @@ -13288,15 +13489,16 @@ snapshots: rollup: 4.53.2 tinyglobby: 0.2.15 optionalDependencies: + '@types/node': 20.17.32 fsevents: 2.3.3 jiti: 1.21.7 tsx: 4.19.4 yaml: 2.7.1 - vitest@4.0.8(@types/debug@4.1.12)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1): + vitest@4.0.8(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1): dependencies: '@vitest/expect': 4.0.8 - '@vitest/mocker': 4.0.8(vite@7.2.2(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1)) + '@vitest/mocker': 4.0.8(vite@7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1)) '@vitest/pretty-format': 4.0.8 '@vitest/runner': 4.0.8 '@vitest/snapshot': 4.0.8 @@ -13313,10 +13515,11 @@ snapshots: tinyexec: 0.3.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.2.2(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) + vite: 7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 + '@types/node': 20.17.32 transitivePeerDependencies: - jiti - less @@ -13488,10 +13691,16 @@ snapshots: dependencies: zod: 3.25.67 + zod-to-json-schema@3.24.5(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod@3.23.8: {} zod@3.25.67: {} zod@3.25.76: {} + zod@4.1.12: {} + zwitch@2.0.4: {} From 1eff25085bc17a24d39d1e8f523e9534ddecddfa Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 17 Nov 2025 15:47:02 -0800 Subject: [PATCH 27/38] update zod --- packages/core/package.json | 9 +- pnpm-lock.yaml | 285 ++++++++++++++++--------------------- 2 files changed, 129 insertions(+), 165 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 46d1b6fb2..d3b423b01 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { - "name": "@browserbasehq/stagehand", - "version": "3.0.3", + "name": "@browserbasehq/orca", + "version": "3.0.2-zod3456", "description": "An AI web browsing framework focused on simplicity and extensibility.", "main": "./dist/index.js", "module": "./dist/index.js", @@ -40,7 +40,7 @@ "peerDependencies": { "deepmerge": "^4.3.1", "dotenv": "^16.4.5", - "zod": "^3.25.0 || ^4.0.0" + "zod": "^4.1.8" }, "dependencies": { "@ai-sdk/provider": "^2.0.0", @@ -84,7 +84,8 @@ "tsup": "^8.2.1", "tsx": "^4.10.5", "typescript": "^5.2.2", - "vitest": "^4.0.8" + "vitest": "^4.0.8", + "zod": "^4.1.8" }, "repository": { "type": "git", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 914452b18..80e8d4c52 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -130,13 +130,13 @@ importers: version: 1.24.0(@modelcontextprotocol/sdk@1.17.2) '@langchain/openai': specifier: ^0.4.4 - version: 0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) + version: 0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)))(ws@8.18.3) '@modelcontextprotocol/sdk': specifier: ^1.17.2 version: 1.17.2 ai: specifier: ^5.0.0 - version: 5.0.76(zod@3.25.76) + version: 5.0.76(zod@4.1.12) deepmerge: specifier: ^4.3.1 version: 4.3.1 @@ -151,7 +151,7 @@ importers: version: 3.1.0 openai: specifier: ^4.87.1 - version: 4.96.2(ws@8.18.3)(zod@3.25.76) + version: 4.96.2(ws@8.18.3)(zod@4.1.12) pino: specifier: ^9.6.0 version: 9.6.0 @@ -164,52 +164,49 @@ importers: ws: specifier: ^8.18.0 version: 8.18.3 - zod: - specifier: ^3.25.0 || ^4.0.0 - version: 3.25.76 optionalDependencies: '@ai-sdk/anthropic': specifier: ^2.0.34 - version: 2.0.34(zod@3.25.76) + version: 2.0.34(zod@4.1.12) '@ai-sdk/azure': specifier: ^2.0.54 - version: 2.0.54(zod@3.25.76) + version: 2.0.54(zod@4.1.12) '@ai-sdk/cerebras': specifier: ^1.0.25 - version: 1.0.25(zod@3.25.76) + version: 1.0.25(zod@4.1.12) '@ai-sdk/deepseek': specifier: ^1.0.23 - version: 1.0.23(zod@3.25.76) + version: 1.0.23(zod@4.1.12) '@ai-sdk/google': specifier: ^2.0.23 - version: 2.0.23(zod@3.25.76) + version: 2.0.23(zod@4.1.12) '@ai-sdk/groq': specifier: ^2.0.24 - version: 2.0.24(zod@3.25.76) + version: 2.0.24(zod@4.1.12) '@ai-sdk/mistral': specifier: ^2.0.19 - version: 2.0.19(zod@3.25.76) + version: 2.0.19(zod@4.1.12) '@ai-sdk/openai': specifier: ^2.0.53 - version: 2.0.53(zod@3.25.76) + version: 2.0.53(zod@4.1.12) '@ai-sdk/perplexity': specifier: ^2.0.13 - version: 2.0.13(zod@3.25.76) + version: 2.0.13(zod@4.1.12) '@ai-sdk/togetherai': specifier: ^1.0.23 - version: 1.0.23(zod@3.25.76) + version: 1.0.23(zod@4.1.12) '@ai-sdk/xai': specifier: ^2.0.26 - version: 2.0.26(zod@3.25.76) + version: 2.0.26(zod@4.1.12) '@langchain/core': specifier: ^0.3.40 - version: 0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.76)) + version: 0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) chrome-launcher: specifier: ^1.2.0 version: 1.2.0 ollama-ai-provider-v2: specifier: ^1.5.0 - version: 1.5.0(zod@3.25.76) + version: 1.5.0(zod@4.1.12) patchright-core: specifier: ^1.55.2 version: 1.55.2 @@ -240,7 +237,10 @@ importers: version: 5.8.3 vitest: specifier: ^4.0.8 - version: 4.0.8(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) + version: 4.0.10(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) + zod: + specifier: ^4.1.8 + version: 4.1.12 packages/docs: dependencies: @@ -2336,11 +2336,11 @@ packages: resolution: {integrity: sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg==} engines: {node: '>= 20'} - '@vitest/expect@4.0.8': - resolution: {integrity: sha512-Rv0eabdP/xjAHQGr8cjBm+NnLHNoL268lMDK85w2aAGLFoVKLd8QGnVon5lLtkXQCoYaNL0wg04EGnyKkkKhPA==} + '@vitest/expect@4.0.10': + resolution: {integrity: sha512-3QkTX/lK39FBNwARCQRSQr0TP9+ywSdxSX+LgbJ2M1WmveXP72anTbnp2yl5fH+dU6SUmBzNMrDHs80G8G2DZg==} - '@vitest/mocker@4.0.8': - resolution: {integrity: sha512-9FRM3MZCedXH3+pIh+ME5Up2NBBHDq0wqwhOKkN4VnvCiKbVxddqH9mSGPZeawjd12pCOGnl+lo/ZGHt0/dQSg==} + '@vitest/mocker@4.0.10': + resolution: {integrity: sha512-e2OfdexYkjkg8Hh3L9NVEfbwGXq5IZbDovkf30qW2tOh7Rh9sVtmSr2ztEXOFbymNxS4qjzLXUQIvATvN4B+lg==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -2350,20 +2350,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.8': - resolution: {integrity: sha512-qRrjdRkINi9DaZHAimV+8ia9Gq6LeGz2CgIEmMLz3sBDYV53EsnLZbJMR1q84z1HZCMsf7s0orDgZn7ScXsZKg==} + '@vitest/pretty-format@4.0.10': + resolution: {integrity: sha512-99EQbpa/zuDnvVjthwz5bH9o8iPefoQZ63WV8+bsRJZNw3qQSvSltfut8yu1Jc9mqOYi7pEbsKxYTi/rjaq6PA==} - '@vitest/runner@4.0.8': - resolution: {integrity: sha512-mdY8Sf1gsM8hKJUQfiPT3pn1n8RF4QBcJYFslgWh41JTfrK1cbqY8whpGCFzBl45LN028g0njLCYm0d7XxSaQQ==} + '@vitest/runner@4.0.10': + resolution: {integrity: sha512-EXU2iSkKvNwtlL8L8doCpkyclw0mc/t4t9SeOnfOFPyqLmQwuceMPA4zJBa6jw0MKsZYbw7kAn+gl7HxrlB8UQ==} - '@vitest/snapshot@4.0.8': - resolution: {integrity: sha512-Nar9OTU03KGiubrIOFhcfHg8FYaRaNT+bh5VUlNz8stFhCZPNrJvmZkhsr1jtaYvuefYFwK2Hwrq026u4uPWCw==} + '@vitest/snapshot@4.0.10': + resolution: {integrity: sha512-2N4X2ZZl7kZw0qeGdQ41H0KND96L3qX1RgwuCfy6oUsF2ISGD/HpSbmms+CkIOsQmg2kulwfhJ4CI0asnZlvkg==} - '@vitest/spy@4.0.8': - resolution: {integrity: sha512-nvGVqUunyCgZH7kmo+Ord4WgZ7lN0sOULYXUOYuHr55dvg9YvMz3izfB189Pgp28w0vWFbEEfNc/c3VTrqrXeA==} + '@vitest/spy@4.0.10': + resolution: {integrity: sha512-AsY6sVS8OLb96GV5RoG8B6I35GAbNrC49AO+jNRF9YVGb/g9t+hzNm1H6kD0NDp8tt7VJLs6hb7YMkDXqu03iw==} - '@vitest/utils@4.0.8': - resolution: {integrity: sha512-pdk2phO5NDvEFfUTxcTP8RFYjVj/kfLSPIN5ebP2Mu9kcIMeAQTbknqcFEyBcC4z2pJlJI9aS5UQjcYfhmKAow==} + '@vitest/utils@4.0.10': + resolution: {integrity: sha512-kOuqWnEwZNtQxMKg3WmPK1vmhZu9WcoX69iwWjVz+jvKTsF1emzsv3eoPcDr6ykA3qP2bsCQE7CwqfNtAVzsmg==} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -2735,8 +2735,8 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@6.2.0: - resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==} + chai@6.2.1: + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} engines: {node: '>=18'} chalk@4.1.2: @@ -6194,18 +6194,18 @@ packages: yaml: optional: true - vitest@4.0.8: - resolution: {integrity: sha512-urzu3NCEV0Qa0Y2PwvBtRgmNtxhj5t5ULw7cuKhIHh3OrkKTLlut0lnBOv9qe5OvbkMH2g38G7KPDCTpIytBVg==} + vitest@4.0.10: + resolution: {integrity: sha512-2Fqty3MM9CDwOVet/jaQalYlbcjATZwPYGcqpiYQqgQ/dLC7GuHdISKgTYIVF/kaishKxLzleKWWfbSDklyIKg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.8 - '@vitest/browser-preview': 4.0.8 - '@vitest/browser-webdriverio': 4.0.8 - '@vitest/ui': 4.0.8 + '@vitest/browser-playwright': 4.0.10 + '@vitest/browser-preview': 4.0.10 + '@vitest/browser-webdriverio': 4.0.10 + '@vitest/ui': 4.0.10 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -6414,11 +6414,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/anthropic@2.0.34(zod@3.25.76)': + '@ai-sdk/anthropic@2.0.34(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true '@ai-sdk/azure@2.0.54(zod@3.25.67)': @@ -6429,12 +6429,12 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/azure@2.0.54(zod@3.25.76)': + '@ai-sdk/azure@2.0.54(zod@4.1.12)': dependencies: - '@ai-sdk/openai': 2.0.53(zod@3.25.76) + '@ai-sdk/openai': 2.0.53(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true '@ai-sdk/cerebras@1.0.25(zod@3.25.67)': @@ -6445,12 +6445,12 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/cerebras@1.0.25(zod@3.25.76)': + '@ai-sdk/cerebras@1.0.25(zod@4.1.12)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.76) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true '@ai-sdk/deepseek@1.0.23(zod@3.25.67)': @@ -6461,12 +6461,12 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/deepseek@1.0.23(zod@3.25.76)': + '@ai-sdk/deepseek@1.0.23(zod@4.1.12)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.76) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true '@ai-sdk/gateway@2.0.0(zod@3.25.67)': @@ -6476,13 +6476,6 @@ snapshots: '@vercel/oidc': 3.0.3 zod: 3.25.67 - '@ai-sdk/gateway@2.0.0(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - '@vercel/oidc': 3.0.3 - zod: 3.25.76 - '@ai-sdk/gateway@2.0.0(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6497,11 +6490,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/google@2.0.23(zod@3.25.76)': + '@ai-sdk/google@2.0.23(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true '@ai-sdk/groq@2.0.24(zod@3.25.67)': @@ -6511,11 +6504,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/groq@2.0.24(zod@3.25.76)': + '@ai-sdk/groq@2.0.24(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true '@ai-sdk/mistral@2.0.19(zod@3.25.67)': @@ -6525,11 +6518,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/mistral@2.0.19(zod@3.25.76)': + '@ai-sdk/mistral@2.0.19(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true '@ai-sdk/openai-compatible@1.0.22(zod@3.25.67)': @@ -6539,11 +6532,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/openai-compatible@1.0.22(zod@3.25.76)': + '@ai-sdk/openai-compatible@1.0.22(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true '@ai-sdk/openai@2.0.53(zod@3.25.67)': @@ -6553,11 +6546,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/openai@2.0.53(zod@3.25.76)': + '@ai-sdk/openai@2.0.53(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true '@ai-sdk/perplexity@2.0.13(zod@3.25.67)': @@ -6567,11 +6560,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/perplexity@2.0.13(zod@3.25.76)': + '@ai-sdk/perplexity@2.0.13(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true '@ai-sdk/provider-utils@3.0.12(zod@3.25.67)': @@ -6581,13 +6574,6 @@ snapshots: eventsource-parser: 3.0.6 zod: 3.25.67 - '@ai-sdk/provider-utils@3.0.12(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 2.0.0 - '@standard-schema/spec': 1.0.0 - eventsource-parser: 3.0.6 - zod: 3.25.76 - '@ai-sdk/provider-utils@3.0.12(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6611,12 +6597,12 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/togetherai@1.0.23(zod@3.25.76)': + '@ai-sdk/togetherai@1.0.23(zod@4.1.12)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.76) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true '@ai-sdk/xai@2.0.26(zod@3.25.67)': @@ -6627,12 +6613,12 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/xai@2.0.26(zod@3.25.76)': + '@ai-sdk/xai@2.0.26(zod@4.1.12)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@3.25.76) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true '@alcalzone/ansi-tokenize@0.1.3': @@ -7481,7 +7467,7 @@ snapshots: p-retry: 4.6.2 uuid: 10.0.0 yaml: 2.7.1 - zod: 3.25.76 + zod: 4.1.12 optionalDependencies: cheerio: 1.0.0 langsmith: 0.3.75(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) @@ -7541,14 +7527,14 @@ snapshots: - openai optional: true - '@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.76))': + '@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12))': dependencies: '@cfworker/json-schema': 4.1.1 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.20 - langsmith: 0.3.23(openai@4.96.2(ws@8.18.3)(zod@3.25.76)) + langsmith: 0.3.23(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -7603,9 +7589,9 @@ snapshots: - react - react-dom - '@langchain/openai@0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': + '@langchain/openai@0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.50(openai@4.96.2(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) js-tiktoken: 1.0.20 openai: 4.96.2(ws@8.18.3)(zod@3.25.67) zod: 3.25.67 @@ -7629,8 +7615,8 @@ snapshots: dependencies: '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) js-tiktoken: 1.0.20 - openai: 6.7.0(ws@8.18.3)(zod@3.25.76) - zod: 3.25.76 + openai: 6.7.0(ws@8.18.3)(zod@4.1.12) + zod: 4.1.12 transitivePeerDependencies: - ws @@ -7638,8 +7624,8 @@ snapshots: dependencies: '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) js-tiktoken: 1.0.20 - openai: 6.7.0(ws@8.18.3)(zod@3.25.76) - zod: 3.25.76 + openai: 6.7.0(ws@8.18.3)(zod@4.1.12) + zod: 4.1.12 transitivePeerDependencies: - ws @@ -8561,43 +8547,43 @@ snapshots: '@vercel/oidc@3.0.3': {} - '@vitest/expect@4.0.8': + '@vitest/expect@4.0.10': dependencies: '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.8 - '@vitest/utils': 4.0.8 - chai: 6.2.0 + '@vitest/spy': 4.0.10 + '@vitest/utils': 4.0.10 + chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.8(vite@7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1))': + '@vitest/mocker@4.0.10(vite@7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1))': dependencies: - '@vitest/spy': 4.0.8 + '@vitest/spy': 4.0.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) - '@vitest/pretty-format@4.0.8': + '@vitest/pretty-format@4.0.10': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.8': + '@vitest/runner@4.0.10': dependencies: - '@vitest/utils': 4.0.8 + '@vitest/utils': 4.0.10 pathe: 2.0.3 - '@vitest/snapshot@4.0.8': + '@vitest/snapshot@4.0.10': dependencies: - '@vitest/pretty-format': 4.0.8 + '@vitest/pretty-format': 4.0.10 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.8': {} + '@vitest/spy@4.0.10': {} - '@vitest/utils@4.0.8': + '@vitest/utils@4.0.10': dependencies: - '@vitest/pretty-format': 4.0.8 + '@vitest/pretty-format': 4.0.10 tinyrainbow: 3.0.3 abort-controller@3.0.0: @@ -8649,14 +8635,6 @@ snapshots: '@opentelemetry/api': 1.9.0 zod: 3.25.67 - ai@5.0.76(zod@3.25.76): - dependencies: - '@ai-sdk/gateway': 2.0.0(zod@3.25.76) - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - '@opentelemetry/api': 1.9.0 - zod: 3.25.76 - ai@5.0.76(zod@4.1.12): dependencies: '@ai-sdk/gateway': 2.0.0(zod@4.1.12) @@ -9005,7 +8983,7 @@ snapshots: ccount@2.0.1: {} - chai@6.2.0: {} + chai@6.2.1: {} chalk@4.1.2: dependencies: @@ -10519,7 +10497,7 @@ snapshots: isstream: 0.1.2 jsonwebtoken: 9.0.2 mime-types: 2.1.35 - retry-axios: 2.6.0(axios@1.13.0) + retry-axios: 2.6.0(axios@1.13.0(debug@4.4.3)) tough-cookie: 4.1.4 transitivePeerDependencies: - supports-color @@ -10921,7 +10899,7 @@ snapshots: openai: 4.96.2(ws@8.18.3)(zod@3.25.67) optional: true - langsmith@0.3.23(openai@4.96.2(ws@8.18.3)(zod@3.25.76)): + langsmith@0.3.23(openai@4.96.2(ws@8.18.3)(zod@4.1.12)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 @@ -10931,7 +10909,7 @@ snapshots: semver: 7.7.1 uuid: 10.0.0 optionalDependencies: - openai: 4.96.2(ws@8.18.3)(zod@3.25.76) + openai: 4.96.2(ws@8.18.3)(zod@4.1.12) langsmith@0.3.23(openai@6.7.0(ws@8.18.3)(zod@3.25.67)): dependencies: @@ -11750,11 +11728,11 @@ snapshots: zod: 3.25.67 optional: true - ollama-ai-provider-v2@1.5.0(zod@3.25.76): + ollama-ai-provider-v2@1.5.0(zod@4.1.12): dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + zod: 4.1.12 optional: true on-exit-leak-free@2.1.2: {} @@ -11814,21 +11792,6 @@ snapshots: transitivePeerDependencies: - encoding - openai@4.96.2(ws@8.18.3)(zod@3.25.76): - dependencies: - '@types/node': 18.19.87 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.6.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0 - optionalDependencies: - ws: 8.18.3 - zod: 3.25.76 - transitivePeerDependencies: - - encoding - openai@4.96.2(ws@8.18.3)(zod@4.1.12): dependencies: '@types/node': 18.19.87 @@ -11849,10 +11812,10 @@ snapshots: ws: 8.18.3 zod: 3.25.67 - openai@6.7.0(ws@8.18.3)(zod@3.25.76): + openai@6.7.0(ws@8.18.3)(zod@4.1.12): optionalDependencies: ws: 8.18.3 - zod: 3.25.76 + zod: 4.1.12 openapi-types@12.1.3: {} @@ -12537,7 +12500,7 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - retry-axios@2.6.0(axios@1.13.0): + retry-axios@2.6.0(axios@1.13.0(debug@4.4.3)): dependencies: axios: 1.13.0(debug@4.4.3) @@ -13495,15 +13458,15 @@ snapshots: tsx: 4.19.4 yaml: 2.7.1 - vitest@4.0.8(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1): + vitest@4.0.10(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1): dependencies: - '@vitest/expect': 4.0.8 - '@vitest/mocker': 4.0.8(vite@7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1)) - '@vitest/pretty-format': 4.0.8 - '@vitest/runner': 4.0.8 - '@vitest/snapshot': 4.0.8 - '@vitest/spy': 4.0.8 - '@vitest/utils': 4.0.8 + '@vitest/expect': 4.0.10 + '@vitest/mocker': 4.0.10(vite@7.2.2(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1)) + '@vitest/pretty-format': 4.0.10 + '@vitest/runner': 4.0.10 + '@vitest/snapshot': 4.0.10 + '@vitest/spy': 4.0.10 + '@vitest/utils': 4.0.10 debug: 4.4.3 es-module-lexer: 1.7.0 expect-type: 1.2.2 From 6edbf7ca42f498b8bd636a4f89a13af25ce88baf Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 17 Nov 2025 17:48:19 -0800 Subject: [PATCH 28/38] add overloads for schema types --- packages/core/lib/v3/v3.ts | 17 ++++++++++++++--- packages/core/package.json | 10 +++++----- pnpm-lock.yaml | 10 +++++----- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/packages/core/lib/v3/v3.ts b/packages/core/lib/v3/v3.ts index b559042be..43c7919e6 100644 --- a/packages/core/lib/v3/v3.ts +++ b/packages/core/lib/v3/v3.ts @@ -1073,15 +1073,26 @@ export class V3 { instruction: string, options?: ExtractOptions, ): Promise>; - async extract( + async extract( instruction: string, schema: T, options?: ExtractOptions, - ): Promise>; + ): Promise>; + async extract( + instruction: string, + schema: T, + options?: ExtractOptions, + ): Promise>; + // Fallback overload to accept unknown schemas from user apps to avoid TS identity issues + async extract( + instruction: string, + schema: unknown, + options?: ExtractOptions, + ): Promise; async extract( a?: string | ExtractOptions, - b?: StagehandZodSchema | ExtractOptions, + b?: unknown | ExtractOptions, c?: ExtractOptions, ): Promise { return await withInstanceLogContext(this.instanceId, async () => { diff --git a/packages/core/package.json b/packages/core/package.json index d3b423b01..0a296a8d7 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@browserbasehq/orca", - "version": "3.0.2-zod3456", + "version": "3.0.2-zod360", "description": "An AI web browsing framework focused on simplicity and extensibility.", "main": "./dist/index.js", "module": "./dist/index.js", @@ -39,8 +39,7 @@ "license": "MIT", "peerDependencies": { "deepmerge": "^4.3.1", - "dotenv": "^16.4.5", - "zod": "^4.1.8" + "dotenv": "^16.4.5" }, "dependencies": { "@ai-sdk/provider": "^2.0.0", @@ -56,7 +55,8 @@ "pino": "^9.6.0", "pino-pretty": "^13.0.0", "playwright": "^1.52.0", - "ws": "^8.18.0" + "ws": "^8.18.0", + "zod": "^4.1.8" }, "optionalDependencies": { "@ai-sdk/anthropic": "^2.0.34", @@ -85,7 +85,7 @@ "tsx": "^4.10.5", "typescript": "^5.2.2", "vitest": "^4.0.8", - "zod": "^4.1.8" + "zod": "3.25.76 || 4.1.8" }, "repository": { "type": "git", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 80e8d4c52..7e94e1dfb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -164,6 +164,9 @@ importers: ws: specifier: ^8.18.0 version: 8.18.3 + zod: + specifier: ^4.1.8 + version: 4.1.12 optionalDependencies: '@ai-sdk/anthropic': specifier: ^2.0.34 @@ -238,9 +241,6 @@ importers: vitest: specifier: ^4.0.8 version: 4.0.10(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) - zod: - specifier: ^4.1.8 - version: 4.1.12 packages/docs: dependencies: @@ -10497,7 +10497,7 @@ snapshots: isstream: 0.1.2 jsonwebtoken: 9.0.2 mime-types: 2.1.35 - retry-axios: 2.6.0(axios@1.13.0(debug@4.4.3)) + retry-axios: 2.6.0(axios@1.13.0) tough-cookie: 4.1.4 transitivePeerDependencies: - supports-color @@ -12500,7 +12500,7 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - retry-axios@2.6.0(axios@1.13.0(debug@4.4.3)): + retry-axios@2.6.0(axios@1.13.0): dependencies: axios: 1.13.0(debug@4.4.3) From f7a8d1940497e4bc9a6deddc8955de458cff27b3 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Mon, 17 Nov 2025 18:37:13 -0800 Subject: [PATCH 29/38] nice --- packages/core/lib/v3/v3.ts | 30 +++--- packages/core/package.json | 10 +- pnpm-lock.yaml | 194 ++++++++++++++++++++++--------------- 3 files changed, 138 insertions(+), 96 deletions(-) diff --git a/packages/core/lib/v3/v3.ts b/packages/core/lib/v3/v3.ts index 43c7919e6..60dd9b0ef 100644 --- a/packages/core/lib/v3/v3.ts +++ b/packages/core/lib/v3/v3.ts @@ -1073,26 +1073,26 @@ export class V3 { instruction: string, options?: ExtractOptions, ): Promise>; - async extract( + async extract( instruction: string, schema: T, options?: ExtractOptions, - ): Promise>; - async extract( - instruction: string, - schema: T, - options?: ExtractOptions, - ): Promise>; - // Fallback overload to accept unknown schemas from user apps to avoid TS identity issues - async extract( - instruction: string, - schema: unknown, - options?: ExtractOptions, - ): Promise; + ): Promise>; + + + + + + + + + + + async extract( a?: string | ExtractOptions, - b?: unknown | ExtractOptions, + b?: StagehandZodSchema | ExtractOptions, c?: ExtractOptions, ): Promise { return await withInstanceLogContext(this.instanceId, async () => { @@ -1705,4 +1705,4 @@ function isObserveResult(v: unknown): v is Action { return ( !!v && typeof v === "object" && "selector" in (v as Record) ); -} +} \ No newline at end of file diff --git a/packages/core/package.json b/packages/core/package.json index 0a296a8d7..a39a77261 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@browserbasehq/orca", - "version": "3.0.2-zod360", + "version": "3.0.2-zod373", "description": "An AI web browsing framework focused on simplicity and extensibility.", "main": "./dist/index.js", "module": "./dist/index.js", @@ -39,7 +39,8 @@ "license": "MIT", "peerDependencies": { "deepmerge": "^4.3.1", - "dotenv": "^16.4.5" + "dotenv": "^16.4.5", + "zod": "3.25.76 || 4.1.8" }, "dependencies": { "@ai-sdk/provider": "^2.0.0", @@ -55,8 +56,7 @@ "pino": "^9.6.0", "pino-pretty": "^13.0.0", "playwright": "^1.52.0", - "ws": "^8.18.0", - "zod": "^4.1.8" + "ws": "^8.18.0" }, "optionalDependencies": { "@ai-sdk/anthropic": "^2.0.34", @@ -85,7 +85,7 @@ "tsx": "^4.10.5", "typescript": "^5.2.2", "vitest": "^4.0.8", - "zod": "3.25.76 || 4.1.8" + "zod": "4.1.8" }, "repository": { "type": "git", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e94e1dfb..cabc895d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -130,13 +130,13 @@ importers: version: 1.24.0(@modelcontextprotocol/sdk@1.17.2) '@langchain/openai': specifier: ^0.4.4 - version: 0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)))(ws@8.18.3) + version: 0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.8)))(ws@8.18.3) '@modelcontextprotocol/sdk': specifier: ^1.17.2 version: 1.17.2 ai: specifier: ^5.0.0 - version: 5.0.76(zod@4.1.12) + version: 5.0.76(zod@4.1.8) deepmerge: specifier: ^4.3.1 version: 4.3.1 @@ -151,7 +151,7 @@ importers: version: 3.1.0 openai: specifier: ^4.87.1 - version: 4.96.2(ws@8.18.3)(zod@4.1.12) + version: 4.96.2(ws@8.18.3)(zod@4.1.8) pino: specifier: ^9.6.0 version: 9.6.0 @@ -164,52 +164,49 @@ importers: ws: specifier: ^8.18.0 version: 8.18.3 - zod: - specifier: ^4.1.8 - version: 4.1.12 optionalDependencies: '@ai-sdk/anthropic': specifier: ^2.0.34 - version: 2.0.34(zod@4.1.12) + version: 2.0.34(zod@4.1.8) '@ai-sdk/azure': specifier: ^2.0.54 - version: 2.0.54(zod@4.1.12) + version: 2.0.54(zod@4.1.8) '@ai-sdk/cerebras': specifier: ^1.0.25 - version: 1.0.25(zod@4.1.12) + version: 1.0.25(zod@4.1.8) '@ai-sdk/deepseek': specifier: ^1.0.23 - version: 1.0.23(zod@4.1.12) + version: 1.0.23(zod@4.1.8) '@ai-sdk/google': specifier: ^2.0.23 - version: 2.0.23(zod@4.1.12) + version: 2.0.23(zod@4.1.8) '@ai-sdk/groq': specifier: ^2.0.24 - version: 2.0.24(zod@4.1.12) + version: 2.0.24(zod@4.1.8) '@ai-sdk/mistral': specifier: ^2.0.19 - version: 2.0.19(zod@4.1.12) + version: 2.0.19(zod@4.1.8) '@ai-sdk/openai': specifier: ^2.0.53 - version: 2.0.53(zod@4.1.12) + version: 2.0.53(zod@4.1.8) '@ai-sdk/perplexity': specifier: ^2.0.13 - version: 2.0.13(zod@4.1.12) + version: 2.0.13(zod@4.1.8) '@ai-sdk/togetherai': specifier: ^1.0.23 - version: 1.0.23(zod@4.1.12) + version: 1.0.23(zod@4.1.8) '@ai-sdk/xai': specifier: ^2.0.26 - version: 2.0.26(zod@4.1.12) + version: 2.0.26(zod@4.1.8) '@langchain/core': specifier: ^0.3.40 - version: 0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) + version: 0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.8)) chrome-launcher: specifier: ^1.2.0 version: 1.2.0 ollama-ai-provider-v2: specifier: ^1.5.0 - version: 1.5.0(zod@4.1.12) + version: 1.5.0(zod@4.1.8) patchright-core: specifier: ^1.55.2 version: 1.55.2 @@ -241,6 +238,9 @@ importers: vitest: specifier: ^4.0.8 version: 4.0.10(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) + zod: + specifier: 4.1.8 + version: 4.1.8 packages/docs: dependencies: @@ -6402,6 +6402,9 @@ packages: zod@4.1.12: resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + zod@4.1.8: + resolution: {integrity: sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -6414,11 +6417,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/anthropic@2.0.34(zod@4.1.12)': + '@ai-sdk/anthropic@2.0.34(zod@4.1.8)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + zod: 4.1.8 optional: true '@ai-sdk/azure@2.0.54(zod@3.25.67)': @@ -6429,12 +6432,12 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/azure@2.0.54(zod@4.1.12)': + '@ai-sdk/azure@2.0.54(zod@4.1.8)': dependencies: - '@ai-sdk/openai': 2.0.53(zod@4.1.12) + '@ai-sdk/openai': 2.0.53(zod@4.1.8) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + zod: 4.1.8 optional: true '@ai-sdk/cerebras@1.0.25(zod@3.25.67)': @@ -6445,12 +6448,12 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/cerebras@1.0.25(zod@4.1.12)': + '@ai-sdk/cerebras@1.0.25(zod@4.1.8)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.8) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + zod: 4.1.8 optional: true '@ai-sdk/deepseek@1.0.23(zod@3.25.67)': @@ -6461,12 +6464,12 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/deepseek@1.0.23(zod@4.1.12)': + '@ai-sdk/deepseek@1.0.23(zod@4.1.8)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.8) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + zod: 4.1.8 optional: true '@ai-sdk/gateway@2.0.0(zod@3.25.67)': @@ -6483,6 +6486,13 @@ snapshots: '@vercel/oidc': 3.0.3 zod: 4.1.12 + '@ai-sdk/gateway@2.0.0(zod@4.1.8)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + '@vercel/oidc': 3.0.3 + zod: 4.1.8 + '@ai-sdk/google@2.0.23(zod@3.25.67)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -6490,11 +6500,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/google@2.0.23(zod@4.1.12)': + '@ai-sdk/google@2.0.23(zod@4.1.8)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + zod: 4.1.8 optional: true '@ai-sdk/groq@2.0.24(zod@3.25.67)': @@ -6504,11 +6514,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/groq@2.0.24(zod@4.1.12)': + '@ai-sdk/groq@2.0.24(zod@4.1.8)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + zod: 4.1.8 optional: true '@ai-sdk/mistral@2.0.19(zod@3.25.67)': @@ -6518,11 +6528,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/mistral@2.0.19(zod@4.1.12)': + '@ai-sdk/mistral@2.0.19(zod@4.1.8)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + zod: 4.1.8 optional: true '@ai-sdk/openai-compatible@1.0.22(zod@3.25.67)': @@ -6532,11 +6542,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/openai-compatible@1.0.22(zod@4.1.12)': + '@ai-sdk/openai-compatible@1.0.22(zod@4.1.8)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + zod: 4.1.8 optional: true '@ai-sdk/openai@2.0.53(zod@3.25.67)': @@ -6546,11 +6556,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/openai@2.0.53(zod@4.1.12)': + '@ai-sdk/openai@2.0.53(zod@4.1.8)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + zod: 4.1.8 optional: true '@ai-sdk/perplexity@2.0.13(zod@3.25.67)': @@ -6560,11 +6570,11 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/perplexity@2.0.13(zod@4.1.12)': + '@ai-sdk/perplexity@2.0.13(zod@4.1.8)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + zod: 4.1.8 optional: true '@ai-sdk/provider-utils@3.0.12(zod@3.25.67)': @@ -6581,6 +6591,13 @@ snapshots: eventsource-parser: 3.0.6 zod: 4.1.12 + '@ai-sdk/provider-utils@3.0.12(zod@4.1.8)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 4.1.8 + '@ai-sdk/provider@1.1.3': dependencies: json-schema: 0.4.0 @@ -6597,12 +6614,12 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/togetherai@1.0.23(zod@4.1.12)': + '@ai-sdk/togetherai@1.0.23(zod@4.1.8)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.8) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + zod: 4.1.8 optional: true '@ai-sdk/xai@2.0.26(zod@3.25.67)': @@ -6613,12 +6630,12 @@ snapshots: zod: 3.25.67 optional: true - '@ai-sdk/xai@2.0.26(zod@4.1.12)': + '@ai-sdk/xai@2.0.26(zod@4.1.8)': dependencies: - '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.12) + '@ai-sdk/openai-compatible': 1.0.22(zod@4.1.8) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + zod: 4.1.8 optional: true '@alcalzone/ansi-tokenize@0.1.3': @@ -7467,7 +7484,7 @@ snapshots: p-retry: 4.6.2 uuid: 10.0.0 yaml: 2.7.1 - zod: 4.1.12 + zod: 4.1.8 optionalDependencies: cheerio: 1.0.0 langsmith: 0.3.75(@opentelemetry/api@1.9.0)(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) @@ -7527,14 +7544,14 @@ snapshots: - openai optional: true - '@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12))': + '@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.8))': dependencies: '@cfworker/json-schema': 4.1.1 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.20 - langsmith: 0.3.23(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) + langsmith: 0.3.23(openai@4.96.2(ws@8.18.3)(zod@4.1.8)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -7589,9 +7606,9 @@ snapshots: - react - react-dom - '@langchain/openai@0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)))(ws@8.18.3)': + '@langchain/openai@0.4.9(@langchain/core@0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.8)))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.12)) + '@langchain/core': 0.3.50(openai@4.96.2(ws@8.18.3)(zod@4.1.8)) js-tiktoken: 1.0.20 openai: 4.96.2(ws@8.18.3)(zod@3.25.67) zod: 3.25.67 @@ -7615,8 +7632,8 @@ snapshots: dependencies: '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) js-tiktoken: 1.0.20 - openai: 6.7.0(ws@8.18.3)(zod@4.1.12) - zod: 4.1.12 + openai: 6.7.0(ws@8.18.3)(zod@4.1.8) + zod: 4.1.8 transitivePeerDependencies: - ws @@ -7624,8 +7641,8 @@ snapshots: dependencies: '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) js-tiktoken: 1.0.20 - openai: 6.7.0(ws@8.18.3)(zod@4.1.12) - zod: 4.1.12 + openai: 6.7.0(ws@8.18.3)(zod@4.1.8) + zod: 4.1.8 transitivePeerDependencies: - ws @@ -8643,6 +8660,14 @@ snapshots: '@opentelemetry/api': 1.9.0 zod: 4.1.12 + ai@5.0.76(zod@4.1.8): + dependencies: + '@ai-sdk/gateway': 2.0.0(zod@4.1.8) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + '@opentelemetry/api': 1.9.0 + zod: 4.1.8 + ajv-draft-04@1.0.0(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 @@ -10899,7 +10924,7 @@ snapshots: openai: 4.96.2(ws@8.18.3)(zod@3.25.67) optional: true - langsmith@0.3.23(openai@4.96.2(ws@8.18.3)(zod@4.1.12)): + langsmith@0.3.23(openai@4.96.2(ws@8.18.3)(zod@4.1.8)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 @@ -10909,7 +10934,7 @@ snapshots: semver: 7.7.1 uuid: 10.0.0 optionalDependencies: - openai: 4.96.2(ws@8.18.3)(zod@4.1.12) + openai: 4.96.2(ws@8.18.3)(zod@4.1.8) langsmith@0.3.23(openai@6.7.0(ws@8.18.3)(zod@3.25.67)): dependencies: @@ -11728,11 +11753,11 @@ snapshots: zod: 3.25.67 optional: true - ollama-ai-provider-v2@1.5.0(zod@4.1.12): + ollama-ai-provider-v2@1.5.0(zod@4.1.8): dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.12(zod@4.1.8) + zod: 4.1.8 optional: true on-exit-leak-free@2.1.2: {} @@ -11807,15 +11832,30 @@ snapshots: transitivePeerDependencies: - encoding + openai@4.96.2(ws@8.18.3)(zod@4.1.8): + dependencies: + '@types/node': 18.19.87 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + ws: 8.18.3 + zod: 4.1.8 + transitivePeerDependencies: + - encoding + openai@6.7.0(ws@8.18.3)(zod@3.25.67): optionalDependencies: ws: 8.18.3 zod: 3.25.67 - openai@6.7.0(ws@8.18.3)(zod@4.1.12): + openai@6.7.0(ws@8.18.3)(zod@4.1.8): optionalDependencies: ws: 8.18.3 - zod: 4.1.12 + zod: 4.1.8 openapi-types@12.1.3: {} @@ -13666,4 +13706,6 @@ snapshots: zod@4.1.12: {} + zod@4.1.8: {} + zwitch@2.0.4: {} From 3898a8393c5b7ca87ead02fc84724cc2ad2aba25 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Tue, 18 Nov 2025 09:05:02 -0800 Subject: [PATCH 30/38] clean up openai clients --- .../examples/external_clients/customOpenAI.ts | 28 ++++++------------- packages/core/lib/v3/llm/OpenAIClient.ts | 8 +----- 2 files changed, 9 insertions(+), 27 deletions(-) diff --git a/packages/core/examples/external_clients/customOpenAI.ts b/packages/core/examples/external_clients/customOpenAI.ts index 3456d4513..e8bf04f68 100644 --- a/packages/core/examples/external_clients/customOpenAI.ts +++ b/packages/core/examples/external_clients/customOpenAI.ts @@ -11,7 +11,6 @@ import { LLMClient, } from "../../lib/v3"; import OpenAI from "openai"; -import { zodResponseFormat } from "openai/helpers/zod"; import type { ChatCompletion, ChatCompletionAssistantMessageParam, @@ -23,11 +22,7 @@ import type { ChatCompletionUserMessageParam, } from "openai/resources/chat/completions"; import { CreateChatCompletionResponseError } from "../../lib/v3"; -import { - StagehandZodSchema, - isZod4Schema, - toJsonSchema, -} from "../../lib/v3/zodCompat"; +import { StagehandZodSchema, toJsonSchema } from "../../lib/v3/zodCompat"; function validateZodSchema(schema: StagehandZodSchema, data: unknown) { try { @@ -92,20 +87,13 @@ export class CustomOpenAIClient extends LLMClient { | undefined; if (options.response_model) { const responseModelSchema = options.response_model.schema; - if (isZod4Schema(responseModelSchema)) { - responseFormat = zodResponseFormat( - responseModelSchema, - options.response_model.name, - ); - } else { - responseFormat = { - type: "json_schema", - json_schema: { - name: options.response_model.name, - schema: toJsonSchema(responseModelSchema), - }, - }; - } + responseFormat = { + type: "json_schema", + json_schema: { + name: options.response_model.name, + schema: toJsonSchema(responseModelSchema), + }, + }; } /* eslint-disable */ diff --git a/packages/core/lib/v3/llm/OpenAIClient.ts b/packages/core/lib/v3/llm/OpenAIClient.ts index 8030cf6fc..c564f0b9b 100644 --- a/packages/core/lib/v3/llm/OpenAIClient.ts +++ b/packages/core/lib/v3/llm/OpenAIClient.ts @@ -1,5 +1,4 @@ import OpenAI, { ClientOptions } from "openai"; -import { zodResponseFormat } from "openai/helpers/zod"; import { ChatCompletionAssistantMessageParam, ChatCompletionContentPartImage, @@ -24,7 +23,7 @@ import { StagehandError, ZodSchemaValidationError, } from "../types/public/sdkErrors"; -import { isZod4Schema, toJsonSchema } from "../zodCompat"; +import { toJsonSchema } from "../zodCompat"; export class OpenAIClient extends LLMClient { public type = "openai" as const; @@ -186,11 +185,6 @@ export class OpenAIClient extends LLMClient { throw error; } - } else if (isZod4Schema(options.response_model.schema)) { - responseFormat = zodResponseFormat( - options.response_model.schema, - options.response_model.name, - ); } else { responseFormat = { type: "json_schema", From a4a142037dd3f527db26e822066fee77188f3c12 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Tue, 18 Nov 2025 09:07:07 -0800 Subject: [PATCH 31/38] format + revert changes to operator example --- packages/core/examples/operator-example.ts | 28 ++++------- packages/core/lib/utils.ts | 4 +- packages/core/lib/v3/v3.ts | 13 +---- packages/core/lib/v3/zodCompat.ts | 55 ++++++++++++---------- 4 files changed, 40 insertions(+), 60 deletions(-) diff --git a/packages/core/examples/operator-example.ts b/packages/core/examples/operator-example.ts index 374b4d743..0bcc30aba 100644 --- a/packages/core/examples/operator-example.ts +++ b/packages/core/examples/operator-example.ts @@ -5,25 +5,20 @@ * * To learn more about Stagehand Agents, see: https://docs.stagehand.dev/concepts/agent */ - import { Stagehand } from "../lib/v3"; import dotenv from "dotenv"; import chalk from "chalk"; -import z from "zod"; // Load environment variables dotenv.config(); - async function main() { console.log(`\n${chalk.bold("Stagehand 🤘 Operator Example")}\n`); - // Initialize Stagehand const stagehand = new Stagehand({ env: "LOCAL", verbose: 2, cacheDir: "stagehand-agent-cache", logInferenceToFile: false, - model: "google/gemini-2.5-flash", }); await stagehand.init(); @@ -31,30 +26,23 @@ async function main() { try { const page = stagehand.context.pages()[0]; await page.goto( - "https://browserbase.github.io/stagehand-eval-sites/sites/jfk/", + "https://browserbase.github.io/stagehand-eval-sites/sites/shadow-dom/", ); + const agent = stagehand.agent(); - const extraction = await stagehand.extract( - "extract all the record file name and their corresponding links", - z.object({ - records: z.array( - z.object({ - file_name: z.string().describe("the file name of the record"), - link: z.string().url(), - }), - ), - }), - ); - - console.log(extraction); + const result = await agent.execute({ + instruction: "click the button", + maxSteps: 20, + }); console.log(`${chalk.green("✓")} Execution complete`); console.log(`${chalk.yellow("⤷")} Result:`); + console.log(JSON.stringify(result, null, 2)); + console.log(chalk.white(result.message)); } catch (error) { console.log(`${chalk.red("✗")} Error: ${error}`); } finally { // await stagehand.close(); } } - main(); diff --git a/packages/core/lib/utils.ts b/packages/core/lib/utils.ts index dde9102df..f6dfadad8 100644 --- a/packages/core/lib/utils.ts +++ b/packages/core/lib/utils.ts @@ -796,7 +796,7 @@ export function jsonSchemaToZod(schema: JsonSchema): ZodTypeAny { return z.string().refine((val) => schema.enum!.includes(val)); } let zodString = z.string(); - + // Handle JSON Schema format field if (schema.format === "uri" || schema.format === "url") { zodString = zodString.url(); @@ -806,7 +806,7 @@ export function jsonSchemaToZod(schema: JsonSchema): ZodTypeAny { zodString = zodString.uuid(); } // Add more format handlers as needed - + if (schema.description) { zodString = zodString.describe(schema.description); } diff --git a/packages/core/lib/v3/v3.ts b/packages/core/lib/v3/v3.ts index 60dd9b0ef..b559042be 100644 --- a/packages/core/lib/v3/v3.ts +++ b/packages/core/lib/v3/v3.ts @@ -1079,17 +1079,6 @@ export class V3 { options?: ExtractOptions, ): Promise>; - - - - - - - - - - - async extract( a?: string | ExtractOptions, b?: StagehandZodSchema | ExtractOptions, @@ -1705,4 +1694,4 @@ function isObserveResult(v: unknown): v is Action { return ( !!v && typeof v === "object" && "selector" in (v as Record) ); -} \ No newline at end of file +} diff --git a/packages/core/lib/v3/zodCompat.ts b/packages/core/lib/v3/zodCompat.ts index f52badd84..167a381dc 100644 --- a/packages/core/lib/v3/zodCompat.ts +++ b/packages/core/lib/v3/zodCompat.ts @@ -5,7 +5,6 @@ import type { ZodTypeAny as Zod4TypeAny, } from "zod"; import type * as z3 from "zod/v3"; - export type StagehandZodSchema = Zod4TypeAny | z3.ZodTypeAny; export type StagehandZodObject = @@ -33,28 +32,32 @@ export type JsonSchemaDocument = Record; // Manual converter for zod/v3 schemas to JSON Schema function ZodToJsonSchema(schema: z3.ZodTypeAny): JsonSchemaDocument { const _def = (schema as unknown as { _def?: Record })._def; - + if (!_def) { return { type: "null" }; } - + const typeName = _def.typeName; - + switch (typeName) { case "ZodObject": { - const shape = typeof _def.shape === "function" ? _def.shape() : _def.shape; + const shape = + typeof _def.shape === "function" ? _def.shape() : _def.shape; const properties: Record = {}; const required: string[] = []; - - for (const [key, value] of Object.entries(shape as Record)) { + + for (const [key, value] of Object.entries( + shape as Record, + )) { properties[key] = ZodToJsonSchema(value); // Check if field is not optional - const valueDef = (value as unknown as { _def?: { typeName?: string } })._def; + const valueDef = (value as unknown as { _def?: { typeName?: string } }) + ._def; if (valueDef?.typeName !== "ZodOptional") { required.push(key); } } - + return { type: "object", properties, @@ -62,7 +65,7 @@ function ZodToJsonSchema(schema: z3.ZodTypeAny): JsonSchemaDocument { additionalProperties: _def.unknownKeys === "passthrough", }; } - + case "ZodArray": { const itemType = _def.type as z3.ZodTypeAny; return { @@ -70,7 +73,7 @@ function ZodToJsonSchema(schema: z3.ZodTypeAny): JsonSchemaDocument { items: ZodToJsonSchema(itemType), }; } - + case "ZodString": { const result: JsonSchemaDocument = { type: "string" }; // Check for URL validation @@ -85,16 +88,16 @@ function ZodToJsonSchema(schema: z3.ZodTypeAny): JsonSchemaDocument { } return result; } - + case "ZodNumber": return { type: "number" }; - + case "ZodBoolean": return { type: "boolean" }; - + case "ZodOptional": return ZodToJsonSchema(_def.innerType as z3.ZodTypeAny); - + case "ZodNullable": { const innerSchema = ZodToJsonSchema(_def.innerType as z3.ZodTypeAny); return { @@ -102,33 +105,33 @@ function ZodToJsonSchema(schema: z3.ZodTypeAny): JsonSchemaDocument { nullable: true, }; } - + case "ZodEnum": return { type: "string", enum: _def.values, }; - + case "ZodLiteral": return { type: typeof _def.value, const: _def.value, }; - + case "ZodUnion": return { - anyOf: (_def.options as z3.ZodTypeAny[]).map((opt) => ZodToJsonSchema(opt)), + anyOf: (_def.options as z3.ZodTypeAny[]).map((opt) => + ZodToJsonSchema(opt), + ), }; - + default: console.warn(`Unknown Zod type: ${typeName}`); return { type: "null" }; } } -export function toJsonSchema( - schema: StagehandZodSchema, -): JsonSchemaDocument { +export function toJsonSchema(schema: StagehandZodSchema): JsonSchemaDocument { // For v3 schemas, use manual converter // Note: We can't use zod-to-json-schema for v3 schemas when zod v4 is installed // because the library imports 'zod' (v4) and tries to access ZodFirstPartyTypeKind which doesn't exist in v4 @@ -139,16 +142,16 @@ export function toJsonSchema( }; return result; } - + // For v4 schemas, use built-in z.toJSONSchema() method const zodWithJsonSchema = z as typeof z & { toJSONSchema?: (schema: Zod4TypeAny) => JsonSchemaDocument; }; - + if (zodWithJsonSchema.toJSONSchema) { return zodWithJsonSchema.toJSONSchema(schema as Zod4TypeAny); } - + // This should never happen with Zod v4.1+ throw new Error("Zod v4 toJSONSchema method not found"); } From f2f7109022548e80e8e31b28524e320caa154d3d Mon Sep 17 00:00:00 2001 From: tkattkat Date: Tue, 18 Nov 2025 09:10:57 -0800 Subject: [PATCH 32/38] remove fallback to empty schema --- packages/core/lib/v3/agent/AnthropicCUAClient.ts | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/packages/core/lib/v3/agent/AnthropicCUAClient.ts b/packages/core/lib/v3/agent/AnthropicCUAClient.ts index 7df044151..62947f531 100644 --- a/packages/core/lib/v3/agent/AnthropicCUAClient.ts +++ b/packages/core/lib/v3/agent/AnthropicCUAClient.ts @@ -443,18 +443,7 @@ export class AnthropicCUAClient extends AgentClient { // Add custom tools if available if (this.tools && Object.keys(this.tools).length > 0) { const customTools = Object.entries(this.tools).map(([name, tool]) => { - const schema = tool.inputSchema as StagehandZodSchema | undefined; - if (!schema) { - return { - name, - description: tool.description, - input_schema: { - type: "object", - properties: {}, - required: [], - }, - }; - } + const schema = tool.inputSchema as StagehandZodSchema; // Convert Zod schema to proper JSON schema format for Anthropic const jsonSchema = toJsonSchema(schema) as { From 19368ce3979a424664b54a7a88137f32490cb0ed Mon Sep 17 00:00:00 2001 From: tkattkat Date: Tue, 18 Nov 2025 09:17:45 -0800 Subject: [PATCH 33/38] clean up unnecessary code --- packages/core/lib/v3/agent/utils/googleCustomToolHandler.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/core/lib/v3/agent/utils/googleCustomToolHandler.ts b/packages/core/lib/v3/agent/utils/googleCustomToolHandler.ts index 345138a06..7766c5d02 100644 --- a/packages/core/lib/v3/agent/utils/googleCustomToolHandler.ts +++ b/packages/core/lib/v3/agent/utils/googleCustomToolHandler.ts @@ -122,11 +122,7 @@ function convertToolToFunctionDeclaration( ): FunctionDeclaration | null { try { // Convert Zod schema to JSON schema - const schema = tool.inputSchema as StagehandZodSchema | undefined; - if (!schema) { - return null; - } - + const schema = tool.inputSchema as StagehandZodSchema; const jsonSchema = toJsonSchema(schema) as { properties?: Record; required?: string[]; From d2af6c30209a64dff6640f431d1440e094dfbae1 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Tue, 18 Nov 2025 10:04:27 -0800 Subject: [PATCH 34/38] update package.json --- packages/core/package.json | 6 +++--- pnpm-lock.yaml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index a39a77261..22dc66b36 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { - "name": "@browserbasehq/orca", - "version": "3.0.2-zod373", + "name": "@browserbasehq/stagehand", + "version": "3.0.3", "description": "An AI web browsing framework focused on simplicity and extensibility.", "main": "./dist/index.js", "module": "./dist/index.js", @@ -85,7 +85,7 @@ "tsx": "^4.10.5", "typescript": "^5.2.2", "vitest": "^4.0.8", - "zod": "4.1.8" + "zod": "3.25.76 || 4.1.8" }, "repository": { "type": "git", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cabc895d8..98b1e1f30 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -239,7 +239,7 @@ importers: specifier: ^4.0.8 version: 4.0.10(@types/debug@4.1.12)(@types/node@20.17.32)(jiti@1.21.7)(tsx@4.19.4)(yaml@2.7.1) zod: - specifier: 4.1.8 + specifier: 3.25.76 || 4.1.8 version: 4.1.8 packages/docs: @@ -10522,7 +10522,7 @@ snapshots: isstream: 0.1.2 jsonwebtoken: 9.0.2 mime-types: 2.1.35 - retry-axios: 2.6.0(axios@1.13.0) + retry-axios: 2.6.0(axios@1.13.0(debug@4.4.3)) tough-cookie: 4.1.4 transitivePeerDependencies: - supports-color @@ -12540,7 +12540,7 @@ snapshots: retext-stringify: 4.0.0 unified: 11.0.5 - retry-axios@2.6.0(axios@1.13.0): + retry-axios@2.6.0(axios@1.13.0(debug@4.4.3)): dependencies: axios: 1.13.0(debug@4.4.3) From 84e1266829698f7d655ce710d50c2fc41dcb573e Mon Sep 17 00:00:00 2001 From: tkattkat <48974763+tkattkat@users.noreply.github.com> Date: Tue, 18 Nov 2025 10:10:45 -0800 Subject: [PATCH 35/38] Update dark-pans-carry.md --- .changeset/dark-pans-carry.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/dark-pans-carry.md b/.changeset/dark-pans-carry.md index 6c2f2b85d..c5f3ab23c 100644 --- a/.changeset/dark-pans-carry.md +++ b/.changeset/dark-pans-carry.md @@ -2,4 +2,4 @@ "@browserbasehq/stagehand": patch --- -Migrate from zodv3 to zodv4 +Add support for zod 4, while maintaining backwards compatibility for zod 3 From 8f001bc19fdc5535d147fc283a42ff629032f4c4 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Tue, 18 Nov 2025 10:22:23 -0800 Subject: [PATCH 36/38] update test --- packages/core/tests/public-types.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/core/tests/public-types.test.ts b/packages/core/tests/public-types.test.ts index ec36d3b07..611f1d17c 100644 --- a/packages/core/tests/public-types.test.ts +++ b/packages/core/tests/public-types.test.ts @@ -69,12 +69,15 @@ const publicApiShape = { getZodType: Stagehand.getZodType, injectUrls: Stagehand.injectUrls, isRunningInBun: Stagehand.isRunningInBun, + isZod3Schema: Stagehand.isZod3Schema, + isZod4Schema: Stagehand.isZod4Schema, jsonSchemaToZod: Stagehand.jsonSchemaToZod, loadApiKeyFromEnv: Stagehand.loadApiKeyFromEnv, modelToAgentProviderMap: Stagehand.modelToAgentProviderMap, pageTextSchema: Stagehand.pageTextSchema, providerEnvVarMap: Stagehand.providerEnvVarMap, toGeminiSchema: Stagehand.toGeminiSchema, + toJsonSchema: Stagehand.toJsonSchema, transformSchema: Stagehand.transformSchema, trimTrailingTextNode: Stagehand.trimTrailingTextNode, validateZodSchema: Stagehand.validateZodSchema, From 91e427e0417b3807fe46c2d9cd9cda4cbd05ff81 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Tue, 18 Nov 2025 11:28:48 -0800 Subject: [PATCH 37/38] update zod to schema --- packages/core/lib/v3/zodCompat.ts | 111 +----------------------------- packages/core/package.json | 3 +- pnpm-lock.yaml | 36 +++++++--- 3 files changed, 31 insertions(+), 119 deletions(-) diff --git a/packages/core/lib/v3/zodCompat.ts b/packages/core/lib/v3/zodCompat.ts index 167a381dc..d9157d9c8 100644 --- a/packages/core/lib/v3/zodCompat.ts +++ b/packages/core/lib/v3/zodCompat.ts @@ -4,6 +4,7 @@ import type { ZodRawShape as Zod4RawShape, ZodTypeAny as Zod4TypeAny, } from "zod"; +import zodToJsonSchema from "zod-to-json-schema"; import type * as z3 from "zod/v3"; export type StagehandZodSchema = Zod4TypeAny | z3.ZodTypeAny; @@ -29,118 +30,12 @@ export const isZod3Schema = ( export type JsonSchemaDocument = Record; -// Manual converter for zod/v3 schemas to JSON Schema -function ZodToJsonSchema(schema: z3.ZodTypeAny): JsonSchemaDocument { - const _def = (schema as unknown as { _def?: Record })._def; - if (!_def) { - return { type: "null" }; - } - - const typeName = _def.typeName; - - switch (typeName) { - case "ZodObject": { - const shape = - typeof _def.shape === "function" ? _def.shape() : _def.shape; - const properties: Record = {}; - const required: string[] = []; - - for (const [key, value] of Object.entries( - shape as Record, - )) { - properties[key] = ZodToJsonSchema(value); - // Check if field is not optional - const valueDef = (value as unknown as { _def?: { typeName?: string } }) - ._def; - if (valueDef?.typeName !== "ZodOptional") { - required.push(key); - } - } - - return { - type: "object", - properties, - required, - additionalProperties: _def.unknownKeys === "passthrough", - }; - } - - case "ZodArray": { - const itemType = _def.type as z3.ZodTypeAny; - return { - type: "array", - items: ZodToJsonSchema(itemType), - }; - } - - case "ZodString": { - const result: JsonSchemaDocument = { type: "string" }; - // Check for URL validation - const checks = _def.checks as Array<{ kind?: string }> | undefined; - if (checks) { - for (const check of checks) { - if (check.kind === "url") { - result.format = "url"; - break; - } - } - } - return result; - } - - case "ZodNumber": - return { type: "number" }; - - case "ZodBoolean": - return { type: "boolean" }; - - case "ZodOptional": - return ZodToJsonSchema(_def.innerType as z3.ZodTypeAny); - - case "ZodNullable": { - const innerSchema = ZodToJsonSchema(_def.innerType as z3.ZodTypeAny); - return { - ...innerSchema, - nullable: true, - }; - } - - case "ZodEnum": - return { - type: "string", - enum: _def.values, - }; - - case "ZodLiteral": - return { - type: typeof _def.value, - const: _def.value, - }; - - case "ZodUnion": - return { - anyOf: (_def.options as z3.ZodTypeAny[]).map((opt) => - ZodToJsonSchema(opt), - ), - }; - - default: - console.warn(`Unknown Zod type: ${typeName}`); - return { type: "null" }; - } -} export function toJsonSchema(schema: StagehandZodSchema): JsonSchemaDocument { - // For v3 schemas, use manual converter - // Note: We can't use zod-to-json-schema for v3 schemas when zod v4 is installed - // because the library imports 'zod' (v4) and tries to access ZodFirstPartyTypeKind which doesn't exist in v4 + if (!isZod4Schema(schema)) { - const result = { - $schema: "http://json-schema.org/draft-07/schema#", - ...ZodToJsonSchema(schema), - }; - return result; + return zodToJsonSchema(schema); } // For v4 schemas, use built-in z.toJSONSchema() method diff --git a/packages/core/package.json b/packages/core/package.json index 22dc66b36..0d0e240a0 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -56,7 +56,8 @@ "pino": "^9.6.0", "pino-pretty": "^13.0.0", "playwright": "^1.52.0", - "ws": "^8.18.0" + "ws": "^8.18.0", + "zod-to-json-schema": "^3.25.0" }, "optionalDependencies": { "@ai-sdk/anthropic": "^2.0.34", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 98b1e1f30..4b4b0aefe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,7 +25,7 @@ importers: version: 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) '@langchain/langgraph': specifier: ^1.0.1 - version: 1.0.1(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zod-to-json-schema@3.24.5(zod@3.25.67))(zod@3.25.67) + version: 1.0.1(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zod-to-json-schema@3.25.0(zod@3.25.67))(zod@3.25.67) '@langchain/openai': specifier: ^0.4.4 version: 0.4.9(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(ws@8.18.3) @@ -164,6 +164,9 @@ importers: ws: specifier: ^8.18.0 version: 8.18.3 + zod-to-json-schema: + specifier: ^3.25.0 + version: 3.25.0(zod@4.1.8) optionalDependencies: '@ai-sdk/anthropic': specifier: ^2.0.34 @@ -6390,6 +6393,11 @@ packages: peerDependencies: zod: ^3.24.1 + zod-to-json-schema@3.25.0: + resolution: {integrity: sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==} + peerDependencies: + zod: ^3.25 || ^4 + zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -6743,7 +6751,7 @@ snapshots: playwright: 1.54.2 ws: 8.18.3 zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod-to-json-schema: 3.25.0(zod@3.25.67) optionalDependencies: '@ai-sdk/anthropic': 2.0.34(zod@3.25.67) '@ai-sdk/azure': 2.0.54(zod@3.25.67) @@ -7539,7 +7547,7 @@ snapshots: p-retry: 4.6.2 uuid: 10.0.0 zod: 3.25.76 - zod-to-json-schema: 3.24.5(zod@3.25.76) + zod-to-json-schema: 3.25.0(zod@3.25.76) transitivePeerDependencies: - openai optional: true @@ -7557,7 +7565,7 @@ snapshots: p-retry: 4.6.2 uuid: 10.0.0 zod: 3.25.76 - zod-to-json-schema: 3.24.5(zod@3.25.76) + zod-to-json-schema: 3.25.0(zod@3.25.76) transitivePeerDependencies: - openai @@ -7574,7 +7582,7 @@ snapshots: p-retry: 4.6.2 uuid: 10.0.0 zod: 3.25.76 - zod-to-json-schema: 3.24.5(zod@3.25.76) + zod-to-json-schema: 3.25.0(zod@3.25.76) transitivePeerDependencies: - openai @@ -7593,7 +7601,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@langchain/langgraph@1.0.1(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zod-to-json-schema@3.24.5(zod@3.25.67))(zod@3.25.67)': + '@langchain/langgraph@1.0.1(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zod-to-json-schema@3.25.0(zod@3.25.67))(zod@3.25.67)': dependencies: '@langchain/core': 0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67)) '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@0.3.50(openai@6.7.0(ws@8.18.3)(zod@3.25.67))) @@ -7601,7 +7609,7 @@ snapshots: uuid: 10.0.0 zod: 3.25.67 optionalDependencies: - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod-to-json-schema: 3.25.0(zod@3.25.67) transitivePeerDependencies: - react - react-dom @@ -7950,7 +7958,7 @@ snapshots: lodash: 4.17.21 openapi-types: 12.1.3 zod: 3.25.76 - zod-to-json-schema: 3.24.5(zod@3.25.76) + zod-to-json-schema: 3.25.0(zod@3.25.76) transitivePeerDependencies: - debug @@ -7967,7 +7975,7 @@ snapshots: pkce-challenge: 5.0.0 raw-body: 3.0.0 zod: 3.25.76 - zod-to-json-schema: 3.24.5(zod@3.25.76) + zod-to-json-schema: 3.25.0(zod@3.25.76) transitivePeerDependencies: - supports-color @@ -13694,10 +13702,18 @@ snapshots: dependencies: zod: 3.25.67 - zod-to-json-schema@3.24.5(zod@3.25.76): + zod-to-json-schema@3.25.0(zod@3.25.67): + dependencies: + zod: 3.25.67 + + zod-to-json-schema@3.25.0(zod@3.25.76): dependencies: zod: 3.25.76 + zod-to-json-schema@3.25.0(zod@4.1.8): + dependencies: + zod: 4.1.8 + zod@3.23.8: {} zod@3.25.67: {} From f7019022488e72fcb240d49bcebae48e9a71d879 Mon Sep 17 00:00:00 2001 From: tkattkat Date: Tue, 18 Nov 2025 14:05:48 -0800 Subject: [PATCH 38/38] format --- packages/core/lib/v3/zodCompat.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/core/lib/v3/zodCompat.ts b/packages/core/lib/v3/zodCompat.ts index d9157d9c8..2ff7ea057 100644 --- a/packages/core/lib/v3/zodCompat.ts +++ b/packages/core/lib/v3/zodCompat.ts @@ -30,10 +30,7 @@ export const isZod3Schema = ( export type JsonSchemaDocument = Record; - - export function toJsonSchema(schema: StagehandZodSchema): JsonSchemaDocument { - if (!isZod4Schema(schema)) { return zodToJsonSchema(schema); }