Open
Description
What happened?
On some occasions, the chat completion is called with it's last message's role set to "assistant".
Example:
{
"model": "mistral-large-latest",
"messages": [
{
"content": "You are a GitLab assistant: your purpose is to help users discuss a specific GitLab issue.",
"role": "system"
},
{
"content": "Please handle the following todo: GitLab instance URL: https://gitlab.com/api/v4\n\n Todo ID: 493871141\n Todo action: directly_addressed\n Todo state: pending\n Todo target ID: 25\n Todo target type: Issue\n Todo target URL: https://gitlab.com/lx-industries/wally-the-wobot/tests/repl-tests/-/issues/25#note_2296444245\n\n Project ID: 45010942\n Project name: LX Industries / Wally The Wobot / tests / REPL Tests\n Project path: lx-industries/wally-the-wobot/tests/repl-tests\n Project default branch: main\n Project description: \n",
"role": "user"
},
{
"content": "Please reply to the user.",
"role": "user"
},
{
"tool_calls": [
{
"id": "iRvM4muS4",
"function": {
"arguments": "{\"todo_id\": 493871141, \"project_id\": 45010942, \"target_url\": \"https://gitlab.com/lx-industries/wally-the-wobot/tests/repl-tests/-/issues/25#note_2296444245\", \"target_type\": \"Issue\", \"target_id\": 25}",
"name": "get_todo_discussion_id"
},
"type": "function"
}
],
"role": "assistant"
},
{
"content": "e7764e059fad9a55ff30dbd4b2bf108b5205e486",
"role": "tool",
"tool_call_id": "iRvM4muS4"
},
{
"content": "[{\"name\": \"list_issue_notes\", \"arguments\": {\"project_id\": 45010942, \"issue_iid\": 25, \"discussion_id\": \"e7764e059fad9a55ff30dbd4b2bf108b5205e486\"}}]",
"role": "assistant"
}
]
}
The Mistral API does not support that:
An error occurred: litellm.BadRequestError: MistralException - Error code: 400 - {'object': 'error', 'message': 'Expected last role User or Tool (or Assistant with prefix True) for serving but got assistant', 'type': 'invalid_request_error', 'param': None, 'code': None}
What did you expect to happen?
I expect no errors.
My understanding is the next message is expected to be a handoff. But in Mistral's API's case, it's not possible.
How can we reproduce it (as minimally and precisely as possible)?
Run Mistral via LiteLLM:
How I run LiteLLM:
compose.yml
---
services:
litellm:
image: ghcr.io/berriai/litellm:main-v1.58.1@sha256:0bd93bb9062e4cb004c8f85c5eb8bf0469f1830f8c888f0f1b1f196d2747774e
volumes:
- ./config.yml:/app/config.yml:ro
ports:
- 4000:4000
command: ["--config", "/app/config.yml", --detailed_debug]
config.yml
---
model_list:
- model_name: mistral-large-latest
litellm_params:
model: mistral/mistral-large-latest
api_base: https://api.mistral.ai/v1/
api_key: the-api-key
model_info:
id: mistral-large-latest
max_tokens: 131072
litellm_settings:
drop_params: true
general_settings:
Then, in my app:
model_client = OpenAIChatCompletionClient(
model="mistral-large-latest",
api_key="notneeded",
base_url="http://0.0.0.0:4000",
model_capabilities={
"json_output": False,
"vision": False,
"function_calling": True,
},
)
AutoGen version
0.4.1
Which package was this bug in
AgentChat
Model used
mistral-large-latest
Python version
3.12
Operating system
Ubuntu 24.04
Any additional info you think would be helpful for fixing this bug
No response