fixed reasoning
This commit is contained in:
@@ -103,6 +103,13 @@ class ChatService:
|
||||
entry["tool_calls"] = json.loads(msg.tool_calls_json)
|
||||
if not content:
|
||||
entry["content"] = None
|
||||
reasoning_data = LLMClient.deserialize_reasoning(msg.reasoning_json)
|
||||
if reasoning_data:
|
||||
LLMClient.attach_reasoning_to_message(
|
||||
entry,
|
||||
reasoning=reasoning_data.get("reasoning", ""),
|
||||
reasoning_details=reasoning_data.get("reasoning_details"),
|
||||
)
|
||||
if msg.role == "tool" and msg.tool_call_id:
|
||||
entry["tool_call_id"] = msg.tool_call_id
|
||||
messages.append(entry)
|
||||
@@ -115,12 +122,14 @@ class ChatService:
|
||||
content: str = "",
|
||||
tool_calls: list[dict[str, Any]] | None = None,
|
||||
tool_call_id: str | None = None,
|
||||
reasoning_json: str | None = None,
|
||||
) -> Message:
|
||||
message = Message(
|
||||
session_id=session_id,
|
||||
role=role,
|
||||
content=content,
|
||||
tool_calls_json=json.dumps(tool_calls, ensure_ascii=False) if tool_calls else None,
|
||||
reasoning_json=reasoning_json,
|
||||
tool_call_id=tool_call_id,
|
||||
)
|
||||
self.db.add(message)
|
||||
@@ -143,11 +152,17 @@ class ChatService:
|
||||
for _ in range(MAX_TOOL_ROUNDS):
|
||||
content_parts: list[str] = []
|
||||
tool_calls: list[dict[str, Any]] = []
|
||||
reasoning = ""
|
||||
reasoning_details: list[Any] | None = None
|
||||
|
||||
async for event in self.llm.stream_chat(messages, tools=TOOL_DEFINITIONS):
|
||||
if event["type"] == "content":
|
||||
content_parts.append(event["content"])
|
||||
yield self._sse("token", {"content": event["content"]})
|
||||
elif event["type"] == "reasoning":
|
||||
reasoning = event.get("reasoning", "") or reasoning
|
||||
if event.get("reasoning_details"):
|
||||
reasoning_details = event["reasoning_details"]
|
||||
elif event["type"] == "error":
|
||||
yield self._sse("error", {"message": event.get("content", "LLM error")})
|
||||
return
|
||||
@@ -160,12 +175,22 @@ class ChatService:
|
||||
"content": "".join(content_parts) or None,
|
||||
"tool_calls": tool_calls,
|
||||
}
|
||||
LLMClient.attach_reasoning_to_message(
|
||||
assistant_msg,
|
||||
reasoning=reasoning,
|
||||
reasoning_details=reasoning_details,
|
||||
)
|
||||
reasoning_json = LLMClient.serialize_reasoning(
|
||||
reasoning=reasoning,
|
||||
reasoning_details=reasoning_details,
|
||||
)
|
||||
messages.append(assistant_msg)
|
||||
self._save_message(
|
||||
session_id,
|
||||
"assistant",
|
||||
"".join(content_parts),
|
||||
tool_calls=tool_calls,
|
||||
reasoning_json=reasoning_json,
|
||||
)
|
||||
|
||||
for tool_call in tool_calls:
|
||||
@@ -196,14 +221,16 @@ class ChatService:
|
||||
continue
|
||||
|
||||
final_content = "".join(content_parts)
|
||||
if not final_content.strip() and reasoning:
|
||||
final_content = reasoning
|
||||
if not final_content.strip():
|
||||
yield self._sse(
|
||||
"error",
|
||||
{
|
||||
"message": (
|
||||
"Модель не вернула текст. Проверь OPENROUTER_MODEL: "
|
||||
"нужна поддержка tool calling или отключи OPENROUTER_TOOLS_ENABLED=false. "
|
||||
"Для памяти можно задать MEMORY_EXTRACT_MODEL=deepseek/deepseek-chat."
|
||||
"Модель не вернула текст. Для deepseek-v4-pro: "
|
||||
"OPENROUTER_TOOLS_ENABLED=true и OPENROUTER_REASONING_EFFORT=none. "
|
||||
"Для памяти: MEMORY_EXTRACT_MODEL=deepseek/deepseek-chat."
|
||||
),
|
||||
},
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user