"""Real model response to knowledge retrieved from an isolated synthetic library.""" import json import os import sys import tempfile import uuid from pathlib import Path from unittest import mock from urllib import request,error root=Path(sys.argv[1]).resolve() sys.path.insert(0,str(root)) import backend_client settings=backend_client.load_settings() token=backend_client.desktop_access_token() import runtime_paths os.environ['KNOWLEDGE_QDRANT_URL']='' os.environ['KNOWLEDGE_EMBEDDING_URL']='' os.environ['KNOWLEDGE_EMBEDDING_MODEL']='' nonce='KREF-'+uuid.uuid4().hex[:12] with tempfile.TemporaryDirectory(prefix='live-rag-audit-') as temp, mock.patch.object(runtime_paths,'application_data_dir',return_value=Path(temp)): import test_knowledge as fixtures from knowledge_retriever import KnowledgeRetriever,inject_references import model_protocol fixture=fixtures.KnowledgeGatewayTest('test_reply_receives_evidence_and_records_version') fixture.setUp() try: item=fixture.seed() tenant=fixture.desktop_account['tenant_id'] item['answer']='本条仅用于合成测试。预约挂号资料指引码是 '+nonce+'。请确认就诊日期和科室。' item['conditions']='仅适用于本次合成接口验收,不能用于真实客户。' item=fixture.store.save(tenant,item['id'],item,fixture.actor,'') fixture.store.transition(tenant,item['id'],item['revision'],'approve',fixture.actor,'',True) fixture.store.publish(tenant,item['id'],item['revision'],fixture.actor,'') retrieval=KnowledgeRetriever(fixture.store).search(tenant,'预约挂号资料指引码') assert retrieval['hits'] messages=inject_references([ {'role':'system','content':'你是合成测试助手,只回答本次测试问题。'}, {'role':'user','content':'这是合成接口验收。预约挂号的资料指引码是什么?仅返回知识参考里的完整指引码。'}],retrieval['hits']) # Existing production Dify drops history/system: preformat only this test # to evaluate the fixed adapter without modifying production services. messages=[{'role':'user','content':model_protocol.dify_query(messages)}] payload={'messages':messages,'customer_text':'合成知识引用验收','purpose':'chat','task_id':'recognition-rag-audit-'+uuid.uuid4().hex} req=request.Request(settings['gateway']['url'],data=json.dumps(payload,ensure_ascii=False).encode(), headers={'Authorization':'Bearer '+token,'Content-Type':'application/json'},method='POST') result={'synthetic_only':True,'isolated_local_library':True,'production_library_unchanged':True, 'local_retrieval_hits':len(retrieval['hits']),'expected':nonce,'task_id':payload['task_id']} try: with request.urlopen(req,timeout=65) as response: data=json.load(response) result.update(http_status=response.status,chosen=data.get('chosen'), reply_matches_reference=nonce in str(data.get('reply') or ''), reply_excerpt=str(data.get('reply') or '')[:500], production_knowledge=data.get('knowledge'), candidates=[{'provider':row.get('provider'),'matches_reference':nonce in str(row.get('text') or '')} for row in data.get('candidates',[])]) except error.HTTPError as exc: result.update(http_status=exc.code,error_type=type(exc).__name__) except Exception as exc: result.update(error_type=type(exc).__name__) Path(sys.argv[2]).write_text(json.dumps(result,ensure_ascii=False,indent=2),encoding='utf-8') print(json.dumps(result,ensure_ascii=False)) finally: fixture.tearDown()