Skip to content

Internal orchestrator-to-subagent communication leaks into final AssistantMessage #377

@erdem-b

Description

@erdem-b

Description

When using multi-agent orchestration with ClaudeSDKClient, internal communication between the orchestrator and sub-agents (via the Task tool) is included in the final AssistantMessage content, even when include_partial_messages=False (the default).

Expected Behavior

Only the final user-facing response from the orchestrator should be included in AssistantMessage objects yielded by receive_response(). Internal delegation prompts and sub-agent responses should not be visible.

Actual Behavior

The AssistantMessage.content includes internal text like:

  • Orchestrator delegation prompts: "Search for marbles matching this profile: elegant white marble with gold veins. This describes a prestigious, luxurious aesthetic..."
  • Sub-agent task instructions: "Return the marble IDs found"
  • Other internal workflow text

This internal content is concatenated with the actual user-facing response.

Reproduction

from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions, AssistantMessage, TextBlock

options = ClaudeAgentOptions(
    agents={
        "ProfileSearcher": {
            "description": "Searches for marbles by profile",
            "prompt": "You search for marbles. Return marble IDs.",
            "tools": ["mcp__tools__search"]
        }
    },
    allowed_tools=["Task", "mcp__tools__search"],
    # include_partial_messages=False  # Default
)

async with ClaudeSDKClient(options) as client:
    await client.query("Find white marbles with gold veins")
    
    async for message in client.receive_response():
        if isinstance(message, AssistantMessage):
            for block in message.content:
                if isinstance(block, TextBlock):
                    print(block.text)  # Contains internal delegation text!

Environment

  • claude-agent-sdk version: 0.1.10
  • Python version: 3.11
  • OS: Linux (Docker container)

Workaround Attempted

We tried using include_partial_messages=True with content filtering patterns, but this is fragile and not a proper solution.

Suggested Fix

The SDK should either:

  1. Filter out Task tool delegation content from final messages automatically
  2. Provide a message type or flag to distinguish internal vs user-facing content
  3. Document the expected behavior for multi-agent message handling

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions