From 8fd2ec1b72bde36ba3835ae974377b32feaa013d Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Sun, 25 Oct 2026 00:27:58 -0500 Subject: [PATCH] feat(ai): send min_p on xAI Responses (#58889) --- packages/ai/src/protocols/xai-responses.ts | 8 ++++++++ packages/ai/src/providers/xai.ts | 3 ++- packages/ai/test/provider/xai-responses.test.ts | 8 ++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/ai/src/protocols/xai-responses.ts b/packages/ai/src/protocols/xai-responses.ts index 0680f87d954..5a580cd8b48 100644 --- a/packages/ai/src/protocols/xai-responses.ts +++ b/packages/ai/src/protocols/xai-responses.ts @@ -31,9 +31,15 @@ const XAIResponsesHostedToolItem = Schema.Union([ ), ]) +const Options = Schema.Struct({ + minP: Schema.optional(Schema.Number), +}) +export type OptionsInput = typeof Options.Type + const Body = Schema.Struct({ ...OpenResponses.OpenResponsesBody.fields, top_k: Schema.optional(Schema.Number), + min_p: Schema.optional(Schema.Number), }) const adapter = { @@ -58,6 +64,7 @@ const fromRequest = Effect.fn("XAIResponses.fromRequest")(function* (request: LL message: "xAI requires explicit compaction through LLMClient.compact; automatic context management is not supported", }) + const options = yield* ProviderShared.validateWith(Schema.decodeUnknownEffect(Options))(request.providerOptions ?? {}) const body = yield* OpenResponses.fromRequestWithAdapter(request, adapter) // xAI Responses does not support penalties (they are ignored), but does support top_k. return { @@ -65,6 +72,7 @@ const fromRequest = Effect.fn("XAIResponses.fromRequest")(function* (request: LL presence_penalty: undefined, frequency_penalty: undefined, top_k: request.generation?.topK, + min_p: options.minP, } }) diff --git a/packages/ai/src/providers/xai.ts b/packages/ai/src/providers/xai.ts index 1dadacc615e..cfc98940b31 100644 --- a/packages/ai/src/providers/xai.ts +++ b/packages/ai/src/providers/xai.ts @@ -14,7 +14,8 @@ import type { ProviderPackage } from "../provider-package.js" export const id = ProviderID.make("xai") const baseURL = "https://api.x.ai/v1" -export type XAIProviderOptionsInput = OpenAIOptionsInput & { readonly contextManagement?: never } +export type XAIProviderOptionsInput = OpenAIOptionsInput & + XAIResponses.OptionsInput & { readonly contextManagement?: never } export type LanguageModelOptions = Omit & ProviderAuthOption<"optional"> & { diff --git a/packages/ai/test/provider/xai-responses.test.ts b/packages/ai/test/provider/xai-responses.test.ts index 161cddb69e1..9dc1250117b 100644 --- a/packages/ai/test/provider/xai-responses.test.ts +++ b/packages/ai/test/provider/xai-responses.test.ts @@ -89,6 +89,14 @@ describe("xAI Responses route", () => { }), ) + it.effect("sends min_p from provider options", () => + Effect.gen(function* () { + const prepared = yield* compileRequest(LLM.request({ model, prompt: "Hello", providerOptions: { minP: 0.1 } })) + + expect(prepared.body.min_p).toBe(0.1) + }), + ) + it.effect("parses xAI reasoning summaries", () => Effect.gen(function* () { const response = yield* LLMClient.generate(LLM.request({ model, prompt: "Think" })).pipe(