成功加入队列,准备尝试开始进程

pull/914/head
Bakadax 2025-04-30 18:01:48 +08:00
parent 5c2dd25ba4
commit 2fd00f4446
4 changed files with 12 additions and 56 deletions

View File

@ -16,27 +16,19 @@ if global_config.ENABLE_NICKNAME_MAPPING: # 使用全局开关
if not model_config or not model_config.get("name"):
logger.error("在全局配置中未找到有效的 'llm_nickname_mapping' 配置或缺少 'name' 字段。")
else:
llm_args = {
"model": model_config.get("name"), # 必须有 name
"temperature": model_config.get("temp", 0.5), # 使用 temp 字段
"max_tokens": model_config.get("max_tokens", 200), # max_tokens 是可选的,取决于 LLMRequest 实现
"api_key": model_config.get("key"), # 使用 key 字段
"base_url": model_config.get("base_url"), # 使用 base_url 字段
"request_type": "nickname_mapping"
}
# 清理 None 值参数
llm_args = {k: v for k, v in llm_args.items() if v is not None}
llm_mapper = LLMRequest(**llm_args)
llm_mapper = LLMRequest( # <-- LLM 初始化
model=global_config.llm_nickname_mapping,
temperature=global_config.llm_nickname_mapping["temp"],
max_tokens=256,
request_type="nickname_mapping",
)
logger.info("绰号映射 LLM 初始化成功 (使用全局配置)。")
except Exception as e:
logger.error(f"使用全局配置初始化绰号映射 LLM 失败: {e}", exc_info=True)
llm_mapper = None
# --- 结束修改 ---
def _build_mapping_prompt(chat_history_str: str, bot_reply: str, user_name_map: Dict[str, str]) -> str:
# ... (函数内容不变) ...
user_list_str = "\n".join([f"- {uid}: {name}" for uid, name in user_name_map.items()])
prompt = f"""
@ -69,7 +61,8 @@ Bot 最新回复:
{{
"is_exist": false
}}
5. 请严格按照 JSON 格式输出不要包含任何额外的解释或文本
5. 不需要输出 Bot 自身的绰号
6. 请严格按照 JSON 格式输出不要包含任何额外的解释或文本
输出
"""
@ -102,7 +95,6 @@ async def analyze_chat_for_nicknames(
response_content, _, _ = await llm_mapper.generate_response(prompt)
logger.debug(f"LLM 原始响应 (绰号映射): {response_content}")
# ... (解析 LLM 响应的逻辑不变) ...
if not response_content:
logger.warning("LLM 返回了空的绰号映射内容。")
return {"is_exist": False}

View File

@ -29,10 +29,7 @@ async def update_nickname_counts(group_id: str, nickname_map: Dict[str, str]):
"""
更新数据库中用户的群组绰号计数
"""
# --- [修改] 使用导入的 db 对象访问集合 ---
# !!! 重要:请确保 'person_info' 是你实际存储用户信息的集合名称 !!!
person_info_collection = db.person_info
# --- 结束修改 ---
if not person_info_collection: # 理论上 db 对象总是可用,但保留检查
logger.error("无法访问数据库集合 'person_info'。无法更新绰号计数。")
@ -107,9 +104,7 @@ async def update_nickname_counts(group_id: str, nickname_map: Dict[str, str]):
# --- 队列和进程 ---
# --- [修改] 使用全局配置 ---
nickname_queue: mpQueue = mpQueue(maxsize=global_config.NICKNAME_QUEUE_MAX_SIZE)
# --- 结束修改 ---
_nickname_process: Optional[Process] = None
async def add_to_nickname_queue(
@ -119,9 +114,7 @@ async def add_to_nickname_queue(
user_name_map: Dict[str, str]
):
"""将需要分析的数据放入队列。"""
# --- [修改] 使用全局配置 ---
if not global_config.ENABLE_NICKNAME_MAPPING:
# --- 结束修改 ---
return
if group_id is None:
@ -138,9 +131,7 @@ async def add_to_nickname_queue(
async def _nickname_processing_loop(queue: mpQueue, stop_event: mpEvent):
"""独立进程中的主循环,处理队列任务。"""
# --- [移除] 不再需要本地数据库初始化 ---
# _initialize_db()
# --- 结束移除 ---
logger.info("绰号处理循环已启动。")
while not stop_event.is_set():
@ -160,9 +151,7 @@ async def _nickname_processing_loop(queue: mpQueue, stop_event: mpEvent):
await asyncio.sleep(0.05)
else:
# --- [修改] 使用全局配置 ---
await asyncio.sleep(global_config.NICKNAME_PROCESS_SLEEP_INTERVAL)
# --- 结束修改 ---
except asyncio.CancelledError:
logger.info("绰号处理循环已取消。")
@ -171,9 +160,6 @@ async def _nickname_processing_loop(queue: mpQueue, stop_event: mpEvent):
logger.error(f"绰号处理循环出错: {e}\n{traceback.format_exc()}")
await asyncio.sleep(5)
# --- [移除] 不再需要本地数据库关闭 ---
# _close_db()
# --- 结束移除 ---
logger.info("绰号处理循环已结束。")
@ -190,24 +176,13 @@ def _run_processor_process(queue: mpQueue, stop_event: mpEvent):
def start_nickname_processor():
"""启动绰号映射处理进程。"""
global _nickname_process
# --- [修改] 使用全局配置 ---
if not global_config.ENABLE_NICKNAME_MAPPING:
# --- 结束修改 ---
logger.info("绰号映射功能已禁用。处理器未启动。")
return
if _nickname_process is None or not _nickname_process.is_alive():
logger.info("正在启动绰号处理器进程...")
# --- [修改] 从全局配置导入停止事件控制函数 ---
try:
from src.config.config import get_stop_event, set_stop_event # 再次确认导入路径
except ImportError:
logger.error("无法从 src.config.config 导入 get_stop_event/set_stop_event")
# 提供备选方案或退出
return # 或者 raise ImportError
stop_event = get_stop_event()
# --- 结束修改 ---
stop_event.clear()
_nickname_process = Process(target=_run_processor_process, args=(nickname_queue, stop_event), daemon=True)
_nickname_process.start()
@ -220,14 +195,7 @@ def stop_nickname_processor():
global _nickname_process
if _nickname_process and _nickname_process.is_alive():
logger.info("正在停止绰号处理器进程...")
# --- [修改] 从全局配置导入停止事件控制函数 ---
try:
from src.config.config import set_stop_event # 再次确认导入路径
except ImportError:
logger.error("无法从 src.config.config 导入 set_stop_event")
return # 或者 raise ImportError
set_stop_event() # 发送停止信号
# --- 结束修改 ---
try:
_nickname_process.join(timeout=10)
if _nickname_process.is_alive():

View File

@ -695,7 +695,7 @@ class HeartFChatting:
# 发生意外错误时,可以选择是否重置计数器,这里选择不重置
return False # 表示动作未成功
# --- [修改] 触发绰号分析的函数 ---
# 触发绰号分析的函数
async def _trigger_nickname_analysis(self, anchor_message: MessageRecv, reply: List[str]):
"""
触发绰号分析任务将相关数据放入处理队列
@ -720,7 +720,7 @@ class HeartFChatting:
limit=history_limit
)
# --- 使用 build_readable_messages 格式化历史记录 ---
# 格式化历史记录
chat_history_str = await build_readable_messages(
messages=history_messages,
replace_bot_name=True, # 在分析时也替换机器人名字,使其与 LLM 交互一致
@ -729,7 +729,6 @@ class HeartFChatting:
read_mark=0.0, # 不需要已读标记
truncate=False # 获取完整内容进行分析
)
# --- 结束使用 build_readable_messages ---
# 2. 获取 Bot 回复字符串
bot_reply_str = " ".join(reply)
@ -779,7 +778,6 @@ class HeartFChatting:
except Exception as e:
logger.error(f"{self.log_prefix} Error triggering nickname analysis: {e}", exc_info=True)
# --- 结束触发函数 ---
async def _wait_for_new_message(self, observation, planner_start_db_time: float, log_prefix: str) -> bool:
"""

View File

@ -224,7 +224,7 @@ class PromptBuilder:
logger.debug("开始构建prompt")
# --- [修改] 注入绰号信息 ---
# 注入绰号信息
nickname_injection_str = ""
if global_config.ENABLE_NICKNAME_MAPPING and chat_stream.group_info:
try:
@ -250,7 +250,6 @@ class PromptBuilder:
all_nicknames_data = await relationship_manager.get_users_group_nicknames(
platform, list(user_ids_in_context), group_id
)
# --- 结束调用 ---
if all_nicknames_data:
selected_nicknames = select_nicknames_for_prompt(all_nicknames_data)
@ -260,7 +259,6 @@ class PromptBuilder:
except Exception as e:
logger.error(f"Error getting or formatting nickname info for focus prompt: {e}", exc_info=True)
# --- [结束修改] ---
prompt = await global_prompt_manager.format_prompt(
"heart_flow_prompt",