fix: 用户开始录音5s后ai反馈“我在认真听”

This commit is contained in:
yangshilin
2026-03-16 11:24:40 +08:00
parent 981920784f
commit 2070a03d35
9 changed files with 128 additions and 11 deletions

View File

@@ -752,13 +752,56 @@ class WebSocketBaselineTest(unittest.IsolatedAsyncioTestCase):
await ws_router.websocket_endpoint(fake_websocket, "conv-1")
await asyncio.sleep(0.05)
# 当前逻辑:仅首个分段且 5s 后发一次「我在认真听」;若本段 is_last 则取消,故此处应为 0
transition_msgs = [
item["message"]
for item in fake_manager.sent_messages
if item["message"]["type"] == ws_router.MessageType.AGENT_RESPONSE
and item["message"].get("data", {}).get("transition") is True
]
self.assertGreaterEqual(len(transition_msgs), 1)
self.assertEqual(len(transition_msgs), 0)
async def test_recording_started_sends_listening_feedback_after_delay(self):
"""客户端发送 recording_started 后,延迟 5s 发一次「我在认真听」。"""
user = _make_user()
conversation = Conversation(id="conv-1", user_id=user.id, status="active")
fake_db = _FakeAsyncDB(user=user, conversation=conversation)
fake_manager = _FakeManager()
fake_websocket = _FakeWebSocket(
messages=[
{"type": "recording_started", "data": {"voice_session_id": "session-1"}},
WebSocketDisconnect(),
]
)
with ExitStack() as stack:
stack.enter_context(
patch.object(
ws_router,
"verify_token",
return_value={"type": "access", "sub": user.id},
)
)
stack.enter_context(
patch.object(ws_router, "get_async_db", _db_provider(fake_db))
)
stack.enter_context(patch.object(ws_router, "manager", fake_manager))
stack.enter_context(_redis_empty_history_patch())
stack.enter_context(
patch("routers.websocket.LISTENING_FEEDBACK_DELAY_SEC", 0.05)
)
await ws_router.websocket_endpoint(fake_websocket, "conv-1")
await asyncio.sleep(0.12)
transition_msgs = [
item["message"]
for item in fake_manager.sent_messages
if item["message"]["type"] == ws_router.MessageType.AGENT_RESPONSE
and item["message"].get("data", {}).get("transition") is True
]
self.assertEqual(len(transition_msgs), 1)
self.assertIn("我在认真听", transition_msgs[0]["data"].get("text", ""))
async def test_audio_segment_last_segment_does_not_emit_terminal_transition(self):
user = _make_user()
@@ -814,14 +857,14 @@ class WebSocketBaselineTest(unittest.IsolatedAsyncioTestCase):
await ws_router.websocket_endpoint(fake_websocket, "conv-1")
await asyncio.sleep(0.05)
# 仅一段且 is_last延迟任务被取消不应发出 transition
transition_msgs = [
item["message"]
for item in fake_manager.sent_messages
if item["message"]["type"] == ws_router.MessageType.AGENT_RESPONSE
and item["message"].get("data", {}).get("transition") is True
]
self.assertEqual(len(transition_msgs), 1)
self.assertIsNone(transition_msgs[0]["data"].get("is_last"))
self.assertEqual(len(transition_msgs), 0)
async def test_audio_segment_continues_after_reconnect_with_existing_previous_segment(self):
user = _make_user()