import type { Context, Model, OpenAICompat, ProviderSessionState, ServiceTier, StreamFunction, StreamOptions, Tool, ToolChoice } from "../types"; import { type OpenAIResponsesToolChoice } from "../utils/tool-choice"; import { type OpenAIReasoningEffortFallbackState } from "./openai-reasoning-fallback"; import type { Tool as OpenAITool, ResponseCreateParamsStreaming, ResponseInput } from "./openai-responses-wire"; import { type OpenAIStrictToolsScope, type OpenAIStrictToolsState } from "./openai-shared"; export interface OpenAIResponsesOptions extends StreamOptions { reasoning?: "minimal" | "low" | "medium" | "high" | "xhigh"; reasoningSummary?: "auto" | "detailed" | "concise" | null; serviceTier?: ServiceTier; textVerbosity?: "low" | "medium" | "high"; toolChoice?: ToolChoice; openrouterVariant?: string; maxTokensExplicit?: boolean; disableReasoning?: boolean; /** * Stateful turns: chain via `previous_response_id` + delta input instead of * replaying the full transcript. Forces `store: true` (the platform only * resolves stored responses). Defaults ON against the official OpenAI API * and OFF for other Responses endpoints; `PI_OPENAI_STATEFUL` overrides the * default, and `false` here vetoes everything. Requires `sessionId` + * `providerSessionState`. Falls back to a full replay whenever history * mutates or the server reports a stale id. */ statefulResponses?: boolean; /** * Override catalog compat for strict tool call/result pairing when building * Responses API inputs. Default behavior is catalog compat; this is only for * debugging/adapter wrappers. */ strictResponsesPairing?: boolean; /** * Override catalog compat for `include: ["reasoning.encrypted_content"]`. * Default behavior is catalog compat; this is only for debugging/adapter wrappers. */ includeEncryptedReasoning?: boolean; /** * Override catalog compat for stripping `type: "reasoning"` items from * replayed conversation history before request encoding. Default behavior is * catalog compat; this is only for debugging/adapter wrappers. */ filterReasoningHistory?: boolean; /** * Override catalog compat for suppressing the `reasoning.effort` wire param. * Default behavior is catalog compat; this is only for debugging/adapter wrappers. */ omitReasoningEffort?: boolean; /** * Extra request headers merged onto the model/copilot defaults. Used by * adapter wrappers to inject provider-specific * routing or cache hints. */ headers?: Record; /** * Extra body fields merged into the Responses request payload. Used by * adapter wrappers to inject provider-specific body keys (e.g., * prompt_cache_key for prompt-cache routing). */ extraBody?: Record; } interface OpenAIResponsesProviderSessionState extends ProviderSessionState, OpenAIStrictToolsState, OpenAIReasoningEffortFallbackState { nativeHistoryReplayWarmed: boolean; /** Stateful `previous_response_id` chain baselines, keyed by baseUrl/model/session. */ chains: Map; } interface OpenAIResponsesChainState { /** * Wire params of the last successful turn, with per-turn trailing * scaffolding stripped from `input` (never carries previous_response_id). */ lastParams?: OpenAIResponsesSamplingParams; lastResponseId?: string; /** Output items of the last response, in replay-sanitized form (matches next-turn input). */ lastResponseItems?: ResponseInput; canAppend: boolean; /** Consecutive stale-previous-response failures; reset on a successful chained completion. */ staleFailures: number; /** Set once chaining is judged unsupported for this session (circuit breaker). */ disabled: boolean; } type OpenRouterAnthropicCacheControl = { type: "ephemeral"; ttl?: "1h"; }; type OpenAIResponsesSamplingParams = ResponseCreateParamsStreaming & { top_p?: number; top_k?: number; min_p?: number; presence_penalty?: number; repetition_penalty?: number; session_id?: string; stream_options?: { include_obfuscation?: boolean; }; provider?: OpenAICompat["openRouterRouting"]; reasoning?: { effort?: string; } | { enabled: false; }; cache_control?: OpenRouterAnthropicCacheControl; }; /** * Public entry: wrap the single-attempt Responses streamer with bounded * empty-completion retries — a `response.completed` carrying no content/usage * would otherwise stall the agent loop. Shared with the OpenAI-completions and * Anthropic providers via `withEmptyCompletionRetry`. */ export declare const streamOpenAIResponses: StreamFunction<"openai-responses">; export declare function buildParams(model: Model<"openai-responses">, context: Context, options: OpenAIResponsesOptions | undefined, providerSessionState: OpenAIResponsesProviderSessionState | undefined, strictToolsScope?: OpenAIStrictToolsScope, disableStrictToolsOverride?: boolean): { params: OpenAIResponsesSamplingParams; trailingScaffoldingItems: number; strictToolsApplied: boolean; }; /** * Whether this model should get the OpenAI custom-tool grammar variant * for `apply_patch`. The generated model catalog sets * `model.applyPatchToolType` for first-party GPT-5 Responses models; this * runtime path only consumes that metadata. * @internal Exported for tests. */ export declare function supportsFreeformApplyPatch(model: Model<"openai-responses" | "azure-openai-responses" | "openai-codex-responses">): boolean; /** @internal Exported for tests. */ export declare function mapOpenAIResponsesToolChoiceForTools(choice: ToolChoice | undefined, tools: Tool[], model: Model<"openai-responses">): OpenAIResponsesToolChoice; /** @internal Exported for tests. */ export declare function convertTools(tools: Tool[], strictMode: boolean, model: Model<"openai-responses" | "azure-openai-responses" | "openai-codex-responses">, onQuarantine?: (toolName: string, schemaPath: string) => void): OpenAITool[]; export {};