Kevin Hu
commited on
Commit
·
a4802a2
1
Parent(s):
6430aeb
Fix chat listing error. (#4270)
Browse files### What problem does this PR solve?
#4220
### Type of change
- [x] Bug Fix (non-breaking change which fixes an issue)
- api/apps/sdk/chat.py +36 -30
api/apps/sdk/chat.py
CHANGED
@@ -18,23 +18,22 @@ from api import settings
|
|
18 |
from api.db import StatusEnum
|
19 |
from api.db.services.dialog_service import DialogService
|
20 |
from api.db.services.knowledgebase_service import KnowledgebaseService
|
21 |
-
from api.db.services.llm_service import
|
22 |
from api.db.services.user_service import TenantService
|
23 |
from api.utils import get_uuid
|
24 |
from api.utils.api_utils import get_error_data_result, token_required
|
25 |
from api.utils.api_utils import get_result
|
26 |
|
27 |
|
28 |
-
|
29 |
@manager.route('/chats', methods=['POST']) # noqa: F821
|
30 |
@token_required
|
31 |
def create(tenant_id):
|
32 |
-
req=request.json
|
33 |
-
ids= req.get("dataset_ids")
|
34 |
if not ids:
|
35 |
return get_error_data_result(message="`dataset_ids` is required")
|
36 |
for kb_id in ids:
|
37 |
-
kbs = KnowledgebaseService.accessible(kb_id=kb_id,user_id=tenant_id)
|
38 |
if not kbs:
|
39 |
return get_error_data_result(f"You don't own the dataset {kb_id}")
|
40 |
kbs = KnowledgebaseService.query(id=kb_id)
|
@@ -44,14 +43,15 @@ def create(tenant_id):
|
|
44 |
kbs = KnowledgebaseService.get_by_ids(ids)
|
45 |
embd_count = list(set([kb.embd_id for kb in kbs]))
|
46 |
if len(embd_count) != 1:
|
47 |
-
return get_result(message='Datasets use different embedding models."',
|
|
|
48 |
req["kb_ids"] = ids
|
49 |
# llm
|
50 |
llm = req.get("llm")
|
51 |
if llm:
|
52 |
if "model_name" in llm:
|
53 |
req["llm_id"] = llm.pop("model_name")
|
54 |
-
if not TenantLLMService.query(tenant_id=tenant_id,llm_name=req["llm_id"],model_type="chat"):
|
55 |
return get_error_data_result(f"`model_name` {req.get('llm_id')} doesn't exist")
|
56 |
req["llm_setting"] = req.pop("llm")
|
57 |
e, tenant = TenantService.get_by_id(tenant_id)
|
@@ -82,8 +82,10 @@ def create(tenant_id):
|
|
82 |
req["top_k"] = req.get("top_k", 1024)
|
83 |
req["rerank_id"] = req.get("rerank_id", "")
|
84 |
if req.get("rerank_id"):
|
85 |
-
value_rerank_model = ["BAAI/bge-reranker-v2-m3","maidalun1020/bce-reranker-base_v1"]
|
86 |
-
if req["rerank_id"] not in value_rerank_model and not TenantLLMService.query(tenant_id=tenant_id,
|
|
|
|
|
87 |
return get_error_data_result(f"`rerank_model` {req.get('rerank_id')} doesn't exist")
|
88 |
if not req.get("llm_id"):
|
89 |
req["llm_id"] = tenant.llm_id
|
@@ -106,11 +108,11 @@ def create(tenant_id):
|
|
106 |
{"key": "knowledge", "optional": False}
|
107 |
],
|
108 |
"empty_response": "Sorry! No relevant content was found in the knowledge base!",
|
109 |
-
"quote":True,
|
110 |
-
"tts":False,
|
111 |
-
"refine_multiturn":True
|
112 |
}
|
113 |
-
key_list_2 = ["system", "prologue", "parameters", "empty_response","quote","tts","refine_multiturn"]
|
114 |
if "prompt_config" not in req:
|
115 |
req['prompt_config'] = {}
|
116 |
for key in key_list_2:
|
@@ -151,15 +153,16 @@ def create(tenant_id):
|
|
151 |
res["avatar"] = res.pop("icon")
|
152 |
return get_result(data=res)
|
153 |
|
|
|
154 |
@manager.route('/chats/<chat_id>', methods=['PUT']) # noqa: F821
|
155 |
@token_required
|
156 |
-
def update(tenant_id,chat_id):
|
157 |
if not DialogService.query(tenant_id=tenant_id, id=chat_id, status=StatusEnum.VALID.value):
|
158 |
return get_error_data_result(message='You do not own the chat')
|
159 |
-
req =request.json
|
160 |
ids = req.get("dataset_ids")
|
161 |
if "show_quotation" in req:
|
162 |
-
req["do_refer"]=req.pop("show_quotation")
|
163 |
if "dataset_ids" in req:
|
164 |
if not ids:
|
165 |
return get_error_data_result("`dataset_ids` can't be empty")
|
@@ -173,8 +176,8 @@ def update(tenant_id,chat_id):
|
|
173 |
if kb.chunk_num == 0:
|
174 |
return get_error_data_result(f"The dataset {kb_id} doesn't own parsed file")
|
175 |
kbs = KnowledgebaseService.get_by_ids(ids)
|
176 |
-
embd_count=list(set([kb.embd_id for kb in kbs]))
|
177 |
-
if len(embd_count) != 1
|
178 |
return get_result(
|
179 |
message='Datasets use different embedding models."',
|
180 |
code=settings.RetCode.AUTHENTICATION_ERROR)
|
@@ -183,7 +186,7 @@ def update(tenant_id,chat_id):
|
|
183 |
if llm:
|
184 |
if "model_name" in llm:
|
185 |
req["llm_id"] = llm.pop("model_name")
|
186 |
-
if not TenantLLMService.query(tenant_id=tenant_id,llm_name=req["llm_id"],model_type="chat"):
|
187 |
return get_error_data_result(f"`model_name` {req.get('llm_id')} doesn't exist")
|
188 |
req["llm_setting"] = req.pop("llm")
|
189 |
e, tenant = TenantService.get_by_id(tenant_id)
|
@@ -209,8 +212,10 @@ def update(tenant_id,chat_id):
|
|
209 |
e, res = DialogService.get_by_id(chat_id)
|
210 |
res = res.to_json()
|
211 |
if req.get("rerank_id"):
|
212 |
-
value_rerank_model = ["BAAI/bge-reranker-v2-m3","maidalun1020/bce-reranker-base_v1"]
|
213 |
-
if req["rerank_id"] not in value_rerank_model and not TenantLLMService.query(tenant_id=tenant_id,
|
|
|
|
|
214 |
return get_error_data_result(f"`rerank_model` {req.get('rerank_id')} doesn't exist")
|
215 |
if "name" in req:
|
216 |
if not req.get("name"):
|
@@ -245,16 +250,16 @@ def update(tenant_id,chat_id):
|
|
245 |
def delete(tenant_id):
|
246 |
req = request.json
|
247 |
if not req:
|
248 |
-
ids=None
|
249 |
else:
|
250 |
-
ids=req.get("ids")
|
251 |
if not ids:
|
252 |
id_list = []
|
253 |
-
dias=DialogService.query(tenant_id=tenant_id,status=StatusEnum.VALID.value)
|
254 |
for dia in dias:
|
255 |
id_list.append(dia.id)
|
256 |
else:
|
257 |
-
id_list=ids
|
258 |
for id in id_list:
|
259 |
if not DialogService.query(tenant_id=tenant_id, id=id, status=StatusEnum.VALID.value):
|
260 |
return get_error_data_result(message=f"You don't own the chat {id}")
|
@@ -262,6 +267,7 @@ def delete(tenant_id):
|
|
262 |
DialogService.update_by_id(id, temp_dict)
|
263 |
return get_result()
|
264 |
|
|
|
265 |
@manager.route('/chats', methods=['GET']) # noqa: F821
|
266 |
@token_required
|
267 |
def list_chat(tenant_id):
|
@@ -278,20 +284,20 @@ def list_chat(tenant_id):
|
|
278 |
desc = False
|
279 |
else:
|
280 |
desc = True
|
281 |
-
chats = DialogService.get_list(tenant_id,page_number,items_per_page,orderby,desc,id,name)
|
282 |
if not chats:
|
283 |
return get_result(data=[])
|
284 |
list_assts = []
|
285 |
-
renamed_dict = {}
|
286 |
key_mapping = {"parameters": "variables",
|
287 |
"prologue": "opener",
|
288 |
"quote": "show_quote",
|
289 |
"system": "prompt",
|
290 |
"rerank_id": "rerank_model",
|
291 |
"vector_similarity_weight": "keywords_similarity_weight",
|
292 |
-
"do_refer":"show_quotation"}
|
293 |
key_list = ["similarity_threshold", "vector_similarity_weight", "top_n", "rerank_id"]
|
294 |
for res in chats:
|
|
|
295 |
for key, value in res["prompt_config"].items():
|
296 |
new_key = key_mapping.get(key, key)
|
297 |
renamed_dict[new_key] = value
|
@@ -309,11 +315,11 @@ def list_chat(tenant_id):
|
|
309 |
kb_list = []
|
310 |
for kb_id in res["kb_ids"]:
|
311 |
kb = KnowledgebaseService.query(id=kb_id)
|
312 |
-
if not kb
|
313 |
return get_error_data_result(message=f"Don't exist the kb {kb_id}")
|
314 |
kb_list.append(kb[0].to_json())
|
315 |
del res["kb_ids"]
|
316 |
res["datasets"] = kb_list
|
317 |
res["avatar"] = res.pop("icon")
|
318 |
list_assts.append(res)
|
319 |
-
return get_result(data=list_assts)
|
|
|
18 |
from api.db import StatusEnum
|
19 |
from api.db.services.dialog_service import DialogService
|
20 |
from api.db.services.knowledgebase_service import KnowledgebaseService
|
21 |
+
from api.db.services.llm_service import TenantLLMService
|
22 |
from api.db.services.user_service import TenantService
|
23 |
from api.utils import get_uuid
|
24 |
from api.utils.api_utils import get_error_data_result, token_required
|
25 |
from api.utils.api_utils import get_result
|
26 |
|
27 |
|
|
|
28 |
@manager.route('/chats', methods=['POST']) # noqa: F821
|
29 |
@token_required
|
30 |
def create(tenant_id):
|
31 |
+
req = request.json
|
32 |
+
ids = req.get("dataset_ids")
|
33 |
if not ids:
|
34 |
return get_error_data_result(message="`dataset_ids` is required")
|
35 |
for kb_id in ids:
|
36 |
+
kbs = KnowledgebaseService.accessible(kb_id=kb_id, user_id=tenant_id)
|
37 |
if not kbs:
|
38 |
return get_error_data_result(f"You don't own the dataset {kb_id}")
|
39 |
kbs = KnowledgebaseService.query(id=kb_id)
|
|
|
43 |
kbs = KnowledgebaseService.get_by_ids(ids)
|
44 |
embd_count = list(set([kb.embd_id for kb in kbs]))
|
45 |
if len(embd_count) != 1:
|
46 |
+
return get_result(message='Datasets use different embedding models."',
|
47 |
+
code=settings.RetCode.AUTHENTICATION_ERROR)
|
48 |
req["kb_ids"] = ids
|
49 |
# llm
|
50 |
llm = req.get("llm")
|
51 |
if llm:
|
52 |
if "model_name" in llm:
|
53 |
req["llm_id"] = llm.pop("model_name")
|
54 |
+
if not TenantLLMService.query(tenant_id=tenant_id, llm_name=req["llm_id"], model_type="chat"):
|
55 |
return get_error_data_result(f"`model_name` {req.get('llm_id')} doesn't exist")
|
56 |
req["llm_setting"] = req.pop("llm")
|
57 |
e, tenant = TenantService.get_by_id(tenant_id)
|
|
|
82 |
req["top_k"] = req.get("top_k", 1024)
|
83 |
req["rerank_id"] = req.get("rerank_id", "")
|
84 |
if req.get("rerank_id"):
|
85 |
+
value_rerank_model = ["BAAI/bge-reranker-v2-m3", "maidalun1020/bce-reranker-base_v1"]
|
86 |
+
if req["rerank_id"] not in value_rerank_model and not TenantLLMService.query(tenant_id=tenant_id,
|
87 |
+
llm_name=req.get("rerank_id"),
|
88 |
+
model_type="rerank"):
|
89 |
return get_error_data_result(f"`rerank_model` {req.get('rerank_id')} doesn't exist")
|
90 |
if not req.get("llm_id"):
|
91 |
req["llm_id"] = tenant.llm_id
|
|
|
108 |
{"key": "knowledge", "optional": False}
|
109 |
],
|
110 |
"empty_response": "Sorry! No relevant content was found in the knowledge base!",
|
111 |
+
"quote": True,
|
112 |
+
"tts": False,
|
113 |
+
"refine_multiturn": True
|
114 |
}
|
115 |
+
key_list_2 = ["system", "prologue", "parameters", "empty_response", "quote", "tts", "refine_multiturn"]
|
116 |
if "prompt_config" not in req:
|
117 |
req['prompt_config'] = {}
|
118 |
for key in key_list_2:
|
|
|
153 |
res["avatar"] = res.pop("icon")
|
154 |
return get_result(data=res)
|
155 |
|
156 |
+
|
157 |
@manager.route('/chats/<chat_id>', methods=['PUT']) # noqa: F821
|
158 |
@token_required
|
159 |
+
def update(tenant_id, chat_id):
|
160 |
if not DialogService.query(tenant_id=tenant_id, id=chat_id, status=StatusEnum.VALID.value):
|
161 |
return get_error_data_result(message='You do not own the chat')
|
162 |
+
req = request.json
|
163 |
ids = req.get("dataset_ids")
|
164 |
if "show_quotation" in req:
|
165 |
+
req["do_refer"] = req.pop("show_quotation")
|
166 |
if "dataset_ids" in req:
|
167 |
if not ids:
|
168 |
return get_error_data_result("`dataset_ids` can't be empty")
|
|
|
176 |
if kb.chunk_num == 0:
|
177 |
return get_error_data_result(f"The dataset {kb_id} doesn't own parsed file")
|
178 |
kbs = KnowledgebaseService.get_by_ids(ids)
|
179 |
+
embd_count = list(set([kb.embd_id for kb in kbs]))
|
180 |
+
if len(embd_count) != 1:
|
181 |
return get_result(
|
182 |
message='Datasets use different embedding models."',
|
183 |
code=settings.RetCode.AUTHENTICATION_ERROR)
|
|
|
186 |
if llm:
|
187 |
if "model_name" in llm:
|
188 |
req["llm_id"] = llm.pop("model_name")
|
189 |
+
if not TenantLLMService.query(tenant_id=tenant_id, llm_name=req["llm_id"], model_type="chat"):
|
190 |
return get_error_data_result(f"`model_name` {req.get('llm_id')} doesn't exist")
|
191 |
req["llm_setting"] = req.pop("llm")
|
192 |
e, tenant = TenantService.get_by_id(tenant_id)
|
|
|
212 |
e, res = DialogService.get_by_id(chat_id)
|
213 |
res = res.to_json()
|
214 |
if req.get("rerank_id"):
|
215 |
+
value_rerank_model = ["BAAI/bge-reranker-v2-m3", "maidalun1020/bce-reranker-base_v1"]
|
216 |
+
if req["rerank_id"] not in value_rerank_model and not TenantLLMService.query(tenant_id=tenant_id,
|
217 |
+
llm_name=req.get("rerank_id"),
|
218 |
+
model_type="rerank"):
|
219 |
return get_error_data_result(f"`rerank_model` {req.get('rerank_id')} doesn't exist")
|
220 |
if "name" in req:
|
221 |
if not req.get("name"):
|
|
|
250 |
def delete(tenant_id):
|
251 |
req = request.json
|
252 |
if not req:
|
253 |
+
ids = None
|
254 |
else:
|
255 |
+
ids = req.get("ids")
|
256 |
if not ids:
|
257 |
id_list = []
|
258 |
+
dias = DialogService.query(tenant_id=tenant_id, status=StatusEnum.VALID.value)
|
259 |
for dia in dias:
|
260 |
id_list.append(dia.id)
|
261 |
else:
|
262 |
+
id_list = ids
|
263 |
for id in id_list:
|
264 |
if not DialogService.query(tenant_id=tenant_id, id=id, status=StatusEnum.VALID.value):
|
265 |
return get_error_data_result(message=f"You don't own the chat {id}")
|
|
|
267 |
DialogService.update_by_id(id, temp_dict)
|
268 |
return get_result()
|
269 |
|
270 |
+
|
271 |
@manager.route('/chats', methods=['GET']) # noqa: F821
|
272 |
@token_required
|
273 |
def list_chat(tenant_id):
|
|
|
284 |
desc = False
|
285 |
else:
|
286 |
desc = True
|
287 |
+
chats = DialogService.get_list(tenant_id, page_number, items_per_page, orderby, desc, id, name)
|
288 |
if not chats:
|
289 |
return get_result(data=[])
|
290 |
list_assts = []
|
|
|
291 |
key_mapping = {"parameters": "variables",
|
292 |
"prologue": "opener",
|
293 |
"quote": "show_quote",
|
294 |
"system": "prompt",
|
295 |
"rerank_id": "rerank_model",
|
296 |
"vector_similarity_weight": "keywords_similarity_weight",
|
297 |
+
"do_refer": "show_quotation"}
|
298 |
key_list = ["similarity_threshold", "vector_similarity_weight", "top_n", "rerank_id"]
|
299 |
for res in chats:
|
300 |
+
renamed_dict = {}
|
301 |
for key, value in res["prompt_config"].items():
|
302 |
new_key = key_mapping.get(key, key)
|
303 |
renamed_dict[new_key] = value
|
|
|
315 |
kb_list = []
|
316 |
for kb_id in res["kb_ids"]:
|
317 |
kb = KnowledgebaseService.query(id=kb_id)
|
318 |
+
if not kb:
|
319 |
return get_error_data_result(message=f"Don't exist the kb {kb_id}")
|
320 |
kb_list.append(kb[0].to_json())
|
321 |
del res["kb_ids"]
|
322 |
res["datasets"] = kb_list
|
323 |
res["avatar"] = res.pop("icon")
|
324 |
list_assts.append(res)
|
325 |
+
return get_result(data=list_assts)
|