diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index ffa59a3c..18759b97 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [Unreleased] + +### Fixed + +- Fixed `streamSimple()` defaults for models whose advertised output limit is effectively their full context window to avoid impossible default requests ([#4614](https://github.com/earendil-works/pi/issues/4614)). + ## [0.74.1] - 2026-05-16 ### Added diff --git a/packages/ai/src/providers/simple-options.ts b/packages/ai/src/providers/simple-options.ts index 288f2c52..d9dcc348 100644 --- a/packages/ai/src/providers/simple-options.ts +++ b/packages/ai/src/providers/simple-options.ts @@ -1,9 +1,19 @@ import type { Api, Model, SimpleStreamOptions, StreamOptions, ThinkingBudgets, ThinkingLevel } from "../types.js"; +const DEFAULT_MAX_OUTPUT_TOKENS = 32000; +const CONTEXT_WINDOW_OUTPUT_TOLERANCE = 1024; + export function buildBaseOptions(model: Model, options?: SimpleStreamOptions, apiKey?: string): StreamOptions { + const defaultMaxTokens = + model.maxTokens > 0 + ? model.maxTokens >= model.contextWindow - CONTEXT_WINDOW_OUTPUT_TOLERANCE + ? Math.min(model.maxTokens, DEFAULT_MAX_OUTPUT_TOKENS) + : model.maxTokens + : undefined; + return { temperature: options?.temperature, - maxTokens: options?.maxTokens ?? (model.maxTokens > 0 ? model.maxTokens : undefined), + maxTokens: options?.maxTokens ?? defaultMaxTokens, signal: options?.signal, apiKey: apiKey || options?.apiKey, transport: options?.transport,