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,

View File

@@ -50,6 +50,8 @@ class ReplySnapshot:
reply_segments: List[str]
planner_reasoning: str
reference_info: str
tool_context: Dict[str, Any] = field(default_factory=dict)
send_results: List[Dict[str, Any]] = field(default_factory=list)
reply_metadata: Dict[str, Any] = field(default_factory=dict)

View File

@@ -67,6 +67,8 @@ class ReplyEffectTracker:
reply_segments: List[str],
planner_reasoning: str,
reference_info: str,
tool_context: Dict[str, Any] | None = None,
send_results: List[Dict[str, Any]] | None = None,
reply_metadata: Dict[str, Any] | None = None,
context_snapshot: List[Dict[str, Any]] | None = None,
) -> ReplyEffectRecord:
@@ -88,6 +90,8 @@ class ReplyEffectTracker:
reply_segments=list(reply_segments),
planner_reasoning=planner_reasoning,
reference_info=reference_info,
tool_context=dict(tool_context or {}),
send_results=list(send_results or []),
reply_metadata=dict(reply_metadata or {}),
),
target_user=UserSnapshot(

View File

@@ -296,6 +296,8 @@ class MaisakaHeartFlowChatting:
reply_segments: list[str],
planner_reasoning: str,
reference_info: str,
tool_context: Optional[dict[str, Any]] = None,
send_results: Optional[list[dict[str, Any]]] = None,
reply_metadata: Optional[dict[str, Any]] = None,
replyer_context_messages: Optional[Sequence[LLMContextMessage]] = None,
) -> None:
@@ -322,6 +324,8 @@ class MaisakaHeartFlowChatting:
reply_segments=reply_segments,
planner_reasoning=planner_reasoning,
reference_info=reference_info,
tool_context=tool_context,
send_results=send_results,
reply_metadata=enriched_reply_metadata,
context_snapshot=context_snapshot,
)