mirror of https://github.com/Mai-with-u/MaiBot.git
成功加入队列,准备尝试开始进程
parent
5c2dd25ba4
commit
2fd00f4446
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -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():
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Reference in New Issue