fix:移除冗余代码,丰富replyer log记录,表达方式改为replyer模型
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user