Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions packages/coding-agent/src/core/agent-session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import {
runToolCall,
type ThinkingLevel,
} from "@earendil-works/pi-agent-core";
import { contentText, getCurrentSystemMessage, retryDelayMs } from "@earendil-works/pi-ai";
import { contentText, getCurrentSystemMessage, jitteredRetryDelayMs } from "@earendil-works/pi-ai";
import type {
AssistantMessage,
AuthResult,
Expand Down Expand Up @@ -3803,7 +3803,7 @@ export class AgentSession {
return false;
}

const delayMs = retryDelayMs(settings, this._retryAttempt);
const delayMs = jitteredRetryDelayMs(settings, this._retryAttempt);

this._emit({
type: "auto_retry_start",
Expand All @@ -3816,7 +3816,7 @@ export class AgentSession {
// Keep the failed attempt in raw history while durably omitting it from model projection.
this._omitRecoveryAttempt(message);

// Wait with exponential backoff (abortable)
// Wait with jittered exponential backoff (abortable)
this._retryAbortController = new AbortController();
try {
await sleep(delayMs, this._retryAbortController.signal);
Expand Down
6 changes: 4 additions & 2 deletions packages/coding-agent/test/agent-session-retry.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { join } from "node:path";
import { Agent, type AgentEvent, type AgentTool } from "@earendil-works/pi-agent-core";
import { type AssistantMessage, createAssistantMessageEventStream, getModel } from "@earendil-works/pi-ai/compat";
import { Type } from "typebox";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { AgentSession } from "../src/core/agent-session.ts";
import { AuthStorage } from "../src/core/auth-storage.ts";
import { SessionManager } from "../src/core/session-manager.ts";
Expand Down Expand Up @@ -47,6 +47,7 @@ describe("AgentSession retry", () => {
});

afterEach(() => {
vi.restoreAllMocks();
if (session) {
session.dispose();
}
Expand Down Expand Up @@ -155,7 +156,8 @@ describe("AgentSession retry", () => {
});

it("caps agent retry delay", async () => {
// Regression for #8826.
// Regression for #8826. The top of the jitter range is the unjittered delay.
vi.spyOn(Math, "random").mockReturnValue(1);
const created = await createSession({ failCount: 4, maxRetries: 5, maxAgentDelayMs: 5 });
const delays: number[] = [];
created.session.subscribe((event) => {
Expand Down
Loading