re-style: 格式化代码
This commit is contained in:
committed by
Windpicker-owo
parent
00ba07e0e1
commit
a79253c714
@@ -2,7 +2,8 @@ import copy
|
||||
import datetime
|
||||
import hashlib
|
||||
import time
|
||||
from typing import Any, Callable, Dict, Union, Optional
|
||||
from collections.abc import Callable
|
||||
from typing import Any
|
||||
|
||||
import orjson
|
||||
from json_repair import repair_json
|
||||
@@ -416,7 +417,7 @@ class PersonInfoManager:
|
||||
logger.error(f"从 SQLAlchemy 加载 person_name_list 失败: {e}")
|
||||
|
||||
@staticmethod
|
||||
def get_person_id(platform: str, user_id: Union[int, str]) -> str:
|
||||
def get_person_id(platform: str, user_id: int | str) -> str:
|
||||
"""获取唯一id(同步)
|
||||
|
||||
说明: 原来该方法为异步并在内部尝试执行数据库检查/迁移,导致在许多调用处未 await 时返回 coroutine 对象。
|
||||
@@ -497,7 +498,7 @@ class PersonInfoManager:
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
async def create_person_info(person_id: str, data: Optional[dict] = None):
|
||||
async def create_person_info(person_id: str, data: dict | None = None):
|
||||
"""创建一个项"""
|
||||
if not person_id:
|
||||
logger.debug("创建失败,person_id不存在")
|
||||
@@ -558,7 +559,7 @@ class PersonInfoManager:
|
||||
await _db_create_async(final_data)
|
||||
|
||||
@staticmethod
|
||||
async def _safe_create_person_info(person_id: str, data: Optional[dict] = None):
|
||||
async def _safe_create_person_info(person_id: str, data: dict | None = None):
|
||||
"""安全地创建用户信息,处理竞态条件"""
|
||||
if not person_id:
|
||||
logger.debug("创建失败,person_id不存在")
|
||||
@@ -626,7 +627,7 @@ class PersonInfoManager:
|
||||
|
||||
await _db_safe_create_async(final_data)
|
||||
|
||||
async def update_one_field(self, person_id: str, field_name: str, value, data: Optional[Dict] = None):
|
||||
async def update_one_field(self, person_id: str, field_name: str, value, data: dict | None = None):
|
||||
"""更新某一个字段,会补全"""
|
||||
# 获取 SQLAlchemy 模型的所有字段名
|
||||
model_fields = [column.name for column in PersonInfo.__table__.columns]
|
||||
@@ -962,7 +963,7 @@ class PersonInfoManager:
|
||||
async def get_specific_value_list(
|
||||
field_name: str,
|
||||
way: Callable[[Any], bool],
|
||||
) -> Dict[str, Any]:
|
||||
) -> dict[str, Any]:
|
||||
"""
|
||||
获取满足条件的字段值字典
|
||||
"""
|
||||
@@ -983,18 +984,18 @@ class PersonInfoManager:
|
||||
found_results[record.person_id] = value
|
||||
except Exception as e_query:
|
||||
logger.error(
|
||||
f"数据库查询失败 (SQLAlchemy specific_value_list for {f_name}): {str(e_query)}", exc_info=True
|
||||
f"数据库查询失败 (SQLAlchemy specific_value_list for {f_name}): {e_query!s}", exc_info=True
|
||||
)
|
||||
return found_results
|
||||
|
||||
try:
|
||||
return await _db_get_specific_async(field_name)
|
||||
except Exception as e:
|
||||
logger.error(f"执行 get_specific_value_list 时出错: {str(e)}", exc_info=True)
|
||||
logger.error(f"执行 get_specific_value_list 时出错: {e!s}", exc_info=True)
|
||||
return {}
|
||||
|
||||
async def get_or_create_person(
|
||||
self, platform: str, user_id: int, nickname: str, user_cardname: str, user_avatar: Optional[str] = None
|
||||
self, platform: str, user_id: int, nickname: str, user_cardname: str, user_avatar: str | None = None
|
||||
) -> str:
|
||||
"""
|
||||
根据 platform 和 user_id 获取 person_id。
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
import time
|
||||
import traceback
|
||||
import os
|
||||
import pickle
|
||||
import random
|
||||
from typing import List, Dict, Any
|
||||
from src.config.config import global_config
|
||||
from src.common.logger import get_logger
|
||||
from src.person_info.relationship_manager import get_relationship_manager
|
||||
from src.person_info.person_info import Person,get_person_id
|
||||
import time
|
||||
import traceback
|
||||
from typing import Any
|
||||
|
||||
from src.chat.message_receive.chat_stream import get_chat_manager
|
||||
from src.chat.utils.chat_message_builder import (
|
||||
get_raw_msg_before_timestamp_with_chat,
|
||||
get_raw_msg_by_timestamp_with_chat,
|
||||
get_raw_msg_by_timestamp_with_chat_inclusive,
|
||||
get_raw_msg_before_timestamp_with_chat,
|
||||
num_new_messages_since,
|
||||
)
|
||||
import asyncio
|
||||
from src.common.logger import get_logger
|
||||
from src.config.config import global_config
|
||||
from src.person_info.person_info import PersonInfoManager, get_person_info_manager
|
||||
from src.person_info.relationship_manager import get_relationship_manager
|
||||
|
||||
logger = get_logger("relationship_builder")
|
||||
|
||||
@@ -46,7 +46,7 @@ class RelationshipBuilder:
|
||||
self.chat_id = chat_id
|
||||
# 新的消息段缓存结构:
|
||||
# {person_id: [{"start_time": float, "end_time": float, "last_msg_time": float, "message_count": int}, ...]}
|
||||
self.person_engaged_cache: Dict[str, List[Dict[str, Any]]] = {}
|
||||
self.person_engaged_cache: dict[str, list[dict[str, Any]]] = {}
|
||||
|
||||
# 持久化存储文件路径
|
||||
self.cache_file_path = os.path.join("data", "relationship", f"relationship_cache_{self.chat_id}.pkl")
|
||||
@@ -402,7 +402,7 @@ class RelationshipBuilder:
|
||||
# 负责触发关系构建、整合消息段、更新用户印象
|
||||
# ================================
|
||||
|
||||
async def update_impression_on_segments(self, person_id: str, chat_id: str, segments: List[Dict[str, Any]]):
|
||||
async def update_impression_on_segments(self, person_id: str, chat_id: str, segments: list[dict[str, Any]]):
|
||||
"""基于消息段更新用户印象"""
|
||||
original_segment_count = len(segments)
|
||||
logger.debug(f"开始为 {person_id} 基于 {original_segment_count} 个消息段更新印象")
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from typing import Dict
|
||||
from typing import Any
|
||||
|
||||
from src.common.logger import get_logger
|
||||
|
||||
from .relationship_builder import RelationshipBuilder
|
||||
|
||||
logger = get_logger("relationship_builder_manager")
|
||||
@@ -13,7 +14,7 @@ class RelationshipBuilderManager:
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.builders: Dict[str, RelationshipBuilder] = {}
|
||||
self.builders: dict[str, RelationshipBuilder] = {}
|
||||
|
||||
def get_or_create_builder(self, chat_id: str) -> RelationshipBuilder:
|
||||
"""获取或创建关系构建器
|
||||
@@ -30,6 +31,73 @@ class RelationshipBuilderManager:
|
||||
|
||||
return self.builders[chat_id]
|
||||
|
||||
def get_builder(self, chat_id: str) -> RelationshipBuilder | None:
|
||||
"""获取关系构建器
|
||||
|
||||
Args:
|
||||
chat_id: 聊天ID
|
||||
|
||||
Returns:
|
||||
Optional[RelationshipBuilder]: 关系构建器实例或None
|
||||
"""
|
||||
return self.builders.get(chat_id)
|
||||
|
||||
def remove_builder(self, chat_id: str) -> bool:
|
||||
"""移除关系构建器
|
||||
|
||||
Args:
|
||||
chat_id: 聊天ID
|
||||
|
||||
Returns:
|
||||
bool: 是否成功移除
|
||||
"""
|
||||
if chat_id in self.builders:
|
||||
del self.builders[chat_id]
|
||||
logger.debug(f"移除聊天 {chat_id} 的关系构建器")
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_all_chat_ids(self) -> list[str]:
|
||||
"""获取所有管理的聊天ID列表
|
||||
|
||||
Returns:
|
||||
List[str]: 聊天ID列表
|
||||
"""
|
||||
return list(self.builders.keys())
|
||||
|
||||
def get_status(self) -> dict[str, Any]:
|
||||
"""获取管理器状态
|
||||
|
||||
Returns:
|
||||
Dict[str, any]: 状态信息
|
||||
"""
|
||||
return {
|
||||
"total_builders": len(self.builders),
|
||||
"chat_ids": list(self.builders.keys()),
|
||||
}
|
||||
|
||||
async def process_chat_messages(self, chat_id: str):
|
||||
"""处理指定聊天的消息
|
||||
|
||||
Args:
|
||||
chat_id: 聊天ID
|
||||
"""
|
||||
builder = self.get_or_create_builder(chat_id)
|
||||
await builder.build_relation()
|
||||
|
||||
async def force_cleanup_user(self, chat_id: str, person_id: str) -> bool:
|
||||
"""强制清理指定用户的关系构建缓存
|
||||
|
||||
Args:
|
||||
chat_id: 聊天ID
|
||||
person_id: 用户ID
|
||||
|
||||
Returns:
|
||||
bool: 是否成功清理
|
||||
"""
|
||||
builder = self.get_builder(chat_id)
|
||||
return builder.force_cleanup_user_segments(person_id) if builder else False
|
||||
|
||||
|
||||
# 全局管理器实例
|
||||
relationship_builder_manager = RelationshipBuilderManager()
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
import time
|
||||
import traceback
|
||||
import orjson
|
||||
from typing import Any
|
||||
|
||||
from typing import List, Dict, Any
|
||||
import orjson
|
||||
from json_repair import repair_json
|
||||
|
||||
from src.chat.message_receive.chat_stream import get_chat_manager
|
||||
from src.chat.utils.prompt import Prompt, global_prompt_manager
|
||||
from src.common.logger import get_logger
|
||||
from src.config.config import global_config, model_config
|
||||
from src.llm_models.utils_model import LLMRequest
|
||||
from src.chat.utils.prompt import Prompt, global_prompt_manager
|
||||
from src.chat.message_receive.chat_stream import get_chat_manager
|
||||
from src.person_info.person_info import get_person_info_manager
|
||||
|
||||
|
||||
logger = get_logger("relationship_fetcher")
|
||||
|
||||
|
||||
@@ -64,10 +63,10 @@ class RelationshipFetcher:
|
||||
self.chat_id = chat_id
|
||||
|
||||
# 信息获取缓存:记录正在获取的信息请求
|
||||
self.info_fetching_cache: List[Dict[str, Any]] = []
|
||||
self.info_fetching_cache: list[dict[str, Any]] = []
|
||||
|
||||
# 信息结果缓存:存储已获取的信息结果,带TTL
|
||||
self.info_fetched_cache: Dict[str, Dict[str, Any]] = {}
|
||||
self.info_fetched_cache: dict[str, dict[str, Any]] = {}
|
||||
# 结构:{person_id: {info_type: {"info": str, "ttl": int, "start_time": float, "person_name": str, "unknown": bool}}}
|
||||
|
||||
# LLM模型配置
|
||||
@@ -475,7 +474,7 @@ class RelationshipFetcherManager:
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self._fetchers: Dict[str, RelationshipFetcher] = {}
|
||||
self._fetchers: dict[str, RelationshipFetcher] = {}
|
||||
|
||||
def get_fetcher(self, chat_id: str) -> RelationshipFetcher:
|
||||
"""获取或创建指定 chat_id 的 RelationshipFetcher
|
||||
@@ -503,7 +502,7 @@ class RelationshipFetcherManager:
|
||||
"""清空所有 RelationshipFetcher"""
|
||||
self._fetchers.clear()
|
||||
|
||||
def get_active_chat_ids(self) -> List[str]:
|
||||
def get_active_chat_ids(self) -> list[str]:
|
||||
"""获取所有活跃的 chat_id 列表"""
|
||||
return list(self._fetchers.keys())
|
||||
|
||||
|
||||
@@ -1,20 +1,71 @@
|
||||
from src.common.logger import get_logger
|
||||
from .person_info import Person,is_person_known
|
||||
import random
|
||||
from src.llm_models.utils_model import LLMRequest
|
||||
from src.config.config import global_config, model_config
|
||||
from src.chat.utils.chat_message_builder import build_readable_messages
|
||||
import time
|
||||
from datetime import datetime
|
||||
from difflib import SequenceMatcher
|
||||
from typing import Any
|
||||
|
||||
import jieba
|
||||
import orjson
|
||||
from json_repair import repair_json
|
||||
from datetime import datetime
|
||||
from typing import List, Dict, Any
|
||||
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
|
||||
import traceback
|
||||
from sklearn.feature_extraction.text import TfidfVectorizer
|
||||
from sklearn.metrics.pairwise import cosine_similarity
|
||||
|
||||
from src.chat.utils.chat_message_builder import build_readable_messages
|
||||
from src.common.logger import get_logger
|
||||
from src.config.config import global_config, model_config
|
||||
from src.llm_models.utils_model import LLMRequest
|
||||
|
||||
from .person_info import PersonInfoManager, get_person_info_manager
|
||||
|
||||
logger = get_logger("relation")
|
||||
|
||||
def init_prompt():
|
||||
Prompt(
|
||||
|
||||
class RelationshipManager:
|
||||
def __init__(self):
|
||||
self.relationship_llm = LLMRequest(
|
||||
model_set=model_config.model_task_config.utils, request_type="relationship"
|
||||
) # 用于动作规划
|
||||
|
||||
@staticmethod
|
||||
async def is_known_some_one(platform, user_id):
|
||||
"""判断是否认识某人"""
|
||||
person_info_manager = get_person_info_manager()
|
||||
return await person_info_manager.is_person_known(platform, user_id)
|
||||
|
||||
@staticmethod
|
||||
async def first_knowing_some_one(platform: str, user_id: str, user_nickname: str, user_cardname: str):
|
||||
"""判断是否认识某人"""
|
||||
person_id = PersonInfoManager.get_person_id(platform, user_id)
|
||||
# 生成唯一的 person_name
|
||||
person_info_manager = get_person_info_manager()
|
||||
unique_nickname = await person_info_manager._generate_unique_person_name(user_nickname)
|
||||
data = {
|
||||
"platform": platform,
|
||||
"user_id": user_id,
|
||||
"nickname": user_nickname,
|
||||
"konw_time": int(time.time()),
|
||||
"person_name": unique_nickname, # 使用唯一的 person_name
|
||||
}
|
||||
# 先创建用户基本信息,使用安全创建方法避免竞态条件
|
||||
await person_info_manager._safe_create_person_info(person_id=person_id, data=data)
|
||||
# 更新昵称
|
||||
await person_info_manager.update_one_field(
|
||||
person_id=person_id, field_name="nickname", value=user_nickname, data=data
|
||||
)
|
||||
# 尝试生成更好的名字
|
||||
# await person_info_manager.qv_person_name(
|
||||
# person_id=person_id, user_nickname=user_nickname, user_cardname=user_cardname, user_avatar=user_avatar
|
||||
# )
|
||||
|
||||
async def update_person_impression(self, person_id, timestamp, bot_engaged_messages: list[dict[str, Any]]):
|
||||
"""更新用户印象
|
||||
|
||||
Args:
|
||||
person_id: 用户ID
|
||||
chat_id: 聊天ID
|
||||
reason: 更新原因
|
||||
timestamp: 时间戳 (用于记录交互时间)
|
||||
bot_engaged_messages: bot参与的消息列表
|
||||
"""
|
||||
person_info_manager = get_person_info_manager()
|
||||
person_name = await person_info_manager.get_value(person_id, "person_name")
|
||||
|
||||
Reference in New Issue
Block a user