Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/pydantic-ai-version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.87.0
1.105.0
1 change: 1 addition & 0 deletions packages/sdk/docs/concepts/models.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand Down
4 changes: 4 additions & 0 deletions packages/sdk/docs/reference/features.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
4 changes: 4 additions & 0 deletions packages/sdk/lib/execution/_run_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -614,6 +614,7 @@ export function modelSettingsToAISDKOptions(
presencePenalty,
stopSequences,
seed,
reasoningEffort,
} = settings;
const result: Record<string, unknown> = {};
if (temperature !== undefined) result.temperature = temperature;
Expand All @@ -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;
}

Expand Down
2 changes: 2 additions & 0 deletions packages/sdk/lib/types/model_settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
24 changes: 24 additions & 0 deletions packages/sdk/tests/model_settings_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, unknown>)
.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;
Expand Down Expand Up @@ -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");
Expand Down