"""Exercise real retrieval/injection with synthetic archive data and mocked LLMs.""" import json from unittest import TestCase, mock import httpx import test_knowledge as fixtures class KnowledgeContextAudit(TestCase): setUp = fixtures.KnowledgeGatewayTest.setUp tearDown = fixtures.KnowledgeGatewayTest.tearDown seed = fixtures.KnowledgeGatewayTest.seed _post_then_drain = fixtures.KnowledgeGatewayTest._post_then_drain def request(self, messages, customer_text=''): item = self.seed() captured = [] def upstream(request): data = json.loads(request.content) captured.append(data) return httpx.Response(200, json={'choices':[{'message':{'content':'请先确认就诊日期和科室。'}}]}) response, _ = self._post_then_drain(upstream, body={'messages':messages,'customer_text':customer_text,'task_id':'context-audit'}) self.assertEqual(response.status_code,200,response.text) return item,response.json(),captured def test_multimodal_messages_only_retrieves_and_preserves_image(self): image = {'type':'image_url','image_url':{'url':'data:image/png;base64,AUDIT_IMAGE'}} item, response, captured = self.request([{'role':'user','content':[image,{'type':'text','text':'预约挂号需要什么材料?'}]}]) self.assertEqual([hit['id'] for hit in response['knowledge']['hits']],[item['id']]) self.assertIn('已审核知识参考',json.dumps(captured[0],ensure_ascii=False)) self.assertIn('AUDIT_IMAGE',json.dumps(captured[0])) def test_followup_uses_recent_topic_for_retrieval_and_keeps_history(self): messages=[{'role':'system','content':'你是测试客服。'}, {'role':'user','content':'预约挂号需要什么材料?'}, {'role':'assistant','content':'请先确认就诊日期和科室。'}, {'role':'user','content':'那需要提前准备什么?'}] item,response,captured=self.request(messages,'那需要提前准备什么?') self.assertEqual([hit['id'] for hit in response['knowledge']['hits']],[item['id']]) self.assertEqual(captured[0]['messages'][:3],messages[:3]) def test_full_current_question_is_prioritized_over_long_preamble(self): messages=[{'role':'user','content':'旧说明文字。'*600+'\n客户 10:01\n预约挂号需要什么材料?'}] item,response,_=self.request(messages) self.assertEqual([hit['id'] for hit in response['knowledge']['hits']],[item['id']]) def test_new_self_contained_topic_does_not_inherit_old_knowledge(self): messages=[{'role':'user','content':'预约挂号需要什么材料?'}, {'role':'assistant','content':'请先确认就诊日期和科室。'}, {'role':'user','content':'请问蓝牙耳机怎么连接电脑?'}] _,response,_=self.request(messages,'请问蓝牙耳机怎么连接电脑?') self.assertEqual(response['knowledge']['hits'],[])