diff --git a/.changeset/pink-lemons-buy.md b/.changeset/pink-lemons-buy.md new file mode 100644 index 000000000..d297779d7 --- /dev/null +++ b/.changeset/pink-lemons-buy.md @@ -0,0 +1,6 @@ +--- +"@lingo.dev/_compiler": minor +"lingo.dev": minor +--- + +Upgrade Compiler and CLI to AI SDK v5. diff --git a/packages/cli/package.json b/packages/cli/package.json index ca0a98ec1..7b56ed304 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -129,10 +129,10 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/anthropic": "1.2.11", - "@ai-sdk/google": "1.2.19", - "@ai-sdk/mistral": "1.2.8", - "@ai-sdk/openai": "1.3.22", + "@ai-sdk/anthropic": "3.0.9", + "@ai-sdk/google": "3.0.6", + "@ai-sdk/mistral": "3.0.5", + "@ai-sdk/openai": "3.0.7", "@babel/generator": "7.28.5", "@babel/parser": "7.28.5", "@babel/traverse": "7.28.5", @@ -150,10 +150,10 @@ "@lingo.dev/_spec": "workspace:*", "@markdoc/markdoc": "0.5.4", "@modelcontextprotocol/sdk": "1.22.0", - "@openrouter/ai-sdk-provider": "0.7.1", + "@openrouter/ai-sdk-provider": "6.0.0-alpha.1", "@paralleldrive/cuid2": "2.2.2", "@types/ejs": "3.1.5", - "ai": "4.3.15", + "ai": "6.0.25", "bitbucket": "2.12.0", "chalk": "5.6.2", "chokidar": "4.0.3", @@ -200,7 +200,7 @@ "node-webvtt": "1.9.4", "object-hash": "3.0.0", "octokit": "4.0.2", - "ollama-ai-provider": "1.2.0", + "ollama-ai-provider-v2": "2.0.0", "open": "10.2.0", "ora": "8.1.1", "p-limit": "6.2.0", @@ -227,7 +227,7 @@ "xml2js": "0.6.2", "xpath": "0.0.34", "yaml": "2.8.1", - "zod": "3.25.76" + "zod": "4.1.12" }, "devDependencies": { "@types/babel__generator": "7.27.0", @@ -258,4 +258,4 @@ "node": ">=18" }, "packageManager": "pnpm@9.12.3" -} \ No newline at end of file +} diff --git a/packages/cli/src/cli/cmd/i18n.ts b/packages/cli/src/cli/cmd/i18n.ts index 99e204fed..339d38f5e 100644 --- a/packages/cli/src/cli/cmd/i18n.ts +++ b/packages/cli/src/cli/cmd/i18n.ts @@ -651,8 +651,8 @@ function parseFlags(options: any) { strict: Z.boolean().optional(), key: Z.string().optional(), file: Z.array(Z.string()).optional(), - interactive: Z.boolean().default(false), - debug: Z.boolean().default(false), + interactive: Z.boolean().prefault(false), + debug: Z.boolean().prefault(false), }).parse(options); } diff --git a/packages/cli/src/cli/cmd/lockfile.ts b/packages/cli/src/cli/cmd/lockfile.ts index 75178b813..23fcf1bc5 100644 --- a/packages/cli/src/cli/cmd/lockfile.ts +++ b/packages/cli/src/cli/cmd/lockfile.ts @@ -61,5 +61,5 @@ export default new Command() }); const flagsSchema = Z.object({ - force: Z.boolean().default(false), + force: Z.boolean().prefault(false), }); diff --git a/packages/cli/src/cli/cmd/mcp.ts b/packages/cli/src/cli/cmd/mcp.ts index 9ecf046e7..f7d216983 100644 --- a/packages/cli/src/cli/cmd/mcp.ts +++ b/packages/cli/src/cli/cmd/mcp.ts @@ -48,8 +48,8 @@ export default new Command() "translate", "Detect language and translate text with Lingo.dev.", { - text: Z.string(), - targetLocale: Z.string().regex(/^[a-z]{2}(-[A-Z]{2})?$/), + text: Z.string() as any, + targetLocale: Z.string().regex(/^[a-z]{2}(-[A-Z]{2})?$/) as any, }, async ({ text, targetLocale }) => { const sourceLocale = await replexicaEngine.recognizeLocale(text); diff --git a/packages/cli/src/cli/cmd/run/_types.ts b/packages/cli/src/cli/cmd/run/_types.ts index 1a9634af2..e101f6b69 100644 --- a/packages/cli/src/cli/cmd/run/_types.ts +++ b/packages/cli/src/cli/cmd/run/_types.ts @@ -45,13 +45,13 @@ export const flagsSchema = z.object({ frozen: z.boolean().optional(), verbose: z.boolean().optional(), strict: z.boolean().optional(), - interactive: z.boolean().default(false), - concurrency: z.number().positive().default(10), - debug: z.boolean().default(false), + interactive: z.boolean().prefault(false), + concurrency: z.number().positive().prefault(10), + debug: z.boolean().prefault(false), sourceLocale: z.string().optional(), targetLocale: z.array(z.string()).optional(), - watch: z.boolean().default(false), - debounce: z.number().positive().default(5000), // 5 seconds default + watch: z.boolean().prefault(false), + debounce: z.number().positive().prefault(5000), // 5 seconds default sound: z.boolean().optional(), pseudo: z.boolean().optional(), }); diff --git a/packages/cli/src/cli/localizer/explicit.ts b/packages/cli/src/cli/localizer/explicit.ts index 257f053fe..eb87b158a 100644 --- a/packages/cli/src/cli/localizer/explicit.ts +++ b/packages/cli/src/cli/localizer/explicit.ts @@ -7,10 +7,10 @@ import { I18nConfig } from "@lingo.dev/_spec"; import chalk from "chalk"; import dedent from "dedent"; import { ILocalizer, LocalizerData } from "./_types"; -import { LanguageModel, Message, generateText } from "ai"; +import { LanguageModel, ModelMessage, generateText } from "ai"; import { colors } from "../constants"; import { jsonrepair } from "jsonrepair"; -import { createOllama } from "ollama-ai-provider"; +import { createOllama } from "ollama-ai-provider-v2"; export default function createExplicitLocalizer( provider: NonNullable, @@ -207,7 +207,7 @@ function createAiSdkLocalizer(params: { [ { role: "user", content: JSON.stringify(userShot) }, { role: "assistant", content: JSON.stringify(assistantShot) }, - ] as Message[], + ] as ModelMessage[], ), { role: "user", content: JSON.stringify(payload) }, ], diff --git a/packages/cli/src/cli/processor/basic.ts b/packages/cli/src/cli/processor/basic.ts index c51f5c003..ed962adf6 100644 --- a/packages/cli/src/cli/processor/basic.ts +++ b/packages/cli/src/cli/processor/basic.ts @@ -1,4 +1,4 @@ -import { generateText, LanguageModelV1 } from "ai"; +import { generateText, LanguageModel } from "ai"; import { LocalizerInput, LocalizerProgressFn } from "./_base"; import _ from "lodash"; @@ -7,7 +7,7 @@ type ModelSettings = { }; export function createBasicTranslator( - model: LanguageModelV1, + model: LanguageModel, systemPrompt: string, settings: ModelSettings = {}, ) { diff --git a/packages/cli/src/cli/processor/index.ts b/packages/cli/src/cli/processor/index.ts index 3f898d04a..1a92fe2f0 100644 --- a/packages/cli/src/cli/processor/index.ts +++ b/packages/cli/src/cli/processor/index.ts @@ -10,7 +10,7 @@ import { createAnthropic } from "@ai-sdk/anthropic"; import { createGoogleGenerativeAI } from "@ai-sdk/google"; import { createOpenRouter } from "@openrouter/ai-sdk-provider"; import { createMistral } from "@ai-sdk/mistral"; -import { createOllama } from "ollama-ai-provider"; +import { createOllama } from "ollama-ai-provider-v2"; export default function createProcessor( provider: I18nConfig["provider"], diff --git a/packages/cli/src/cli/utils/delta.ts b/packages/cli/src/cli/utils/delta.ts index 4950a70b6..7104d7748 100644 --- a/packages/cli/src/cli/utils/delta.ts +++ b/packages/cli/src/cli/utils/delta.ts @@ -6,7 +6,7 @@ import * as path from "path"; import YAML from "yaml"; const LockSchema = z.object({ - version: z.literal(1).default(1), + version: z.literal(1).prefault(1), checksums: z .record( z.string(), // localizable files' keys @@ -18,9 +18,9 @@ const LockSchema = z.object({ // checksum of the key's value in the source locale z.string(), ) - .default({}), + .prefault({}), ) - .default({}), + .prefault({}), }); export type LockData = z.infer; diff --git a/packages/cli/src/cli/utils/exec.ts b/packages/cli/src/cli/utils/exec.ts index 4f2d98eb0..6c9028e09 100644 --- a/packages/cli/src/cli/utils/exec.ts +++ b/packages/cli/src/cli/utils/exec.ts @@ -65,20 +65,20 @@ export async function execWithRetry( // Helpers const ExecAsyncSchema = Z.object({ - delay: Z.number().nonnegative().default(1000), - concurrency: Z.number().positive().default(1), - onProgress: Z.function( - Z.tuple([ + delay: Z.number().nonnegative().prefault(1000), + concurrency: Z.number().positive().prefault(1), + onProgress: Z.function({ + input: Z.tuple([ Z.number().positive(), // completed count Z.number().positive(), // total count ]), - Z.void(), - ).optional(), + output: Z.void(), + }).optional(), }); const ExecWithRetrySchema = Z.object({ - delay: Z.number().nonnegative().default(0), - attempts: Z.number().positive().default(3), + delay: Z.number().nonnegative().prefault(0), + attempts: Z.number().positive().prefault(3), }); function delay(ms: number) { diff --git a/packages/cli/src/cli/utils/lockfile.ts b/packages/cli/src/cli/utils/lockfile.ts index f1e7dee6e..a78c5bc21 100644 --- a/packages/cli/src/cli/utils/lockfile.ts +++ b/packages/cli/src/cli/utils/lockfile.ts @@ -84,13 +84,13 @@ export function createLockfileHelper() { } const LockfileSchema = Z.object({ - version: Z.literal(1).default(1), + version: Z.literal(1).prefault(1), checksums: Z.record( Z.string(), // localizable files' keys Z.record( // checksums hashmap Z.string(), // key Z.string(), // checksum of the key's value in the source locale - ).default({}), - ).default({}), + ).prefault({}), + ).prefault({}), }); diff --git a/packages/cli/src/cli/utils/settings.ts b/packages/cli/src/cli/utils/settings.ts index a768f9ff4..bdaf3c79c 100644 --- a/packages/cli/src/cli/utils/settings.ts +++ b/packages/cli/src/cli/utils/settings.ts @@ -104,7 +104,7 @@ function _loadDefaults(): CliSettings { } function _loadEnv() { - return Z.object({ + return Z.looseObject({ LINGODOTDEV_API_KEY: Z.string().optional(), LINGODOTDEV_API_URL: Z.string().optional(), LINGODOTDEV_WEB_URL: Z.string().optional(), @@ -115,9 +115,7 @@ function _loadEnv() { GOOGLE_API_KEY: Z.string().optional(), OPENROUTER_API_KEY: Z.string().optional(), MISTRAL_API_KEY: Z.string().optional(), - }) - .passthrough() - .parse(process.env); + }).parse(process.env); } function _loadSystemFile() { @@ -127,8 +125,8 @@ function _loadSystemFile() { : ""; const data = Ini.parse(content); - return Z.object({ - auth: Z.object({ + return Z.looseObject({ + auth: Z.looseObject({ apiKey: Z.string().optional(), apiUrl: Z.string().optional(), webUrl: Z.string().optional(), @@ -136,7 +134,7 @@ function _loadSystemFile() { apiKey: Z.string().optional(), }).optional(), }).optional(), - llm: Z.object({ + llm: Z.looseObject({ openaiApiKey: Z.string().optional(), anthropicApiKey: Z.string().optional(), groqApiKey: Z.string().optional(), @@ -144,9 +142,7 @@ function _loadSystemFile() { openrouterApiKey: Z.string().optional(), mistralApiKey: Z.string().optional(), }).optional(), - }) - .passthrough() - .parse(data); + }).parse(data); } function _saveSystemFile(settings: CliSettings) { diff --git a/packages/compiler/package.json b/packages/compiler/package.json index 5ed270504..b076e2c2e 100644 --- a/packages/compiler/package.json +++ b/packages/compiler/package.json @@ -51,19 +51,19 @@ "vitest": "4.0.13" }, "dependencies": { - "@ai-sdk/anthropic": "1.2.11", - "@ai-sdk/google": "1.2.19", - "@ai-sdk/groq": "1.2.3", - "@ai-sdk/mistral": "1.2.8", - "@ai-sdk/openai": "1.3.22", + "@ai-sdk/anthropic": "3.0.9", + "@ai-sdk/google": "3.0.6", + "@ai-sdk/groq": "3.0.4", + "@ai-sdk/mistral": "3.0.5", + "@ai-sdk/openai": "3.0.7", "@babel/generator": "7.28.5", "@babel/parser": "7.28.5", "@babel/traverse": "7.28.5", "@babel/types": "7.28.5", "@lingo.dev/_sdk": "workspace:*", "@lingo.dev/_spec": "workspace:*", - "@openrouter/ai-sdk-provider": "0.7.1", - "ai": "4.2.10", + "@openrouter/ai-sdk-provider": "6.0.0-alpha.1", + "ai": "6.0.25", "dedent": "1.7.0", "dotenv": "16.4.5", "fast-xml-parser": "5.3.2", @@ -71,10 +71,10 @@ "lodash": "4.17.21", "node-machine-id": "1.1.12", "object-hash": "3.0.0", - "ollama-ai-provider": "1.2.0", + "ollama-ai-provider-v2": "2.0.0", "posthog-node": "5.14.0", "unplugin": "2.3.11", - "zod": "3.25.76" + "zod": "4.1.12" }, "packageManager": "pnpm@9.12.3" } \ No newline at end of file diff --git a/packages/compiler/src/lib/lcp/api/index.ts b/packages/compiler/src/lib/lcp/api/index.ts index 6b7a1b8cf..635ceb98f 100644 --- a/packages/compiler/src/lib/lcp/api/index.ts +++ b/packages/compiler/src/lib/lcp/api/index.ts @@ -1,7 +1,7 @@ import { createGroq } from "@ai-sdk/groq"; import { createGoogleGenerativeAI } from "@ai-sdk/google"; import { createOpenRouter } from "@openrouter/ai-sdk-provider"; -import { createOllama } from "ollama-ai-provider"; +import { createOllama } from "ollama-ai-provider-v2"; import { createMistral } from "@ai-sdk/mistral"; import { createOpenAI } from "@ai-sdk/openai"; import { createAnthropic } from "@ai-sdk/anthropic"; diff --git a/packages/compiler/src/lib/lcp/schema.ts b/packages/compiler/src/lib/lcp/schema.ts index 21a4fc1a4..874558a52 100644 --- a/packages/compiler/src/lib/lcp/schema.ts +++ b/packages/compiler/src/lib/lcp/schema.ts @@ -20,7 +20,7 @@ export const lcpFile = z.object({ export type LCPFile = z.infer; export const lcpSchema = z.object({ - version: z.number().default(0.1), + version: z.number().prefault(0.1), files: z.record(z.string(), lcpFile).optional(), }); @@ -35,7 +35,7 @@ export const dictionaryFile = z.object({ export type DictionaryFile = z.infer; export const dictionarySchema = z.object({ - version: z.number().default(0.1), + version: z.number().prefault(0.1), locale: z.string(), files: z.record(z.string(), dictionaryFile), }); @@ -55,7 +55,7 @@ export const dictionaryCacheFile = z.object({ }); export const dictionaryCacheSchema = z.object({ - version: z.number().default(0.1), + version: z.number().prefault(0.1), files: z.record(z.string(), dictionaryCacheFile), }); diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 96aac940c..784560de7 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -33,7 +33,7 @@ "@lingo.dev/_spec": "workspace:*", "@paralleldrive/cuid2": "2.2.2", "jsdom": "25.0.1", - "zod": "3.25.76" + "zod": "4.1.12" }, "devDependencies": { "@types/jsdom": "21.1.7", diff --git a/packages/spec/package.json b/packages/spec/package.json index f947ae98f..a273c7af3 100644 --- a/packages/spec/package.json +++ b/packages/spec/package.json @@ -32,8 +32,7 @@ "license": "Apache-2.0", "dependencies": { "@lingo.dev/_locales": "workspace:*", - "zod": "3.25.76", - "zod-to-json-schema": "3.25.0" + "zod": "4.1.12" }, "devDependencies": { "@types/node": "22.13.5", diff --git a/packages/spec/src/config.ts b/packages/spec/src/config.ts index d100c5e37..dc5d8154b 100644 --- a/packages/spec/src/config.ts +++ b/packages/spec/src/config.ts @@ -63,7 +63,7 @@ const extendConfigDefinition = < return safeResult.data; } - const localeErrors = safeResult.error.errors + const localeErrors = safeResult.error.issues .filter((issue) => issue.message.includes("Invalid locale code")) .map((issue) => { let unsupportedLocale = ""; @@ -142,7 +142,7 @@ export const configV1Definition = extendConfigDefinition(configV0Definition, { export const configV1_1Definition = extendConfigDefinition(configV1Definition, { createSchema: (baseSchema) => baseSchema.extend({ - buckets: Z.record( + buckets: Z.partialRecord( bucketTypeSchema, Z.object({ include: Z.array(Z.string()) @@ -151,7 +151,6 @@ export const configV1_1Definition = extendConfigDefinition(configV1Definition, { "File paths or glob patterns to include for this bucket.", ), exclude: Z.array(Z.string()) - .default([]) .optional() .describe( "File paths or glob patterns to exclude from this bucket.", @@ -235,7 +234,6 @@ export const bucketValueSchemaV1_3 = Z.object({ .default([]) .describe("Glob patterns or bucket items to include for this bucket."), exclude: Z.array(Z.union([Z.string(), bucketItemSchema])) - .default([]) .optional() .describe("Glob patterns or bucket items to exclude from this bucket."), injectLocale: Z.array(Z.string()) @@ -250,7 +248,10 @@ export const configV1_3Definition = extendConfigDefinition( { createSchema: (baseSchema) => baseSchema.extend({ - buckets: Z.record(bucketTypeSchema, bucketValueSchemaV1_3).default({}), + buckets: Z.partialRecord( + bucketTypeSchema, + bucketValueSchemaV1_3, + ).default({}), }), createDefaultValue: (baseDefaultValue) => ({ ...baseDefaultValue, @@ -328,7 +329,6 @@ export const configV1_5Definition = extendConfigDefinition( // Changes: Add "lockedKeys" string array to bucket config export const bucketValueSchemaV1_6 = bucketValueSchemaV1_3.extend({ lockedKeys: Z.array(Z.string()) - .default([]) .optional() .describe( "Keys that must remain unchanged and should never be overwritten by translations.", @@ -340,7 +340,10 @@ export const configV1_6Definition = extendConfigDefinition( { createSchema: (baseSchema) => baseSchema.extend({ - buckets: Z.record(bucketTypeSchema, bucketValueSchemaV1_6).default({}), + buckets: Z.partialRecord( + bucketTypeSchema, + bucketValueSchemaV1_6, + ).default({}), }), createDefaultValue: (baseDefaultValue) => ({ ...baseDefaultValue, @@ -356,7 +359,6 @@ export const configV1_6Definition = extendConfigDefinition( // Changes: Add "lockedPatterns" string array of regex patterns to bucket config export const bucketValueSchemaV1_7 = bucketValueSchemaV1_6.extend({ lockedPatterns: Z.array(Z.string()) - .default([]) .optional() .describe( "Regular expression patterns whose matched content should remain locked during translation.", @@ -368,7 +370,10 @@ export const configV1_7Definition = extendConfigDefinition( { createSchema: (baseSchema) => baseSchema.extend({ - buckets: Z.record(bucketTypeSchema, bucketValueSchemaV1_7).default({}), + buckets: Z.partialRecord( + bucketTypeSchema, + bucketValueSchemaV1_7, + ).default({}), }), createDefaultValue: (baseDefaultValue) => ({ ...baseDefaultValue, @@ -385,7 +390,6 @@ export const configV1_7Definition = extendConfigDefinition( // Changes: Add "ignoredKeys" string array to bucket config export const bucketValueSchemaV1_8 = bucketValueSchemaV1_7.extend({ ignoredKeys: Z.array(Z.string()) - .default([]) .optional() .describe( "Keys that should be completely ignored by translation processes.", @@ -397,7 +401,10 @@ export const configV1_8Definition = extendConfigDefinition( { createSchema: (baseSchema) => baseSchema.extend({ - buckets: Z.record(bucketTypeSchema, bucketValueSchemaV1_8).default({}), + buckets: Z.partialRecord( + bucketTypeSchema, + bucketValueSchemaV1_8, + ).default({}), }), createDefaultValue: (baseDefaultValue) => ({ ...baseDefaultValue, diff --git a/packages/spec/src/json-schema.ts b/packages/spec/src/json-schema.ts index 805948f2b..f5c5e3923 100644 --- a/packages/spec/src/json-schema.ts +++ b/packages/spec/src/json-schema.ts @@ -1,11 +1,11 @@ import fs from "fs"; import path from "path"; import { fileURLToPath } from "url"; -import { zodToJsonSchema } from "zod-to-json-schema"; +import { toJSONSchema } from "zod"; import { LATEST_CONFIG_DEFINITION } from "./config"; export default function buildJsonSchema() { - const configSchema = zodToJsonSchema(LATEST_CONFIG_DEFINITION.schema); + const configSchema = toJSONSchema(LATEST_CONFIG_DEFINITION.schema); const currentDir = path.dirname(fileURLToPath(import.meta.url)); fs.writeFileSync( `${currentDir}/../build/i18n.schema.json`, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1f776761..d3197be04 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -199,17 +199,17 @@ importers: packages/cli: dependencies: '@ai-sdk/anthropic': - specifier: 1.2.11 - version: 1.2.11(zod@3.25.76) + specifier: 3.0.9 + version: 3.0.9(zod@4.1.12) '@ai-sdk/google': - specifier: 1.2.19 - version: 1.2.19(zod@3.25.76) + specifier: 3.0.6 + version: 3.0.6(zod@4.1.12) '@ai-sdk/mistral': - specifier: 1.2.8 - version: 1.2.8(zod@3.25.76) + specifier: 3.0.5 + version: 3.0.5(zod@4.1.12) '@ai-sdk/openai': - specifier: 1.3.22 - version: 1.3.22(zod@3.25.76) + specifier: 3.0.7 + version: 3.0.7(zod@4.1.12) '@babel/generator': specifier: 7.28.5 version: 7.28.5 @@ -262,8 +262,8 @@ importers: specifier: 1.22.0 version: 1.22.0 '@openrouter/ai-sdk-provider': - specifier: 0.7.1 - version: 0.7.1(ai@4.3.15(react@19.2.3)(zod@3.25.76))(zod@3.25.76) + specifier: 6.0.0-alpha.1 + version: 6.0.0-alpha.1(zod@4.1.12) '@paralleldrive/cuid2': specifier: 2.2.2 version: 2.2.2 @@ -271,8 +271,8 @@ importers: specifier: 3.1.5 version: 3.1.5 ai: - specifier: 4.3.15 - version: 4.3.15(react@19.2.3)(zod@3.25.76) + specifier: 6.0.25 + version: 6.0.25(zod@4.1.12) bitbucket: specifier: 2.12.0 version: 2.12.0(encoding@0.1.13) @@ -411,9 +411,9 @@ importers: octokit: specifier: 4.0.2 version: 4.0.2 - ollama-ai-provider: - specifier: 1.2.0 - version: 1.2.0(zod@3.25.76) + ollama-ai-provider-v2: + specifier: 2.0.0 + version: 2.0.0(ai@6.0.25(zod@4.1.12))(zod@4.1.12) open: specifier: 10.2.0 version: 10.2.0 @@ -493,8 +493,8 @@ importers: specifier: 2.8.1 version: 2.8.1 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.1.12 + version: 4.1.12 devDependencies: '@types/babel__generator': specifier: 7.27.0 @@ -569,20 +569,20 @@ importers: packages/compiler: dependencies: '@ai-sdk/anthropic': - specifier: 1.2.11 - version: 1.2.11(zod@3.25.76) + specifier: 3.0.9 + version: 3.0.9(zod@4.1.12) '@ai-sdk/google': - specifier: 1.2.19 - version: 1.2.19(zod@3.25.76) + specifier: 3.0.6 + version: 3.0.6(zod@4.1.12) '@ai-sdk/groq': - specifier: 1.2.3 - version: 1.2.3(zod@3.25.76) + specifier: 3.0.4 + version: 3.0.4(zod@4.1.12) '@ai-sdk/mistral': - specifier: 1.2.8 - version: 1.2.8(zod@3.25.76) + specifier: 3.0.5 + version: 3.0.5(zod@4.1.12) '@ai-sdk/openai': - specifier: 1.3.22 - version: 1.3.22(zod@3.25.76) + specifier: 3.0.7 + version: 3.0.7(zod@4.1.12) '@babel/generator': specifier: 7.28.5 version: 7.28.5 @@ -602,11 +602,11 @@ importers: specifier: workspace:* version: link:../spec '@openrouter/ai-sdk-provider': - specifier: 0.7.1 - version: 0.7.1(ai@4.2.10(react@19.2.3)(zod@3.25.76))(zod@3.25.76) + specifier: 6.0.0-alpha.1 + version: 6.0.0-alpha.1(zod@4.1.12) ai: - specifier: 4.2.10 - version: 4.2.10(react@19.2.3)(zod@3.25.76) + specifier: 6.0.25 + version: 6.0.25(zod@4.1.12) dedent: specifier: 1.7.0 version: 1.7.0 @@ -628,9 +628,9 @@ importers: object-hash: specifier: 3.0.0 version: 3.0.0 - ollama-ai-provider: - specifier: 1.2.0 - version: 1.2.0(zod@3.25.76) + ollama-ai-provider-v2: + specifier: 2.0.0 + version: 2.0.0(ai@6.0.25(zod@4.1.12))(zod@4.1.12) posthog-node: specifier: 5.14.0 version: 5.14.0 @@ -638,8 +638,8 @@ importers: specifier: 2.3.11 version: 2.3.11 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.1.12 + version: 4.1.12 devDependencies: '@types/babel__generator': specifier: 7.27.0 @@ -910,8 +910,8 @@ importers: specifier: 25.0.1 version: 25.0.1 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.1.12 + version: 4.1.12 devDependencies: '@types/jsdom': specifier: 21.1.7 @@ -932,11 +932,8 @@ importers: specifier: workspace:* version: link:../locales zod: - specifier: 3.25.76 - version: 3.25.76 - zod-to-json-schema: - specifier: 3.25.0 - version: 3.25.0(zod@3.25.76) + specifier: 4.1.12 + version: 4.1.12 devDependencies: '@types/node': specifier: 22.13.5 @@ -1005,6 +1002,18 @@ packages: peerDependencies: zod: ^3.0.0 + '@ai-sdk/anthropic@3.0.9': + resolution: {integrity: sha512-QBD4qDnwIHd+N5PpjxXOaWJig1aRB43J0PM5ZUe6Yyl9Qq2bUmraQjvNznkuFKy+hMFDgj0AvgGogTiO5TC+qA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/gateway@3.0.10': + resolution: {integrity: sha512-sRlPMKd38+fdp2y11USW44c0o8tsIsT6T/pgyY04VXC3URjIRnkxugxd9AkU2ogfpPDMz50cBAGPnMxj+6663Q==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/gateway@3.0.2': resolution: {integrity: sha512-giJEg9ob45htbu3iautK+2kvplY2JnTj7ir4wZzYSQWvqGatWfBBfDuNCU5wSJt9BCGjymM5ZS9ziD42JGCZBw==} engines: {node: '>=18'} @@ -1023,6 +1032,12 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/google@3.0.6': + resolution: {integrity: sha512-Nr7E+ouWd/bKO9SFlgLnJJ1+fiGHC07KAeFr08faT+lvkECWlxVox3aL0dec8uCgBDUghYbq7f4S5teUrCc+QQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/groq@1.2.3': resolution: {integrity: sha512-MGPo+ROdJfavrkI4SgJSUOtT6cFjEZEyu7sKKI1PWE3FBTp0oYxSfsmAFWebXGI1G+v70XPFiH9IObBYUiEMvQ==} engines: {node: '>=18'} @@ -1035,6 +1050,12 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/groq@3.0.4': + resolution: {integrity: sha512-xhqeUZ9DclSZntfIAsIDsMzk2QpeWA9NMAdyrfP3Lbu+Nqccv1fWPoy9SaYwRwdluUUvc45gl9GtMDnWUbO0oA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/mistral@1.2.8': resolution: {integrity: sha512-lv857D9UJqCVxiq2Fcu7mSPTypEHBUqLl1K+lCaP6X/7QAkcaxI36QDONG+tOhGHJOXTsS114u8lrUTaEiGXbg==} engines: {node: '>=18'} @@ -1047,12 +1068,24 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/mistral@3.0.5': + resolution: {integrity: sha512-ymrHvsVBcafjZmdjLY4677o9yUvRhht3Hbdz1kTCqAzpJ5bWlHQikU9KaA5EAE0fvArixQmUNpTxSXuI26VQ2g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/openai@1.3.22': resolution: {integrity: sha512-QwA+2EkG0QyjVR+7h6FE7iOu2ivNqAVMm9UJZkVxxTk5OIq5fFJDTEI/zICEMuHImTTXR2JjsL6EirJ28Jc4cw==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 + '@ai-sdk/openai@3.0.7': + resolution: {integrity: sha512-CBoYn1U59Lop8yBL9KuVjHCKc/B06q9Qo0SasRwHoyMEq+X4I8LQZu3a8Ck1jwwcZTTxfyiExB70LtIRSynBDA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider-utils@2.2.3': resolution: {integrity: sha512-o3fWTzkxzI5Af7U7y794MZkYNEsxbjLam2nxyoUZSScqkacb7vZ3EYHLh21+xCcSSzEC161C7pZAGHtC0hTUMw==} engines: {node: '>=18'} @@ -1071,6 +1104,12 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider-utils@4.0.4': + resolution: {integrity: sha512-VxhX0B/dWGbpNHxrKCWUAJKXIXV015J4e7qYjdIU9lLWeptk0KMLGcqkB4wFxff5Njqur8dt8wRi1MN9lZtDqg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider@1.1.0': resolution: {integrity: sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew==} engines: {node: '>=18'} @@ -1083,6 +1122,10 @@ packages: resolution: {integrity: sha512-m9ka3ptkPQbaHHZHqDXDF9C9B5/Mav0KTdky1k2HZ3/nrW2t1AgObxIVPyGDWQNS9FXT/FS6PIoSjpcP/No8rQ==} engines: {node: '>=18'} + '@ai-sdk/provider@3.0.2': + resolution: {integrity: sha512-HrEmNt/BH/hkQ7zpi2o6N3k1ZR1QTb7z85WYhYygiTxOQuaml4CMtHCWRbric5WPU+RNsYI7r1EpyVQMKO1pYw==} + engines: {node: '>=18'} + '@ai-sdk/react@1.2.12': resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} engines: {node: '>=18'} @@ -2925,9 +2968,18 @@ packages: ai: ^5.0.0 zod: ^3.24.1 || ^v4 + '@openrouter/ai-sdk-provider@6.0.0-alpha.1': + resolution: {integrity: sha512-N91glWtq6XFl8Kvgft14BiDeCLABHatylAVKHOWMRJHnBl6iKblI4iZgcipnF9Pj8ZRUO752qpPoZVC+L2C6tA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^4.3.5 + '@openrouter/sdk@0.1.27': resolution: {integrity: sha512-RH//L10bSmc81q25zAZudiI4kNkLgxF2E+WU42vghp3N6TEvZ6F0jK7uT3tOxkEn91gzmMw9YVmDENy7SJsajQ==} + '@openrouter/sdk@0.3.15': + resolution: {integrity: sha512-tmiMQGu6L1fHD9NpIABN9LALEZitqM27CFebSVyJTQDcxCcR3m1F6v1O1MnOlLmedCFU+/BojniRGFAXo1F3Bw==} + '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} @@ -4395,6 +4447,10 @@ packages: resolution: {integrity: sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==} engines: {node: '>= 20'} + '@vercel/oidc@3.1.0': + resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} + engines: {node: '>= 20'} + '@vitejs/plugin-react@4.4.1': resolution: {integrity: sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==} engines: {node: ^14.18.0 || >=16.0.0} @@ -4657,6 +4713,12 @@ packages: react: optional: true + ai@6.0.25: + resolution: {integrity: sha512-KErk9JWkRaN4j9Xzxuo+twa0TxcYKdYbrRV8iGktduvUeGb0Yd5seWe3yOfuLGERbDBiKI1ajQz28O2FG3WO5A==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + ai@6.0.3: resolution: {integrity: sha512-OOo+/C+sEyscoLnbY3w42vjQDICioVNyS+F+ogwq6O5RJL/vgWGuiLzFwuP7oHTeni/MkmX8tIge48GTdaV7QQ==} engines: {node: '>=18'} @@ -7471,6 +7533,13 @@ packages: resolution: {integrity: sha512-wbqF4uc1YbcldtiBFfkSnquHtECEIpYD78YUXI6ri1Im5OO2NLo6ZVpRdbJpdnpZ05zMrVPssNiEo6JQtea+Qg==} engines: {node: '>= 18'} + ollama-ai-provider-v2@2.0.0: + resolution: {integrity: sha512-vbLG/xsW0kgGlInrTIa3W8niy294dw7n8nkLFVwjPHlX9EjtBH4bNPgHQEbmQUy60LjV3NF3Y1HtWPxORSb3bQ==} + engines: {node: '>=18'} + peerDependencies: + ai: ^5.0.0 || ^6.0.0 + zod: ^4.0.16 + ollama-ai-provider@1.2.0: resolution: {integrity: sha512-jTNFruwe3O/ruJeppI/quoOUxG7NA6blG3ZyQj3lei4+NnJo7bi3eIRWqlVpRlu/mbzbFXeJSBuYQWF6pzGKww==} engines: {node: '>=18'} @@ -9735,6 +9804,19 @@ snapshots: '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) zod: 3.25.76 + '@ai-sdk/anthropic@3.0.9(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 3.0.2 + '@ai-sdk/provider-utils': 4.0.4(zod@4.1.12) + zod: 4.1.12 + + '@ai-sdk/gateway@3.0.10(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 3.0.2 + '@ai-sdk/provider-utils': 4.0.4(zod@4.1.12) + '@vercel/oidc': 3.1.0 + zod: 4.1.12 + '@ai-sdk/gateway@3.0.2(zod@4.1.12)': dependencies: '@ai-sdk/provider': 3.0.0 @@ -9754,6 +9836,12 @@ snapshots: '@ai-sdk/provider-utils': 4.0.1(zod@4.1.12) zod: 4.1.12 + '@ai-sdk/google@3.0.6(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 3.0.2 + '@ai-sdk/provider-utils': 4.0.4(zod@4.1.12) + zod: 4.1.12 + '@ai-sdk/groq@1.2.3(zod@3.25.76)': dependencies: '@ai-sdk/provider': 1.1.0 @@ -9766,6 +9854,12 @@ snapshots: '@ai-sdk/provider-utils': 4.0.1(zod@4.1.12) zod: 4.1.12 + '@ai-sdk/groq@3.0.4(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 3.0.2 + '@ai-sdk/provider-utils': 4.0.4(zod@4.1.12) + zod: 4.1.12 + '@ai-sdk/mistral@1.2.8(zod@3.25.76)': dependencies: '@ai-sdk/provider': 1.1.3 @@ -9778,12 +9872,24 @@ snapshots: '@ai-sdk/provider-utils': 4.0.1(zod@4.1.12) zod: 4.1.12 + '@ai-sdk/mistral@3.0.5(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 3.0.2 + '@ai-sdk/provider-utils': 4.0.4(zod@4.1.12) + zod: 4.1.12 + '@ai-sdk/openai@1.3.22(zod@3.25.76)': dependencies: '@ai-sdk/provider': 1.1.3 '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) zod: 3.25.76 + '@ai-sdk/openai@3.0.7(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 3.0.2 + '@ai-sdk/provider-utils': 4.0.4(zod@4.1.12) + zod: 4.1.12 + '@ai-sdk/provider-utils@2.2.3(zod@3.25.76)': dependencies: '@ai-sdk/provider': 1.1.0 @@ -9805,6 +9911,13 @@ snapshots: eventsource-parser: 3.0.6 zod: 4.1.12 + '@ai-sdk/provider-utils@4.0.4(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 3.0.2 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 + zod: 4.1.12 + '@ai-sdk/provider@1.1.0': dependencies: json-schema: 0.4.0 @@ -9817,6 +9930,10 @@ snapshots: dependencies: json-schema: 0.4.0 + '@ai-sdk/provider@3.0.2': + dependencies: + json-schema: 0.4.0 + '@ai-sdk/react@1.2.12(react@19.2.3)(zod@3.25.76)': dependencies: '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) @@ -12269,9 +12386,20 @@ snapshots: ai: 6.0.3(zod@4.1.12) zod: 4.1.12 + '@openrouter/ai-sdk-provider@6.0.0-alpha.1(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 3.0.0 + '@ai-sdk/provider-utils': 4.0.1(zod@4.1.12) + '@openrouter/sdk': 0.3.15 + zod: 4.1.12 + '@openrouter/sdk@0.1.27': dependencies: - zod: 3.25.76 + zod: 4.1.12 + + '@openrouter/sdk@0.3.15': + dependencies: + zod: 4.1.12 '@opentelemetry/api@1.9.0': {} @@ -13816,6 +13944,8 @@ snapshots: '@vercel/oidc@3.0.5': {} + '@vercel/oidc@3.1.0': {} + '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@25.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.5 @@ -14213,6 +14343,14 @@ snapshots: optionalDependencies: react: 19.2.3 + ai@6.0.25(zod@4.1.12): + dependencies: + '@ai-sdk/gateway': 3.0.10(zod@4.1.12) + '@ai-sdk/provider': 3.0.2 + '@ai-sdk/provider-utils': 4.0.4(zod@4.1.12) + '@opentelemetry/api': 1.9.0 + zod: 4.1.12 + ai@6.0.3(zod@4.1.12): dependencies: '@ai-sdk/gateway': 3.0.2(zod@4.1.12) @@ -15395,8 +15533,8 @@ snapshots: '@babel/parser': 7.28.5 eslint: 9.39.1(jiti@2.6.1) hermes-parser: 0.25.1 - zod: 3.25.76 - zod-validation-error: 4.0.2(zod@3.25.76) + zod: 4.1.12 + zod-validation-error: 4.0.2(zod@4.1.12) transitivePeerDependencies: - supports-color @@ -17621,6 +17759,13 @@ snapshots: '@octokit/request-error': 6.1.8 '@octokit/types': 13.10.0 + ollama-ai-provider-v2@2.0.0(ai@6.0.25(zod@4.1.12))(zod@4.1.12): + dependencies: + '@ai-sdk/provider': 3.0.0 + '@ai-sdk/provider-utils': 4.0.1(zod@4.1.12) + ai: 6.0.25(zod@4.1.12) + zod: 4.1.12 + ollama-ai-provider@1.2.0(zod@3.25.76): dependencies: '@ai-sdk/provider': 1.1.3 @@ -20504,9 +20649,9 @@ snapshots: dependencies: zod: 3.25.76 - zod-validation-error@4.0.2(zod@3.25.76): + zod-validation-error@4.0.2(zod@4.1.12): dependencies: - zod: 3.25.76 + zod: 4.1.12 zod@3.25.76: {}