Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion aider/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from packaging import version

__version__ = "0.88.8.dev"
__version__ = "0.88.9.dev"
safe_version = __version__

try:
Expand Down
17 changes: 17 additions & 0 deletions aider/coders/base_coder.py
Original file line number Diff line number Diff line change
Expand Up @@ -2743,6 +2743,8 @@ async def send(self, messages, model=None, functions=None, tools=None):
format_content("ASSISTANT", self.partial_response_content),
)

self.preprocess_response()

if self.partial_response_content:
self.io.ai_output(self.partial_response_content)
elif self.partial_response_function_call:
Expand Down Expand Up @@ -2986,6 +2988,21 @@ def render_incremental_response(self, final):
# Just return the current content - the streaming logic will handle incremental updates
return self.get_multi_response_content_in_progress()

def preprocess_response(self):
if len(self.partial_response_tool_calls):
tool_list = []
tool_id_set = set()

for tool_call_dict in self.partial_response_tool_calls:
# LLM APIs sometimes return duplicates and that's annoying part 2
if tool_call_dict.get("id") in tool_id_set:
continue

tool_id_set.add(tool_call_dict.get("id"))
tool_list.append(tool_call_dict)

self.partial_response_tool_calls = tool_list

def remove_reasoning_content(self):
"""Remove reasoning content from the model's response."""

Expand Down
19 changes: 15 additions & 4 deletions aider/sendchat.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,9 @@ def ensure_alternating_roles(messages):

# Add missing tool responses as empty
for tool_id in expected_ids:
tool_sequence.append({"role": "tool", "tool_call_id": tool_id, "content": ""})
tool_sequence.append(
{"role": "tool", "tool_call_id": tool_id, "content": "(empty response)"}
)

# Add the complete tool sequence to result
for tool_msg in tool_sequence:
Expand All @@ -194,7 +196,16 @@ def ensure_alternating_roles(messages):
if role == prev_role:
# Insert empty message of opposite role
opposite_role = "user" if role == "assistant" else "assistant"
result.append({"role": opposite_role, "content": ""})
result.append(
{
"role": opposite_role,
"content": (
"(empty response)"
if opposite_role == "assistant"
else "(empty request)"
),
}
)
prev_role = opposite_role

result.append(msg)
Expand All @@ -221,8 +232,8 @@ def ensure_alternating_roles(messages):
current_role in ("user", "assistant")
and last_role in ("user", "assistant")
and current_role == last_role
and msg.get("content") == ""
and last_msg.get("content") == ""
and msg.get("content") in ["", "(empty response)", "(empty request)"]
and last_msg.get("content") in ["", "(empty response)", "(empty request)"]
):
continue

Expand Down
8 changes: 4 additions & 4 deletions tests/basic/test_sendchat.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ def test_ensure_alternating_roles_consecutive_user(self):
]
expected = [
{"role": "user", "content": "Hello"},
{"role": "assistant", "content": ""},
{"role": "assistant", "content": "(empty response)"},
{"role": "user", "content": "Are you there?"},
]
result = ensure_alternating_roles(messages)
Expand All @@ -148,7 +148,7 @@ def test_ensure_alternating_roles_consecutive_assistant(self):
]
expected = [
{"role": "assistant", "content": "Hi there"},
{"role": "user", "content": ""},
{"role": "user", "content": "(empty request)"},
{"role": "assistant", "content": "How can I help?"},
]
result = ensure_alternating_roles(messages)
Expand All @@ -166,10 +166,10 @@ def test_ensure_alternating_roles_mixed_sequence(self):
]
expected = [
{"role": "user", "content": "Hello"},
{"role": "assistant", "content": ""},
{"role": "assistant", "content": "(empty response)"},
{"role": "user", "content": "Are you there?"},
{"role": "assistant", "content": "Yes"},
{"role": "user", "content": ""},
{"role": "user", "content": "(empty request)"},
{"role": "assistant", "content": "How can I help?"},
{"role": "user", "content": "Write code"},
]
Expand Down
Loading