feat: upgrade客服多店铺分流、批量报价与稳定性防护

This commit is contained in:
2026-02-28 18:52:31 +08:00
parent c39840fe15
commit 46143be86c
16 changed files with 1329 additions and 37 deletions

View File

@@ -0,0 +1,76 @@
import os
import unittest
from unittest.mock import AsyncMock
from core.pydantic_ai_agent import CustomerServiceAgent, CustomerMessage
from db.customer_db import db
class RegressionPipelineTest(unittest.IsolatedAsyncioTestCase):
def setUp(self):
self.customer_id = "__regression_test_customer__"
db.clear_pending_quote_state(self.customer_id)
os.environ["FEATURE_BATCH_QUOTE_ENABLED"] = "true"
os.environ["FEATURE_BATCH_QUOTE_PERCENT"] = "100"
os.environ["FEATURE_BATCH_QUOTE_SHOPS"] = ""
async def test_collect_images_then_ack(self):
agent = CustomerServiceAgent()
msg = CustomerMessage(
msg_id="m1",
acc_id="test_shop",
msg="https://img.alicdn.com/a.jpg#*#https://img.alicdn.com/b.jpg",
from_id=self.customer_id,
from_name="t",
cy_id=self.customer_id,
acc_type="AliWorkbench",
msg_type=0,
cy_name="t",
goods_name="专业找图",
goods_order="",
)
resp = await agent.process_message(msg)
self.assertTrue(resp.should_reply)
self.assertIn("", resp.reply)
st = agent._get_conversation_state(self.customer_id)
self.assertEqual(len(st.pending_image_urls), 2)
async def test_finish_signal_triggers_batch_quote(self):
agent = CustomerServiceAgent()
st = agent._get_conversation_state(self.customer_id)
st.pending_image_urls = ["https://img.alicdn.com/a.jpg"]
st.pending_requirements = ["去背景"]
agent._sync_pending_quote_state(self.customer_id, st)
agent._quote_pending_images = AsyncMock(return_value={"reply": "打包15元确认我就安排", "need_transfer": False})
msg = CustomerMessage(
msg_id="m2",
acc_id="test_shop",
msg="发完了,报价吧",
from_id=self.customer_id,
from_name="t",
cy_id=self.customer_id,
acc_type="AliWorkbench",
msg_type=0,
cy_name="t",
goods_name="专业找图",
goods_order="",
)
resp = await agent.process_message(msg)
self.assertTrue(resp.should_reply)
self.assertIn("15", resp.reply)
agent._quote_pending_images.assert_awaited()
async def test_pending_state_restore(self):
db.update_pending_quote_state(self.customer_id, ["u1", "u2"], ["r1"])
agent = CustomerServiceAgent()
st = agent._get_conversation_state(self.customer_id)
self.assertEqual(st.pending_image_urls, ["u1", "u2"])
self.assertEqual(st.pending_requirements, ["r1"])
def tearDown(self):
db.clear_pending_quote_state(self.customer_id)
if __name__ == "__main__":
unittest.main(verbosity=2)