From 0629aec1cc68b9671362592f4ee365c8c734d0c4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:39:11 +0000 Subject: [PATCH 1/2] Initial plan From 3aa5956f55255e358257ea4399abf59f1a77b65f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:46:10 +0000 Subject: [PATCH 2/2] Port v1.105.0 model settings and version updates --- .github/pydantic-ai-version.txt | 2 +- packages/sdk/docs/concepts/models.mdx | 1 + packages/sdk/docs/reference/features.mdx | 4 ++++ packages/sdk/lib/execution/_run_utils.ts | 4 ++++ packages/sdk/lib/types/model_settings.ts | 2 ++ packages/sdk/tests/model_settings_test.ts | 24 +++++++++++++++++++++++ 6 files changed, 36 insertions(+), 1 deletion(-) diff --git a/.github/pydantic-ai-version.txt b/.github/pydantic-ai-version.txt index f634271..e38c0a0 100644 --- a/.github/pydantic-ai-version.txt +++ b/.github/pydantic-ai-version.txt @@ -1 +1 @@ -1.87.0 +1.105.0 diff --git a/packages/sdk/docs/concepts/models.mdx b/packages/sdk/docs/concepts/models.mdx index d8ef03a..8237d48 100644 --- a/packages/sdk/docs/concepts/models.mdx +++ b/packages/sdk/docs/concepts/models.mdx @@ -165,6 +165,7 @@ const agent = new Agent({ | `frequencyPenalty` | `number?` | Penalises tokens that have already appeared (frequency) | | `stopSequences` | `string[]?` | Stop generation when any of these sequences appear | | `seed` | `number?` | Seed for deterministic generation (model-dependent) | +| `reasoningEffort` | `'low' \| 'medium' \| 'high'?` | Provider-specific reasoning effort hint (for example xAI Grok 4.3) | ```typescript const agent = new Agent({ diff --git a/packages/sdk/docs/reference/features.mdx b/packages/sdk/docs/reference/features.mdx index c329f47..3bb953c 100644 --- a/packages/sdk/docs/reference/features.mdx +++ b/packages/sdk/docs/reference/features.mdx @@ -305,3 +305,7 @@ Vibes is designed to stay current with Pydantic AI - an AI agent automatically | `UIAdapter.manage_system_prompt` | `'server'` (default) strips frontend system prompts and reinjects agent's own (v1.86.0) | ❌ | - | Not applicable — vibes AG-UI adapter does not store or forward system prompts via message history | | `HandleDeferredToolCalls` | Auto-resolve deferred tool calls inline (v1.87.0) | ✅ | - | `deferredToolHandler` on `AgentOptions`/`RunOptions`; return `DeferredToolResults` to auto-approve or `null` to fall back to `ApprovalRequiredError` | | `ProcessEventStream` | Observe or transform the agent event stream (v1.87.0) | ✅ | - | `eventStreamHandler` on `AgentOptions`/`RunOptions`; observer form (async fn → void) or processor form (async generator → iterable); applies to `runStreamEvents()` | +| On-demand capability loading (v1.105.0) | Deferred loading for instructions, tools, model settings, and hooks | 🚧 | [Toolsets](/concepts/toolsets) | `DeferredLoadingToolset` covers deferred tool discovery; instructions are already resolved per-turn; full hook/model-settings deferred capability wrappers are not yet ported | +| xAI `reasoning_effort` model setting (v1.105.0) | Grok 4.3 reasoning effort hint support | ✅ | [Models](/concepts/models) | `modelSettings.reasoningEffort` is forwarded via `providerOptions.xai.reasoningEffort` | +| Temporal `gateway/` model construction fix (v1.105.0) | Sandbox-safe gateway model construction in Temporal provider SDKs | ❌ | - | Not applicable — vibes Temporal integration accepts instantiated AI SDK models directly and has no `gateway/` model constructor path | +| `google_cached_content` request omission fix (v1.105.0) | Omit system/tools/tool config when cached content is used | ❌ | - | Not applicable — vibes does not implement Pydantic AI's `GoogleModelSettings.google_cached_content` wrapper path | diff --git a/packages/sdk/lib/execution/_run_utils.ts b/packages/sdk/lib/execution/_run_utils.ts index 2e5287a..a8bcb76 100644 --- a/packages/sdk/lib/execution/_run_utils.ts +++ b/packages/sdk/lib/execution/_run_utils.ts @@ -614,6 +614,7 @@ export function modelSettingsToAISDKOptions( presencePenalty, stopSequences, seed, + reasoningEffort, } = settings; const result: Record = {}; if (temperature !== undefined) result.temperature = temperature; @@ -626,6 +627,9 @@ export function modelSettingsToAISDKOptions( if (presencePenalty !== undefined) result.presencePenalty = presencePenalty; if (stopSequences !== undefined) result.stopSequences = stopSequences; if (seed !== undefined) result.seed = seed; + if (reasoningEffort !== undefined) { + result.providerOptions = { xai: { reasoningEffort } }; + } return result; } diff --git a/packages/sdk/lib/types/model_settings.ts b/packages/sdk/lib/types/model_settings.ts index 0d4f935..54fc484 100644 --- a/packages/sdk/lib/types/model_settings.ts +++ b/packages/sdk/lib/types/model_settings.ts @@ -19,4 +19,6 @@ export interface ModelSettings { stopSequences?: string[]; /** Seed for deterministic generation (model-dependent). */ seed?: number; + /** Provider-specific reasoning effort (e.g. xAI Grok 4.3). */ + reasoningEffort?: "low" | "medium" | "high"; } diff --git a/packages/sdk/tests/model_settings_test.ts b/packages/sdk/tests/model_settings_test.ts index 806c8ca..4684e14 100644 --- a/packages/sdk/tests/model_settings_test.ts +++ b/packages/sdk/tests/model_settings_test.ts @@ -74,6 +74,29 @@ Deno.test("modelSettings - seed is passed to generateText", async () => { assertEquals(capturedSeed, 42); }); +Deno.test("modelSettings - reasoningEffort is passed to generateText", async () => { + let capturedReasoningEffort: string | undefined; + + const model = new MockLanguageModelV3({ + doGenerate: (opts) => { + const providerOptions = (opts as Record) + .providerOptions as + | { xai?: { reasoningEffort?: string } } + | undefined; + capturedReasoningEffort = providerOptions?.xai?.reasoningEffort; + return Promise.resolve(textResponse("ok")); + }, + }); + + const agent = new Agent({ + model, + modelSettings: { reasoningEffort: "high" }, + }); + + await agent.run("prompt"); + assertEquals(capturedReasoningEffort, "high"); +}); + Deno.test("modelSettings - multiple fields passed together", async () => { let capturedTemperature: number | undefined; let capturedTopP: number | undefined; @@ -196,6 +219,7 @@ Deno.test("modelSettings - type check: ModelSettings interface is exported", () presencePenalty: 0.2, stopSequences: ["STOP"], seed: 99, + reasoningEffort: "medium", }; // Just verify the type compiles correctly assertEquals(typeof settings.temperature, "number");