feat: 添加 AI Agent 对话测试工具 + 代码优化

主要变更:

- 新增 tests/test_ai_chat.py: AI Agent 对话测试工具

- 优化 core/pydantic_ai_agent.py 和 db/chat_log_db.py

- 清理归档文件,更新文档

Made-with: Cursor
This commit is contained in:
2026-02-28 16:19:35 +08:00
parent a6c42d505a
commit c39840fe15
49 changed files with 2453 additions and 8556 deletions

View File

@@ -177,17 +177,8 @@ def cmd_live(refresh: int = 3):
try:
while True:
import sqlite3
conn = sqlite3.connect(db._DB_PATH)
conn.row_factory = sqlite3.Row
rows = conn.execute("""
SELECT id, customer_id, customer_name, direction, message, timestamp
FROM chat_logs
ORDER BY id DESC LIMIT 20
""").fetchall()
conn.close()
new_rows = [dict(r) for r in rows if r["id"] not in seen_ids]
rows = db.get_latest_messages(20)
new_rows = [r for r in rows if r["id"] not in seen_ids]
if new_rows:
new_rows.reverse()
for r in new_rows:

View File

@@ -24,22 +24,23 @@ logger = logging.getLogger(__name__)
class WorkerProcess:
"""工作进程"""
def __init__(self, worker_id: int, shard_keys: List[str]):
def __init__(self, worker_id: int, shard_keys: List[str], enable_agent: bool = True):
self.worker_id = worker_id
self.shard_keys = shard_keys
self.enable_agent = enable_agent
self.process = None
def start(self):
"""启动工作进程"""
self.process = Process(
target=self._run,
args=(self.worker_id, self.shard_keys),
args=(self.worker_id, self.shard_keys, self.enable_agent),
name=f"ai-cs-worker-{self.worker_id}"
)
self.process.start()
logger.info(f"Worker {self.worker_id} 启动 (PID: {self.process.pid})")
def _run(self, worker_id: int, shard_keys: List[str]):
def _run(self, worker_id: int, shard_keys: List[str], enable_agent: bool):
"""工作进程入口"""
try:
# 设置进程环境变量
@@ -50,7 +51,7 @@ class WorkerProcess:
from core.websocket_client import QingjianAPIClient
logger.info(f"Worker {worker_id} 初始化 Agent...")
client = QingjianAPIClient(enable_agent=True)
client = QingjianAPIClient(enable_agent=enable_agent)
# 只处理分配给这个 worker 的客户
client.shard_keys = set(shard_keys)
@@ -77,10 +78,11 @@ class WorkerProcess:
class Coordinator:
"""协调器 - 管理多个工作进程"""
def __init__(self, num_workers: int = None):
def __init__(self, num_workers: int = None, enable_agent: bool = True):
self.num_workers = num_workers or max(2, cpu_count())
self.workers: List[WorkerProcess] = []
self.running = False
self.enable_agent = enable_agent
def _get_shard_key(self, acc_id: str, from_id: str) -> int:
"""根据店铺 ID + 客户 ID 计算分片 key"""
@@ -117,7 +119,8 @@ class Coordinator:
for worker_id in range(self.num_workers):
worker = WorkerProcess(
worker_id=worker_id,
shard_keys=shards.get(worker_id, [])
shard_keys=shards.get(worker_id, []),
enable_agent=self.enable_agent
)
worker.start()
self.workers.append(worker)