fix:移除冗余代码,丰富replyer log记录,表达方式改为replyer模型

This commit is contained in:
SengokuCola
2026-04-21 10:32:25 +08:00
parent 6696eb2fd4
commit 66663050dd
10 changed files with 92 additions and 481 deletions

View File

@@ -1,6 +1,6 @@
"""reply 内置工具。"""
from typing import Optional
from typing import Any, Optional
import traceback
@@ -75,6 +75,25 @@ def _build_monitor_metadata(reply_result: ReplyGenerationResult) -> dict[str, ob
return {}
def _build_send_result(
*,
index: int,
segment: str,
set_quote: bool,
success: bool,
message_id: str = "",
) -> dict[str, Any]:
"""构建分段回复的轻量发送结果。"""
return {
"index": index,
"segment": segment,
"set_quote": set_quote,
"success": success,
"message_id": message_id,
}
async def handle_tool(
tool_ctx: BuiltinToolRuntimeContext,
invocation: ToolInvocation,
@@ -165,19 +184,29 @@ async def handle_tool(
reply_segments = tool_ctx.post_process_reply_text(reply_text)
combined_reply_text = "".join(reply_segments)
sent_message_ids: list[str] = []
send_results: list[dict[str, Any]] = []
try:
sent = False
if tool_ctx.runtime.chat_stream.platform == CLI_PLATFORM_NAME:
for segment in reply_segments:
for index, segment in enumerate(reply_segments):
render_cli_message(segment)
send_results.append(
_build_send_result(
index=index,
segment=segment,
set_quote=effective_set_quote if index == 0 else False,
success=True,
)
)
sent = True
else:
for index, segment in enumerate(reply_segments):
segment_set_quote = effective_set_quote if index == 0 else False
sent_message = await send_service.text_to_stream_with_message(
text=segment,
stream_id=tool_ctx.runtime.session_id,
set_reply=effective_set_quote if index == 0 else False,
reply_message=target_message if effective_set_quote and index == 0 else None,
set_reply=segment_set_quote,
reply_message=target_message if segment_set_quote else None,
selected_expressions=reply_result.selected_expression_ids or None,
typing=index > 0,
sync_to_maisaka_history=True,
@@ -185,10 +214,27 @@ async def handle_tool(
)
sent = sent_message is not None
if not sent:
send_results.append(
_build_send_result(
index=index,
segment=segment,
set_quote=segment_set_quote,
success=False,
)
)
break
sent_message_id = str(getattr(sent_message, "message_id", "") or "").strip()
if sent_message_id:
sent_message_ids.append(sent_message_id)
send_results.append(
_build_send_result(
index=index,
segment=segment,
set_quote=segment_set_quote,
success=True,
message_id=sent_message_id,
)
)
except Exception:
logger.exception(
f"{tool_ctx.runtime.log_prefix} 发送文字消息时发生异常,目标消息编号={target_message_id}"
@@ -208,6 +254,7 @@ async def handle_tool(
"set_quote": set_quote,
"effective_set_quote": effective_set_quote,
"reply_segments": reply_segments,
"send_results": send_results,
},
metadata=reply_metadata,
)
@@ -219,17 +266,27 @@ async def handle_tool(
tool_ctx.append_guided_reply_to_chat_history(combined_reply_text)
tool_ctx.runtime._record_reply_sent()
reply_metadata["sent_message_ids"] = sent_message_ids
await tool_ctx.runtime.track_reply_effect(
tool_call_id=invocation.call_id,
target_message=target_message,
set_quote=effective_set_quote,
reply_text=combined_reply_text,
reply_segments=reply_segments,
planner_reasoning=latest_thought,
reference_info=reference_info,
reply_metadata=reply_metadata,
replyer_context_messages=replyer_chat_history,
)
reply_metadata["send_results"] = send_results
track_reply_effect = getattr(tool_ctx.runtime, "track_reply_effect", None)
if track_reply_effect is not None:
await track_reply_effect(
tool_call_id=invocation.call_id,
target_message=target_message,
set_quote=effective_set_quote,
reply_text=combined_reply_text,
reply_segments=reply_segments,
planner_reasoning=latest_thought,
reference_info=reference_info,
tool_context={
"tool_name": invocation.tool_name,
"call_id": invocation.call_id,
"arguments": dict(invocation.arguments or {}),
"reasoning": latest_thought,
},
send_results=send_results,
reply_metadata=reply_metadata,
replyer_context_messages=replyer_chat_history,
)
return tool_ctx.build_success_result(
invocation.tool_name,
"回复已生成并发送。",
@@ -239,6 +296,7 @@ async def handle_tool(
"effective_set_quote": effective_set_quote,
"reply_text": combined_reply_text,
"reply_segments": reply_segments,
"send_results": send_results,
"target_user_name": target_user_name,
},
metadata=reply_metadata,