diff --git a/bun.lock b/bun.lock index 95aaf2e39ee5..e41d891ec932 100644 --- a/bun.lock +++ b/bun.lock @@ -1075,6 +1075,7 @@ "@silvia-odwyer/photon-node@0.3.4": "patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch", "@npmcli/agent@4.0.2": "patches/@npmcli%2Fagent@4.0.2.patch", "solid-js@1.9.10": "patches/solid-js@1.9.10.patch", + "@ai-sdk/groq@3.0.31": "patches/@ai-sdk%2Fgroq@3.0.31.patch", "@ai-sdk/google@3.0.73": "patches/@ai-sdk%2Fgoogle@3.0.73.patch", "pacote@21.5.0": "patches/pacote@21.5.0.patch", "@dnd-kit/dom@0.5.0": "patches/@dnd-kit%2Fdom@0.5.0.patch", diff --git a/package.json b/package.json index 58712547b4b8..0f11d0c3966a 100644 --- a/package.json +++ b/package.json @@ -159,6 +159,7 @@ "@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch", "effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch", "@tanstack/virtual-core@3.17.3": "patches/@tanstack%2Fvirtual-core@3.17.3.patch", - "@ai-sdk/openai-compatible@2.0.41": "patches/@ai-sdk%2Fopenai-compatible@2.0.41.patch" + "@ai-sdk/openai-compatible@2.0.41": "patches/@ai-sdk%2Fopenai-compatible@2.0.41.patch", + "@ai-sdk/groq@3.0.31": "patches/@ai-sdk%2Fgroq@3.0.31.patch" } } diff --git a/packages/core/test/provider-groq.test.ts b/packages/core/test/provider-groq.test.ts new file mode 100644 index 000000000000..604a2a750e52 --- /dev/null +++ b/packages/core/test/provider-groq.test.ts @@ -0,0 +1,28 @@ +import { createGroq } from "@ai-sdk/groq" +import { expect, test } from "bun:test" + +test("Groq passes through unknown reasoning effort", async () => { + let body: Record | undefined + const mockFetch = Object.assign( + async (_input: Parameters[0], init?: RequestInit) => { + body = JSON.parse(String(init?.body)) + return Response.json({ + id: "response-1", + created: 0, + model: "openai/gpt-oss-120b", + object: "chat.completion", + choices: [{ index: 0, message: { role: "assistant", content: "Hello" }, finish_reason: "stop" }], + usage: { prompt_tokens: 1, completion_tokens: 1, total_tokens: 2 }, + }) + }, + { preconnect: fetch.preconnect }, + ) + const model = createGroq({ apiKey: "test", fetch: mockFetch })("openai/gpt-oss-120b") + + await model.doGenerate({ + prompt: [{ role: "user", content: [{ type: "text", text: "Hello" }] }], + providerOptions: { groq: { reasoningEffort: "custom" } }, + }) + + expect(body?.reasoning_effort).toBe("custom") +}) diff --git a/patches/@ai-sdk%2Fgroq@3.0.31.patch b/patches/@ai-sdk%2Fgroq@3.0.31.patch new file mode 100644 index 000000000000..f26a4bedfa20 --- /dev/null +++ b/patches/@ai-sdk%2Fgroq@3.0.31.patch @@ -0,0 +1,79 @@ +diff --git a/dist/index.d.mts b/dist/index.d.mts +index 8b23996dcce6c1ad5b17ef59f92196fb97312d79..80be2e52a347042b89da8e502834afd92120877a 100644 +--- a/dist/index.d.mts ++++ b/dist/index.d.mts +@@ -10,13 +10,7 @@ declare const groqLanguageModelOptions: z.ZodObject<{ + raw: "raw"; + hidden: "hidden"; + }>>; +- reasoningEffort: z.ZodOptional>; ++ reasoningEffort: z.ZodOptional; + parallelToolCalls: z.ZodOptional; + user: z.ZodOptional; + structuredOutputs: z.ZodOptional; +diff --git a/dist/index.d.ts b/dist/index.d.ts +index 8b23996dcce6c1ad5b17ef59f92196fb97312d79..80be2e52a347042b89da8e502834afd92120877a 100644 +--- a/dist/index.d.ts ++++ b/dist/index.d.ts +@@ -10,13 +10,7 @@ declare const groqLanguageModelOptions: z.ZodObject<{ + raw: "raw"; + hidden: "hidden"; + }>>; +- reasoningEffort: z.ZodOptional>; ++ reasoningEffort: z.ZodOptional; + parallelToolCalls: z.ZodOptional; + user: z.ZodOptional; + structuredOutputs: z.ZodOptional; +diff --git a/dist/index.js b/dist/index.js +index 45a104f2e0775761858eac2a82ced64bceba1f5e..f60ac36f4a064d527e8f8881b1d6c58ff69286a3 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -214,7 +214,7 @@ var groqLanguageModelOptions = import_v4.z.object({ + * Specifies the reasoning effort level for model inference. + * @see https://console.groq.com/docs/reasoning#reasoning-effort + */ +- reasoningEffort: import_v4.z.enum(["none", "default", "low", "medium", "high"]).optional(), ++ reasoningEffort: import_v4.z.string().optional(), + /** + * Whether to enable parallel function calling during tool use. Default to true. + */ +diff --git a/dist/index.mjs b/dist/index.mjs +index c644c32235d8fa88c51c0fc6958feb1da4877c96..2c2f81869673eb4633e843d93ff5376abf1e67d0 100644 +--- a/dist/index.mjs ++++ b/dist/index.mjs +@@ -203,7 +203,7 @@ var groqLanguageModelOptions = z.object({ + * Specifies the reasoning effort level for model inference. + * @see https://console.groq.com/docs/reasoning#reasoning-effort + */ +- reasoningEffort: z.enum(["none", "default", "low", "medium", "high"]).optional(), ++ reasoningEffort: z.string().optional(), + /** + * Whether to enable parallel function calling during tool use. Default to true. + */ +diff --git a/src/groq-chat-options.ts b/src/groq-chat-options.ts +index 3812cdf53308709f166f05c58c5d46a5d8189c8b..af520c5459bd752b3cce03c3b4afbeed31157d90 100644 +--- a/src/groq-chat-options.ts ++++ b/src/groq-chat-options.ts +@@ -33,9 +33,7 @@ export const groqLanguageModelOptions = z.object({ + * Specifies the reasoning effort level for model inference. + * @see https://console.groq.com/docs/reasoning#reasoning-effort + */ +- reasoningEffort: z +- .enum(['none', 'default', 'low', 'medium', 'high']) +- .optional(), ++ reasoningEffort: z.string().optional(), + + /** + * Whether to enable parallel function calling during tool use. Default to true.