fix(agent): fix orphaned tool-role message causing API 400 errors#153
Merged
yhjun1026 merged 1 commit intoderisk-ai:mainfrom Mar 9, 2026
Merged
fix(agent): fix orphaned tool-role message causing API 400 errors#153yhjun1026 merged 1 commit intoderisk-ai:mainfrom
yhjun1026 merged 1 commit intoderisk-ai:mainfrom
Conversation
Root cause: when the LLM responded with plain text (no tool_calls) in a function-calling session, the next iteration still built history pairs of assistant(tool_calls=null) → tool(tool_call_id=...) which violates the OpenAI-compatible API contract and produces: "messages with role 'tool' must be a response to a preceeding message with 'tool_calls'" Fix (base_agent.py): - `function_callning_reply_messages`: skip appending tool-result messages when the preceding assistant message has no tool_calls, preventing the invalid sequence from being produced in the first place. - `_sanitize_tool_messages`: new helper that scrubs any remaining orphaned tool messages from the final LLM message list immediately before the API call, acting as a last-resort safety net.
yhjun1026
pushed a commit
that referenced
this pull request
Mar 11, 2026
Co-authored-by: 越鸿 <nishenghao.nsh@oceanbase.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Root cause: when the LLM responded with plain text (no tool_calls) in a function-calling session, the next iteration still built history pairs of
assistant(tool_calls=null) → tool(tool_call_id=...)
which violates the OpenAI-compatible API contract and produces:
"messages with role 'tool' must be a response to a preceeding message
with 'tool_calls'"
Fix (base_agent.py):
function_callning_reply_messages: skip appending tool-result messages when the preceding assistant message has no tool_calls, preventing the invalid sequence from being produced in the first place._sanitize_tool_messages: new helper that scrubs any remaining orphaned tool messages from the final LLM message list immediately before the API call, acting as a last-resort safety net.Description
Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.
How Has This Been Tested?
Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration
Snapshots:
Include snapshots for easier review.
Checklist: