Skip to content

Fix/nsh mcp bind error 20250309#154

Merged
yhjun1026 merged 2 commits intoderisk-ai:mainfrom
niiish32x:fix/nsh_mcp_bind_error_20250309
Mar 10, 2026
Merged

Fix/nsh mcp bind error 20250309#154
yhjun1026 merged 2 commits intoderisk-ai:mainfrom
niiish32x:fix/nsh_mcp_bind_error_20250309

Conversation

@niiish32x
Copy link
Contributor

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:

  • My code follows the style guidelines of this project
  • I have already rebased the commits and make the commit message conform to the project standard.
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • Any dependent changes have been merged and published in downstream modules

越鸿 added 2 commits March 9, 2026 17:52
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.
… creation

  When an MCP resource is rebound (deleted and recreated with a new code/name),
  the old resource instance remains registered but no longer matches the new
  configuration. Previously, this caused a ValueError to be thrown, breaking
  the entire agent initialization.

  Changes:
  - When registered instances exist but none match the requested resource,
    fall back to dynamic resource creation using the configuration value
  - Properly catch MCPNotFoundError in both matching and dynamic creation
    paths, returning None to allow graceful degradation
  - Filter out None entries in build_resource() and a_build_resource() to
    prevent unavailable MCPs from breaking agent loading

  This ensures that when an MCP is rebound, the agent can still initialize
  by creating a new resource instance from the updated configuration.
Copy link
Collaborator

@yhjun1026 yhjun1026 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

r+

@yhjun1026 yhjun1026 merged commit 131a781 into derisk-ai:main Mar 10, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants