ai: OpenAI and Codex forced tool calls (#6588)
* feat(ai): support forced OpenAI Codex tool calls * feat(ai): support OpenAI Responses tool choice
This commit is contained in:
@@ -85,6 +85,7 @@ export interface OpenAICodexResponsesOptions extends StreamOptions {
|
||||
reasoningSummary?: "auto" | "concise" | "detailed" | "off" | "on" | null;
|
||||
serviceTier?: ResponseCreateParamsStreaming["service_tier"];
|
||||
textVerbosity?: "low" | "medium" | "high";
|
||||
toolChoice?: "auto" | "none" | "required";
|
||||
}
|
||||
|
||||
type CodexResponseStatus = "completed" | "incomplete" | "failed" | "cancelled" | "queued" | "in_progress";
|
||||
@@ -97,7 +98,7 @@ interface RequestBody {
|
||||
previous_response_id?: string;
|
||||
input?: ResponseInput;
|
||||
tools?: OpenAITool[];
|
||||
tool_choice?: "auto";
|
||||
tool_choice?: OpenAICodexResponsesOptions["toolChoice"];
|
||||
parallel_tool_calls?: boolean;
|
||||
temperature?: number;
|
||||
reasoning?: { effort?: string; summary?: string };
|
||||
@@ -497,7 +498,7 @@ function buildRequestBody(
|
||||
text: { verbosity: options?.textVerbosity || "low" },
|
||||
include: ["reasoning.encrypted_content"],
|
||||
prompt_cache_key: clampOpenAIPromptCacheKey(options?.sessionId),
|
||||
tool_choice: "auto",
|
||||
tool_choice: options?.toolChoice ?? "auto",
|
||||
parallel_tool_calls: true,
|
||||
};
|
||||
|
||||
|
||||
@@ -83,6 +83,7 @@ export interface OpenAIResponsesOptions extends StreamOptions {
|
||||
reasoningEffort?: "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
|
||||
reasoningSummary?: "auto" | "detailed" | "concise" | null;
|
||||
serviceTier?: ResponseCreateParamsStreaming["service_tier"];
|
||||
toolChoice?: ResponseCreateParamsStreaming["tool_choice"];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -254,6 +255,10 @@ function buildParams(model: Model<"openai-responses">, context: Context, options
|
||||
params.tools = convertResponsesTools(toolPlacement.immediate);
|
||||
}
|
||||
|
||||
if (options?.toolChoice !== undefined) {
|
||||
params.tool_choice = options.toolChoice;
|
||||
}
|
||||
|
||||
if (model.reasoning) {
|
||||
if (options?.reasoningEffort || options?.reasoningSummary) {
|
||||
const effort = options?.reasoningEffort
|
||||
|
||||
Reference in New Issue
Block a user