



















@@ -16,7 +16,6 @@ import {
1616queueEmbeddedAgentMessageWithOutcomeAsync,
1717} from "../../agents/embedded-agent-runner/runs.js";
1818import { resolveFastModeState } from "../../agents/fast-mode.js";
19-import { resolveAgentIdentity } from "../../agents/identity.js";
2019import { resolveModelAuthMode } from "../../agents/model-auth.js";
2120import { isCliProvider } from "../../agents/model-selection.js";
2221import { deriveContextPromptTokens, hasNonzeroUsage, normalizeUsage } from "../../agents/usage.js";
@@ -40,7 +39,6 @@ import {
4039} from "../../infra/diagnostic-trace-context.js";
4140import { measureDiagnosticsTimelineSpan } from "../../infra/diagnostics-timeline.js";
4241import { enqueueSystemEvent } from "../../infra/system-events.js";
43-import type { PluginHookReplyUsageState } from "../../plugins/hook-types.js";
4442import { CommandLaneClearedError, GatewayDrainingError } from "../../process/command-queue.js";
4543import { shouldPreserveUserFacingSessionStateForInputProvenance } from "../../sessions/input-provenance.js";
4644import { resolveSendPolicy } from "../../sessions/send-policy.js";
@@ -65,15 +63,9 @@ import {
6563setReplyPayloadMetadata,
6664} from "../reply-payload.js";
6765import type { OriginatingChannelType, TemplateContext } from "../templating.js";
68-import {
69-resolveEffectiveResponseUsage,
70-type VerboseLevel,
71-} from "../thinking.js";
66+import type { VerboseLevel } from "../thinking.js";
7267import { SILENT_REPLY_TOKEN } from "../tokens.js";
7368import type { GetReplyOptions, ReplyPayload } from "../types.js";
74-import { buildUsageContract } from "../usage-bar/contract.js";
75-import { loadUsageBarTemplate } from "../usage-bar/template.js";
76-import { renderUsageBar } from "../usage-bar/translator.js";
7769import {
7870buildKnownAgentRunFailureReplyPayload,
7971runAgentTurnWithFallback,
@@ -92,7 +84,7 @@ import {
9284hasUnbackedReminderCommitment,
9385} from "./agent-runner-reminder-guard.js";
9486import { resetReplyRunSession } from "./agent-runner-session-reset.js";
95-import { appendUsageLine, formatResponseUsageLine } from "./agent-runner-usage-line.js";
87+import { appendUsageLine, resolveResponseUsageLine } from "./agent-runner-usage-line.js";
9688import { resolveQueuedReplyExecutionConfig } from "./agent-runner-utils.js";
9789import { createAudioAsVoiceBuffer, createBlockReplyPipeline } from "./block-reply-pipeline.js";
9890import { resolveEffectiveBlockStreamingConfig } from "./block-streaming.js";
@@ -129,7 +121,7 @@ import {
129121} from "./reply-run-registry.js";
130122import { createReplyToModeFilterForChannel, resolveReplyToMode } from "./reply-threading.js";
131123import { admitReplyTurn, resolveReplyTurnKind } from "./reply-turn-admission.js";
132-import { recordReplyUsageState } from "./reply-usage-state.js";
124+import { buildReplyUsageState, recordReplyUsageState } from "./reply-usage-state.js";
133125import { resolveRoutedDeliveryThreadId } from "./routed-delivery-thread.js";
134126import { incrementRunCompactionCount, persistRunSessionUsage } from "./session-run-accounting.js";
135127import { resolveSourceReplyVisibilityPolicy } from "./source-reply-delivery-mode.js";
@@ -1686,7 +1678,6 @@ export async function runReplyAgent(params: {
16861678 toolProgressDetail,
16871679});
168816801689-let responseUsageLine: string | undefined;
16901681type SessionResetOptions = {
16911682failureLabel: string;
16921683buildLogMessage: (nextSessionId: string) => string;
@@ -1832,80 +1823,52 @@ export async function runReplyAgent(params: {
18321823const providerUsed =
18331824runResult.meta?.agentMeta?.provider ?? fallbackProvider ?? followupRun.run.provider;
183418251835-let replyUsageState: PluginHookReplyUsageState | undefined;
1836-{
1837-const winnerProvider = fallbackExhausted
1838- ? undefined
1839- : (runResult.meta?.executionTrace?.winnerProvider ?? providerUsed);
1840-const winnerModel = fallbackExhausted
1841- ? undefined
1842- : (runResult.meta?.executionTrace?.winnerModel ?? modelUsed);
1843-const ctxTokens = runResult.meta?.agentMeta?.contextTokens;
1844-const compactions = runResult.meta?.agentMeta?.compactionCount;
1845-const lastCallUsage = runResult.meta?.agentMeta?.lastCallUsage;
1846-replyUsageState = {
1847-provider: providerUsed,
1848-model: modelUsed,
1849-resolvedRef: winnerProvider && winnerModel ? `${winnerProvider}/${winnerModel}` : undefined,
1850-reasoningEffort:
1851-typeof followupRun.run.thinkLevel === "string" ? followupRun.run.thinkLevel : undefined,
1852-fastMode: resolveFastModeState({
1853- cfg,
1854-provider: providerUsed ?? "",
1855-model: modelUsed ?? "",
1856-agentId: followupRun.run.agentId,
1857-sessionEntry: activeSessionEntry,
1858-}).enabled,
1859-fallbackUsed: runResult.meta?.executionTrace?.fallbackUsed === true,
1826+const winnerProvider = fallbackExhausted
1827+ ? undefined
1828+ : (runResult.meta?.executionTrace?.winnerProvider ?? providerUsed);
1829+const winnerModel = fallbackExhausted
1830+ ? undefined
1831+ : (runResult.meta?.executionTrace?.winnerModel ?? modelUsed);
1832+const ctxTokens = runResult.meta?.agentMeta?.contextTokens;
1833+const compactions = runResult.meta?.agentMeta?.compactionCount;
1834+const lastCallUsage = runResult.meta?.agentMeta?.lastCallUsage;
1835+const replyUsageState = buildReplyUsageState({
1836+config: cfg,
1837+provider: providerUsed,
1838+model: modelUsed,
1839+ fallbackExhausted,
1840+ winnerProvider,
1841+ winnerModel,
1842+reasoningEffort:
1843+typeof followupRun.run.thinkLevel === "string" ? followupRun.run.thinkLevel : undefined,
1844+fastMode: resolveFastModeState({
1845+ cfg,
1846+provider: providerUsed ?? "",
1847+model: modelUsed ?? "",
18601848agentId: followupRun.run.agentId,
1861-sessionId: followupRun.run.sessionId,
1862-chatType: typeof sessionCtx.ChatType === "string" ? sessionCtx.ChatType : undefined,
1863-authMode: runResult.meta?.requestShaping?.authMode ?? undefined,
1864-overrideSource: activeSessionEntry?.modelOverrideSource ?? undefined,
1865-requested:
1866-followupRun.run.provider && followupRun.run.model
1867- ? `${followupRun.run.provider}/${followupRun.run.model}`
1868- : undefined,
1869-turnUsd: hasBillableUsageBuckets
1870- ? estimateUsageCost({
1871- usage,
1872-cost: resolveModelCostConfig({
1873-provider: providerUsed,
1874-model: modelUsed,
1875-config: cfg,
1876-}),
1877-})
1878- : undefined,
1879-durationMs: Date.now() - runStartedAt,
1880-identity: resolveAgentIdentity(cfg, followupRun.run.agentId),
1881-compactionCount: typeof compactions === "number" ? compactions : undefined,
1882-contextTokenBudget:
1883-typeof ctxTokens === "number" && Number.isFinite(ctxTokens) ? ctxTokens : undefined,
1884-contextUsedTokens:
1885-typeof promptTokens === "number" && Number.isFinite(promptTokens)
1886- ? promptTokens
1887- : undefined,
1888-usage: usage
1889- ? {
1890-input: usage.input,
1891-output: usage.output,
1892-cacheRead: usage.cacheRead,
1893-cacheWrite: usage.cacheWrite,
1894-total: usage.total,
1895-}
1896- : undefined,
1897-lastUsage: lastCallUsage
1898- ? {
1899-input: lastCallUsage.input,
1900-output: lastCallUsage.output,
1901-cacheRead: lastCallUsage.cacheRead,
1902-cacheWrite: lastCallUsage.cacheWrite,
1903-total: lastCallUsage.total,
1904-}
1849+sessionEntry: activeSessionEntry,
1850+}).enabled,
1851+fallbackUsed: runResult.meta?.executionTrace?.fallbackUsed === true,
1852+agentId: followupRun.run.agentId,
1853+sessionId: followupRun.run.sessionId,
1854+chatType: typeof sessionCtx.ChatType === "string" ? sessionCtx.ChatType : undefined,
1855+authMode: runResult.meta?.requestShaping?.authMode ?? undefined,
1856+overrideSource: activeSessionEntry?.modelOverrideSource ?? undefined,
1857+requestedProvider: followupRun.run.provider,
1858+requestedModel: followupRun.run.model,
1859+durationMs: Date.now() - runStartedAt,
1860+compactionCount: typeof compactions === "number" ? compactions : undefined,
1861+contextTokenBudget:
1862+typeof ctxTokens === "number" && Number.isFinite(ctxTokens) ? ctxTokens : undefined,
1863+contextUsedTokens:
1864+typeof promptTokens === "number" && Number.isFinite(promptTokens)
1865+ ? promptTokens
19051866 : undefined,
1906-};
1907-recordReplyUsageState(runId, replyUsageState);
1908-}
1867+ promptTokens,
1868+ usage,
1869+ lastCallUsage,
1870+});
1871+recordReplyUsageState(runId, replyUsageState);
19091872const verboseEnabled = resolvedVerboseLevel !== "off";
19101873const preserveUserFacingSessionState = shouldPreserveUserFacingSessionStateForInputProvenance(
19111874followupRun.run.inputProvenance,
@@ -2276,40 +2239,16 @@ export async function runReplyAgent(params: {
22762239const responseUsageSessionRaw =
22772240activeSessionEntry?.responseUsage ??
22782241(sessionKey ? activeSessionStore?.[sessionKey]?.responseUsage : undefined);
2279-const responseUsageMode = resolveEffectiveResponseUsage(
2280-responseUsageSessionRaw,
2281-cfg.messages?.responseUsage,
2282-replyToChannel,
2283-);
2284-if (responseUsageMode !== "off" && hasNonzeroUsage(usage) && !preserveUserFacingSessionState) {
2285-const costConfig = resolveModelCostConfig({
2286-provider: providerUsed,
2287-model: modelUsed,
2288-config: cfg,
2289-allowPluginNormalization: false,
2290-});
2291-const showCost = responseUsageMode === "full" && costConfig !== undefined;
2292-let formatted = formatResponseUsageLine({
2293- usage,
2294- showCost,
2295- costConfig,
2296-});
2297-const usageTemplate =
2298-responseUsageMode === "full" && replyUsageState
2299- ? loadUsageBarTemplate(cfg.messages?.usageTemplate)
2300- : undefined;
2301-const renderedUsageLine = usageTemplate
2302- ? renderUsageBar(usageTemplate, buildUsageContract(replyUsageState, replyToChannel))
2303- : undefined;
2304-if (renderedUsageLine) {
2305-formatted = renderedUsageLine;
2306-} else if (formatted && responseUsageMode === "full" && sessionKey) {
2307-formatted = `${formatted} · session \`${sessionKey}\``;
2308-}
2309-if (formatted) {
2310-responseUsageLine = formatted;
2311-}
2312-}
2242+const responseUsageLine = resolveResponseUsageLine({
2243+config: cfg,
2244+sessionRaw: responseUsageSessionRaw,
2245+channel: replyToChannel,
2246+ usage,
2247+provider: providerUsed,
2248+model: modelUsed,
2249+ preserveUserFacingSessionState,
2250+ replyUsageState,
2251+});
2313225223142253if (verboseEnabled) {
23152254activeSessionEntry = refreshSessionEntryFromStore({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。