diff --git a/src/ai_client.py b/src/ai_client.py
index 47fcec94..00fe1da3 100644
--- a/src/ai_client.py
+++ b/src/ai_client.py
@@ -2233,40 +2233,63 @@ def _send_minimax(md_content: str, user_message: str, base_dir: str,
_ensure_minimax_client()
from src.openai_compatible import OpenAICompatibleRequest, send_openai_compatible
from src.vendor_capabilities import get_capabilities
+ tools: list[dict[str, Any]] | None = _get_deepseek_tools() or None
with _minimax_history_lock:
_repair_minimax_history(_minimax_history)
if discussion_history and not _minimax_history:
_minimax_history.append({"role": "user", "content": f"[DISCUSSION HISTORY]\n\n{discussion_history}\n\n---\n\n{user_message}"})
else:
_minimax_history.append({"role": "user", "content": user_message})
- messages = [{"role": "system", "content": f"{_get_combined_system_prompt()}\n\n\n{md_content}\n"}]
- messages.extend(_minimax_history)
- request = OpenAICompatibleRequest(
- messages=messages,
- model=_model,
- temperature=_temperature,
- top_p=_top_p,
- max_tokens=min(_max_tokens, 8192),
- stream=stream,
- stream_callback=stream_callback,
- )
- caps = get_capabilities("minimax", _model)
- response = send_openai_compatible(_minimax_client, request, capabilities=caps)
- reasoning_content = ""
- if response.raw_response and hasattr(response.raw_response, "choices"):
- choice = response.raw_response.choices[0]
- if hasattr(choice.message, "reasoning_details") and choice.message.reasoning_details:
- reasoning_content = choice.message.reasoning_details[0].get("text", "") if choice.message.reasoning_details else ""
- thinking_tags = ""
- if reasoning_content:
- thinking_tags = f"\n{reasoning_content}\n\n"
- full_text = thinking_tags + response.text
- with _minimax_history_lock:
- msg_to_store: dict[str, Any] = {"role": "assistant", "content": response.text or None}
- if reasoning_content:
- msg_to_store["reasoning_content"] = reasoning_content
- _minimax_history.append(msg_to_store)
- return full_text
+ response_text: str = ""
+ reasoning_content: str = ""
+ for round_idx in range(MAX_TOOL_ROUNDS + 2):
+ with _minimax_history_lock:
+ messages = [{"role": "system", "content": f"{_get_combined_system_prompt()}\n\n\n{md_content}\n"}]
+ messages.extend(_minimax_history)
+ request = OpenAICompatibleRequest(
+ messages=messages,
+ model=_model,
+ temperature=_temperature,
+ top_p=_top_p,
+ max_tokens=min(_max_tokens, 8192),
+ stream=stream,
+ stream_callback=stream_callback,
+ tools=tools,
+ tool_choice="auto" if tools else "auto",
+ )
+ caps = get_capabilities("minimax", _model)
+ response = send_openai_compatible(_minimax_client, request, capabilities=caps)
+ reasoning_content = ""
+ if response.raw_response and hasattr(response.raw_response, "choices"):
+ choice = response.raw_response.choices[0]
+ if hasattr(choice.message, "reasoning_details") and choice.message.reasoning_details:
+ reasoning_content = choice.message.reasoning_details[0].get("text", "") if choice.message.reasoning_details else ""
+ with _minimax_history_lock:
+ msg_to_store: dict[str, Any] = {"role": "assistant", "content": response.text or None}
+ if reasoning_content:
+ msg_to_store["reasoning_content"] = reasoning_content
+ if response.tool_calls:
+ msg_to_store["tool_calls"] = response.tool_calls
+ _minimax_history.append(msg_to_store)
+ if not response.tool_calls:
+ response_text = (f"\n{reasoning_content}\n\n" if reasoning_content else "") + response.text
+ break
+ try:
+ loop = asyncio.get_running_loop()
+ results = asyncio.run_coroutine_threadsafe(
+ _execute_tool_calls_concurrently(response.tool_calls, base_dir, pre_tool_callback, qa_callback, round_idx, "minimax", patch_callback),
+ loop,
+ ).result()
+ except RuntimeError:
+ results = asyncio.run(_execute_tool_calls_concurrently(response.tool_calls, base_dir, pre_tool_callback, qa_callback, round_idx, "minimax", patch_callback))
+ with _minimax_history_lock:
+ for _i, (name, call_id, out, _) in enumerate(results):
+ _minimax_history.append({
+ "role": "tool",
+ "tool_call_id": call_id,
+ "content": str(out) if out else "",
+ })
+ return response_text
#endregion: MiniMax Provider