[BUG] Duplicate tool result after ask_user causes 400 "each tool_use must have a single result" on Claude

未关闭
#3,193 4 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

@AnantKumar17 已经在做这个了。

开始于 2026年10月19日。

评估

难度
3/5
预计耗时
1-2 天
新手友好度
40/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
活跃
技术栈
go
领域
backend

调研方向

The payload points at the session history replay: GET /api/sessions/<id> returns two functionResponse entries with the same ask_user call ID, and the adk-… confirmation items are skipped. Start by finding where the Go controller converts stored session events into Responses API input items, and check how function_call_output entries are keyed by call_id. Done when the replayed history has one result per call_id, with a test that feeds in a duplicate result for the same call. The root cause is still unconfirmed, so verify it before changing the code.

由索引模型根据 Issue 内容生成。

描述

📋 Prerequisites
  • I have searched the existing issues to avoid creating a duplicate
  • By submitting this issue, you agree to follow our Code of Conduct
  • I am using the latest version of the software
  • I have tried to clear cache/cookies or used incognito mode (if ui-related)
  • I can consistently reproduce this issue
🎯 Affected Service(s)

Controller Service

🚦 Impact/Severity

Minor inconvenience

🐛 Bug Description

After an agent calls ask_user and the user answers, the next model request fails with 400 Bad Request. Every later request in that session fails the same way, so the session is unusable.

The session history holds two functionResponse entries for the same ask_user call ID. When the history is replayed to the model, both are sent as results for one tool call. Claude on Bedrock rejects that, because each tool_use must have exactly one result.

kagent only shows OpenAI responses request failed: POST ".../responses": 400 Bad Request. The upstream error body is dropped, so the pod logs don't say why.

🔄 Steps To Reproduce
  1. Chat with an agent that has ask_user available, and get it to call ask_user. A vague request that needs clarification, like "what should I do to connect to other clusters?", works.
  2. Answer the question in the UI.
  3. Send another message, or let the agent continue.

The request after the answer fails with 400. It happened in two separate sessions for me.

To see the cause without the agent, fetch the session (GET /api/sessions/) and rebuild the history as Responses API input items: user and assistant text, function_call and function_call_output. Skip the adk-… confirmation items. POST that to the gateway's /responses endpoint with a few function tool definitions.

  • As stored: 400.
  • After keeping only the last function_call_output per call_id: 200.

This is my reconstruction of the replayed history, not a capture of the exact payload the agent sent.

🤔 Expected Behavior

The history sent to the model has exactly one result per tool call ID. For example, the placeholder is replaced by the final result, or dropped when the history is converted for the model.

📱 Actual Behavior

Error from the gateway

400 BAD_REQUEST
{"message":"messages.6.content.1: each tool_use must have a single result.
Found multiple tool_result blocks with id: toolu_bdrk_"}

💻 Environment
  • kagent chart and images 0.10.3 (golang-adk:0.10.3, controller 0.10.3, kagent-tools 0.3.0)
  • ModelConfig: provider OpenAI, apiFormat: responses, pointing at an OpenAI-compatible Responses endpoint on a Databricks AI gateway
  • Model: claude-sonnet-5 (Bedrock behind the gateway), maxTokens: 8192
  • Agent: the default k8s-agent
🔧 CLI Bug Report

No response

🔍 Additional Context

Version 0.10.3 does not fix this. I haven't tested the 1.0 alphas.
Related: #2836 asks for a switch to turn ask_user off, which would work around this.
Suggestion: log the upstream error body for a failed model call, with secrets redacted. Without a manual replay, the bare 400 gave no hint.

📋 Logs

📷 Screenshots
Image
🙋 Are you willing to contribute?
  • I am willing to submit a PR to fix this issue
主要语言
Go
星标
4.2k
派生
890
平均合并
1 天 6 小时
30 天内合并 PR
189

环境准备

在 Codespaces 中打开

在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

kagent-dev/kagent 的其他 Issue

查看 kagent-dev/kagent 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。