Files
LangBot/plugins/KnowledgeEngine/certification-tests/test_fastgpt_wire_contract.py

45 lines
2.8 KiB
Python

"""Regression against FastGPT v4.9.3 observed wire contracts; local HTTP fixture."""
import pytest
from aiohttp import web
from langbot_plugin.api.entities.builtin.rag import RetrievalContext
from test_shared_state import load_plugin, bind, StorageFixture, configuration
@pytest.mark.asyncio
@pytest.mark.parametrize('scores, expected', [([{'type':'embedding','value':0.72,'index':0}],0.72),([{'type':'embedding','value':0.72},{'type':'rerank','value':0.91}],0.91),([],0.0)])
async def test_fastgpt_nested_search_list_and_typed_scores(scores, expected):
pc,ec=load_plugin('FastGPTConnector')
async def search(request):
return web.json_response({'code':200,'data':{'list':[{'id':'seg','q':'real-format','a':'answer','score':scores,'collectionId':'doc'}]}})
app=web.Application();app.router.add_post('/api/core/dataset/searchTest',search)
runner=web.AppRunner(app);await runner.setup();site=web.TCPSite(runner,'127.0.0.1',0);await site.start()
cfg={**configuration('A'),'api_base_url':f'http://127.0.0.1:{site._server.sockets[0].getsockname()[1]}'}
engine=ec();engine.plugin=bind(pc,StorageFixture())
try:
result=await engine.retrieve(RetrievalContext(query='q',knowledge_base_id='kb',creation_settings=cfg))
assert result.total_found==1
assert result.results[0].content[0].text=='real-format\nanswer'
assert result.results[0].score==expected
assert result.results[0].distance==pytest.approx(1-expected)
finally:await runner.cleanup()
@pytest.mark.asyncio
async def test_fastgpt_delete_uses_delete_query_id_and_saved_credentials():
pc,ec=load_plugin('FastGPTConnector');seen=[]
async def delete(request):
seen.append((request.method,dict(request.query),request.headers.get('Authorization')))
if request.method!='DELETE' or request.query.get('id')!='upstream-doc':
return web.json_response({'code':500,'message':'missingParams'})
return web.json_response({'code':200,'data':None})
app=web.Application();app.router.add_route('*','/api/core/dataset/collection/delete',delete)
runner=web.AppRunner(app);await runner.setup();site=web.TCPSite(runner,'127.0.0.1',0);await site.start()
cfg={**configuration('A'),'api_base_url':f'http://127.0.0.1:{site._server.sockets[0].getsockname()[1]}'}
store=StorageFixture();first=ec();first.plugin=bind(pc,store)
try:
await first.on_knowledge_base_create('kb',cfg)
restarted=ec();restarted.plugin=bind(pc,store)
assert await restarted.delete_document('kb','upstream-doc') is False
await restarted._save_document('kb','host-doc', {'upstream_id':'upstream-doc', 'dataset_id':'A', 'status':'created', 'api_base_url':cfg['api_base_url']})
assert await restarted.delete_document('kb','host-doc')
assert seen==[('DELETE',{'id':'upstream-doc'},'Bearer A')]
finally:await runner.cleanup()