Langchain-Chatchat
214 строк · 6.9 Кб
1import requests2import json3import sys4from pathlib import Path5
6root_path = Path(__file__).parent.parent.parent7sys.path.append(str(root_path))8from server.utils import api_address9from configs import VECTOR_SEARCH_TOP_K10from server.knowledge_base.utils import get_kb_path, get_file_path11
12from pprint import pprint13
14
15api_base_url = api_address()16
17
18kb = "kb_for_api_test"19test_files = {20"wiki/Home.MD": get_file_path("samples", "wiki/Home.md"),21"wiki/开发环境部署.MD": get_file_path("samples", "wiki/开发环境部署.md"),22"test_files/test.txt": get_file_path("samples", "test_files/test.txt"),23}
24
25print("\n\n直接url访问\n")26
27
28def test_delete_kb_before(api="/knowledge_base/delete_knowledge_base"):29if not Path(get_kb_path(kb)).exists():30return31
32url = api_base_url + api33print("\n测试知识库存在,需要删除")34r = requests.post(url, json=kb)35data = r.json()36pprint(data)37
38# check kb not exists anymore39url = api_base_url + "/knowledge_base/list_knowledge_bases"40print("\n获取知识库列表:")41r = requests.get(url)42data = r.json()43pprint(data)44assert data["code"] == 20045assert isinstance(data["data"], list) and len(data["data"]) > 046assert kb not in data["data"]47
48
49def test_create_kb(api="/knowledge_base/create_knowledge_base"):50url = api_base_url + api51
52print(f"\n尝试用空名称创建知识库:")53r = requests.post(url, json={"knowledge_base_name": " "})54data = r.json()55pprint(data)56assert data["code"] == 40457assert data["msg"] == "知识库名称不能为空,请重新填写知识库名称"58
59print(f"\n创建新知识库: {kb}")60r = requests.post(url, json={"knowledge_base_name": kb})61data = r.json()62pprint(data)63assert data["code"] == 20064assert data["msg"] == f"已新增知识库 {kb}"65
66print(f"\n尝试创建同名知识库: {kb}")67r = requests.post(url, json={"knowledge_base_name": kb})68data = r.json()69pprint(data)70assert data["code"] == 40471assert data["msg"] == f"已存在同名知识库 {kb}"72
73
74def test_list_kbs(api="/knowledge_base/list_knowledge_bases"):75url = api_base_url + api76print("\n获取知识库列表:")77r = requests.get(url)78data = r.json()79pprint(data)80assert data["code"] == 20081assert isinstance(data["data"], list) and len(data["data"]) > 082assert kb in data["data"]83
84
85def test_upload_docs(api="/knowledge_base/upload_docs"):86url = api_base_url + api87files = [("files", (name, open(path, "rb"))) for name, path in test_files.items()]88
89print(f"\n上传知识文件")90data = {"knowledge_base_name": kb, "override": True}91r = requests.post(url, data=data, files=files)92data = r.json()93pprint(data)94assert data["code"] == 20095assert len(data["data"]["failed_files"]) == 096
97print(f"\n尝试重新上传知识文件, 不覆盖")98data = {"knowledge_base_name": kb, "override": False}99files = [("files", (name, open(path, "rb"))) for name, path in test_files.items()]100r = requests.post(url, data=data, files=files)101data = r.json()102pprint(data)103assert data["code"] == 200104assert len(data["data"]["failed_files"]) == len(test_files)105
106print(f"\n尝试重新上传知识文件, 覆盖,自定义docs")107docs = {"FAQ.MD": [{"page_content": "custom docs", "metadata": {}}]}108data = {"knowledge_base_name": kb, "override": True, "docs": json.dumps(docs)}109files = [("files", (name, open(path, "rb"))) for name, path in test_files.items()]110r = requests.post(url, data=data, files=files)111data = r.json()112pprint(data)113assert data["code"] == 200114assert len(data["data"]["failed_files"]) == 0115
116
117def test_list_files(api="/knowledge_base/list_files"):118url = api_base_url + api119print("\n获取知识库中文件列表:")120r = requests.get(url, params={"knowledge_base_name": kb})121data = r.json()122pprint(data)123assert data["code"] == 200124assert isinstance(data["data"], list)125for name in test_files:126assert name in data["data"]127
128
129def test_search_docs(api="/knowledge_base/search_docs"):130url = api_base_url + api131query = "介绍一下langchain-chatchat项目"132print("\n检索知识库:")133print(query)134r = requests.post(url, json={"knowledge_base_name": kb, "query": query})135data = r.json()136pprint(data)137assert isinstance(data, list) and len(data) == VECTOR_SEARCH_TOP_K138
139
140def test_update_info(api="/knowledge_base/update_info"):141url = api_base_url + api142print("\n更新知识库介绍")143r = requests.post(url, json={"knowledge_base_name": "samples", "kb_info": "你好"})144data = r.json()145pprint(data)146assert data["code"] == 200147
148def test_update_docs(api="/knowledge_base/update_docs"):149url = api_base_url + api150
151print(f"\n更新知识文件")152r = requests.post(url, json={"knowledge_base_name": kb, "file_names": list(test_files)})153data = r.json()154pprint(data)155assert data["code"] == 200156assert len(data["data"]["failed_files"]) == 0157
158
159def test_delete_docs(api="/knowledge_base/delete_docs"):160url = api_base_url + api161
162print(f"\n删除知识文件")163r = requests.post(url, json={"knowledge_base_name": kb, "file_names": list(test_files)})164data = r.json()165pprint(data)166assert data["code"] == 200167assert len(data["data"]["failed_files"]) == 0168
169url = api_base_url + "/knowledge_base/search_docs"170query = "介绍一下langchain-chatchat项目"171print("\n尝试检索删除后的检索知识库:")172print(query)173r = requests.post(url, json={"knowledge_base_name": kb, "query": query})174data = r.json()175pprint(data)176assert isinstance(data, list) and len(data) == 0177
178
179def test_recreate_vs(api="/knowledge_base/recreate_vector_store"):180url = api_base_url + api181print("\n重建知识库:")182r = requests.post(url, json={"knowledge_base_name": kb}, stream=True)183for chunk in r.iter_content(None):184data = json.loads(chunk[6:])185assert isinstance(data, dict)186assert data["code"] == 200187print(data["msg"])188
189url = api_base_url + "/knowledge_base/search_docs"190query = "本项目支持哪些文件格式?"191print("\n尝试检索重建后的检索知识库:")192print(query)193r = requests.post(url, json={"knowledge_base_name": kb, "query": query})194data = r.json()195pprint(data)196assert isinstance(data, list) and len(data) == VECTOR_SEARCH_TOP_K197
198
199def test_delete_kb_after(api="/knowledge_base/delete_knowledge_base"):200url = api_base_url + api201print("\n删除知识库")202r = requests.post(url, json=kb)203data = r.json()204pprint(data)205
206# check kb not exists anymore207url = api_base_url + "/knowledge_base/list_knowledge_bases"208print("\n获取知识库列表:")209r = requests.get(url)210data = r.json()211pprint(data)212assert data["code"] == 200213assert isinstance(data["data"], list) and len(data["data"]) > 0214assert kb not in data["data"]215