惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
M
MIT News - Artificial intelligence
G
Google Developers Blog
P
Proofpoint News Feed
Recent Announcements
Recent Announcements
MyScale Blog
MyScale Blog
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
月光博客
月光博客
爱范儿
爱范儿
罗磊的独立博客
腾讯CDC
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗
Vercel News
Vercel News
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog
C
Check Point Blog
美团技术团队
宝玉的分享
宝玉的分享
Microsoft Security Blog
Microsoft Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
fix(messages): apply response usage to followups · opencl...
obviyus · 2026-06-24 · via Recent Commits to openclaw:main

@@ -16,7 +16,6 @@ import {

1616

queueEmbeddedAgentMessageWithOutcomeAsync,

1717

} from "../../agents/embedded-agent-runner/runs.js";

1818

import { resolveFastModeState } from "../../agents/fast-mode.js";

19-

import { resolveAgentIdentity } from "../../agents/identity.js";

2019

import { resolveModelAuthMode } from "../../agents/model-auth.js";

2120

import { isCliProvider } from "../../agents/model-selection.js";

2221

import { deriveContextPromptTokens, hasNonzeroUsage, normalizeUsage } from "../../agents/usage.js";

@@ -40,7 +39,6 @@ import {

4039

} from "../../infra/diagnostic-trace-context.js";

4140

import { measureDiagnosticsTimelineSpan } from "../../infra/diagnostics-timeline.js";

4241

import { enqueueSystemEvent } from "../../infra/system-events.js";

43-

import type { PluginHookReplyUsageState } from "../../plugins/hook-types.js";

4442

import { CommandLaneClearedError, GatewayDrainingError } from "../../process/command-queue.js";

4543

import { shouldPreserveUserFacingSessionStateForInputProvenance } from "../../sessions/input-provenance.js";

4644

import { resolveSendPolicy } from "../../sessions/send-policy.js";

@@ -65,15 +63,9 @@ import {

6563

setReplyPayloadMetadata,

6664

} from "../reply-payload.js";

6765

import type { OriginatingChannelType, TemplateContext } from "../templating.js";

68-

import {

69-

resolveEffectiveResponseUsage,

70-

type VerboseLevel,

71-

} from "../thinking.js";

66+

import type { VerboseLevel } from "../thinking.js";

7267

import { SILENT_REPLY_TOKEN } from "../tokens.js";

7368

import 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";

7769

import {

7870

buildKnownAgentRunFailureReplyPayload,

7971

runAgentTurnWithFallback,

@@ -92,7 +84,7 @@ import {

9284

hasUnbackedReminderCommitment,

9385

} from "./agent-runner-reminder-guard.js";

9486

import { 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";

9688

import { resolveQueuedReplyExecutionConfig } from "./agent-runner-utils.js";

9789

import { createAudioAsVoiceBuffer, createBlockReplyPipeline } from "./block-reply-pipeline.js";

9890

import { resolveEffectiveBlockStreamingConfig } from "./block-streaming.js";

@@ -129,7 +121,7 @@ import {

129121

} from "./reply-run-registry.js";

130122

import { createReplyToModeFilterForChannel, resolveReplyToMode } from "./reply-threading.js";

131123

import { admitReplyTurn, resolveReplyTurnKind } from "./reply-turn-admission.js";

132-

import { recordReplyUsageState } from "./reply-usage-state.js";

124+

import { buildReplyUsageState, recordReplyUsageState } from "./reply-usage-state.js";

133125

import { resolveRoutedDeliveryThreadId } from "./routed-delivery-thread.js";

134126

import { incrementRunCompactionCount, persistRunSessionUsage } from "./session-run-accounting.js";

135127

import { resolveSourceReplyVisibilityPolicy } from "./source-reply-delivery-mode.js";

@@ -1686,7 +1678,6 @@ export async function runReplyAgent(params: {

16861678

toolProgressDetail,

16871679

});

168816801689-

let responseUsageLine: string | undefined;

16901681

type SessionResetOptions = {

16911682

failureLabel: string;

16921683

buildLogMessage: (nextSessionId: string) => string;

@@ -1832,80 +1823,52 @@ export async function runReplyAgent(params: {

18321823

const providerUsed =

18331824

runResult.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 ?? "",

18601848

agentId: 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);

19091872

const verboseEnabled = resolvedVerboseLevel !== "off";

19101873

const preserveUserFacingSessionState = shouldPreserveUserFacingSessionStateForInputProvenance(

19111874

followupRun.run.inputProvenance,

@@ -2276,40 +2239,16 @@ export async function runReplyAgent(params: {

22762239

const responseUsageSessionRaw =

22772240

activeSessionEntry?.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+

});

2313225223142253

if (verboseEnabled) {

23152254

activeSessionEntry = refreshSessionEntryFromStore({