fix: 修复 HarnessRL 真实重试状态机

This commit is contained in:
root
2026-07-17 05:06:27 +02:00
parent 9715992cd4
commit da03fb7e0c
4 changed files with 150 additions and 37 deletions
+6 -3
View File
@@ -823,7 +823,7 @@ export async function recoverAgentTaskStage(context: CaseContext, run: PreparedC
promptPath: path.join(run.runDir, "agent-prompt.md"),
promptSha256: ""
});
const result = await pollAgentResult(context, { baseUrl, traceId, acceptedBody: { resultUrl }, resultUrl, run, agent: recoveredAgent });
const result = await pollAgentResult(context, { baseUrl, traceId, acceptedBody: { resultUrl }, resultUrl, run, agent: recoveredAgent, notFoundCode: "agentrun_task_not_found" });
const agent = agentWithResultEvidence({
...recoveredAgent,
stageStatus: result.stageStatus,
@@ -919,7 +919,7 @@ async function submitAgentTask(context: CaseContext, input: { baseUrl: string; p
}, "agent_task_submit");
}
async function pollAgentResult(context: CaseContext, input: { baseUrl: string; traceId: string; acceptedBody: any; resultUrl?: string; run?: PreparedCaseRun; agent?: AgentRunStage }) {
async function pollAgentResult(context: CaseContext, input: { baseUrl: string; traceId: string; acceptedBody: any; resultUrl?: string; run?: PreparedCaseRun; agent?: AgentRunStage; notFoundCode?: string }) {
const requestedTimeoutMs = effectiveAgentTimeoutMs(context, input.run?.agentTask);
const timeoutMs = Math.max(Math.min(requestedTimeoutMs, MAX_AGENT_TIMEOUT_MS), 1000);
const pollIntervalMs = effectiveAgentPollIntervalMs(context, input.run?.agentTask);
@@ -936,11 +936,14 @@ async function pollAgentResult(context: CaseContext, input: { baseUrl: string; t
const response = await caseFetchJson(context, resultUrl, { method: "GET", headers: caseAgentHeaders(context) }, "agent_task_result");
lastBody = response.body;
lastStatus = response.status;
if (!response.ok && response.status === 404 && input.notFoundCode) {
throw Object.assign(new Error(`AgentRun task ${input.traceId} was not found`), { code: input.notFoundCode, traceId: input.traceId, status: response.status });
}
if (!response.ok) return { stageStatus: "result_request_failed", body: lastBody, polls, timedOut: false, lastPollAt, lastHttpStatus: lastStatus, error: response.error };
if (input.run && input.agent) {
const runningAgent = agentWithResultEvidence({ ...input.agent, stageStatus: "running", polls, timeoutMs, pollIntervalMs, resultUrl, lastPollAt, lastHttpStatus: lastStatus }, lastBody, input.run.agentTask);
await updateRun(context, input.run, { stage: "agent-running", agent: runningAgent });
}
if (!response.ok) return { stageStatus: "result_request_failed", body: lastBody, polls, timedOut: false, lastPollAt, lastHttpStatus: lastStatus, error: response.error };
const terminal = agentTerminalEvidence(lastBody);
const status = text(lastBody?.status);
if ((status && status !== "running") || terminal.terminal) {