Skip to content

Python: [Bug]: Group Chat orchestrator message cleanup issue #3705

Description

@leelakarthik

Description

When using groupchatbuilder, messages with empty content are not being cleaned like in the _handoff.py 'clean_conversation_for_handoff'

This breaks the conversation flow
Error message
{'type': 'error', 'error': {'type': 'invalid_request_error', 'message': 'messages.11: all messages must have non-empty content except for the optional final assistant message'}, 'request_id': 'req_011CXq5rCQUPFti495Nrvn6f'}

Code Sample

Error Messages / Stack Traces

Traceback (most recent call last):
  File "/Users/karthik/Code bases/Jan/MAF/main.py", line 221, in _interactive_mode
    response = await workflow.run(query)
               ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/codebase_orchestrator_agent/agent/codebase_orchestrator.py", line 203, in run
    async for event in self._run_with_events(query):
  File "/Users/karthik/Code bases/Jan/MAF/codebase_orchestrator_agent/agent/codebase_orchestrator.py", line 296, in _run_with_events
    events = await self.workflow.run(clean_query)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_workflow.py", line 660, in run
    raw_events = [
                 ^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_workflow.py", line 660, in <listcomp>
    raw_events = [
                 ^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_workflow.py", line 346, in _run_workflow_with_tracing
    async for event in self._runner.run_until_convergence():
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_runner.py", line 120, in run_until_convergence
    await iteration_task
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_runner.py", line 189, in _run_iteration
    await asyncio.gather(*tasks)
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_runner.py", line 185, in _deliver_messages
    await asyncio.gather(*tasks)
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_runner.py", line 159, in _deliver_message_inner
    return await edge_runner.send_message(message, self._shared_state, self._ctx)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_edge_runner.py", line 147, in send_message
    await self._execute_on_target(target_id, [source_id], message, shared_state, ctx)
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_edge_runner.py", line 76, in _execute_on_target
    await target_executor.execute(
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_executor.py", line 277, in execute
    await handler(message, context)
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_executor.py", line 567, in wrapper
    return await func(self, message, ctx)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_base_group_chat_orchestrator.py", line 282, in handle_participant_response
    await self._handle_response(response, ctx)
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_group_chat.py", line 369, in _handle_response
    agent_orchestration_output = await self._invoke_agent()
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_group_chat.py", line 432, in _invoke_agent
    return await _invoke_agent_helper(current_conversation)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_workflows/_group_chat.py", line 397, in _invoke_agent_helper
    agent_response = await self._agent.run(
                     ^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_middleware.py", line 1253, in middleware_enabled_run
    return await original_run(self, normalized_messages, thread=thread, **kwargs)  # type: ignore[return-value]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/observability.py", line 1348, in trace_run
    return await run_func(self, messages=messages, thread=thread, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_agents.py", line 842, in run
    response = await self.chat_client.get_response(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_tools.py", line 1946, in function_invocation_wrapper
    response = await func(self, messages=prepped_messages, options=options, **filtered_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/observability.py", line 1073, in trace_get_response
    return await func(
           ^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_middleware.py", line 1373, in middleware_enabled_get_response
    return await original_get_response(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework/_clients.py", line 339, in get_response
    return await self._inner_get_response(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/agent_framework_anthropic/_chat_client.py", line 344, in _inner_get_response
    message = await self.anthropic_client.beta.messages.create(**run_options, stream=False)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/anthropic/resources/beta/messages/messages.py", line 2685, in create
    return await self._post(
           ^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/anthropic/_base_client.py", line 1989, in post
    return await self.request(cast_to, opts, stream=stream, stream_cls=stream_cls)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karthik/Code bases/Jan/MAF/.venv/lib/python3.11/site-packages/anthropic/_base_client.py", line 1774, in request
    raise self._make_status_error_from_response(err.response) from None
anthropic.BadRequestError: Error code: 400 - {'type': 'error', 'error': {'type': 'invalid_request_error', 'message': 'messages.11: all messages must have non-empty content except for the optional final assistant message'}, 'request_id': 'req_011CXq5rCQUPFti495Nrvn6f'}

Package Versions

agent-framework-anthropic==1.0.0b260130 agent-framework-core==1.0.0b260130

Python Version

3.11

Additional Context

I have imported the same clean_conversation_for_handoff from _orchestrator_helpers.py and added in _handle_response functions in the _group_chat.py

messages = self._process_participant_response(response)
        # TODO: PATCHING TO CLEAN MESSAGES FOR GROUPCHAT USING HANDOFF IMPLEMENTATION - REMOVE ONCE WE HAVE A BETTER SOLUTION IN PLACE
        messages = clean_conversation_for_handoff(messages)
        self._append_messages(messages)

This helps cleaning the messages like in handoff

Metadata

Metadata

Assignees

Labels

bugUsage: [Issues], Target: all issues (Legacy, prefer issue type: bug)pythonUsage: [Issues, PRs], Target: Python

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions