





















@@ -133,6 +133,8 @@ import { createCodexUserInputBridge } from "./user-input-bridge.js";
133133import { filterToolsForVisionInputs } from "./vision-tools.js";
134134135135const CODEX_DYNAMIC_TOOL_TIMEOUT_MS = 30_000;
136+const CODEX_DYNAMIC_TOOL_MAX_TIMEOUT_MS = 600_000;
137+const CODEX_DYNAMIC_IMAGE_TOOL_TIMEOUT_MS = 60_000;
136138const CODEX_APP_SERVER_STARTUP_CONNECTION_CLOSE_MAX_ATTEMPTS = 3;
137139const CODEX_APP_SERVER_STARTUP_TIMEOUT_FLOOR_MS = 100;
138140const CODEX_TURN_COMPLETION_IDLE_TIMEOUT_MS = 60_000;
@@ -1186,18 +1188,22 @@ export async function runCodexAppServerAttempt(
11861188 ...(toolArgs ? { args: toolArgs } : {}),
11871189},
11881190});
1191+const dynamicToolTimeoutMs = resolveDynamicToolCallTimeoutMs({
1192+ call,
1193+config: params.config,
1194+});
11891195const response = await handleDynamicToolCallWithTimeout({
11901196 call,
11911197 toolBridge,
11921198signal: runAbortController.signal,
1193-timeoutMs: CODEX_DYNAMIC_TOOL_TIMEOUT_MS,
1199+timeoutMs: dynamicToolTimeoutMs,
11941200onTimeout: () => {
11951201trajectoryRecorder?.recordEvent("tool.timeout", {
11961202threadId: call.threadId,
11971203turnId: call.turnId,
11981204toolCallId: call.callId,
11991205name: call.tool,
1200-timeoutMs: CODEX_DYNAMIC_TOOL_TIMEOUT_MS,
1206+timeoutMs: dynamicToolTimeoutMs,
12011207});
12021208},
12031209});
@@ -1579,7 +1585,7 @@ async function handleDynamicToolCallWithTimeout(params: {
15791585resolveAbort = resolve;
15801586});
15811587const timeoutPromise = new Promise<CodexDynamicToolCallResponse>((resolve) => {
1582-const timeoutMs = Math.max(1, Math.min(CODEX_DYNAMIC_TOOL_TIMEOUT_MS, params.timeoutMs));
1588+const timeoutMs = clampDynamicToolTimeoutMs(params.timeoutMs);
15831589timeout = setTimeout(() => {
15841590timedOut = true;
15851591const timeoutDetails = formatDynamicToolTimeoutDetails({ call: params.call, timeoutMs });
@@ -1625,6 +1631,61 @@ function failedDynamicToolResponse(message: string): CodexDynamicToolCallRespons
16251631};
16261632}
162716331634+function resolveDynamicToolCallTimeoutMs(params: {
1635+call: CodexDynamicToolCallParams;
1636+config: EmbeddedRunAttemptParams["config"];
1637+}): number {
1638+return clampDynamicToolTimeoutMs(
1639+readDynamicToolCallTimeoutMs(params.call.arguments) ??
1640+readConfiguredDynamicToolTimeoutMs(params.call.tool, params.config) ??
1641+CODEX_DYNAMIC_TOOL_TIMEOUT_MS,
1642+);
1643+}
1644+1645+function readDynamicToolCallTimeoutMs(value: JsonValue | undefined): number | undefined {
1646+if (!isJsonObject(value)) {
1647+return undefined;
1648+}
1649+return readPositiveFiniteTimeoutMs(value.timeoutMs);
1650+}
1651+1652+function readConfiguredDynamicToolTimeoutMs(
1653+toolName: string,
1654+config: EmbeddedRunAttemptParams["config"],
1655+): number | undefined {
1656+if (toolName === "image_generate") {
1657+const imageGenerationModel = config?.agents?.defaults?.imageGenerationModel;
1658+if (!imageGenerationModel || typeof imageGenerationModel !== "object") {
1659+return undefined;
1660+}
1661+return readPositiveFiniteTimeoutMs(imageGenerationModel.timeoutMs);
1662+}
1663+1664+if (toolName === "image") {
1665+return (
1666+readTimeoutSecondsAsMs(config?.tools?.media?.image?.timeoutSeconds) ??
1667+CODEX_DYNAMIC_IMAGE_TOOL_TIMEOUT_MS
1668+);
1669+}
1670+1671+return undefined;
1672+}
1673+1674+function readTimeoutSecondsAsMs(value: unknown): number | undefined {
1675+const seconds = readPositiveFiniteTimeoutMs(value);
1676+return seconds === undefined ? undefined : seconds * 1000;
1677+}
1678+1679+function readPositiveFiniteTimeoutMs(value: unknown): number | undefined {
1680+return typeof value === "number" && Number.isFinite(value) && value > 0
1681+ ? Math.floor(value)
1682+ : undefined;
1683+}
1684+1685+function clampDynamicToolTimeoutMs(timeoutMs: number): number {
1686+return Math.max(1, Math.min(CODEX_DYNAMIC_TOOL_MAX_TIMEOUT_MS, Math.floor(timeoutMs)));
1687+}
1688+16281689function createCodexNativeHookRelay(params: {
16291690options:
16301691| {
@@ -2292,6 +2353,8 @@ function handleApprovalRequest(params: {
2292235322932354export const __testing = {
22942355CODEX_DYNAMIC_TOOL_TIMEOUT_MS,
2356+CODEX_DYNAMIC_TOOL_MAX_TIMEOUT_MS,
2357+CODEX_DYNAMIC_IMAGE_TOOL_TIMEOUT_MS,
22952358CODEX_TURN_COMPLETION_IDLE_TIMEOUT_MS,
22962359CODEX_TURN_TERMINAL_IDLE_TIMEOUT_MS,
22972360 buildCodexNativeHookRelayId,
@@ -2300,6 +2363,7 @@ export const __testing = {
23002363 filterCodexDynamicToolsForAllowlist,
23012364 filterToolsForVisionInputs,
23022365 handleDynamicToolCallWithTimeout,
2366+ resolveDynamicToolCallTimeoutMs,
23032367 resolveCodexPluginAppCacheEndpoint,
23042368 resolveOpenClawCodingToolsSessionKeys,
23052369 shouldForceMessageTool,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。