feat(gateway): stream thinking events and decouple tool events from verbose level (#10568)

This commit is contained in:
Nate
2026-02-10 19:17:21 -06:00
committed by GitHub
parent d2c2f4185b
commit 2b02e8a7a8
5 changed files with 48 additions and 7 deletions

View File

@@ -328,10 +328,7 @@ export function createAgentEventHandler({
const last = agentRunSeq.get(evt.runId) ?? 0;
const isToolEvent = evt.stream === "tool";
const toolVerbose = isToolEvent ? resolveToolVerboseLevel(evt.runId, sessionKey) : "off";
if (isToolEvent && toolVerbose === "off") {
agentRunSeq.set(evt.runId, evt.seq);
return;
}
// Build tool payload: strip result/partialResult unless verbose=full
const toolPayload =
isToolEvent && toolVerbose !== "full"
? (() => {
@@ -356,6 +353,10 @@ export function createAgentEventHandler({
}
agentRunSeq.set(evt.runId, evt.seq);
if (isToolEvent) {
// Always broadcast tool events to registered WS recipients with
// tool-events capability, regardless of verboseLevel. The verbose
// setting only controls whether tool details are sent as channel
// messages to messaging surfaces (Telegram, Discord, etc.).
const recipients = toolEventRecipients.get(evt.runId);
if (recipients && recipients.size > 0) {
broadcastToConnIds("agent", toolPayload, recipients);
@@ -368,7 +369,11 @@ export function createAgentEventHandler({
evt.stream === "lifecycle" && typeof evt.data?.phase === "string" ? evt.data.phase : null;
if (sessionKey) {
nodeSendToSession(sessionKey, "agent", isToolEvent ? toolPayload : agentPayload);
// Send tool events to node/channel subscribers only when verbose is enabled;
// WS clients already received the event above via broadcastToConnIds.
if (!isToolEvent || toolVerbose !== "off") {
nodeSendToSession(sessionKey, "agent", isToolEvent ? toolPayload : agentPayload);
}
if (!isAborted && evt.stream === "assistant" && typeof evt.data?.text === "string") {
emitChatDelta(sessionKey, clientRunId, evt.seq, evt.data.text);
} else if (!isAborted && (lifecyclePhase === "end" || lifecyclePhase === "error")) {