refactor: unify workflow/websocket logging and extract conversation state store
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user