我将试图修复关系和引用!(当然引用需要你们这群人给我点日志()而且只有回复的引用)

This commit is contained in:
minecraft1024a
2025-09-23 11:37:11 +08:00
parent 3c6700e8ed
commit 51801bca8e
3 changed files with 75 additions and 4 deletions

View File

@@ -378,24 +378,26 @@ class UserRelationshipTracker:
): ):
"""回复后关系追踪 - 主要入口点""" """回复后关系追踪 - 主要入口点"""
try: try:
logger.info(f"🔄 开始回复后关系追踪: {user_id}") logger.info(f"🔄 [RelationshipTracker] 开始回复后关系追踪: {user_id}")
# 检查上次追踪时间 # 检查上次追踪时间
last_tracked_time = self._get_last_tracked_time(user_id) last_tracked_time = self._get_last_tracked_time(user_id)
time_diff = reply_timestamp - last_tracked_time time_diff = reply_timestamp - last_tracked_time
if time_diff < 5 * 60: # 5分钟内不重复追踪 if time_diff < 5 * 60: # 5分钟内不重复追踪
logger.debug(f"用户 {user_id} 距离上次追踪时间不足5分钟跳过") logger.debug(f"⏱️ [RelationshipTracker] 用户 {user_id} 距离上次追踪时间不足5分钟 ({time_diff:.2f}s),跳过")
return return
# 获取上次bot回复该用户的消息 # 获取上次bot回复该用户的消息
last_bot_reply = await self._get_last_bot_reply_to_user(user_id) last_bot_reply = await self._get_last_bot_reply_to_user(user_id)
if not last_bot_reply: if not last_bot_reply:
logger.debug(f"未找到上次回复用户 {user_id} 的记录") logger.info(f"👋 [RelationshipTracker] 未找到用户 {user_id} 的历史回复记录,启动'初次见面'逻辑")
await self._handle_first_interaction(user_id, user_name, bot_reply_content)
return return
# 获取用户后续的反应消息 # 获取用户后续的反应消息
user_reactions = await self._get_user_reactions_after_reply(user_id, last_bot_reply.time) user_reactions = await self._get_user_reactions_after_reply(user_id, last_bot_reply.time)
logger.debug(f"💬 [RelationshipTracker] 找到用户 {user_id} 在上次回复后的 {len(user_reactions)} 条反应消息")
# 获取当前关系数据 # 获取当前关系数据
current_relationship = self._get_user_relationship_from_db(user_id) current_relationship = self._get_user_relationship_from_db(user_id)
@@ -407,6 +409,7 @@ class UserRelationshipTracker:
current_text = current_relationship.get("relationship_text", "新用户") if current_relationship else "新用户" current_text = current_relationship.get("relationship_text", "新用户") if current_relationship else "新用户"
# 使用LLM分析并更新关系 # 使用LLM分析并更新关系
logger.debug(f"🧠 [RelationshipTracker] 开始为用户 {user_id} 分析并更新关系")
await self._analyze_and_update_relationship( await self._analyze_and_update_relationship(
user_id, user_name, last_bot_reply, user_reactions, current_text, current_score, bot_reply_content user_id, user_name, last_bot_reply, user_reactions, current_text, current_score, bot_reply_content
) )
@@ -637,6 +640,69 @@ class UserRelationshipTracker:
logger.error(f"关系分析失败: {e}") logger.error(f"关系分析失败: {e}")
logger.debug("错误详情:", exc_info=True) logger.debug("错误详情:", exc_info=True)
async def _handle_first_interaction(self, user_id: str, user_name: str, bot_reply_content: str):
"""处理与用户的初次交互"""
try:
logger.info(f"✨ [RelationshipTracker] 正在处理与用户 {user_id} 的初次交互")
# 获取bot人设信息
from src.individuality.individuality import Individuality
individuality = Individuality()
bot_personality = await individuality.get_personality_block()
prompt = f"""
你现在是:{bot_personality}
你正在与一个新用户进行初次有效互动。请根据你对TA的第一印象建立初始关系档案。
用户信息:
- 用户ID: {user_id}
- 用户名: {user_name}
你的首次回复: {bot_reply_content}
【严格要求】:
1. 建立一个初始关系分数通常在0.2-0.4之间(普通网友)。
2. 关系印象描述要简洁地记录你对用户的初步看法50-100字
- 用户名给你的感觉?
- 你的回复是基于什么考虑?
- 你对接下来与TA的互动有什么期待
请以JSON格式返回结果:
{{
"relationship_text": "简洁的初始关系印象描述(50-100字)",
"relationship_score": 0.2~0.4的新分数,
"analysis_reasoning": "从你性格角度说明建立此初始印象的理由"
}}
"""
# 调用LLM进行分析
llm_response, _ = await self.relationship_llm.generate_response_async(prompt=prompt)
if not llm_response:
logger.warning(f"初次交互分析时LLM未返回有效响应: {user_id}")
return
import json
cleaned_response = self._clean_llm_json_response(llm_response)
response_data = json.loads(cleaned_response)
new_text = response_data.get("relationship_text", "初次见面")
new_score = max(0.0, min(1.0, float(response_data.get("relationship_score", global_config.affinity_flow.base_relationship_score))))
# 更新数据库和缓存
self._update_user_relationship_in_db(user_id, new_text, new_score)
self.user_relationship_cache[user_id] = {
"relationship_text": new_text,
"relationship_score": new_score,
"last_tracked": time.time(),
}
logger.info(f"✅ [RelationshipTracker] 已成功为新用户 {user_id} 建立初始关系档案,分数为 {new_score:.3f}")
except Exception as e:
logger.error(f"处理初次交互失败: {user_id}, 错误: {e}")
logger.debug("错误详情:", exc_info=True)
def _clean_llm_json_response(self, response: str) -> str: def _clean_llm_json_response(self, response: str) -> str:
""" """
清理LLM响应移除可能的JSON格式标记 清理LLM响应移除可能的JSON格式标记

View File

@@ -162,6 +162,7 @@ class ActionManager:
执行结果 执行结果
""" """
try: try:
logger.debug(f"🎯 [ActionManager] execute_action接收到 target_message: {target_message}")
# 通过chat_id获取chat_stream # 通过chat_id获取chat_stream
chat_manager = get_chat_manager() chat_manager = get_chat_manager()
chat_stream = chat_manager.get_stream(chat_id) chat_stream = chat_manager.get_stream(chat_id)
@@ -456,11 +457,13 @@ class ActionManager:
# 发送第一段回复 # 发送第一段回复
if not first_replied: if not first_replied:
set_reply_flag = bool(message_data)
logger.debug(f"📤 [ActionManager] 准备发送第一段回复。message_data: {message_data}, set_reply: {set_reply_flag}")
await send_api.text_to_stream( await send_api.text_to_stream(
text=data, text=data,
stream_id=chat_stream.stream_id, stream_id=chat_stream.stream_id,
reply_to_message=message_data, reply_to_message=message_data,
set_reply=bool(message_data), set_reply=set_reply_flag,
typing=False, typing=False,
) )
first_replied = True first_replied = True

View File

@@ -151,6 +151,8 @@ class PlanExecutor:
"action_data": action_info.action_data or {}, "action_data": action_info.action_data or {},
} }
logger.debug(f"📬 [PlanExecutor] 准备调用 ActionManagertarget_message: {action_info.action_message}")
# 通过动作管理器执行回复 # 通过动作管理器执行回复
reply_content = await self.action_manager.execute_action( reply_content = await self.action_manager.execute_action(
action_name=action_info.action_type, **action_params action_name=action_info.action_type, **action_params