From c78269209d93a08d3eb2c124c95e0b1bcf65c2ee Mon Sep 17 00:00:00 2001 From: Nathan Colosimo <110621881+NathanColosimo@users.noreply.github.com> Date: Tue, 30 Jun 2026 16:41:29 -0700 Subject: [PATCH] fix(ai): continue durable agent tool loops --- .changeset/durable-agent-tool-stop-detection.md | 5 +++++ packages/ai/src/agent/stream-text-iterator.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/durable-agent-tool-stop-detection.md diff --git a/.changeset/durable-agent-tool-stop-detection.md b/.changeset/durable-agent-tool-stop-detection.md new file mode 100644 index 0000000000..4a5938084f --- /dev/null +++ b/.changeset/durable-agent-tool-stop-detection.md @@ -0,0 +1,5 @@ +--- +'@workflow/ai': patch +--- + +Continue DurableAgent tool loops whenever a model step contains tool calls, regardless of the reported finish reason. diff --git a/packages/ai/src/agent/stream-text-iterator.ts b/packages/ai/src/agent/stream-text-iterator.ts index d3e7aecbc3..67c96fad42 100644 --- a/packages/ai/src/agent/stream-text-iterator.ts +++ b/packages/ai/src/agent/stream-text-iterator.ts @@ -331,7 +331,7 @@ export async function* streamTextIterator({ // Normalize finishReason - AI SDK v6 returns { unified, raw }, v5 returns a string const finishReason = normalizeFinishReason(raw.rawFinishReason); - if (finishReason === 'tool-calls') { + if (finishReason === 'tool-calls' || toolCalls.length > 0) { lastStepWasToolCalls = true; // Build reasoning content parts from the step result.