






















@@ -24,6 +24,7 @@ import {
2424createChildDiagnosticTraceContext,
2525freezeDiagnosticTraceContext,
2626} from "../../infra/diagnostic-trace-context.js";
27+import { measureDiagnosticsTimelineSpan } from "../../infra/diagnostics-timeline.js";
2728import { enqueueSystemEvent } from "../../infra/system-events.js";
2829import { CommandLaneClearedError, GatewayDrainingError } from "../../process/command-queue.js";
2930import { resolveSendPolicy } from "../../sessions/send-policy.js";
@@ -989,6 +990,20 @@ export async function runReplyAgent(params: {
989990const effectiveShouldFollowup = !effectiveResetTriggered && shouldFollowup;
990991991992const isHeartbeat = opts?.isHeartbeat === true;
993+const traceAttributes = {
994+provider: followupRun.run.provider,
995+hasSessionKey: Boolean(sessionKey ?? followupRun.run.sessionKey),
996+ isHeartbeat,
997+queueMode: resolvedQueue.mode,
998+ isActive,
999+ blockStreamingEnabled,
1000+};
1001+const traceAgentPhase = <T>(name: string, run: () => Promise<T> | T): Promise<T> =>
1002+measureDiagnosticsTimelineSpan(name, run, {
1003+phase: "agent-turn",
1004+config: followupRun.run.config,
1005+attributes: traceAttributes,
1006+});
9921007const typingSignals = createTypingSignaler({
9931008 typing,
9941009mode: typingMode,
@@ -1175,40 +1190,44 @@ export async function runReplyAgent(params: {
11751190try {
11761191await typingSignals.signalRunStart();
117711921178-activeSessionEntry = await runPreflightCompactionIfNeeded({
1179- cfg,
1180- followupRun,
1181-promptForEstimate: followupRun.prompt,
1182- defaultModel,
1183- agentCfgContextTokens,
1184-sessionEntry: activeSessionEntry,
1185-sessionStore: activeSessionStore,
1186- sessionKey,
1187- runtimePolicySessionKey,
1188- storePath,
1189- isHeartbeat,
1190- replyOperation,
1191-});
1193+activeSessionEntry = await traceAgentPhase("reply.preflight_compaction", () =>
1194+runPreflightCompactionIfNeeded({
1195+ cfg,
1196+ followupRun,
1197+promptForEstimate: followupRun.prompt,
1198+ defaultModel,
1199+ agentCfgContextTokens,
1200+sessionEntry: activeSessionEntry,
1201+sessionStore: activeSessionStore,
1202+ sessionKey,
1203+ runtimePolicySessionKey,
1204+ storePath,
1205+ isHeartbeat,
1206+ replyOperation,
1207+}),
1208+);
11921209preflightCompactionApplied =
11931210(activeSessionEntry?.compactionCount ?? 0) > prePreflightCompactionCount;
119412111195-activeSessionEntry = await runMemoryFlushIfNeeded({
1196- cfg,
1197- followupRun,
1198-promptForEstimate: followupRun.prompt,
1199- sessionCtx,
1200- opts,
1201- defaultModel,
1202- agentCfgContextTokens,
1203- resolvedVerboseLevel,
1204-sessionEntry: activeSessionEntry,
1205-sessionStore: activeSessionStore,
1206- sessionKey,
1207- runtimePolicySessionKey,
1208- storePath,
1209- isHeartbeat,
1210- replyOperation,
1211-});
1212+activeSessionEntry = await traceAgentPhase("reply.memory_flush", () =>
1213+runMemoryFlushIfNeeded({
1214+ cfg,
1215+ followupRun,
1216+promptForEstimate: followupRun.prompt,
1217+ sessionCtx,
1218+ opts,
1219+ defaultModel,
1220+ agentCfgContextTokens,
1221+ resolvedVerboseLevel,
1222+sessionEntry: activeSessionEntry,
1223+sessionStore: activeSessionStore,
1224+ sessionKey,
1225+ runtimePolicySessionKey,
1226+ storePath,
1227+ isHeartbeat,
1228+ replyOperation,
1229+}),
1230+);
1212123112131232runFollowupTurn = createFollowupRunner({
12141233 opts,
@@ -1270,35 +1289,37 @@ export async function runReplyAgent(params: {
1270128912711290replyOperation.setPhase("running");
12721291const runStartedAt = Date.now();
1273-const runOutcome = await runAgentTurnWithFallback({
1274- commandBody,
1275- transcriptCommandBody,
1276- followupRun,
1277- sessionCtx,
1278-replyThreading: replyThreadingOverride ?? sessionCtx.ReplyThreading,
1279- replyOperation,
1280- opts,
1281- typingSignals,
1282- blockReplyPipeline,
1283- blockStreamingEnabled,
1284- blockReplyChunking,
1285- resolvedBlockStreamingBreak,
1286- applyReplyToMode,
1287- shouldEmitToolResult,
1288- shouldEmitToolOutput,
1289- pendingToolTasks,
1290- resetSessionAfterCompactionFailure,
1291- resetSessionAfterRoleOrderingConflict,
1292- isHeartbeat,
1293- sessionKey,
1294- runtimePolicySessionKey,
1295-getActiveSessionEntry: () => activeSessionEntry,
1296- activeSessionStore,
1297- storePath,
1298- resolvedVerboseLevel,
1299- toolProgressDetail,
1300- replyMediaContext,
1301-});
1292+const runOutcome = await traceAgentPhase("reply.run_agent_turn", () =>
1293+runAgentTurnWithFallback({
1294+ commandBody,
1295+ transcriptCommandBody,
1296+ followupRun,
1297+ sessionCtx,
1298+replyThreading: replyThreadingOverride ?? sessionCtx.ReplyThreading,
1299+ replyOperation,
1300+ opts,
1301+ typingSignals,
1302+ blockReplyPipeline,
1303+ blockStreamingEnabled,
1304+ blockReplyChunking,
1305+ resolvedBlockStreamingBreak,
1306+ applyReplyToMode,
1307+ shouldEmitToolResult,
1308+ shouldEmitToolOutput,
1309+ pendingToolTasks,
1310+ resetSessionAfterCompactionFailure,
1311+ resetSessionAfterRoleOrderingConflict,
1312+ isHeartbeat,
1313+ sessionKey,
1314+ runtimePolicySessionKey,
1315+getActiveSessionEntry: () => activeSessionEntry,
1316+ activeSessionStore,
1317+ storePath,
1318+ resolvedVerboseLevel,
1319+ toolProgressDetail,
1320+ replyMediaContext,
1321+}),
1322+);
1302132313031324if (runOutcome.kind === "final") {
13041325if (!replyOperation.result) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。