refactor: unify workflow/websocket logging and extract conversation state store

This commit is contained in:
2026-03-01 16:35:39 +08:00
parent 8dd5a11b4b
commit 4a07f9c726
4 changed files with 219 additions and 181 deletions

View File

@@ -6,7 +6,7 @@
- 图片AI接入点调用 workflow.image_ai_submit_result(task_id, result_url)
- 消息回调接口:通过 register_send_callback 注入发送函数
"""
import asyncio
import asyncio`r`nimport logging
import os
import uuid
from enum import Enum
@@ -14,7 +14,7 @@ from typing import Optional, Dict, Callable, Awaitable, Any, List
from datetime import datetime
from dataclasses import dataclass, field
_WECHAT_WEBHOOK = os.getenv("WECHAT_WEBHOOK", "")
_WECHAT_WEBHOOK = os.getenv("WECHAT_WEBHOOK", "")`r`nlogger = logging.getLogger("cs_agent")
async def _wechat_notify(content: str):
@@ -30,11 +30,11 @@ async def _wechat_notify(content: str):
})
data = resp.json()
if data.get("errcode") == 0:
print(f"[Workflow通知] 企业微信推送成功 ✓")
logger.info(f"[Workflow通知] 企业微信推送成功 ✓")
else:
print(f"[Workflow通知] 企业微信推送失败: {data}")
logger.info(f"[Workflow通知] 企业微信推送失败: {data}")
except Exception as e:
print(f"[Workflow通知] 推送异常: {e}")
logger.info(f"[Workflow通知] 推送异常: {e}")
from db.customer_db import db
@@ -142,7 +142,7 @@ class CustomerServiceWorkflow:
if requirements:
db.add_requirement(customer_id, requirements)
print(f"[Workflow] 创建任务 {task_id} | 客户: {customer_name} | 操作: {operation}")
logger.info(f"[Workflow] 创建任务 {task_id} | 客户: {customer_name} | 操作: {operation}")
return task_id
def get_task(self, task_id: str) -> Optional[ImageTask]:
@@ -216,7 +216,7 @@ class CustomerServiceWorkflow:
requirements=requirements,
)
print(f"[Workflow] 图片识别完成 | 客户:{customer_id} | 复杂度:{complexity} | 建议报价:{price_hint}")
logger.info(f"[Workflow] 图片识别完成 | 客户:{customer_id} | 复杂度:{complexity} | 建议报价:{price_hint}")
# 通知客服AI报价把识别结果注入消息让AI根据结果报价
if self._send_message:
@@ -266,10 +266,10 @@ class CustomerServiceWorkflow:
if not task:
# 内存任务丢失(重启场景)→ 从客户档案重建
print(f"[Workflow] 付款触发:内存无任务,尝试从客户档案重建 | 客户: {customer_id}")
logger.info(f"[Workflow] 付款触发:内存无任务,尝试从客户档案重建 | 客户: {customer_id}")
task = await self._rebuild_task_from_profile(customer_id, acc_id, acc_type)
if not task:
print(f"[Workflow] 付款触发:客户 {customer_id} 无图片记录,无法重建任务,跳过")
logger.info(f"[Workflow] 付款触发:客户 {customer_id} 无图片记录,无法重建任务,跳过")
await _wechat_notify(
f"⚠️ **付款但无图片**\n"
f"客户:{customer_id}\n"
@@ -279,11 +279,11 @@ class CustomerServiceWorkflow:
return False
if task.status not in (TaskStatus.PENDING,):
print(f"[Workflow] 付款触发:任务 {task.task_id[:8]}... 状态={task.status.value},跳过")
logger.info(f"[Workflow] 付款触发:任务 {task.task_id[:8]}... 状态={task.status.value},跳过")
return False
task.operation = task.operation or "enhance"
print(f"[Workflow] 付款确认,启动 Gemini 处理 | 客户: {customer_id} | 任务: {task.task_id[:8]}...")
logger.info(f"[Workflow] 付款确认,启动 Gemini 处理 | 客户: {customer_id} | 任务: {task.task_id[:8]}...")
asyncio.create_task(self._auto_process(task.task_id, acc_id=acc_id, acc_type=acc_type))
return True
@@ -325,10 +325,10 @@ class CustomerServiceWorkflow:
)
self.tasks[task_id] = task
self.customer_active_task[customer_id] = task_id
print(f"[Workflow] 任务已重建 | 客户: {customer_id} | 图片: {image_url[:60]}...")
logger.info(f"[Workflow] 任务已重建 | 客户: {customer_id} | 图片: {image_url[:60]}...")
return task
except Exception as e:
print(f"[Workflow] 任务重建失败: {e}")
logger.info(f"[Workflow] 任务重建失败: {e}")
return None
@staticmethod
@@ -367,7 +367,7 @@ class CustomerServiceWorkflow:
if revision_note:
gemini_prompt = (gemini_prompt or "") + f"\n【客户修改要求】{revision_note}"
print(f"[Workflow] Gemini 开始处理 | 任务: {task_id[:8]}... | 比例: {aspect_ratio} | 透视: {perspective} | 图片: {task.original_image}")
logger.info(f"[Workflow] Gemini 开始处理 | 任务: {task_id[:8]}... | 比例: {aspect_ratio} | 透视: {perspective} | 图片: {task.original_image}")
try:
from image.image_processor import image_processor
from utils.image_queue import run_with_queue
@@ -387,7 +387,7 @@ class CustomerServiceWorkflow:
qa_score = result.get("qa_score", 0)
qa_pass = result.get("qa_pass", True)
qa_issue = result.get("qa_issue", "")
print(f"[Workflow] Gemini 处理完成 | 任务: {task_id[:8]}... | 质检: {qa_score}分 | 尝试: {attempts}")
logger.info(f"[Workflow] Gemini 处理完成 | 任务: {task_id[:8]}... | 质检: {qa_score}分 | 尝试: {attempts}")
# 质检未通过(已达重试上限,保留结果但人工跟进)
if not qa_pass:
@@ -408,7 +408,7 @@ class CustomerServiceWorkflow:
)
else:
err_msg = result['message']
print(f"[Workflow] Gemini 处理失败: {err_msg}")
logger.info(f"[Workflow] Gemini 处理失败: {err_msg}")
task.update_status(TaskStatus.FAILED)
# 企业微信预警
await _wechat_notify(
@@ -428,7 +428,7 @@ class CustomerServiceWorkflow:
msg_type=0,
)
except Exception as e:
print(f"[Workflow] 自动处理异常: {e}")
logger.info(f"[Workflow] 自动处理异常: {e}")
task.update_status(TaskStatus.FAILED)
await _wechat_notify(
f"⚠️ **Workflow处理异常**\n"
@@ -459,13 +459,13 @@ class CustomerServiceWorkflow:
"""
task = self.tasks.get(task_id)
if not task:
print(f"[Workflow] 任务不存在: {task_id}")
logger.info(f"[Workflow] 任务不存在: {task_id}")
return False
task.result_url = result_url
task.update_status(TaskStatus.AWAITING_CONFIRM)
print(f"[Workflow] 任务 {task_id} 处理完成,发送给客户确认")
logger.info(f"[Workflow] 任务 {task_id} 处理完成,发送给客户确认")
# 先发结果图片
if self._send_message:
@@ -573,7 +573,7 @@ class CustomerServiceWorkflow:
)
return result.get("success", False)
except Exception as e:
print(f"[Workflow] 邮件发送失败: {e}")
logger.info(f"[Workflow] 邮件发送失败: {e}")
await _wechat_notify(
f"⚠️ **邮件发送失败**\n"
f"客户:{task.customer_id}\n"
@@ -621,17 +621,17 @@ class CustomerServiceWorkflow:
# 尝试从数据库加载
db_task = self.db.get_task(task_id)
if db_task:
print(f"[Workflow] 从数据库加载任务:{task_id[:8]}...")
logger.info(f"[Workflow] 从数据库加载任务:{task_id[:8]}...")
# 可以在这里重建内存任务
else:
print(f"[Workflow] 任务不存在:{task_id}")
logger.info(f"[Workflow] 任务不存在:{task_id}")
return False
# 添加到数据库
success = self.db.add_customer_note(task_id, requirement, changed_by)
if success:
print(f"[Workflow] 客户添加需求:{task_id[:8]}... | {requirement}")
logger.info(f"[Workflow] 客户添加需求:{task_id[:8]}... | {requirement}")
# 如果任务还在待处理状态,通知 AI 客服
if task and task.status.value == 'pending':
@@ -664,12 +664,12 @@ class CustomerServiceWorkflow:
if not task:
db_task = self.db.get_task(task_id)
if not db_task:
print(f"[Workflow] 任务不存在:{task_id}")
logger.info(f"[Workflow] 任务不存在:{task_id}")
return False
# 检查状态,已处理完成的不允许修改
if task and task.status.value in ['completed', 'processing']:
print(f"[Workflow] 任务已开始处理,不允许修改操作:{task_id}")
logger.info(f"[Workflow] 任务已开始处理,不允许修改操作:{task_id}")
if self._send_message:
await self._send_message(
customer_id=customer_id,
@@ -685,7 +685,7 @@ class CustomerServiceWorkflow:
if success and task:
task.operation = new_operation
print(f"[Workflow] 修改操作类型:{task_id[:8]}... -> {new_operation}")
logger.info(f"[Workflow] 修改操作类型:{task_id[:8]}... -> {new_operation}")
if self._send_message:
await self._send_message(
@@ -720,7 +720,7 @@ class CustomerServiceWorkflow:
bool: 是否成功
"""
try:
print(f"[Workflow] 启动查找图片工作流 | 客户:{customer_id}")
logger.info(f"[Workflow] 启动查找图片工作流 | 客户:{customer_id}")
# 1. 创建任务
task_id = self.create_image_task(
@@ -754,7 +754,7 @@ class CustomerServiceWorkflow:
msg_type=0,
)
print(f"[Workflow] 查找图片完成 | 客户:{customer_id} | URL: {tuhui_url}")
logger.info(f"[Workflow] 查找图片完成 | 客户:{customer_id} | URL: {tuhui_url}")
return True
except Exception as e:
@@ -777,7 +777,7 @@ class CustomerServiceWorkflow:
bool: 是否成功
"""
try:
print(f"[Workflow] 启动处理图片工作流 | 客户:{customer_id}")
logger.info(f"[Workflow] 启动处理图片工作流 | 客户:{customer_id}")
# 1. 创建任务
task_id = self.create_image_task(
@@ -803,7 +803,7 @@ class CustomerServiceWorkflow:
# 3. 启动处理
await self.trigger_processing_on_payment(customer_id, acc_id, acc_type)
print(f"[Workflow] 处理图片已启动 | 客户:{customer_id}")
logger.info(f"[Workflow] 处理图片已启动 | 客户:{customer_id}")
return True
except Exception as e:
@@ -828,7 +828,7 @@ class CustomerServiceWorkflow:
bool: 是否成功
"""
try:
print(f"[Workflow] 启动转人工派单工作流 | 客户:{customer_id} | 原因:{reason}")
logger.info(f"[Workflow] 启动转人工派单工作流 | 客户:{customer_id} | 原因:{reason}")
# 1. 创建任务
task_id = self.create_image_task(
@@ -864,7 +864,7 @@ class CustomerServiceWorkflow:
f"请安排设计师上线"
)
print(f"[Workflow] 无人在线 | 客户:{customer_id}")
logger.info(f"[Workflow] 无人在线 | 客户:{customer_id}")
return False
# 3. 派单给在线设计师
@@ -885,7 +885,7 @@ class CustomerServiceWorkflow:
msg_type=0,
)
print(f"[Workflow] 已派单给设计师:{designer} | 客户:{customer_id}")
logger.info(f"[Workflow] 已派单给设计师:{designer} | 客户:{customer_id}")
return True
except Exception as e:
@@ -901,7 +901,7 @@ class CustomerServiceWorkflow:
"""
try:
designers = await self.dispatch_client.get_online_designers()
print(f"[Workflow] 查询在线设计师:{len(designers)}人在线 | {designers}")
logger.info(f"[Workflow] 查询在线设计师:{len(designers)}人在线 | {designers}")
return designers
except Exception as e:
@@ -945,7 +945,7 @@ class CustomerServiceWorkflow:
)
if success:
print(f"[Workflow] 派单成功:{dispatch_task_id}{designer_name} | 客户:{customer_id}")
logger.info(f"[Workflow] 派单成功:{dispatch_task_id}{designer_name} | 客户:{customer_id}")
# 企业微信通知
await _wechat_notify(
@@ -969,3 +969,4 @@ class CustomerServiceWorkflow:
# ========== 全局实例 ==========
workflow = CustomerServiceWorkflow()