diff --git a/api/apps/api_app.py b/api/apps/api_app.py index 98f696f1ca5194d5957558ce738eec09fb1bcdf0..3bf14590f06b8bbe413bb8c3a8823b710ff4a22e 100644 --- a/api/apps/api_app.py +++ b/api/apps/api_app.py @@ -52,7 +52,7 @@ def new_token(): try: tenants = UserTenantService.query(user_id=current_user.id) if not tenants: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") tenant_id = tenants[0].tenant_id obj = {"tenant_id": tenant_id, "token": generate_confirmation_token(tenant_id), @@ -68,7 +68,7 @@ def new_token(): obj["dialog_id"] = req["dialog_id"] if not APITokenService.save(**obj): - return get_data_error_result(retmsg="Fail to new a dialog!") + return get_data_error_result(message="Fail to new a dialog!") return get_json_result(data=obj) except Exception as e: @@ -81,7 +81,7 @@ def token_list(): try: tenants = UserTenantService.query(user_id=current_user.id) if not tenants: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") id = request.args["dialog_id"] if "dialog_id" in request.args else request.args["canvas_id"] objs = APITokenService.query(tenant_id=tenants[0].tenant_id, dialog_id=id) @@ -110,7 +110,7 @@ def stats(): try: tenants = UserTenantService.query(user_id=current_user.id) if not tenants: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") objs = API4ConversationService.stats( tenants[0].tenant_id, request.args.get( @@ -141,7 +141,7 @@ def set_conversation(): objs = APIToken.query(token=token) if not objs: return get_json_result( - data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR) + data=False, message='Token is not valid!"', code=RetCode.AUTHENTICATION_ERROR) req = request.json try: if objs[0].source == "agent": @@ -163,7 +163,7 @@ def set_conversation(): else: e, dia = DialogService.get_by_id(objs[0].dialog_id) if not e: - return get_data_error_result(retmsg="Dialog not found") + return get_data_error_result(message="Dialog not found") conv = { "id": get_uuid(), "dialog_id": dia.id, @@ -183,11 +183,11 @@ def completion(): objs = APIToken.query(token=token) if not objs: return get_json_result( - data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR) + data=False, message='Token is not valid!"', code=RetCode.AUTHENTICATION_ERROR) req = request.json e, conv = API4ConversationService.get_by_id(req["conversation_id"]) if not e: - return get_data_error_result(retmsg="Conversation not found!") + return get_data_error_result(message="Conversation not found!") if "quote" not in req: req["quote"] = False msg = [] @@ -257,7 +257,7 @@ def completion(): ans = {"answer": ans["content"], "reference": ans.get("reference", [])} fillin_conv(ans) rename_field(ans) - yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": ans}, + yield "data:" + json.dumps({"code": 0, "message": "", "data": ans}, ensure_ascii=False) + "\n\n" canvas.messages.append({"role": "assistant", "content": final_ans["content"], "id": message_id}) @@ -267,10 +267,10 @@ def completion(): cvs.dsl = json.loads(str(canvas)) API4ConversationService.append_message(conv.id, conv.to_dict()) except Exception as e: - yield "data:" + json.dumps({"retcode": 500, "retmsg": str(e), + yield "data:" + json.dumps({"code": 500, "message": str(e), "data": {"answer": "**ERROR**: " + str(e), "reference": []}}, ensure_ascii=False) + "\n\n" - yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": True}, ensure_ascii=False) + "\n\n" + yield "data:" + json.dumps({"code": 0, "message": "", "data": True}, ensure_ascii=False) + "\n\n" resp = Response(sse(), mimetype="text/event-stream") resp.headers.add_header("Cache-control", "no-cache") @@ -295,7 +295,7 @@ def completion(): conv.message.append(msg[-1]) e, dia = DialogService.get_by_id(conv.dialog_id) if not e: - return get_data_error_result(retmsg="Dialog not found!") + return get_data_error_result(message="Dialog not found!") del req["conversation_id"] del req["messages"] @@ -310,14 +310,14 @@ def completion(): for ans in chat(dia, msg, True, **req): fillin_conv(ans) rename_field(ans) - yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": ans}, + yield "data:" + json.dumps({"code": 0, "message": "", "data": ans}, ensure_ascii=False) + "\n\n" API4ConversationService.append_message(conv.id, conv.to_dict()) except Exception as e: - yield "data:" + json.dumps({"retcode": 500, "retmsg": str(e), + yield "data:" + json.dumps({"code": 500, "message": str(e), "data": {"answer": "**ERROR**: " + str(e), "reference": []}}, ensure_ascii=False) + "\n\n" - yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": True}, ensure_ascii=False) + "\n\n" + yield "data:" + json.dumps({"code": 0, "message": "", "data": True}, ensure_ascii=False) + "\n\n" if req.get("stream", True): resp = Response(stream(), mimetype="text/event-stream") @@ -347,17 +347,17 @@ def get(conversation_id): objs = APIToken.query(token=token) if not objs: return get_json_result( - data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR) + data=False, message='Token is not valid!"', code=RetCode.AUTHENTICATION_ERROR) try: e, conv = API4ConversationService.get_by_id(conversation_id) if not e: - return get_data_error_result(retmsg="Conversation not found!") + return get_data_error_result(message="Conversation not found!") conv = conv.to_dict() if token != APIToken.query(dialog_id=conv['dialog_id'])[0].token: - return get_json_result(data=False, retmsg='Token is not valid for this conversation_id!"', - retcode=RetCode.AUTHENTICATION_ERROR) + return get_json_result(data=False, message='Token is not valid for this conversation_id!"', + code=RetCode.AUTHENTICATION_ERROR) for referenct_i in conv['reference']: if referenct_i is None or len(referenct_i) == 0: @@ -378,7 +378,7 @@ def upload(): objs = APIToken.query(token=token) if not objs: return get_json_result( - data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR) + data=False, message='Token is not valid!"', code=RetCode.AUTHENTICATION_ERROR) kb_name = request.form.get("kb_name").strip() tenant_id = objs[0].tenant_id @@ -387,19 +387,19 @@ def upload(): e, kb = KnowledgebaseService.get_by_name(kb_name, tenant_id) if not e: return get_data_error_result( - retmsg="Can't find this knowledgebase!") + message="Can't find this knowledgebase!") kb_id = kb.id except Exception as e: return server_error_response(e) if 'file' not in request.files: return get_json_result( - data=False, retmsg='No file part!', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='No file part!', code=RetCode.ARGUMENT_ERROR) file = request.files['file'] if file.filename == '': return get_json_result( - data=False, retmsg='No file selected!', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='No file selected!', code=RetCode.ARGUMENT_ERROR) root_folder = FileService.get_root_folder(tenant_id) pf_id = root_folder["id"] @@ -410,7 +410,7 @@ def upload(): try: if DocumentService.get_doc_count(kb.tenant_id) >= int(os.environ.get('MAX_FILE_NUM_PER_USER', 8192)): return get_data_error_result( - retmsg="Exceed the maximum file number of a free user!") + message="Exceed the maximum file number of a free user!") filename = duplicate_name( DocumentService.query, @@ -419,7 +419,7 @@ def upload(): filetype = filename_type(filename) if not filetype: return get_data_error_result( - retmsg="This type of file has not been supported yet!") + message="This type of file has not been supported yet!") location = filename while STORAGE_IMPL.obj_exist(kb_id, location): @@ -468,7 +468,7 @@ def upload(): # if str(req["run"]) == TaskStatus.CANCEL.value: tenant_id = DocumentService.get_tenant_id(doc["id"]) if not tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") # e, doc = DocumentService.get_by_id(doc["id"]) TaskService.filter_delete([Task.doc_id == doc["id"]]) @@ -490,17 +490,17 @@ def upload_parse(): objs = APIToken.query(token=token) if not objs: return get_json_result( - data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR) + data=False, message='Token is not valid!"', code=RetCode.AUTHENTICATION_ERROR) if 'file' not in request.files: return get_json_result( - data=False, retmsg='No file part!', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='No file part!', code=RetCode.ARGUMENT_ERROR) file_objs = request.files.getlist('file') for file_obj in file_objs: if file_obj.filename == '': return get_json_result( - data=False, retmsg='No file selected!', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='No file selected!', code=RetCode.ARGUMENT_ERROR) doc_ids = doc_upload_and_parse(request.form.get("conversation_id"), file_objs, objs[0].tenant_id) return get_json_result(data=doc_ids) @@ -513,7 +513,7 @@ def list_chunks(): objs = APIToken.query(token=token) if not objs: return get_json_result( - data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR) + data=False, message='Token is not valid!"', code=RetCode.AUTHENTICATION_ERROR) req = request.json @@ -527,7 +527,7 @@ def list_chunks(): doc_id = req['doc_id'] else: return get_json_result( - data=False, retmsg="Can't find doc_name or doc_id" + data=False, message="Can't find doc_name or doc_id" ) res = retrievaler.chunk_list(doc_id=doc_id, tenant_id=tenant_id) @@ -552,7 +552,7 @@ def list_kb_docs(): objs = APIToken.query(token=token) if not objs: return get_json_result( - data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR) + data=False, message='Token is not valid!"', code=RetCode.AUTHENTICATION_ERROR) req = request.json tenant_id = objs[0].tenant_id @@ -562,7 +562,7 @@ def list_kb_docs(): e, kb = KnowledgebaseService.get_by_name(kb_name, tenant_id) if not e: return get_data_error_result( - retmsg="Can't find this knowledgebase!") + message="Can't find this knowledgebase!") kb_id = kb.id except Exception as e: @@ -591,7 +591,7 @@ def docinfos(): objs = APIToken.query(token=token) if not objs: return get_json_result( - data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR) + data=False, message='Token is not valid!"', code=RetCode.AUTHENTICATION_ERROR) req = request.json doc_ids = req["doc_ids"] docs = DocumentService.get_by_ids(doc_ids) @@ -605,7 +605,7 @@ def document_rm(): objs = APIToken.query(token=token) if not objs: return get_json_result( - data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR) + data=False, message='Token is not valid!"', code=RetCode.AUTHENTICATION_ERROR) tenant_id = objs[0].tenant_id req = request.json @@ -617,7 +617,7 @@ def document_rm(): if not doc_ids: return get_json_result( - data=False, retmsg="Can't find doc_names or doc_ids" + data=False, message="Can't find doc_names or doc_ids" ) except Exception as e: @@ -632,16 +632,16 @@ def document_rm(): try: e, doc = DocumentService.get_by_id(doc_id) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") tenant_id = DocumentService.get_tenant_id(doc_id) if not tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") b, n = File2DocumentService.get_storage_address(doc_id=doc_id) if not DocumentService.remove_document(doc, tenant_id): return get_data_error_result( - retmsg="Database error (Document removal)!") + message="Database error (Document removal)!") f2d = File2DocumentService.get_by_document_id(doc_id) FileService.filter_delete([File.source_type == FileSource.KNOWLEDGEBASE, File.id == f2d[0].file_id]) @@ -652,7 +652,7 @@ def document_rm(): errors += str(e) if errors: - return get_json_result(data=False, retmsg=errors, retcode=RetCode.SERVER_ERROR) + return get_json_result(data=False, message=errors, code=RetCode.SERVER_ERROR) return get_json_result(data=True) @@ -667,11 +667,11 @@ def completion_faq(): objs = APIToken.query(token=token) if not objs: return get_json_result( - data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR) + data=False, message='Token is not valid!"', code=RetCode.AUTHENTICATION_ERROR) e, conv = API4ConversationService.get_by_id(req["conversation_id"]) if not e: - return get_data_error_result(retmsg="Conversation not found!") + return get_data_error_result(message="Conversation not found!") if "quote" not in req: req["quote"] = True msg = [] @@ -752,7 +752,7 @@ def completion_faq(): conv.message.append(msg[-1]) e, dia = DialogService.get_by_id(conv.dialog_id) if not e: - return get_data_error_result(retmsg="Dialog not found!") + return get_data_error_result(message="Dialog not found!") del req["conversation_id"] if not conv.reference: @@ -804,7 +804,7 @@ def retrieval(): objs = APIToken.query(token=token) if not objs: return get_json_result( - data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR) + data=False, message='Token is not valid!"', code=RetCode.AUTHENTICATION_ERROR) req = request.json kb_ids = req.get("kb_id",[]) @@ -821,7 +821,7 @@ def retrieval(): embd_nms = list(set([kb.embd_id for kb in kbs])) if len(embd_nms) != 1: return get_json_result( - data=False, retmsg='Knowledge bases use different embedding models or does not exist."', retcode=RetCode.AUTHENTICATION_ERROR) + data=False, message='Knowledge bases use different embedding models or does not exist."', code=RetCode.AUTHENTICATION_ERROR) embd_mdl = TenantLLMService.model_instance( kbs[0].tenant_id, LLMType.EMBEDDING.value, llm_name=kbs[0].embd_id) @@ -841,6 +841,6 @@ def retrieval(): return get_json_result(data=ranks) except Exception as e: if str(e).find("not_found") > 0: - return get_json_result(data=False, retmsg=f'No chunk found! Check the chunk status please!', - retcode=RetCode.DATA_ERROR) + return get_json_result(data=False, message='No chunk found! Check the chunk status please!', + code=RetCode.DATA_ERROR) return server_error_response(e) diff --git a/api/apps/canvas_app.py b/api/apps/canvas_app.py index b6a49ba42b7b65d34cc66db7fa40a0b2f0abe3dc..dc4c37848eddae706369d80b66fd75f0f14dda7f 100644 --- a/api/apps/canvas_app.py +++ b/api/apps/canvas_app.py @@ -46,8 +46,8 @@ def rm(): for i in request.json["canvas_ids"]: if not UserCanvasService.query(user_id=current_user.id,id=i): return get_json_result( - data=False, retmsg=f'Only owner of canvas authorized for this operation.', - retcode=RetCode.OPERATING_ERROR) + data=False, message='Only owner of canvas authorized for this operation.', + code=RetCode.OPERATING_ERROR) UserCanvasService.delete_by_id(i) return get_json_result(data=True) @@ -66,12 +66,12 @@ def save(): return server_error_response(ValueError("Duplicated title.")) req["id"] = get_uuid() if not UserCanvasService.save(**req): - return get_data_error_result(retmsg="Fail to save canvas.") + return get_data_error_result(message="Fail to save canvas.") else: if not UserCanvasService.query(user_id=current_user.id, id=req["id"]): return get_json_result( - data=False, retmsg=f'Only owner of canvas authorized for this operation.', - retcode=RetCode.OPERATING_ERROR) + data=False, message='Only owner of canvas authorized for this operation.', + code=RetCode.OPERATING_ERROR) UserCanvasService.update_by_id(req["id"], req) return get_json_result(data=req) @@ -81,7 +81,7 @@ def save(): def get(canvas_id): e, c = UserCanvasService.get_by_id(canvas_id) if not e: - return get_data_error_result(retmsg="canvas not found.") + return get_data_error_result(message="canvas not found.") return get_json_result(data=c.to_dict()) @@ -93,11 +93,11 @@ def run(): stream = req.get("stream", True) e, cvs = UserCanvasService.get_by_id(req["id"]) if not e: - return get_data_error_result(retmsg="canvas not found.") + return get_data_error_result(message="canvas not found.") if not UserCanvasService.query(user_id=current_user.id, id=req["id"]): return get_json_result( - data=False, retmsg=f'Only owner of canvas authorized for this operation.', - retcode=RetCode.OPERATING_ERROR) + data=False, message='Only owner of canvas authorized for this operation.', + code=RetCode.OPERATING_ERROR) if not isinstance(cvs.dsl, str): cvs.dsl = json.dumps(cvs.dsl, ensure_ascii=False) @@ -130,7 +130,7 @@ def run(): for k in ans.keys(): final_ans[k] = ans[k] ans = {"answer": ans["content"], "reference": ans.get("reference", [])} - yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": ans}, ensure_ascii=False) + "\n\n" + yield "data:" + json.dumps({"code": 0, "message": "", "data": ans}, ensure_ascii=False) + "\n\n" canvas.messages.append({"role": "assistant", "content": final_ans["content"], "id": message_id}) canvas.history.append(("assistant", final_ans["content"])) @@ -139,10 +139,10 @@ def run(): cvs.dsl = json.loads(str(canvas)) UserCanvasService.update_by_id(req["id"], cvs.to_dict()) except Exception as e: - yield "data:" + json.dumps({"retcode": 500, "retmsg": str(e), + yield "data:" + json.dumps({"code": 500, "message": str(e), "data": {"answer": "**ERROR**: " + str(e), "reference": []}}, ensure_ascii=False) + "\n\n" - yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": True}, ensure_ascii=False) + "\n\n" + yield "data:" + json.dumps({"code": 0, "message": "", "data": True}, ensure_ascii=False) + "\n\n" resp = Response(sse(), mimetype="text/event-stream") resp.headers.add_header("Cache-control", "no-cache") @@ -168,11 +168,11 @@ def reset(): try: e, user_canvas = UserCanvasService.get_by_id(req["id"]) if not e: - return get_data_error_result(retmsg="canvas not found.") + return get_data_error_result(message="canvas not found.") if not UserCanvasService.query(user_id=current_user.id, id=req["id"]): return get_json_result( - data=False, retmsg=f'Only owner of canvas authorized for this operation.', - retcode=RetCode.OPERATING_ERROR) + data=False, message='Only owner of canvas authorized for this operation.', + code=RetCode.OPERATING_ERROR) canvas = Canvas(json.dumps(user_canvas.dsl), current_user.id) canvas.reset() diff --git a/api/apps/chunk_app.py b/api/apps/chunk_app.py index f79a3673eed97f7e15f135d4d7444fd2c63201ed..02abad1ddb6311053d67da4c047fdbc3ca0c581e 100644 --- a/api/apps/chunk_app.py +++ b/api/apps/chunk_app.py @@ -15,7 +15,6 @@ # import datetime import json -import traceback from flask import request from flask_login import login_required, current_user @@ -50,10 +49,10 @@ def list_chunk(): try: tenant_id = DocumentService.get_tenant_id(req["doc_id"]) if not tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") e, doc = DocumentService.get_by_id(doc_id) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") query = { "doc_ids": [doc_id], "page": page, "size": size, "question": question, "sort": True } @@ -84,8 +83,8 @@ def list_chunk(): return get_json_result(data=res) except Exception as e: if str(e).find("not_found") > 0: - return get_json_result(data=False, retmsg=f'No chunk found!', - retcode=RetCode.DATA_ERROR) + return get_json_result(data=False, message='No chunk found!', + code=RetCode.DATA_ERROR) return server_error_response(e) @@ -96,7 +95,7 @@ def get(): try: tenants = UserTenantService.query(user_id=current_user.id) if not tenants: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") res = ELASTICSEARCH.get( chunk_id, search.index_name( tenants[0].tenant_id)) @@ -115,8 +114,8 @@ def get(): return get_json_result(data=res) except Exception as e: if str(e).find("NotFoundError") >= 0: - return get_json_result(data=False, retmsg=f'Chunk not found!', - retcode=RetCode.DATA_ERROR) + return get_json_result(data=False, message='Chunk not found!', + code=RetCode.DATA_ERROR) return server_error_response(e) @@ -139,14 +138,14 @@ def set(): try: tenant_id = DocumentService.get_tenant_id(req["doc_id"]) if not tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") embd_id = DocumentService.get_embd_id(req["doc_id"]) embd_mdl = LLMBundle(tenant_id, LLMType.EMBEDDING, embd_id) e, doc = DocumentService.get_by_id(req["doc_id"]) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") if doc.parser_id == ParserType.QA: arr = [ @@ -155,7 +154,7 @@ def set(): req["content_with_weight"]) if len(t) > 1] if len(arr) != 2: return get_data_error_result( - retmsg="Q&A must be separated by TAB/ENTER key.") + message="Q&A must be separated by TAB/ENTER key.") q, a = rmPrefix(arr[0]), rmPrefix(arr[1]) d = beAdoc(d, arr[0], arr[1], not any( [rag_tokenizer.is_chinese(t) for t in q + a])) @@ -177,10 +176,10 @@ def switch(): try: tenant_id = DocumentService.get_tenant_id(req["doc_id"]) if not tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") if not ELASTICSEARCH.upsert([{"id": i, "available_int": int(req["available_int"])} for i in req["chunk_ids"]], search.index_name(tenant_id)): - return get_data_error_result(retmsg="Index updating failure") + return get_data_error_result(message="Index updating failure") return get_json_result(data=True) except Exception as e: return server_error_response(e) @@ -194,10 +193,10 @@ def rm(): try: if not ELASTICSEARCH.deleteByQuery( Q("ids", values=req["chunk_ids"]), search.index_name(current_user.id)): - return get_data_error_result(retmsg="Index updating failure") + return get_data_error_result(message="Index updating failure") e, doc = DocumentService.get_by_id(req["doc_id"]) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") deleted_chunk_ids = req["chunk_ids"] chunk_number = len(deleted_chunk_ids) DocumentService.decrement_chunk_num(doc.id, doc.kb_id, 1, chunk_number, 0) @@ -225,14 +224,14 @@ def create(): try: e, doc = DocumentService.get_by_id(req["doc_id"]) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") d["kb_id"] = [doc.kb_id] d["docnm_kwd"] = doc.name d["doc_id"] = doc.id tenant_id = DocumentService.get_tenant_id(req["doc_id"]) if not tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") embd_id = DocumentService.get_embd_id(req["doc_id"]) embd_mdl = LLMBundle(tenant_id, LLMType.EMBEDDING.value, embd_id) @@ -273,12 +272,12 @@ def retrieval_test(): break else: return get_json_result( - data=False, retmsg=f'Only owner of knowledgebase authorized for this operation.', - retcode=RetCode.OPERATING_ERROR) + data=False, message='Only owner of knowledgebase authorized for this operation.', + code=RetCode.OPERATING_ERROR) e, kb = KnowledgebaseService.get_by_id(kb_id[0]) if not e: - return get_data_error_result(retmsg="Knowledgebase not found!") + return get_data_error_result(message="Knowledgebase not found!") embd_mdl = LLMBundle(kb.tenant_id, LLMType.EMBEDDING.value, llm_name=kb.embd_id) @@ -301,8 +300,8 @@ def retrieval_test(): return get_json_result(data=ranks) except Exception as e: if str(e).find("not_found") > 0: - return get_json_result(data=False, retmsg=f'No chunk found! Check the chunk status please!', - retcode=RetCode.DATA_ERROR) + return get_json_result(data=False, message='No chunk found! Check the chunk status please!', + code=RetCode.DATA_ERROR) return server_error_response(e) @@ -321,7 +320,7 @@ def knowledge_graph(): ty = sres.field[id]["knowledge_graph_kwd"] try: content_json = json.loads(sres.field[id]["content_with_weight"]) - except Exception as e: + except Exception: continue if ty == 'mind_map': diff --git a/api/apps/conversation_app.py b/api/apps/conversation_app.py index 02f0545164aaa5766b3699e3af335fe5d89a56cc..a86a0dbaea775d22de39d019c7cce60a45a8c5e9 100644 --- a/api/apps/conversation_app.py +++ b/api/apps/conversation_app.py @@ -42,11 +42,11 @@ def set_conversation(): del req["conversation_id"] try: if not ConversationService.update_by_id(conv_id, req): - return get_data_error_result(retmsg="Conversation not found!") + return get_data_error_result(message="Conversation not found!") e, conv = ConversationService.get_by_id(conv_id) if not e: return get_data_error_result( - retmsg="Fail to update a conversation!") + message="Fail to update a conversation!") conv = conv.to_dict() return get_json_result(data=conv) except Exception as e: @@ -55,7 +55,7 @@ def set_conversation(): try: e, dia = DialogService.get_by_id(req["dialog_id"]) if not e: - return get_data_error_result(retmsg="Dialog not found") + return get_data_error_result(message="Dialog not found") conv = { "id": conv_id, "dialog_id": req["dialog_id"], @@ -65,7 +65,7 @@ def set_conversation(): ConversationService.save(**conv) e, conv = ConversationService.get_by_id(conv["id"]) if not e: - return get_data_error_result(retmsg="Fail to new a conversation!") + return get_data_error_result(message="Fail to new a conversation!") conv = conv.to_dict() return get_json_result(data=conv) except Exception as e: @@ -79,15 +79,15 @@ def get(): try: e, conv = ConversationService.get_by_id(conv_id) if not e: - return get_data_error_result(retmsg="Conversation not found!") + return get_data_error_result(message="Conversation not found!") tenants = UserTenantService.query(user_id=current_user.id) for tenant in tenants: if DialogService.query(tenant_id=tenant.tenant_id, id=conv.dialog_id): break else: return get_json_result( - data=False, retmsg=f'Only owner of conversation authorized for this operation.', - retcode=RetCode.OPERATING_ERROR) + data=False, message='Only owner of conversation authorized for this operation.', + code=RetCode.OPERATING_ERROR) conv = conv.to_dict() return get_json_result(data=conv) except Exception as e: @@ -102,15 +102,15 @@ def rm(): for cid in conv_ids: exist, conv = ConversationService.get_by_id(cid) if not exist: - return get_data_error_result(retmsg="Conversation not found!") + return get_data_error_result(message="Conversation not found!") tenants = UserTenantService.query(user_id=current_user.id) for tenant in tenants: if DialogService.query(tenant_id=tenant.tenant_id, id=conv.dialog_id): break else: return get_json_result( - data=False, retmsg=f'Only owner of conversation authorized for this operation.', - retcode=RetCode.OPERATING_ERROR) + data=False, message='Only owner of conversation authorized for this operation.', + code=RetCode.OPERATING_ERROR) ConversationService.delete_by_id(cid) return get_json_result(data=True) except Exception as e: @@ -124,8 +124,8 @@ def list_convsersation(): try: if not DialogService.query(tenant_id=current_user.id, id=dialog_id): return get_json_result( - data=False, retmsg=f'Only owner of dialog authorized for this operation.', - retcode=RetCode.OPERATING_ERROR) + data=False, message='Only owner of dialog authorized for this operation.', + code=RetCode.OPERATING_ERROR) convs = ConversationService.query( dialog_id=dialog_id, order_by=ConversationService.model.create_time, @@ -152,11 +152,11 @@ def completion(): try: e, conv = ConversationService.get_by_id(req["conversation_id"]) if not e: - return get_data_error_result(retmsg="Conversation not found!") + return get_data_error_result(message="Conversation not found!") conv.message = deepcopy(req["messages"]) e, dia = DialogService.get_by_id(conv.dialog_id) if not e: - return get_data_error_result(retmsg="Dialog not found!") + return get_data_error_result(message="Dialog not found!") del req["conversation_id"] del req["messages"] @@ -180,14 +180,14 @@ def completion(): try: for ans in chat(dia, msg, True, **req): fillin_conv(ans) - yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": ans}, ensure_ascii=False) + "\n\n" + yield "data:" + json.dumps({"code": 0, "message": "", "data": ans}, ensure_ascii=False) + "\n\n" ConversationService.update_by_id(conv.id, conv.to_dict()) except Exception as e: traceback.print_exc() - yield "data:" + json.dumps({"retcode": 500, "retmsg": str(e), + yield "data:" + json.dumps({"code": 500, "message": str(e), "data": {"answer": "**ERROR**: " + str(e), "reference": []}}, ensure_ascii=False) + "\n\n" - yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": True}, ensure_ascii=False) + "\n\n" + yield "data:" + json.dumps({"code": 0, "message": "", "data": True}, ensure_ascii=False) + "\n\n" if req.get("stream", True): resp = Response(stream(), mimetype="text/event-stream") @@ -217,11 +217,11 @@ def tts(): tenants = TenantService.get_info_by(current_user.id) if not tenants: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") tts_id = tenants[0]["tts_id"] if not tts_id: - return get_data_error_result(retmsg="No default TTS model is set") + return get_data_error_result(message="No default TTS model is set") tts_mdl = LLMBundle(tenants[0]["tenant_id"], LLMType.TTS, tts_id) @@ -231,7 +231,7 @@ def tts(): for chunk in tts_mdl.tts(txt): yield chunk except Exception as e: - yield ("data:" + json.dumps({"retcode": 500, "retmsg": str(e), + yield ("data:" + json.dumps({"code": 500, "message": str(e), "data": {"answer": "**ERROR**: " + str(e)}}, ensure_ascii=False)).encode('utf-8') @@ -250,7 +250,7 @@ def delete_msg(): req = request.json e, conv = ConversationService.get_by_id(req["conversation_id"]) if not e: - return get_data_error_result(retmsg="Conversation not found!") + return get_data_error_result(message="Conversation not found!") conv = conv.to_dict() for i, msg in enumerate(conv["message"]): @@ -273,7 +273,7 @@ def thumbup(): req = request.json e, conv = ConversationService.get_by_id(req["conversation_id"]) if not e: - return get_data_error_result(retmsg="Conversation not found!") + return get_data_error_result(message="Conversation not found!") up_down = req.get("set") feedback = req.get("feedback", "") conv = conv.to_dict() @@ -301,12 +301,12 @@ def ask_about(): nonlocal req, uid try: for ans in ask(req["question"], req["kb_ids"], uid): - yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": ans}, ensure_ascii=False) + "\n\n" + yield "data:" + json.dumps({"code": 0, "message": "", "data": ans}, ensure_ascii=False) + "\n\n" except Exception as e: - yield "data:" + json.dumps({"retcode": 500, "retmsg": str(e), + yield "data:" + json.dumps({"code": 500, "message": str(e), "data": {"answer": "**ERROR**: " + str(e), "reference": []}}, ensure_ascii=False) + "\n\n" - yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": True}, ensure_ascii=False) + "\n\n" + yield "data:" + json.dumps({"code": 0, "message": "", "data": True}, ensure_ascii=False) + "\n\n" resp = Response(stream(), mimetype="text/event-stream") resp.headers.add_header("Cache-control", "no-cache") @@ -324,7 +324,7 @@ def mindmap(): kb_ids = req["kb_ids"] e, kb = KnowledgebaseService.get_by_id(kb_ids[0]) if not e: - return get_data_error_result(retmsg="Knowledgebase not found!") + return get_data_error_result(message="Knowledgebase not found!") embd_mdl = TenantLLMService.model_instance( kb.tenant_id, LLMType.EMBEDDING.value, llm_name=kb.embd_id) diff --git a/api/apps/dialog_app.py b/api/apps/dialog_app.py index 371362c676ff1a618d12867e18527dfde1ef13c1..e3c87a1fc41d66ecfd7a3dc179bcc109306217e8 100644 --- a/api/apps/dialog_app.py +++ b/api/apps/dialog_app.py @@ -68,17 +68,17 @@ def set_dialog(): continue if prompt_config["system"].find("{%s}" % p["key"]) < 0: return get_data_error_result( - retmsg="Parameter '{}' is not used".format(p["key"])) + message="Parameter '{}' is not used".format(p["key"])) try: e, tenant = TenantService.get_by_id(current_user.id) if not e: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") llm_id = req.get("llm_id", tenant.llm_id) if not dialog_id: if not req.get("kb_ids"): return get_data_error_result( - retmsg="Fail! Please select knowledgebase!") + message="Fail! Please select knowledgebase!") dia = { "id": get_uuid(), "tenant_id": current_user.id, @@ -96,20 +96,20 @@ def set_dialog(): "icon": icon } if not DialogService.save(**dia): - return get_data_error_result(retmsg="Fail to new a dialog!") + return get_data_error_result(message="Fail to new a dialog!") e, dia = DialogService.get_by_id(dia["id"]) if not e: - return get_data_error_result(retmsg="Fail to new a dialog!") + return get_data_error_result(message="Fail to new a dialog!") return get_json_result(data=dia.to_json()) else: del req["dialog_id"] if "kb_names" in req: del req["kb_names"] if not DialogService.update_by_id(dialog_id, req): - return get_data_error_result(retmsg="Dialog not found!") + return get_data_error_result(message="Dialog not found!") e, dia = DialogService.get_by_id(dialog_id) if not e: - return get_data_error_result(retmsg="Fail to update a dialog!") + return get_data_error_result(message="Fail to update a dialog!") dia = dia.to_dict() dia["kb_ids"], dia["kb_names"] = get_kb_names(dia["kb_ids"]) return get_json_result(data=dia) @@ -124,7 +124,7 @@ def get(): try: e, dia = DialogService.get_by_id(dialog_id) if not e: - return get_data_error_result(retmsg="Dialog not found!") + return get_data_error_result(message="Dialog not found!") dia = dia.to_dict() dia["kb_ids"], dia["kb_names"] = get_kb_names(dia["kb_ids"]) return get_json_result(data=dia) @@ -174,8 +174,8 @@ def rm(): break else: return get_json_result( - data=False, retmsg=f'Only owner of dialog authorized for this operation.', - retcode=RetCode.OPERATING_ERROR) + data=False, message='Only owner of dialog authorized for this operation.', + code=RetCode.OPERATING_ERROR) dialog_list.append({"id": id,"status":StatusEnum.INVALID.value}) DialogService.update_many_by_id(dialog_list) return get_json_result(data=True) diff --git a/api/apps/document_app.py b/api/apps/document_app.py index 0e4af1447863bb07bfd6c04b83634b6923086f33..c6446f3d60566dd3e7166459935d618d2e7fc4f6 100644 --- a/api/apps/document_app.py +++ b/api/apps/document_app.py @@ -49,16 +49,16 @@ def upload(): kb_id = request.form.get("kb_id") if not kb_id: return get_json_result( - data=False, retmsg='Lack of "KB ID"', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='Lack of "KB ID"', code=RetCode.ARGUMENT_ERROR) if 'file' not in request.files: return get_json_result( - data=False, retmsg='No file part!', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='No file part!', code=RetCode.ARGUMENT_ERROR) file_objs = request.files.getlist('file') for file_obj in file_objs: if file_obj.filename == '': return get_json_result( - data=False, retmsg='No file selected!', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='No file selected!', code=RetCode.ARGUMENT_ERROR) e, kb = KnowledgebaseService.get_by_id(kb_id) if not e: @@ -67,7 +67,7 @@ def upload(): err, _ = FileService.upload_document(kb, file_objs, current_user.id) if err: return get_json_result( - data=False, retmsg="\n".join(err), retcode=RetCode.SERVER_ERROR) + data=False, message="\n".join(err), code=RetCode.SERVER_ERROR) return get_json_result(data=True) @@ -78,12 +78,12 @@ def web_crawl(): kb_id = request.form.get("kb_id") if not kb_id: return get_json_result( - data=False, retmsg='Lack of "KB ID"', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='Lack of "KB ID"', code=RetCode.ARGUMENT_ERROR) name = request.form.get("name") url = request.form.get("url") if not is_valid_url(url): return get_json_result( - data=False, retmsg='The URL format is invalid', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='The URL format is invalid', code=RetCode.ARGUMENT_ERROR) e, kb = KnowledgebaseService.get_by_id(kb_id) if not e: raise LookupError("Can't find this knowledgebase!") @@ -145,17 +145,17 @@ def create(): kb_id = req["kb_id"] if not kb_id: return get_json_result( - data=False, retmsg='Lack of "KB ID"', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='Lack of "KB ID"', code=RetCode.ARGUMENT_ERROR) try: e, kb = KnowledgebaseService.get_by_id(kb_id) if not e: return get_data_error_result( - retmsg="Can't find this knowledgebase!") + message="Can't find this knowledgebase!") if DocumentService.query(name=req["name"], kb_id=kb_id): return get_data_error_result( - retmsg="Duplicated document name in the same knowledgebase.") + message="Duplicated document name in the same knowledgebase.") doc = DocumentService.insert({ "id": get_uuid(), @@ -179,7 +179,7 @@ def list_docs(): kb_id = request.args.get("kb_id") if not kb_id: return get_json_result( - data=False, retmsg='Lack of "KB ID"', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='Lack of "KB ID"', code=RetCode.ARGUMENT_ERROR) tenants = UserTenantService.query(user_id=current_user.id) for tenant in tenants: if KnowledgebaseService.query( @@ -187,8 +187,8 @@ def list_docs(): break else: return get_json_result( - data=False, retmsg=f'Only owner of knowledgebase authorized for this operation.', - retcode=RetCode.OPERATING_ERROR) + data=False, message='Only owner of knowledgebase authorized for this operation.', + code=RetCode.OPERATING_ERROR) keywords = request.args.get("keywords", "") page_number = int(request.args.get("page", 1)) @@ -217,8 +217,8 @@ def docinfos(): if not DocumentService.accessible(doc_id, current_user.id): return get_json_result( data=False, - retmsg='No authorization.', - retcode=RetCode.AUTHENTICATION_ERROR + message='No authorization.', + code=RetCode.AUTHENTICATION_ERROR ) docs = DocumentService.get_by_ids(doc_ids) return get_json_result(data=list(docs.dicts())) @@ -230,7 +230,7 @@ def thumbnails(): doc_ids = request.args.get("doc_ids").split(",") if not doc_ids: return get_json_result( - data=False, retmsg='Lack of "Document ID"', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='Lack of "Document ID"', code=RetCode.ARGUMENT_ERROR) try: docs = DocumentService.get_thumbnails(doc_ids) @@ -252,28 +252,28 @@ def change_status(): if str(req["status"]) not in ["0", "1"]: return get_json_result( data=False, - retmsg='"Status" must be either 0 or 1!', - retcode=RetCode.ARGUMENT_ERROR) + message='"Status" must be either 0 or 1!', + code=RetCode.ARGUMENT_ERROR) if not DocumentService.accessible(req["doc_id"], current_user.id): return get_json_result( data=False, - retmsg='No authorization.', - retcode=RetCode.AUTHENTICATION_ERROR) + message='No authorization.', + code=RetCode.AUTHENTICATION_ERROR) try: e, doc = DocumentService.get_by_id(req["doc_id"]) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") e, kb = KnowledgebaseService.get_by_id(doc.kb_id) if not e: return get_data_error_result( - retmsg="Can't find this knowledgebase!") + message="Can't find this knowledgebase!") if not DocumentService.update_by_id( req["doc_id"], {"status": str(req["status"])}): return get_data_error_result( - retmsg="Database error (Document update)!") + message="Database error (Document update)!") if str(req["status"]) == "0": ELASTICSEARCH.updateScriptByQuery(Q("term", doc_id=req["doc_id"]), @@ -304,8 +304,8 @@ def rm(): if not DocumentService.accessible4deletion(doc_id, current_user.id): return get_json_result( data=False, - retmsg='No authorization.', - retcode=RetCode.AUTHENTICATION_ERROR + message='No authorization.', + code=RetCode.AUTHENTICATION_ERROR ) root_folder = FileService.get_root_folder(current_user.id) @@ -316,16 +316,16 @@ def rm(): try: e, doc = DocumentService.get_by_id(doc_id) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") tenant_id = DocumentService.get_tenant_id(doc_id) if not tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") b, n = File2DocumentService.get_storage_address(doc_id=doc_id) if not DocumentService.remove_document(doc, tenant_id): return get_data_error_result( - retmsg="Database error (Document removal)!") + message="Database error (Document removal)!") f2d = File2DocumentService.get_by_document_id(doc_id) FileService.filter_delete([File.source_type == FileSource.KNOWLEDGEBASE, File.id == f2d[0].file_id]) @@ -336,7 +336,7 @@ def rm(): errors += str(e) if errors: - return get_json_result(data=False, retmsg=errors, retcode=RetCode.SERVER_ERROR) + return get_json_result(data=False, message=errors, code=RetCode.SERVER_ERROR) return get_json_result(data=True) @@ -350,8 +350,8 @@ def run(): if not DocumentService.accessible(doc_id, current_user.id): return get_json_result( data=False, - retmsg='No authorization.', - retcode=RetCode.AUTHENTICATION_ERROR + message='No authorization.', + code=RetCode.AUTHENTICATION_ERROR ) try: for id in req["doc_ids"]: @@ -364,7 +364,7 @@ def run(): # if str(req["run"]) == TaskStatus.CANCEL.value: tenant_id = DocumentService.get_tenant_id(id) if not tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") ELASTICSEARCH.deleteByQuery( Q("match", doc_id=id), idxnm=search.index_name(tenant_id)) @@ -389,28 +389,28 @@ def rename(): if not DocumentService.accessible(req["doc_id"], current_user.id): return get_json_result( data=False, - retmsg='No authorization.', - retcode=RetCode.AUTHENTICATION_ERROR + message='No authorization.', + code=RetCode.AUTHENTICATION_ERROR ) try: e, doc = DocumentService.get_by_id(req["doc_id"]) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") if pathlib.Path(req["name"].lower()).suffix != pathlib.Path( doc.name.lower()).suffix: return get_json_result( data=False, - retmsg="The extension of file can't be changed", - retcode=RetCode.ARGUMENT_ERROR) + message="The extension of file can't be changed", + code=RetCode.ARGUMENT_ERROR) for d in DocumentService.query(name=req["name"], kb_id=doc.kb_id): if d.name == req["name"]: return get_data_error_result( - retmsg="Duplicated document name in the same knowledgebase.") + message="Duplicated document name in the same knowledgebase.") if not DocumentService.update_by_id( req["doc_id"], {"name": req["name"]}): return get_data_error_result( - retmsg="Database error (Document rename)!") + message="Database error (Document rename)!") informs = File2DocumentService.get_by_document_id(req["doc_id"]) if informs: @@ -428,7 +428,7 @@ def get(doc_id): try: e, doc = DocumentService.get_by_id(doc_id) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") b, n = File2DocumentService.get_storage_address(doc_id=doc_id) response = flask.make_response(STORAGE_IMPL.get(b, n)) @@ -456,13 +456,13 @@ def change_parser(): if not DocumentService.accessible(req["doc_id"], current_user.id): return get_json_result( data=False, - retmsg='No authorization.', - retcode=RetCode.AUTHENTICATION_ERROR + message='No authorization.', + code=RetCode.AUTHENTICATION_ERROR ) try: e, doc = DocumentService.get_by_id(req["doc_id"]) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") if doc.parser_id.lower() == req["parser_id"].lower(): if "parser_config" in req: if req["parser_config"] == doc.parser_config: @@ -473,23 +473,23 @@ def change_parser(): if ((doc.type == FileType.VISUAL and req["parser_id"] != "picture") or (re.search( r"\.(ppt|pptx|pages)$", doc.name) and req["parser_id"] != "presentation")): - return get_data_error_result(retmsg="Not supported yet!") + return get_data_error_result(message="Not supported yet!") e = DocumentService.update_by_id(doc.id, {"parser_id": req["parser_id"], "progress": 0, "progress_msg": "", "run": TaskStatus.UNSTART.value}) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") if "parser_config" in req: DocumentService.update_parser_config(doc.id, req["parser_config"]) if doc.token_num > 0: e = DocumentService.increment_chunk_num(doc.id, doc.kb_id, doc.token_num * -1, doc.chunk_num * -1, doc.process_duation * -1) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") tenant_id = DocumentService.get_tenant_id(req["doc_id"]) if not tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") ELASTICSEARCH.deleteByQuery( Q("match", doc_id=doc.id), idxnm=search.index_name(tenant_id)) @@ -516,13 +516,13 @@ def get_image(image_id): def upload_and_parse(): if 'file' not in request.files: return get_json_result( - data=False, retmsg='No file part!', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='No file part!', code=RetCode.ARGUMENT_ERROR) file_objs = request.files.getlist('file') for file_obj in file_objs: if file_obj.filename == '': return get_json_result( - data=False, retmsg='No file selected!', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='No file selected!', code=RetCode.ARGUMENT_ERROR) doc_ids = doc_upload_and_parse(request.form.get("conversation_id"), file_objs, current_user.id) diff --git a/api/apps/file2document_app.py b/api/apps/file2document_app.py index 1e4b2c9ad3fe2056d490cf9eaad3af749e4499f3..97209b78033cc331991dcf52baf15abe2a785e68 100644 --- a/api/apps/file2document_app.py +++ b/api/apps/file2document_app.py @@ -13,9 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License # -from elasticsearch_dsl import Q -from api.db.db_models import File2Document from api.db.services.file2document_service import File2DocumentService from api.db.services.file_service import FileService @@ -28,8 +26,6 @@ from api.db import FileType from api.db.services.document_service import DocumentService from api.settings import RetCode from api.utils.api_utils import get_json_result -from rag.nlp import search -from rag.utils.es_conn import ELASTICSEARCH @manager.route('/convert', methods=['POST']) @@ -54,13 +50,13 @@ def convert(): doc_id = inform.document_id e, doc = DocumentService.get_by_id(doc_id) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") tenant_id = DocumentService.get_tenant_id(doc_id) if not tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") if not DocumentService.remove_document(doc, tenant_id): return get_data_error_result( - retmsg="Database error (Document removal)!") + message="Database error (Document removal)!") File2DocumentService.delete_by_file_id(id) # insert @@ -68,11 +64,11 @@ def convert(): e, kb = KnowledgebaseService.get_by_id(kb_id) if not e: return get_data_error_result( - retmsg="Can't find this knowledgebase!") + message="Can't find this knowledgebase!") e, file = FileService.get_by_id(id) if not e: return get_data_error_result( - retmsg="Can't find this file!") + message="Can't find this file!") doc = DocumentService.insert({ "id": get_uuid(), @@ -104,26 +100,26 @@ def rm(): file_ids = req["file_ids"] if not file_ids: return get_json_result( - data=False, retmsg='Lack of "Files ID"', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='Lack of "Files ID"', code=RetCode.ARGUMENT_ERROR) try: for file_id in file_ids: informs = File2DocumentService.get_by_file_id(file_id) if not informs: - return get_data_error_result(retmsg="Inform not found!") + return get_data_error_result(message="Inform not found!") for inform in informs: if not inform: - return get_data_error_result(retmsg="Inform not found!") + return get_data_error_result(message="Inform not found!") File2DocumentService.delete_by_file_id(file_id) doc_id = inform.document_id e, doc = DocumentService.get_by_id(doc_id) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") tenant_id = DocumentService.get_tenant_id(doc_id) if not tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") if not DocumentService.remove_document(doc, tenant_id): return get_data_error_result( - retmsg="Database error (Document removal)!") + message="Database error (Document removal)!") return get_json_result(data=True) except Exception as e: return server_error_response(e) diff --git a/api/apps/file_app.py b/api/apps/file_app.py index 4f4b44af98f3992e5f4573dc3e87b696075453eb..318a98fc7777af49b1b595f0d78f84afdf2bf70c 100644 --- a/api/apps/file_app.py +++ b/api/apps/file_app.py @@ -18,7 +18,6 @@ import pathlib import re import flask -from elasticsearch_dsl import Q from flask import request from flask_login import login_required, current_user @@ -32,8 +31,6 @@ from api.db.services.file_service import FileService from api.settings import RetCode from api.utils.api_utils import get_json_result from api.utils.file_utils import filename_type -from rag.nlp import search -from rag.utils.es_conn import ELASTICSEARCH from rag.utils.storage_factory import STORAGE_IMPL @@ -49,24 +46,24 @@ def upload(): if 'file' not in request.files: return get_json_result( - data=False, retmsg='No file part!', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='No file part!', code=RetCode.ARGUMENT_ERROR) file_objs = request.files.getlist('file') for file_obj in file_objs: if file_obj.filename == '': return get_json_result( - data=False, retmsg='No file selected!', retcode=RetCode.ARGUMENT_ERROR) + data=False, message='No file selected!', code=RetCode.ARGUMENT_ERROR) file_res = [] try: for file_obj in file_objs: e, file = FileService.get_by_id(pf_id) if not e: return get_data_error_result( - retmsg="Can't find this folder!") + message="Can't find this folder!") MAX_FILE_NUM_PER_USER = int(os.environ.get('MAX_FILE_NUM_PER_USER', 0)) if MAX_FILE_NUM_PER_USER > 0 and DocumentService.get_doc_count(current_user.id) >= MAX_FILE_NUM_PER_USER: return get_data_error_result( - retmsg="Exceed the maximum file number of a free user!") + message="Exceed the maximum file number of a free user!") # split file name path if not file_obj.filename: @@ -85,13 +82,13 @@ def upload(): if file_len != len_id_list: e, file = FileService.get_by_id(file_id_list[len_id_list - 1]) if not e: - return get_data_error_result(retmsg="Folder not found!") + return get_data_error_result(message="Folder not found!") last_folder = FileService.create_folder(file, file_id_list[len_id_list - 1], file_obj_names, len_id_list) else: e, file = FileService.get_by_id(file_id_list[len_id_list - 2]) if not e: - return get_data_error_result(retmsg="Folder not found!") + return get_data_error_result(message="Folder not found!") last_folder = FileService.create_folder(file, file_id_list[len_id_list - 2], file_obj_names, len_id_list) @@ -137,10 +134,10 @@ def create(): try: if not FileService.is_parent_folder_exist(pf_id): return get_json_result( - data=False, retmsg="Parent Folder Doesn't Exist!", retcode=RetCode.OPERATING_ERROR) + data=False, message="Parent Folder Doesn't Exist!", code=RetCode.OPERATING_ERROR) if FileService.query(name=req["name"], parent_id=pf_id): return get_data_error_result( - retmsg="Duplicated folder name in the same folder.") + message="Duplicated folder name in the same folder.") if input_file_type == FileType.FOLDER.value: file_type = FileType.FOLDER.value @@ -181,14 +178,14 @@ def list_files(): try: e, file = FileService.get_by_id(pf_id) if not e: - return get_data_error_result(retmsg="Folder not found!") + return get_data_error_result(message="Folder not found!") files, total = FileService.get_by_pf_id( current_user.id, pf_id, page_number, items_per_page, orderby, desc, keywords) parent_folder = FileService.get_parent_folder(pf_id) if not FileService.get_parent_folder(pf_id): - return get_json_result(retmsg="File not found!") + return get_json_result(message="File not found!") return get_json_result(data={"total": total, "files": files, "parent_folder": parent_folder.to_json()}) except Exception as e: @@ -212,7 +209,7 @@ def get_parent_folder(): try: e, file = FileService.get_by_id(file_id) if not e: - return get_data_error_result(retmsg="Folder not found!") + return get_data_error_result(message="Folder not found!") parent_folder = FileService.get_parent_folder(file_id) return get_json_result(data={"parent_folder": parent_folder.to_json()}) @@ -227,7 +224,7 @@ def get_all_parent_folders(): try: e, file = FileService.get_by_id(file_id) if not e: - return get_data_error_result(retmsg="Folder not found!") + return get_data_error_result(message="Folder not found!") parent_folders = FileService.get_all_parent_folders(file_id) parent_folders_res = [] @@ -248,9 +245,9 @@ def rm(): for file_id in file_ids: e, file = FileService.get_by_id(file_id) if not e: - return get_data_error_result(retmsg="File or Folder not found!") + return get_data_error_result(message="File or Folder not found!") if not file.tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") if file.source_type == FileSource.KNOWLEDGEBASE: continue @@ -259,13 +256,13 @@ def rm(): for inner_file_id in file_id_list: e, file = FileService.get_by_id(inner_file_id) if not e: - return get_data_error_result(retmsg="File not found!") + return get_data_error_result(message="File not found!") STORAGE_IMPL.rm(file.parent_id, file.location) FileService.delete_folder_by_pf_id(current_user.id, file_id) else: if not FileService.delete(file): return get_data_error_result( - retmsg="Database error (File removal)!") + message="Database error (File removal)!") # delete file2document informs = File2DocumentService.get_by_file_id(file_id) @@ -273,13 +270,13 @@ def rm(): doc_id = inform.document_id e, doc = DocumentService.get_by_id(doc_id) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") tenant_id = DocumentService.get_tenant_id(doc_id) if not tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") if not DocumentService.remove_document(doc, tenant_id): return get_data_error_result( - retmsg="Database error (Document removal)!") + message="Database error (Document removal)!") File2DocumentService.delete_by_file_id(file_id) return get_json_result(data=True) @@ -295,30 +292,30 @@ def rename(): try: e, file = FileService.get_by_id(req["file_id"]) if not e: - return get_data_error_result(retmsg="File not found!") + return get_data_error_result(message="File not found!") if file.type != FileType.FOLDER.value \ and pathlib.Path(req["name"].lower()).suffix != pathlib.Path( file.name.lower()).suffix: return get_json_result( data=False, - retmsg="The extension of file can't be changed", - retcode=RetCode.ARGUMENT_ERROR) + message="The extension of file can't be changed", + code=RetCode.ARGUMENT_ERROR) for file in FileService.query(name=req["name"], pf_id=file.parent_id): if file.name == req["name"]: return get_data_error_result( - retmsg="Duplicated file name in the same folder.") + message="Duplicated file name in the same folder.") if not FileService.update_by_id( req["file_id"], {"name": req["name"]}): return get_data_error_result( - retmsg="Database error (File rename)!") + message="Database error (File rename)!") informs = File2DocumentService.get_by_file_id(req["file_id"]) if informs: if not DocumentService.update_by_id( informs[0].document_id, {"name": req["name"]}): return get_data_error_result( - retmsg="Database error (Document rename)!") + message="Database error (Document rename)!") return get_json_result(data=True) except Exception as e: @@ -331,7 +328,7 @@ def get(file_id): try: e, file = FileService.get_by_id(file_id) if not e: - return get_data_error_result(retmsg="Document not found!") + return get_data_error_result(message="Document not found!") b, n = File2DocumentService.get_storage_address(file_id=file_id) response = flask.make_response(STORAGE_IMPL.get(b, n)) ext = re.search(r"\.([^.]+)$", file.name) @@ -359,12 +356,12 @@ def move(): for file_id in file_ids: e, file = FileService.get_by_id(file_id) if not e: - return get_data_error_result(retmsg="File or Folder not found!") + return get_data_error_result(message="File or Folder not found!") if not file.tenant_id: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") fe, _ = FileService.get_by_id(parent_id) if not fe: - return get_data_error_result(retmsg="Parent Folder not found!") + return get_data_error_result(message="Parent Folder not found!") FileService.move_file(file_ids, parent_id) return get_json_result(data=True) except Exception as e: diff --git a/api/apps/kb_app.py b/api/apps/kb_app.py index 551e7867ed6dc6c863c93315ca140c90e2cc7b3f..7807550cd7e9e7ec1c88cdc5a743661b3772ce24 100644 --- a/api/apps/kb_app.py +++ b/api/apps/kb_app.py @@ -47,7 +47,7 @@ def create(): req["created_by"] = current_user.id e, t = TenantService.get_by_id(current_user.id) if not e: - return get_data_error_result(retmsg="Tenant not found.") + return get_data_error_result(message="Tenant not found.") req["embd_id"] = t.embd_id if not KnowledgebaseService.save(**req): return get_data_error_result() @@ -65,24 +65,24 @@ def update(): if not KnowledgebaseService.accessible4deletion(req["kb_id"], current_user.id): return get_json_result( data=False, - retmsg='No authorization.', - retcode=RetCode.AUTHENTICATION_ERROR + message='No authorization.', + code=RetCode.AUTHENTICATION_ERROR ) try: if not KnowledgebaseService.query( created_by=current_user.id, id=req["kb_id"]): return get_json_result( - data=False, retmsg=f'Only owner of knowledgebase authorized for this operation.', retcode=RetCode.OPERATING_ERROR) + data=False, message='Only owner of knowledgebase authorized for this operation.', code=RetCode.OPERATING_ERROR) e, kb = KnowledgebaseService.get_by_id(req["kb_id"]) if not e: return get_data_error_result( - retmsg="Can't find this knowledgebase!") + message="Can't find this knowledgebase!") if req["name"].lower() != kb.name.lower() \ and len(KnowledgebaseService.query(name=req["name"], tenant_id=current_user.id, status=StatusEnum.VALID.value)) > 1: return get_data_error_result( - retmsg="Duplicated knowledgebase name.") + message="Duplicated knowledgebase name.") del req["kb_id"] if not KnowledgebaseService.update_by_id(kb.id, req): @@ -91,7 +91,7 @@ def update(): e, kb = KnowledgebaseService.get_by_id(kb.id) if not e: return get_data_error_result( - retmsg="Database error (Knowledgebase rename)!") + message="Database error (Knowledgebase rename)!") return get_json_result(data=kb.to_json()) except Exception as e: @@ -110,12 +110,12 @@ def detail(): break else: return get_json_result( - data=False, retmsg=f'Only owner of knowledgebase authorized for this operation.', - retcode=RetCode.OPERATING_ERROR) + data=False, message='Only owner of knowledgebase authorized for this operation.', + code=RetCode.OPERATING_ERROR) kb = KnowledgebaseService.get_detail(kb_id) if not kb: return get_data_error_result( - retmsg="Can't find this knowledgebase!") + message="Can't find this knowledgebase!") return get_json_result(data=kb) except Exception as e: return server_error_response(e) @@ -145,27 +145,27 @@ def rm(): if not KnowledgebaseService.accessible4deletion(req["kb_id"], current_user.id): return get_json_result( data=False, - retmsg='No authorization.', - retcode=RetCode.AUTHENTICATION_ERROR + message='No authorization.', + code=RetCode.AUTHENTICATION_ERROR ) try: kbs = KnowledgebaseService.query( created_by=current_user.id, id=req["kb_id"]) if not kbs: return get_json_result( - data=False, retmsg=f'Only owner of knowledgebase authorized for this operation.', retcode=RetCode.OPERATING_ERROR) + data=False, message='Only owner of knowledgebase authorized for this operation.', code=RetCode.OPERATING_ERROR) for doc in DocumentService.query(kb_id=req["kb_id"]): if not DocumentService.remove_document(doc, kbs[0].tenant_id): return get_data_error_result( - retmsg="Database error (Document removal)!") + message="Database error (Document removal)!") f2d = File2DocumentService.get_by_document_id(doc.id) FileService.filter_delete([File.source_type == FileSource.KNOWLEDGEBASE, File.id == f2d[0].file_id]) File2DocumentService.delete_by_document_id(doc.id) if not KnowledgebaseService.delete_by_id(req["kb_id"]): return get_data_error_result( - retmsg="Database error (Knowledgebase removal)!") + message="Database error (Knowledgebase removal)!") return get_json_result(data=True) except Exception as e: return server_error_response(e) diff --git a/api/apps/llm_app.py b/api/apps/llm_app.py index 7209789630b84e135ef9d9f023c4b746ec7458b9..74b3e71383d19aaa110f26d9f87423df694172ed 100644 --- a/api/apps/llm_app.py +++ b/api/apps/llm_app.py @@ -98,7 +98,7 @@ def set_api_key(): break if msg: - return get_data_error_result(retmsg=msg) + return get_data_error_result(message=msg) llm_config = { "api_key": req["api_key"], @@ -278,7 +278,7 @@ def add_llm(): pass if msg: - return get_data_error_result(retmsg=msg) + return get_data_error_result(message=msg) if not TenantLLMService.filter_update( [TenantLLM.tenant_id == current_user.id, TenantLLM.llm_factory == factory, TenantLLM.llm_name == llm["llm_name"]], llm): diff --git a/api/apps/sdk/chat.py b/api/apps/sdk/chat.py index 9d0c0892016a7ed98dba7cf102c74416352b95cd..048828832aeb39a27760db6b76f15daba980c3f6 100644 --- a/api/apps/sdk/chat.py +++ b/api/apps/sdk/chat.py @@ -32,7 +32,7 @@ def create(tenant_id): req=request.json ids= req.get("dataset_ids") if not ids: - return get_error_data_result(retmsg="`dataset_ids` is required") + return get_error_data_result(message="`dataset_ids` is required") for kb_id in ids: kbs = KnowledgebaseService.query(id=kb_id,tenant_id=tenant_id) if not kbs: @@ -43,7 +43,7 @@ def create(tenant_id): kbs = KnowledgebaseService.get_by_ids(ids) embd_count = list(set([kb.embd_id for kb in kbs])) if len(embd_count) != 1: - return get_result(retmsg='Datasets use different embedding models."',retcode=RetCode.AUTHENTICATION_ERROR) + return get_result(message='Datasets use different embedding models."',code=RetCode.AUTHENTICATION_ERROR) req["kb_ids"] = ids # llm llm = req.get("llm") @@ -55,7 +55,7 @@ def create(tenant_id): req["llm_setting"] = req.pop("llm") e, tenant = TenantService.get_by_id(tenant_id) if not e: - return get_error_data_result(retmsg="Tenant not found!") + return get_error_data_result(message="Tenant not found!") # prompt prompt = req.get("prompt") key_mapping = {"parameters": "variables", @@ -86,12 +86,12 @@ def create(tenant_id): if not req.get("llm_id"): req["llm_id"] = tenant.llm_id if not req.get("name"): - return get_error_data_result(retmsg="`name` is required.") + return get_error_data_result(message="`name` is required.") if DialogService.query(name=req["name"], tenant_id=tenant_id, status=StatusEnum.VALID.value): - return get_error_data_result(retmsg="Duplicated chat name in creating chat.") + return get_error_data_result(message="Duplicated chat name in creating chat.") # tenant_id if req.get("tenant_id"): - return get_error_data_result(retmsg="`tenant_id` must not be provided.") + return get_error_data_result(message="`tenant_id` must not be provided.") req["tenant_id"] = tenant_id # prompt more parameter default_prompt = { @@ -117,14 +117,14 @@ def create(tenant_id): continue if req['prompt_config']["system"].find("{%s}" % p["key"]) < 0: return get_error_data_result( - retmsg="Parameter '{}' is not used".format(p["key"])) + message="Parameter '{}' is not used".format(p["key"])) # save if not DialogService.save(**req): - return get_error_data_result(retmsg="Fail to new a chat!") + return get_error_data_result(message="Fail to new a chat!") # response e, res = DialogService.get_by_id(req["id"]) if not e: - return get_error_data_result(retmsg="Fail to new a chat!") + return get_error_data_result(message="Fail to new a chat!") res = res.to_json() renamed_dict = {} for key, value in res["prompt_config"].items(): @@ -150,7 +150,7 @@ def create(tenant_id): @token_required def update(tenant_id,chat_id): if not DialogService.query(tenant_id=tenant_id, id=chat_id, status=StatusEnum.VALID.value): - return get_error_data_result(retmsg='You do not own the chat') + return get_error_data_result(message='You do not own the chat') req =request.json ids = req.get("dataset_ids") if "show_quotation" in req: @@ -170,8 +170,8 @@ def update(tenant_id,chat_id): embd_count=list(set([kb.embd_id for kb in kbs])) if len(embd_count) != 1 : return get_result( - retmsg='Datasets use different embedding models."', - retcode=RetCode.AUTHENTICATION_ERROR) + message='Datasets use different embedding models."', + code=RetCode.AUTHENTICATION_ERROR) req["kb_ids"] = ids llm = req.get("llm") if llm: @@ -182,7 +182,7 @@ def update(tenant_id,chat_id): req["llm_setting"] = req.pop("llm") e, tenant = TenantService.get_by_id(tenant_id) if not e: - return get_error_data_result(retmsg="Tenant not found!") + return get_error_data_result(message="Tenant not found!") if req.get("rerank_model"): if not TenantLLMService.query(tenant_id=tenant_id,llm_name=req.get("rerank_model"),model_type="rerank"): return get_error_data_result(f"`rerank_model` {req.get('rerank_model')} doesn't exist") @@ -207,18 +207,18 @@ def update(tenant_id,chat_id): res = res.to_json() if "name" in req: if not req.get("name"): - return get_error_data_result(retmsg="`name` is not empty.") + return get_error_data_result(message="`name` is not empty.") if req["name"].lower() != res["name"].lower() \ and len( DialogService.query(name=req["name"], tenant_id=tenant_id, status=StatusEnum.VALID.value)) > 0: - return get_error_data_result(retmsg="Duplicated chat name in updating dataset.") + return get_error_data_result(message="Duplicated chat name in updating dataset.") if "prompt_config" in req: res["prompt_config"].update(req["prompt_config"]) for p in res["prompt_config"]["parameters"]: if p["optional"]: continue if res["prompt_config"]["system"].find("{%s}" % p["key"]) < 0: - return get_error_data_result(retmsg="Parameter '{}' is not used".format(p["key"])) + return get_error_data_result(message="Parameter '{}' is not used".format(p["key"])) if "llm_setting" in req: res["llm_setting"].update(req["llm_setting"]) req["prompt_config"] = res["prompt_config"] @@ -229,7 +229,7 @@ def update(tenant_id,chat_id): if "dataset_ids" in req: req.pop("dataset_ids") if not DialogService.update_by_id(chat_id, req): - return get_error_data_result(retmsg="Chat not found!") + return get_error_data_result(message="Chat not found!") return get_result() @@ -250,7 +250,7 @@ def delete(tenant_id): id_list=ids for id in id_list: if not DialogService.query(tenant_id=tenant_id, id=id, status=StatusEnum.VALID.value): - return get_error_data_result(retmsg=f"You don't own the chat {id}") + return get_error_data_result(message=f"You don't own the chat {id}") temp_dict = {"status": StatusEnum.INVALID.value} DialogService.update_by_id(id, temp_dict) return get_result() @@ -262,7 +262,7 @@ def list_chat(tenant_id): name = request.args.get("name") chat = DialogService.query(id=id,name=name,status=StatusEnum.VALID.value) if not chat: - return get_error_data_result(retmsg="The chat doesn't exist") + return get_error_data_result(message="The chat doesn't exist") page_number = int(request.args.get("page", 1)) items_per_page = int(request.args.get("page_size", 1024)) orderby = request.args.get("orderby", "create_time") @@ -302,7 +302,7 @@ def list_chat(tenant_id): for kb_id in res["kb_ids"]: kb = KnowledgebaseService.query(id=kb_id) if not kb : - return get_error_data_result(retmsg=f"Don't exist the kb {kb_id}") + return get_error_data_result(message=f"Don't exist the kb {kb_id}") kb_list.append(kb[0].to_json()) del res["kb_ids"] res["datasets"] = kb_list diff --git a/api/apps/sdk/dataset.py b/api/apps/sdk/dataset.py index c00343f3836857781f9c89474c5280e9d043eb45..9278aeb743c8c7b58bff53d3c3b0a5ec4a3840f1 100644 --- a/api/apps/sdk/dataset.py +++ b/api/apps/sdk/dataset.py @@ -1,535 +1,535 @@ -# -# Copyright 2024 The InfiniFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -from flask import request -from api.db import StatusEnum, FileSource -from api.db.db_models import File -from api.db.services.document_service import DocumentService -from api.db.services.file2document_service import File2DocumentService -from api.db.services.file_service import FileService -from api.db.services.knowledgebase_service import KnowledgebaseService -from api.db.services.llm_service import TenantLLMService, LLMService -from api.db.services.user_service import TenantService -from api.settings import RetCode -from api.utils import get_uuid -from api.utils.api_utils import ( - get_result, - token_required, - get_error_data_result, - valid, - get_parser_config, -) - - -@manager.route("/datasets", methods=["POST"]) -@token_required -def create(tenant_id): - """ - Create a new dataset. - --- - tags: - - Datasets - security: - - ApiKeyAuth: [] - parameters: - - in: header - name: Authorization - type: string - required: true - description: Bearer token for authentication. - - in: body - name: body - description: Dataset creation parameters. - required: true - schema: - type: object - required: - - name - properties: - name: - type: string - description: Name of the dataset. - permission: - type: string - enum: ['me', 'team'] - description: Dataset permission. - language: - type: string - enum: ['Chinese', 'English'] - description: Language of the dataset. - chunk_method: - type: string - enum: ["naive", "manual", "qa", "table", "paper", "book", "laws", - "presentation", "picture", "one", "knowledge_graph", "email"] - description: Chunking method. - parser_config: - type: object - description: Parser configuration. - responses: - 200: - description: Successful operation. - schema: - type: object - properties: - data: - type: object - """ - req = request.json - e, t = TenantService.get_by_id(tenant_id) - permission = req.get("permission") - language = req.get("language") - chunk_method = req.get("chunk_method") - parser_config = req.get("parser_config") - valid_permission = ["me", "team"] - valid_language = ["Chinese", "English"] - valid_chunk_method = [ - "naive", - "manual", - "qa", - "table", - "paper", - "book", - "laws", - "presentation", - "picture", - "one", - "knowledge_graph", - "email", - ] - check_validation = valid( - permission, - valid_permission, - language, - valid_language, - chunk_method, - valid_chunk_method, - ) - if check_validation: - return check_validation - req["parser_config"] = get_parser_config(chunk_method, parser_config) - if "tenant_id" in req: - return get_error_data_result(retmsg="`tenant_id` must not be provided") - if "chunk_count" in req or "document_count" in req: - return get_error_data_result( - retmsg="`chunk_count` or `document_count` must not be provided" - ) - if "name" not in req: - return get_error_data_result(retmsg="`name` is not empty!") - req["id"] = get_uuid() - req["name"] = req["name"].strip() - if req["name"] == "": - return get_error_data_result(retmsg="`name` is not empty string!") - if KnowledgebaseService.query( - name=req["name"], tenant_id=tenant_id, status=StatusEnum.VALID.value - ): - return get_error_data_result( - retmsg="Duplicated dataset name in creating dataset." - ) - req["tenant_id"] = req["created_by"] = tenant_id - if not req.get("embedding_model"): - req["embedding_model"] = t.embd_id - else: - valid_embedding_models = [ - "BAAI/bge-large-zh-v1.5", - "BAAI/bge-base-en-v1.5", - "BAAI/bge-large-en-v1.5", - "BAAI/bge-small-en-v1.5", - "BAAI/bge-small-zh-v1.5", - "jinaai/jina-embeddings-v2-base-en", - "jinaai/jina-embeddings-v2-small-en", - "nomic-ai/nomic-embed-text-v1.5", - "sentence-transformers/all-MiniLM-L6-v2", - "text-embedding-v2", - "text-embedding-v3", - "maidalun1020/bce-embedding-base_v1", - ] - embd_model = LLMService.query( - llm_name=req["embedding_model"], model_type="embedding" - ) - if not embd_model: - return get_error_data_result( - f"`embedding_model` {req.get('embedding_model')} doesn't exist" - ) - if embd_model: - if req[ - "embedding_model" - ] not in valid_embedding_models and not TenantLLMService.query( - tenant_id=tenant_id, - model_type="embedding", - llm_name=req.get("embedding_model"), - ): - return get_error_data_result( - f"`embedding_model` {req.get('embedding_model')} doesn't exist" - ) - key_mapping = { - "chunk_num": "chunk_count", - "doc_num": "document_count", - "parser_id": "chunk_method", - "embd_id": "embedding_model", - } - mapped_keys = { - new_key: req[old_key] - for new_key, old_key in key_mapping.items() - if old_key in req - } - req.update(mapped_keys) - if not KnowledgebaseService.save(**req): - return get_error_data_result(retmsg="Create dataset error.(Database error)") - renamed_data = {} - e, k = KnowledgebaseService.get_by_id(req["id"]) - for key, value in k.to_dict().items(): - new_key = key_mapping.get(key, key) - renamed_data[new_key] = value - return get_result(data=renamed_data) - - -@manager.route("/datasets", methods=["DELETE"]) -@token_required -def delete(tenant_id): - """ - Delete datasets. - --- - tags: - - Datasets - security: - - ApiKeyAuth: [] - parameters: - - in: header - name: Authorization - type: string - required: true - description: Bearer token for authentication. - - in: body - name: body - description: Dataset deletion parameters. - required: true - schema: - type: object - properties: - ids: - type: array - items: - type: string - description: List of dataset IDs to delete. - responses: - 200: - description: Successful operation. - schema: - type: object - """ - req = request.json - if not req: - ids = None - else: - ids = req.get("ids") - if not ids: - id_list = [] - kbs = KnowledgebaseService.query(tenant_id=tenant_id) - for kb in kbs: - id_list.append(kb.id) - else: - id_list = ids - for id in id_list: - kbs = KnowledgebaseService.query(id=id, tenant_id=tenant_id) - if not kbs: - return get_error_data_result(retmsg=f"You don't own the dataset {id}") - for doc in DocumentService.query(kb_id=id): - if not DocumentService.remove_document(doc, tenant_id): - return get_error_data_result( - retmsg="Remove document error.(Database error)" - ) - f2d = File2DocumentService.get_by_document_id(doc.id) - FileService.filter_delete( - [ - File.source_type == FileSource.KNOWLEDGEBASE, - File.id == f2d[0].file_id, - ] - ) - File2DocumentService.delete_by_document_id(doc.id) - if not KnowledgebaseService.delete_by_id(id): - return get_error_data_result(retmsg="Delete dataset error.(Database error)") - return get_result(retcode=RetCode.SUCCESS) - - -@manager.route("/datasets/", methods=["PUT"]) -@token_required -def update(tenant_id, dataset_id): - """ - Update a dataset. - --- - tags: - - Datasets - security: - - ApiKeyAuth: [] - parameters: - - in: path - name: dataset_id - type: string - required: true - description: ID of the dataset to update. - - in: header - name: Authorization - type: string - required: true - description: Bearer token for authentication. - - in: body - name: body - description: Dataset update parameters. - required: true - schema: - type: object - properties: - name: - type: string - description: New name of the dataset. - permission: - type: string - enum: ['me', 'team'] - description: Updated permission. - language: - type: string - enum: ['Chinese', 'English'] - description: Updated language. - chunk_method: - type: string - enum: ["naive", "manual", "qa", "table", "paper", "book", "laws", - "presentation", "picture", "one", "knowledge_graph", "email"] - description: Updated chunking method. - parser_config: - type: object - description: Updated parser configuration. - responses: - 200: - description: Successful operation. - schema: - type: object - """ - if not KnowledgebaseService.query(id=dataset_id, tenant_id=tenant_id): - return get_error_data_result(retmsg="You don't own the dataset") - req = request.json - e, t = TenantService.get_by_id(tenant_id) - invalid_keys = {"id", "embd_id", "chunk_num", "doc_num", "parser_id"} - if any(key in req for key in invalid_keys): - return get_error_data_result(retmsg="The input parameters are invalid.") - permission = req.get("permission") - language = req.get("language") - chunk_method = req.get("chunk_method") - parser_config = req.get("parser_config") - valid_permission = ["me", "team"] - valid_language = ["Chinese", "English"] - valid_chunk_method = [ - "naive", - "manual", - "qa", - "table", - "paper", - "book", - "laws", - "presentation", - "picture", - "one", - "knowledge_graph", - "email", - ] - check_validation = valid( - permission, - valid_permission, - language, - valid_language, - chunk_method, - valid_chunk_method, - ) - if check_validation: - return check_validation - if "tenant_id" in req: - if req["tenant_id"] != tenant_id: - return get_error_data_result(retmsg="Can't change `tenant_id`.") - e, kb = KnowledgebaseService.get_by_id(dataset_id) - if "parser_config" in req: - temp_dict = kb.parser_config - temp_dict.update(req["parser_config"]) - req["parser_config"] = temp_dict - if "chunk_count" in req: - if req["chunk_count"] != kb.chunk_num: - return get_error_data_result(retmsg="Can't change `chunk_count`.") - req.pop("chunk_count") - if "document_count" in req: - if req["document_count"] != kb.doc_num: - return get_error_data_result(retmsg="Can't change `document_count`.") - req.pop("document_count") - if "chunk_method" in req: - if kb.chunk_num != 0 and req["chunk_method"] != kb.parser_id: - return get_error_data_result( - retmsg="If `chunk_count` is not 0, `chunk_method` is not changeable." - ) - req["parser_id"] = req.pop("chunk_method") - if req["parser_id"] != kb.parser_id: - if not req.get("parser_config"): - req["parser_config"] = get_parser_config(chunk_method, parser_config) - if "embedding_model" in req: - if kb.chunk_num != 0 and req["embedding_model"] != kb.embd_id: - return get_error_data_result( - retmsg="If `chunk_count` is not 0, `embedding_model` is not changeable." - ) - if not req.get("embedding_model"): - return get_error_data_result("`embedding_model` can't be empty") - valid_embedding_models = [ - "BAAI/bge-large-zh-v1.5", - "BAAI/bge-base-en-v1.5", - "BAAI/bge-large-en-v1.5", - "BAAI/bge-small-en-v1.5", - "BAAI/bge-small-zh-v1.5", - "jinaai/jina-embeddings-v2-base-en", - "jinaai/jina-embeddings-v2-small-en", - "nomic-ai/nomic-embed-text-v1.5", - "sentence-transformers/all-MiniLM-L6-v2", - "text-embedding-v2", - "text-embedding-v3", - "maidalun1020/bce-embedding-base_v1", - ] - embd_model = LLMService.query( - llm_name=req["embedding_model"], model_type="embedding" - ) - if not embd_model: - return get_error_data_result( - f"`embedding_model` {req.get('embedding_model')} doesn't exist" - ) - if embd_model: - if req[ - "embedding_model" - ] not in valid_embedding_models and not TenantLLMService.query( - tenant_id=tenant_id, - model_type="embedding", - llm_name=req.get("embedding_model"), - ): - return get_error_data_result( - f"`embedding_model` {req.get('embedding_model')} doesn't exist" - ) - req["embd_id"] = req.pop("embedding_model") - if "name" in req: - req["name"] = req["name"].strip() - if ( - req["name"].lower() != kb.name.lower() - and len( - KnowledgebaseService.query( - name=req["name"], tenant_id=tenant_id, status=StatusEnum.VALID.value - ) - ) - > 0 - ): - return get_error_data_result( - retmsg="Duplicated dataset name in updating dataset." - ) - if not KnowledgebaseService.update_by_id(kb.id, req): - return get_error_data_result(retmsg="Update dataset error.(Database error)") - return get_result(retcode=RetCode.SUCCESS) - - -@manager.route("/datasets", methods=["GET"]) -@token_required -def list(tenant_id): - """ - List datasets. - --- - tags: - - Datasets - security: - - ApiKeyAuth: [] - parameters: - - in: query - name: id - type: string - required: false - description: Dataset ID to filter. - - in: query - name: name - type: string - required: false - description: Dataset name to filter. - - in: query - name: page - type: integer - required: false - default: 1 - description: Page number. - - in: query - name: page_size - type: integer - required: false - default: 1024 - description: Number of items per page. - - in: query - name: orderby - type: string - required: false - default: "create_time" - description: Field to order by. - - in: query - name: desc - type: boolean - required: false - default: true - description: Order in descending. - - in: header - name: Authorization - type: string - required: true - description: Bearer token for authentication. - responses: - 200: - description: Successful operation. - schema: - type: array - items: - type: object - """ - id = request.args.get("id") - name = request.args.get("name") - kbs = KnowledgebaseService.query(id=id, name=name, status=1) - if not kbs: - return get_error_data_result(retmsg="The dataset doesn't exist") - page_number = int(request.args.get("page", 1)) - items_per_page = int(request.args.get("page_size", 1024)) - orderby = request.args.get("orderby", "create_time") - if request.args.get("desc") == "False" or request.args.get("desc") == "false": - desc = False - else: - desc = True - tenants = TenantService.get_joined_tenants_by_user_id(tenant_id) - kbs = KnowledgebaseService.get_list( - [m["tenant_id"] for m in tenants], - tenant_id, - page_number, - items_per_page, - orderby, - desc, - id, - name, - ) - renamed_list = [] - for kb in kbs: - key_mapping = { - "chunk_num": "chunk_count", - "doc_num": "document_count", - "parser_id": "chunk_method", - "embd_id": "embedding_model", - } - renamed_data = {} - for key, value in kb.items(): - new_key = key_mapping.get(key, key) - renamed_data[new_key] = value - renamed_list.append(renamed_data) - return get_result(data=renamed_list) +# +# Copyright 2024 The InfiniFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from flask import request +from api.db import StatusEnum, FileSource +from api.db.db_models import File +from api.db.services.document_service import DocumentService +from api.db.services.file2document_service import File2DocumentService +from api.db.services.file_service import FileService +from api.db.services.knowledgebase_service import KnowledgebaseService +from api.db.services.llm_service import TenantLLMService, LLMService +from api.db.services.user_service import TenantService +from api.settings import RetCode +from api.utils import get_uuid +from api.utils.api_utils import ( + get_result, + token_required, + get_error_data_result, + valid, + get_parser_config, +) + + +@manager.route("/datasets", methods=["POST"]) +@token_required +def create(tenant_id): + """ + Create a new dataset. + --- + tags: + - Datasets + security: + - ApiKeyAuth: [] + parameters: + - in: header + name: Authorization + type: string + required: true + description: Bearer token for authentication. + - in: body + name: body + description: Dataset creation parameters. + required: true + schema: + type: object + required: + - name + properties: + name: + type: string + description: Name of the dataset. + permission: + type: string + enum: ['me', 'team'] + description: Dataset permission. + language: + type: string + enum: ['Chinese', 'English'] + description: Language of the dataset. + chunk_method: + type: string + enum: ["naive", "manual", "qa", "table", "paper", "book", "laws", + "presentation", "picture", "one", "knowledge_graph", "email"] + description: Chunking method. + parser_config: + type: object + description: Parser configuration. + responses: + 200: + description: Successful operation. + schema: + type: object + properties: + data: + type: object + """ + req = request.json + e, t = TenantService.get_by_id(tenant_id) + permission = req.get("permission") + language = req.get("language") + chunk_method = req.get("chunk_method") + parser_config = req.get("parser_config") + valid_permission = ["me", "team"] + valid_language = ["Chinese", "English"] + valid_chunk_method = [ + "naive", + "manual", + "qa", + "table", + "paper", + "book", + "laws", + "presentation", + "picture", + "one", + "knowledge_graph", + "email", + ] + check_validation = valid( + permission, + valid_permission, + language, + valid_language, + chunk_method, + valid_chunk_method, + ) + if check_validation: + return check_validation + req["parser_config"] = get_parser_config(chunk_method, parser_config) + if "tenant_id" in req: + return get_error_data_result(message="`tenant_id` must not be provided") + if "chunk_count" in req or "document_count" in req: + return get_error_data_result( + message="`chunk_count` or `document_count` must not be provided" + ) + if "name" not in req: + return get_error_data_result(message="`name` is not empty!") + req["id"] = get_uuid() + req["name"] = req["name"].strip() + if req["name"] == "": + return get_error_data_result(message="`name` is not empty string!") + if KnowledgebaseService.query( + name=req["name"], tenant_id=tenant_id, status=StatusEnum.VALID.value + ): + return get_error_data_result( + message="Duplicated dataset name in creating dataset." + ) + req["tenant_id"] = req["created_by"] = tenant_id + if not req.get("embedding_model"): + req["embedding_model"] = t.embd_id + else: + valid_embedding_models = [ + "BAAI/bge-large-zh-v1.5", + "BAAI/bge-base-en-v1.5", + "BAAI/bge-large-en-v1.5", + "BAAI/bge-small-en-v1.5", + "BAAI/bge-small-zh-v1.5", + "jinaai/jina-embeddings-v2-base-en", + "jinaai/jina-embeddings-v2-small-en", + "nomic-ai/nomic-embed-text-v1.5", + "sentence-transformers/all-MiniLM-L6-v2", + "text-embedding-v2", + "text-embedding-v3", + "maidalun1020/bce-embedding-base_v1", + ] + embd_model = LLMService.query( + llm_name=req["embedding_model"], model_type="embedding" + ) + if not embd_model: + return get_error_data_result( + f"`embedding_model` {req.get('embedding_model')} doesn't exist" + ) + if embd_model: + if req[ + "embedding_model" + ] not in valid_embedding_models and not TenantLLMService.query( + tenant_id=tenant_id, + model_type="embedding", + llm_name=req.get("embedding_model"), + ): + return get_error_data_result( + f"`embedding_model` {req.get('embedding_model')} doesn't exist" + ) + key_mapping = { + "chunk_num": "chunk_count", + "doc_num": "document_count", + "parser_id": "chunk_method", + "embd_id": "embedding_model", + } + mapped_keys = { + new_key: req[old_key] + for new_key, old_key in key_mapping.items() + if old_key in req + } + req.update(mapped_keys) + if not KnowledgebaseService.save(**req): + return get_error_data_result(message="Create dataset error.(Database error)") + renamed_data = {} + e, k = KnowledgebaseService.get_by_id(req["id"]) + for key, value in k.to_dict().items(): + new_key = key_mapping.get(key, key) + renamed_data[new_key] = value + return get_result(data=renamed_data) + + +@manager.route("/datasets", methods=["DELETE"]) +@token_required +def delete(tenant_id): + """ + Delete datasets. + --- + tags: + - Datasets + security: + - ApiKeyAuth: [] + parameters: + - in: header + name: Authorization + type: string + required: true + description: Bearer token for authentication. + - in: body + name: body + description: Dataset deletion parameters. + required: true + schema: + type: object + properties: + ids: + type: array + items: + type: string + description: List of dataset IDs to delete. + responses: + 200: + description: Successful operation. + schema: + type: object + """ + req = request.json + if not req: + ids = None + else: + ids = req.get("ids") + if not ids: + id_list = [] + kbs = KnowledgebaseService.query(tenant_id=tenant_id) + for kb in kbs: + id_list.append(kb.id) + else: + id_list = ids + for id in id_list: + kbs = KnowledgebaseService.query(id=id, tenant_id=tenant_id) + if not kbs: + return get_error_data_result(message=f"You don't own the dataset {id}") + for doc in DocumentService.query(kb_id=id): + if not DocumentService.remove_document(doc, tenant_id): + return get_error_data_result( + message="Remove document error.(Database error)" + ) + f2d = File2DocumentService.get_by_document_id(doc.id) + FileService.filter_delete( + [ + File.source_type == FileSource.KNOWLEDGEBASE, + File.id == f2d[0].file_id, + ] + ) + File2DocumentService.delete_by_document_id(doc.id) + if not KnowledgebaseService.delete_by_id(id): + return get_error_data_result(message="Delete dataset error.(Database error)") + return get_result(code=RetCode.SUCCESS) + + +@manager.route("/datasets/", methods=["PUT"]) +@token_required +def update(tenant_id, dataset_id): + """ + Update a dataset. + --- + tags: + - Datasets + security: + - ApiKeyAuth: [] + parameters: + - in: path + name: dataset_id + type: string + required: true + description: ID of the dataset to update. + - in: header + name: Authorization + type: string + required: true + description: Bearer token for authentication. + - in: body + name: body + description: Dataset update parameters. + required: true + schema: + type: object + properties: + name: + type: string + description: New name of the dataset. + permission: + type: string + enum: ['me', 'team'] + description: Updated permission. + language: + type: string + enum: ['Chinese', 'English'] + description: Updated language. + chunk_method: + type: string + enum: ["naive", "manual", "qa", "table", "paper", "book", "laws", + "presentation", "picture", "one", "knowledge_graph", "email"] + description: Updated chunking method. + parser_config: + type: object + description: Updated parser configuration. + responses: + 200: + description: Successful operation. + schema: + type: object + """ + if not KnowledgebaseService.query(id=dataset_id, tenant_id=tenant_id): + return get_error_data_result(message="You don't own the dataset") + req = request.json + e, t = TenantService.get_by_id(tenant_id) + invalid_keys = {"id", "embd_id", "chunk_num", "doc_num", "parser_id"} + if any(key in req for key in invalid_keys): + return get_error_data_result(message="The input parameters are invalid.") + permission = req.get("permission") + language = req.get("language") + chunk_method = req.get("chunk_method") + parser_config = req.get("parser_config") + valid_permission = ["me", "team"] + valid_language = ["Chinese", "English"] + valid_chunk_method = [ + "naive", + "manual", + "qa", + "table", + "paper", + "book", + "laws", + "presentation", + "picture", + "one", + "knowledge_graph", + "email", + ] + check_validation = valid( + permission, + valid_permission, + language, + valid_language, + chunk_method, + valid_chunk_method, + ) + if check_validation: + return check_validation + if "tenant_id" in req: + if req["tenant_id"] != tenant_id: + return get_error_data_result(message="Can't change `tenant_id`.") + e, kb = KnowledgebaseService.get_by_id(dataset_id) + if "parser_config" in req: + temp_dict = kb.parser_config + temp_dict.update(req["parser_config"]) + req["parser_config"] = temp_dict + if "chunk_count" in req: + if req["chunk_count"] != kb.chunk_num: + return get_error_data_result(message="Can't change `chunk_count`.") + req.pop("chunk_count") + if "document_count" in req: + if req["document_count"] != kb.doc_num: + return get_error_data_result(message="Can't change `document_count`.") + req.pop("document_count") + if "chunk_method" in req: + if kb.chunk_num != 0 and req["chunk_method"] != kb.parser_id: + return get_error_data_result( + message="If `chunk_count` is not 0, `chunk_method` is not changeable." + ) + req["parser_id"] = req.pop("chunk_method") + if req["parser_id"] != kb.parser_id: + if not req.get("parser_config"): + req["parser_config"] = get_parser_config(chunk_method, parser_config) + if "embedding_model" in req: + if kb.chunk_num != 0 and req["embedding_model"] != kb.embd_id: + return get_error_data_result( + message="If `chunk_count` is not 0, `embedding_model` is not changeable." + ) + if not req.get("embedding_model"): + return get_error_data_result("`embedding_model` can't be empty") + valid_embedding_models = [ + "BAAI/bge-large-zh-v1.5", + "BAAI/bge-base-en-v1.5", + "BAAI/bge-large-en-v1.5", + "BAAI/bge-small-en-v1.5", + "BAAI/bge-small-zh-v1.5", + "jinaai/jina-embeddings-v2-base-en", + "jinaai/jina-embeddings-v2-small-en", + "nomic-ai/nomic-embed-text-v1.5", + "sentence-transformers/all-MiniLM-L6-v2", + "text-embedding-v2", + "text-embedding-v3", + "maidalun1020/bce-embedding-base_v1", + ] + embd_model = LLMService.query( + llm_name=req["embedding_model"], model_type="embedding" + ) + if not embd_model: + return get_error_data_result( + f"`embedding_model` {req.get('embedding_model')} doesn't exist" + ) + if embd_model: + if req[ + "embedding_model" + ] not in valid_embedding_models and not TenantLLMService.query( + tenant_id=tenant_id, + model_type="embedding", + llm_name=req.get("embedding_model"), + ): + return get_error_data_result( + f"`embedding_model` {req.get('embedding_model')} doesn't exist" + ) + req["embd_id"] = req.pop("embedding_model") + if "name" in req: + req["name"] = req["name"].strip() + if ( + req["name"].lower() != kb.name.lower() + and len( + KnowledgebaseService.query( + name=req["name"], tenant_id=tenant_id, status=StatusEnum.VALID.value + ) + ) + > 0 + ): + return get_error_data_result( + message="Duplicated dataset name in updating dataset." + ) + if not KnowledgebaseService.update_by_id(kb.id, req): + return get_error_data_result(message="Update dataset error.(Database error)") + return get_result(code=RetCode.SUCCESS) + + +@manager.route("/datasets", methods=["GET"]) +@token_required +def list(tenant_id): + """ + List datasets. + --- + tags: + - Datasets + security: + - ApiKeyAuth: [] + parameters: + - in: query + name: id + type: string + required: false + description: Dataset ID to filter. + - in: query + name: name + type: string + required: false + description: Dataset name to filter. + - in: query + name: page + type: integer + required: false + default: 1 + description: Page number. + - in: query + name: page_size + type: integer + required: false + default: 1024 + description: Number of items per page. + - in: query + name: orderby + type: string + required: false + default: "create_time" + description: Field to order by. + - in: query + name: desc + type: boolean + required: false + default: true + description: Order in descending. + - in: header + name: Authorization + type: string + required: true + description: Bearer token for authentication. + responses: + 200: + description: Successful operation. + schema: + type: array + items: + type: object + """ + id = request.args.get("id") + name = request.args.get("name") + kbs = KnowledgebaseService.query(id=id, name=name, status=1) + if not kbs: + return get_error_data_result(message="The dataset doesn't exist") + page_number = int(request.args.get("page", 1)) + items_per_page = int(request.args.get("page_size", 1024)) + orderby = request.args.get("orderby", "create_time") + if request.args.get("desc") == "False" or request.args.get("desc") == "false": + desc = False + else: + desc = True + tenants = TenantService.get_joined_tenants_by_user_id(tenant_id) + kbs = KnowledgebaseService.get_list( + [m["tenant_id"] for m in tenants], + tenant_id, + page_number, + items_per_page, + orderby, + desc, + id, + name, + ) + renamed_list = [] + for kb in kbs: + key_mapping = { + "chunk_num": "chunk_count", + "doc_num": "document_count", + "parser_id": "chunk_method", + "embd_id": "embedding_model", + } + renamed_data = {} + for key, value in kb.items(): + new_key = key_mapping.get(key, key) + renamed_data[new_key] = value + renamed_list.append(renamed_data) + return get_result(data=renamed_list) diff --git a/api/apps/sdk/dify_retrieval.py b/api/apps/sdk/dify_retrieval.py index ddb7fdf76c0bec3958595aa01007fb0e7fe8987e..d2e6ee6f12c68e428f5552fac5993a79bb6919eb 100644 --- a/api/apps/sdk/dify_retrieval.py +++ b/api/apps/sdk/dify_retrieval.py @@ -37,10 +37,10 @@ def retrieval(tenant_id): e, kb = KnowledgebaseService.get_by_id(kb_id) if not e: - return build_error_result(error_msg="Knowledgebase not found!", retcode=RetCode.NOT_FOUND) + return build_error_result(message="Knowledgebase not found!", code=RetCode.NOT_FOUND) if kb.tenant_id != tenant_id: - return build_error_result(error_msg="Knowledgebase not found!", retcode=RetCode.NOT_FOUND) + return build_error_result(message="Knowledgebase not found!", code=RetCode.NOT_FOUND) embd_mdl = LLMBundle(kb.tenant_id, LLMType.EMBEDDING.value, llm_name=kb.embd_id) @@ -71,7 +71,7 @@ def retrieval(tenant_id): except Exception as e: if str(e).find("not_found") > 0: return build_error_result( - error_msg=f'No chunk found! Check the chunk status please!', - retcode=RetCode.NOT_FOUND + message='No chunk found! Check the chunk status please!', + code=RetCode.NOT_FOUND ) - return build_error_result(error_msg=str(e), retcode=RetCode.SERVER_ERROR) + return build_error_result(message=str(e), code=RetCode.SERVER_ERROR) diff --git a/api/apps/sdk/doc.py b/api/apps/sdk/doc.py index c19e706baa89767d473e8bd25314a237651ce36d..6701454fe89aa9c3f39632d284963f8cf4308cdc 100644 --- a/api/apps/sdk/doc.py +++ b/api/apps/sdk/doc.py @@ -110,13 +110,13 @@ def upload(dataset_id, tenant_id): """ if "file" not in request.files: return get_error_data_result( - retmsg="No file part!", retcode=RetCode.ARGUMENT_ERROR + message="No file part!", code=RetCode.ARGUMENT_ERROR ) file_objs = request.files.getlist("file") for file_obj in file_objs: if file_obj.filename == "": return get_result( - retmsg="No file selected!", retcode=RetCode.ARGUMENT_ERROR + message="No file selected!", code=RetCode.ARGUMENT_ERROR ) # total size total_size = 0 @@ -127,15 +127,15 @@ def upload(dataset_id, tenant_id): MAX_TOTAL_FILE_SIZE = 10 * 1024 * 1024 if total_size > MAX_TOTAL_FILE_SIZE: return get_result( - retmsg=f"Total file size exceeds 10MB limit! ({total_size / (1024 * 1024):.2f} MB)", - retcode=RetCode.ARGUMENT_ERROR, + message=f"Total file size exceeds 10MB limit! ({total_size / (1024 * 1024):.2f} MB)", + code=RetCode.ARGUMENT_ERROR, ) e, kb = KnowledgebaseService.get_by_id(dataset_id) if not e: raise LookupError(f"Can't find the dataset with ID {dataset_id}!") err, files = FileService.upload_document(kb, file_objs, tenant_id) if err: - return get_result(retmsg="\n".join(err), retcode=RetCode.SERVER_ERROR) + return get_result(message="\n".join(err), code=RetCode.SERVER_ERROR) # rename key's name renamed_doc_list = [] for file in files: @@ -205,20 +205,20 @@ def update_doc(tenant_id, dataset_id, document_id): """ req = request.json if not KnowledgebaseService.query(id=dataset_id, tenant_id=tenant_id): - return get_error_data_result(retmsg="You don't own the dataset.") + return get_error_data_result(message="You don't own the dataset.") doc = DocumentService.query(kb_id=dataset_id, id=document_id) if not doc: - return get_error_data_result(retmsg="The dataset doesn't own the document.") + return get_error_data_result(message="The dataset doesn't own the document.") doc = doc[0] if "chunk_count" in req: if req["chunk_count"] != doc.chunk_num: - return get_error_data_result(retmsg="Can't change `chunk_count`.") + return get_error_data_result(message="Can't change `chunk_count`.") if "token_count" in req: if req["token_count"] != doc.token_num: - return get_error_data_result(retmsg="Can't change `token_count`.") + return get_error_data_result(message="Can't change `token_count`.") if "progress" in req: if req["progress"] != doc.progress: - return get_error_data_result(retmsg="Can't change `progress`.") + return get_error_data_result(message="Can't change `progress`.") if "name" in req and req["name"] != doc.name: if ( @@ -226,16 +226,16 @@ def update_doc(tenant_id, dataset_id, document_id): != pathlib.Path(doc.name.lower()).suffix ): return get_result( - retmsg="The extension of file can't be changed", - retcode=RetCode.ARGUMENT_ERROR, + message="The extension of file can't be changed", + code=RetCode.ARGUMENT_ERROR, ) for d in DocumentService.query(name=req["name"], kb_id=doc.kb_id): if d.name == req["name"]: return get_error_data_result( - retmsg="Duplicated document name in the same dataset." + message="Duplicated document name in the same dataset." ) if not DocumentService.update_by_id(document_id, {"name": req["name"]}): - return get_error_data_result(retmsg="Database error (Document rename)!") + return get_error_data_result(message="Database error (Document rename)!") informs = File2DocumentService.get_by_document_id(document_id) if informs: @@ -266,7 +266,7 @@ def update_doc(tenant_id, dataset_id, document_id): return get_result() if doc.type == FileType.VISUAL or re.search(r"\.(ppt|pptx|pages)$", doc.name): - return get_error_data_result(retmsg="Not supported yet!") + return get_error_data_result(message="Not supported yet!") e = DocumentService.update_by_id( doc.id, @@ -278,7 +278,7 @@ def update_doc(tenant_id, dataset_id, document_id): }, ) if not e: - return get_error_data_result(retmsg="Document not found!") + return get_error_data_result(message="Document not found!") req["parser_config"] = get_parser_config( req["chunk_method"], req.get("parser_config") ) @@ -292,7 +292,7 @@ def update_doc(tenant_id, dataset_id, document_id): doc.process_duation * -1, ) if not e: - return get_error_data_result(retmsg="Document not found!") + return get_error_data_result(message="Document not found!") ELASTICSEARCH.deleteByQuery( Q("match", doc_id=doc.id), idxnm=search.index_name(tenant_id) ) @@ -339,11 +339,11 @@ def download(tenant_id, dataset_id, document_id): type: object """ if not KnowledgebaseService.query(id=dataset_id, tenant_id=tenant_id): - return get_error_data_result(retmsg=f"You do not own the dataset {dataset_id}.") + return get_error_data_result(message=f"You do not own the dataset {dataset_id}.") doc = DocumentService.query(kb_id=dataset_id, id=document_id) if not doc: return get_error_data_result( - retmsg=f"The dataset not own the document {document_id}." + message=f"The dataset not own the document {document_id}." ) # The process of downloading doc_id, doc_location = File2DocumentService.get_storage_address( @@ -451,13 +451,13 @@ def list_docs(dataset_id, tenant_id): description: Processing status. """ if not KnowledgebaseService.query(id=dataset_id, tenant_id=tenant_id): - return get_error_data_result(retmsg=f"You don't own the dataset {dataset_id}. ") + return get_error_data_result(message=f"You don't own the dataset {dataset_id}. ") id = request.args.get("id") name = request.args.get("name") if not DocumentService.query(id=id, kb_id=dataset_id): - return get_error_data_result(retmsg=f"You don't own the document {id}.") + return get_error_data_result(message=f"You don't own the document {id}.") if not DocumentService.query(name=name, kb_id=dataset_id): - return get_error_data_result(retmsg=f"You don't own the document {name}.") + return get_error_data_result(message=f"You don't own the document {name}.") page = int(request.args.get("page", 1)) keywords = request.args.get("keywords", "") page_size = int(request.args.get("page_size", 1024)) @@ -538,7 +538,7 @@ def delete(tenant_id, dataset_id): type: object """ if not KnowledgebaseService.query(id=dataset_id, tenant_id=tenant_id): - return get_error_data_result(retmsg=f"You don't own the dataset {dataset_id}. ") + return get_error_data_result(message=f"You don't own the dataset {dataset_id}. ") req = request.json if not req: doc_ids = None @@ -559,16 +559,16 @@ def delete(tenant_id, dataset_id): try: e, doc = DocumentService.get_by_id(doc_id) if not e: - return get_error_data_result(retmsg="Document not found!") + return get_error_data_result(message="Document not found!") tenant_id = DocumentService.get_tenant_id(doc_id) if not tenant_id: - return get_error_data_result(retmsg="Tenant not found!") + return get_error_data_result(message="Tenant not found!") b, n = File2DocumentService.get_storage_address(doc_id=doc_id) if not DocumentService.remove_document(doc, tenant_id): return get_error_data_result( - retmsg="Database error (Document removal)!" + message="Database error (Document removal)!" ) f2d = File2DocumentService.get_by_document_id(doc_id) @@ -585,7 +585,7 @@ def delete(tenant_id, dataset_id): errors += str(e) if errors: - return get_result(retmsg=errors, retcode=RetCode.SERVER_ERROR) + return get_result(message=errors, code=RetCode.SERVER_ERROR) return get_result() @@ -630,14 +630,14 @@ def parse(tenant_id, dataset_id): type: object """ if not KnowledgebaseService.query(id=dataset_id, tenant_id=tenant_id): - return get_error_data_result(retmsg=f"You don't own the dataset {dataset_id}.") + return get_error_data_result(message=f"You don't own the dataset {dataset_id}.") req = request.json if not req.get("document_ids"): return get_error_data_result("`document_ids` is required") for id in req["document_ids"]: doc = DocumentService.query(id=id, kb_id=dataset_id) if not doc: - return get_error_data_result(retmsg=f"You don't own the document {id}.") + return get_error_data_result(message=f"You don't own the document {id}.") if doc[0].progress != 0.0: return get_error_data_result( "Can't stop parsing document with progress at 0 or 100" @@ -699,14 +699,14 @@ def stop_parsing(tenant_id, dataset_id): type: object """ if not KnowledgebaseService.query(id=dataset_id, tenant_id=tenant_id): - return get_error_data_result(retmsg=f"You don't own the dataset {dataset_id}.") + return get_error_data_result(message=f"You don't own the dataset {dataset_id}.") req = request.json if not req.get("document_ids"): return get_error_data_result("`document_ids` is required") for id in req["document_ids"]: doc = DocumentService.query(id=id, kb_id=dataset_id) if not doc: - return get_error_data_result(retmsg=f"You don't own the document {id}.") + return get_error_data_result(message=f"You don't own the document {id}.") if int(doc[0].progress) == 1 or int(doc[0].progress) == 0: return get_error_data_result( "Can't stop parsing document with progress at 0 or 1" @@ -793,11 +793,11 @@ def list_chunks(tenant_id, dataset_id, document_id): description: Document details. """ if not KnowledgebaseService.query(id=dataset_id, tenant_id=tenant_id): - return get_error_data_result(retmsg=f"You don't own the dataset {dataset_id}.") + return get_error_data_result(message=f"You don't own the dataset {dataset_id}.") doc = DocumentService.query(id=document_id, kb_id=dataset_id) if not doc: return get_error_data_result( - retmsg=f"You don't own the document {document_id}." + message=f"You don't own the document {document_id}." ) doc = doc[0] req = request.args @@ -965,16 +965,16 @@ def add_chunk(tenant_id, dataset_id, document_id): description: Important keywords. """ if not KnowledgebaseService.query(id=dataset_id, tenant_id=tenant_id): - return get_error_data_result(retmsg=f"You don't own the dataset {dataset_id}.") + return get_error_data_result(message=f"You don't own the dataset {dataset_id}.") doc = DocumentService.query(id=document_id, kb_id=dataset_id) if not doc: return get_error_data_result( - retmsg=f"You don't own the document {document_id}." + message=f"You don't own the document {document_id}." ) doc = doc[0] req = request.json if not req.get("content"): - return get_error_data_result(retmsg="`content` is required") + return get_error_data_result(message="`content` is required") if "important_keywords" in req: if type(req["important_keywords"]) != list: return get_error_data_result( @@ -1078,11 +1078,11 @@ def rm_chunk(tenant_id, dataset_id, document_id): type: object """ if not KnowledgebaseService.query(id=dataset_id, tenant_id=tenant_id): - return get_error_data_result(retmsg=f"You don't own the dataset {dataset_id}.") + return get_error_data_result(message=f"You don't own the dataset {dataset_id}.") doc = DocumentService.query(id=document_id, kb_id=dataset_id) if not doc: return get_error_data_result( - retmsg=f"You don't own the document {document_id}." + message=f"You don't own the document {document_id}." ) doc = doc[0] req = request.json @@ -1104,7 +1104,7 @@ def rm_chunk(tenant_id, dataset_id, document_id): if not ELASTICSEARCH.deleteByQuery( Q("ids", values=chunk_list), search.index_name(tenant_id) ): - return get_error_data_result(retmsg="Index updating failure") + return get_error_data_result(message="Index updating failure") deleted_chunk_ids = chunk_list chunk_number = len(deleted_chunk_ids) DocumentService.decrement_chunk_num(doc.id, doc.kb_id, 1, chunk_number, 0) @@ -1170,14 +1170,14 @@ def update_chunk(tenant_id, dataset_id, document_id, chunk_id): """ try: res = ELASTICSEARCH.get(chunk_id, search.index_name(tenant_id)) - except Exception as e: + except Exception: return get_error_data_result(f"Can't find this chunk {chunk_id}") if not KnowledgebaseService.query(id=dataset_id, tenant_id=tenant_id): - return get_error_data_result(retmsg=f"You don't own the dataset {dataset_id}.") + return get_error_data_result(message=f"You don't own the dataset {dataset_id}.") doc = DocumentService.query(id=document_id, kb_id=dataset_id) if not doc: return get_error_data_result( - retmsg=f"You don't own the document {document_id}." + message=f"You don't own the document {document_id}." ) doc = doc[0] query = { @@ -1210,7 +1210,7 @@ def update_chunk(tenant_id, dataset_id, document_id, chunk_id): arr = [t for t in re.split(r"[\n\t]", d["content_with_weight"]) if len(t) > 1] if len(arr) != 2: return get_error_data_result( - retmsg="Q&A must be separated by TAB/ENTER key." + message="Q&A must be separated by TAB/ENTER key." ) q, a = rmPrefix(arr[0]), rmPrefix(arr[1]) d = beAdoc( @@ -1317,8 +1317,8 @@ def retrieval_test(tenant_id): embd_nms = list(set([kb.embd_id for kb in kbs])) if len(embd_nms) != 1: return get_result( - retmsg='Datasets use different embedding models."', - retcode=RetCode.AUTHENTICATION_ERROR, + message='Datasets use different embedding models."', + code=RetCode.AUTHENTICATION_ERROR, ) if "question" not in req: return get_error_data_result("`question` is required.") @@ -1344,7 +1344,7 @@ def retrieval_test(tenant_id): try: e, kb = KnowledgebaseService.get_by_id(kb_ids[0]) if not e: - return get_error_data_result(retmsg="Dataset not found!") + return get_error_data_result(message="Dataset not found!") embd_mdl = TenantLLMService.model_instance( kb.tenant_id, LLMType.EMBEDDING.value, llm_name=kb.embd_id ) @@ -1398,7 +1398,7 @@ def retrieval_test(tenant_id): except Exception as e: if str(e).find("not_found") > 0: return get_result( - retmsg=f"No chunk found! Check the chunk status please!", - retcode=RetCode.DATA_ERROR, + message="No chunk found! Check the chunk status please!", + code=RetCode.DATA_ERROR, ) return server_error_response(e) diff --git a/api/apps/sdk/session.py b/api/apps/sdk/session.py index 1b7b0ce0c659abd22671a01da95e714694ee53c0..9f7be2a9a3642f3d28c218e05669ccd1c3ae9d7f 100644 --- a/api/apps/sdk/session.py +++ b/api/apps/sdk/session.py @@ -1,394 +1,394 @@ -# -# Copyright 2024 The InfiniFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import json -from functools import partial -from uuid import uuid4 - -from flask import request, Response - -from agent.canvas import Canvas -from api.db import StatusEnum -from api.db.db_models import API4Conversation -from api.db.services.api_service import API4ConversationService -from api.db.services.canvas_service import UserCanvasService -from api.db.services.dialog_service import DialogService, ConversationService, chat -from api.utils import get_uuid -from api.utils.api_utils import get_error_data_result -from api.utils.api_utils import get_result, token_required - - -@manager.route('/chats//sessions', methods=['POST']) -@token_required -def create(tenant_id,chat_id): - req = request.json - req["dialog_id"] = chat_id - dia = DialogService.query(tenant_id=tenant_id, id=req["dialog_id"], status=StatusEnum.VALID.value) - if not dia: - return get_error_data_result(retmsg="You do not own the assistant.") - conv = { - "id": get_uuid(), - "dialog_id": req["dialog_id"], - "name": req.get("name", "New session"), - "message": [{"role": "assistant", "content": "Hi! I am your assistant,can I help you?"}] - } - if not conv.get("name"): - return get_error_data_result(retmsg="`name` can not be empty.") - ConversationService.save(**conv) - e, conv = ConversationService.get_by_id(conv["id"]) - if not e: - return get_error_data_result(retmsg="Fail to create a session!") - conv = conv.to_dict() - conv['messages'] = conv.pop("message") - conv["chat_id"] = conv.pop("dialog_id") - del conv["reference"] - return get_result(data=conv) - - -@manager.route('/agents//sessions', methods=['POST']) -@token_required -def create_agent_session(tenant_id, agent_id): - req = request.json - e, cvs = UserCanvasService.get_by_id(agent_id) - if not e: - return get_error_data_result("Agent not found.") - if cvs.user_id != tenant_id: - return get_error_data_result(retmsg="You do not own the agent.") - - if not isinstance(cvs.dsl, str): - cvs.dsl = json.dumps(cvs.dsl, ensure_ascii=False) - - canvas = Canvas(cvs.dsl, tenant_id) - conv = { - "id": get_uuid(), - "dialog_id": cvs.id, - "user_id": req.get("user_id", ""), - "message": [{"role": "assistant", "content": canvas.get_prologue()}], - "source": "agent" - } - API4ConversationService.save(**conv) - return get_result(data=conv) - - -@manager.route('/chats//sessions/', methods=['PUT']) -@token_required -def update(tenant_id,chat_id,session_id): - req = request.json - req["dialog_id"] = chat_id - conv_id = session_id - conv = ConversationService.query(id=conv_id,dialog_id=chat_id) - if not conv: - return get_error_data_result(retmsg="Session does not exist") - if not DialogService.query(id=chat_id, tenant_id=tenant_id, status=StatusEnum.VALID.value): - return get_error_data_result(retmsg="You do not own the session") - if "message" in req or "messages" in req: - return get_error_data_result(retmsg="`message` can not be change") - if "reference" in req: - return get_error_data_result(retmsg="`reference` can not be change") - if "name" in req and not req.get("name"): - return get_error_data_result(retmsg="`name` can not be empty.") - if not ConversationService.update_by_id(conv_id, req): - return get_error_data_result(retmsg="Session updates error") - return get_result() - - -@manager.route('/chats//completions', methods=['POST']) -@token_required -def completion(tenant_id, chat_id): - req = request.json - if not req.get("session_id"): - conv = { - "id": get_uuid(), - "dialog_id": chat_id, - "name": req.get("name", "New session"), - "message": [{"role": "assistant", "content": "Hi! I am your assistant,can I help you?"}] - } - if not conv.get("name"): - return get_error_data_result(retmsg="`name` can not be empty.") - ConversationService.save(**conv) - e, conv = ConversationService.get_by_id(conv["id"]) - session_id=conv.id - else: - session_id = req.get("session_id") - if not req.get("question"): - return get_error_data_result(retmsg="Please input your question.") - conv = ConversationService.query(id=session_id,dialog_id=chat_id) - if not conv: - return get_error_data_result(retmsg="Session does not exist") - conv = conv[0] - if not DialogService.query(id=chat_id, tenant_id=tenant_id, status=StatusEnum.VALID.value): - return get_error_data_result(retmsg="You do not own the chat") - msg = [] - question = { - "content": req.get("question"), - "role": "user", - "id": str(uuid4()) - } - conv.message.append(question) - for m in conv.message: - if m["role"] == "system": continue - if m["role"] == "assistant" and not msg: continue - msg.append(m) - message_id = msg[-1].get("id") - e, dia = DialogService.get_by_id(conv.dialog_id) - - if not conv.reference: - conv.reference = [] - conv.message.append({"role": "assistant", "content": "", "id": message_id}) - conv.reference.append({"chunks": [], "doc_aggs": []}) - - def fillin_conv(ans): - nonlocal conv, message_id - if not conv.reference: - conv.reference.append(ans["reference"]) - else: - conv.reference[-1] = ans["reference"] - conv.message[-1] = {"role": "assistant", "content": ans["answer"], - "id": message_id, "prompt": ans.get("prompt", "")} - ans["id"] = message_id - ans["session_id"]=session_id - - def stream(): - nonlocal dia, msg, req, conv - try: - for ans in chat(dia, msg, **req): - fillin_conv(ans) - yield "data:" + json.dumps({"code": 0, "data": ans}, ensure_ascii=False) + "\n\n" - ConversationService.update_by_id(conv.id, conv.to_dict()) - except Exception as e: - yield "data:" + json.dumps({"code": 500, "message": str(e), - "data": {"answer": "**ERROR**: " + str(e),"reference": []}}, - ensure_ascii=False) + "\n\n" - yield "data:" + json.dumps({"code": 0, "data": True}, ensure_ascii=False) + "\n\n" - - if req.get("stream", True): - resp = Response(stream(), mimetype="text/event-stream") - resp.headers.add_header("Cache-control", "no-cache") - resp.headers.add_header("Connection", "keep-alive") - resp.headers.add_header("X-Accel-Buffering", "no") - resp.headers.add_header("Content-Type", "text/event-stream; charset=utf-8") - return resp - - else: - answer = None - for ans in chat(dia, msg, **req): - answer = ans - fillin_conv(ans) - ConversationService.update_by_id(conv.id, conv.to_dict()) - break - return get_result(data=answer) - - -@manager.route('/agents//completions', methods=['POST']) -@token_required -def agent_completion(tenant_id, agent_id): - req = request.json - e, cvs = UserCanvasService.get_by_id(agent_id) - if not e: - return get_error_data_result("Agent not found.") - if cvs.user_id != tenant_id: - return get_error_data_result(retmsg="You do not own the agent.") - if not isinstance(cvs.dsl, str): - cvs.dsl = json.dumps(cvs.dsl, ensure_ascii=False) - - canvas = Canvas(cvs.dsl, tenant_id) - - msg = [] - for m in req["messages"]: - if m["role"] == "system": - continue - if m["role"] == "assistant" and not msg: - continue - msg.append(m) - if not msg[-1].get("id"): msg[-1]["id"] = get_uuid() - message_id = msg[-1]["id"] - - if not req.get("session_id"): - session_id = get_uuid() - conv = { - "id": session_id, - "dialog_id": cvs.id, - "user_id": req.get("user_id", ""), - "message": [{"role": "assistant", "content": canvas.get_prologue()}], - "source": "agent" - } - API4ConversationService.save(**conv) - conv = API4Conversation(**conv) - else: - session_id = req.get("session_id") - e, conv = API4ConversationService.get_by_id(req["session_id"]) - if not e: - return get_error_data_result(retmsg="Session not found!") - - if "quote" not in req: req["quote"] = False - stream = req.get("stream", True) - - def fillin_conv(ans): - nonlocal conv, message_id - if not conv.reference: - conv.reference.append(ans["reference"]) - else: - conv.reference[-1] = ans["reference"] - conv.message[-1] = {"role": "assistant", "content": ans["answer"], "id": message_id} - ans["id"] = message_id - ans["session_id"] = session_id - - def rename_field(ans): - reference = ans['reference'] - if not isinstance(reference, dict): - return - for chunk_i in reference.get('chunks', []): - if 'docnm_kwd' in chunk_i: - chunk_i['doc_name'] = chunk_i['docnm_kwd'] - chunk_i.pop('docnm_kwd') - conv.message.append(msg[-1]) - - if not conv.reference: - conv.reference = [] - conv.message.append({"role": "assistant", "content": "", "id": message_id}) - conv.reference.append({"chunks": [], "doc_aggs": []}) - - final_ans = {"reference": [], "content": ""} - - canvas.messages.append(msg[-1]) - canvas.add_user_input(msg[-1]["content"]) - answer = canvas.run(stream=stream) - - assert answer is not None, "Nothing. Is it over?" - - if stream: - assert isinstance(answer, partial), "Nothing. Is it over?" - - def sse(): - nonlocal answer, cvs, conv - try: - for ans in answer(): - for k in ans.keys(): - final_ans[k] = ans[k] - ans = {"answer": ans["content"], "reference": ans.get("reference", [])} - fillin_conv(ans) - rename_field(ans) - yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": ans}, - ensure_ascii=False) + "\n\n" - - canvas.messages.append({"role": "assistant", "content": final_ans["content"], "id": message_id}) - if final_ans.get("reference"): - canvas.reference.append(final_ans["reference"]) - cvs.dsl = json.loads(str(canvas)) - API4ConversationService.append_message(conv.id, conv.to_dict()) - except Exception as e: - yield "data:" + json.dumps({"retcode": 500, "retmsg": str(e), - "data": {"answer": "**ERROR**: " + str(e), "reference": []}}, - ensure_ascii=False) + "\n\n" - yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": True}, ensure_ascii=False) + "\n\n" - - resp = Response(sse(), mimetype="text/event-stream") - resp.headers.add_header("Cache-control", "no-cache") - resp.headers.add_header("Connection", "keep-alive") - resp.headers.add_header("X-Accel-Buffering", "no") - resp.headers.add_header("Content-Type", "text/event-stream; charset=utf-8") - return resp - - final_ans["content"] = "\n".join(answer["content"]) if "content" in answer else "" - canvas.messages.append({"role": "assistant", "content": final_ans["content"], "id": message_id}) - if final_ans.get("reference"): - canvas.reference.append(final_ans["reference"]) - cvs.dsl = json.loads(str(canvas)) - - result = {"answer": final_ans["content"], "reference": final_ans.get("reference", [])} - fillin_conv(result) - API4ConversationService.append_message(conv.id, conv.to_dict()) - rename_field(result) - return get_result(data=result) - - -@manager.route('/chats//sessions', methods=['GET']) -@token_required -def list(chat_id,tenant_id): - if not DialogService.query(tenant_id=tenant_id, id=chat_id, status=StatusEnum.VALID.value): - return get_error_data_result(retmsg=f"You don't own the assistant {chat_id}.") - id = request.args.get("id") - name = request.args.get("name") - page_number = int(request.args.get("page", 1)) - items_per_page = int(request.args.get("page_size", 1024)) - orderby = request.args.get("orderby", "create_time") - if request.args.get("desc") == "False" or request.args.get("desc") == "false": - desc = False - else: - desc = True - convs = ConversationService.get_list(chat_id,page_number,items_per_page,orderby,desc,id,name) - if not convs: - return get_result(data=[]) - for conv in convs: - conv['messages'] = conv.pop("message") - infos = conv["messages"] - for info in infos: - if "prompt" in info: - info.pop("prompt") - conv["chat"] = conv.pop("dialog_id") - if conv["reference"]: - messages = conv["messages"] - message_num = 0 - chunk_num = 0 - while message_num < len(messages): - if message_num != 0 and messages[message_num]["role"] != "user": - chunk_list = [] - if "chunks" in conv["reference"][chunk_num]: - chunks = conv["reference"][chunk_num]["chunks"] - for chunk in chunks: - new_chunk = { - "id": chunk["chunk_id"], - "content": chunk["content_with_weight"], - "document_id": chunk["doc_id"], - "document_name": chunk["docnm_kwd"], - "dataset_id": chunk["kb_id"], - "image_id": chunk["img_id"], - "similarity": chunk["similarity"], - "vector_similarity": chunk["vector_similarity"], - "term_similarity": chunk["term_similarity"], - "positions": chunk["positions"], - } - chunk_list.append(new_chunk) - chunk_num += 1 - messages[message_num]["reference"] = chunk_list - message_num += 1 - del conv["reference"] - return get_result(data=convs) - - -@manager.route('/chats//sessions', methods=["DELETE"]) -@token_required -def delete(tenant_id,chat_id): - if not DialogService.query(id=chat_id, tenant_id=tenant_id, status=StatusEnum.VALID.value): - return get_error_data_result(retmsg="You don't own the chat") - req = request.json - convs = ConversationService.query(dialog_id=chat_id) - if not req: - ids = None - else: - ids=req.get("ids") - - if not ids: - conv_list = [] - for conv in convs: - conv_list.append(conv.id) - else: - conv_list=ids - for id in conv_list: - conv = ConversationService.query(id=id,dialog_id=chat_id) - if not conv: - return get_error_data_result(retmsg="The chat doesn't own the session") - ConversationService.delete_by_id(id) - return get_result() +# +# Copyright 2024 The InfiniFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import json +from functools import partial +from uuid import uuid4 + +from flask import request, Response + +from agent.canvas import Canvas +from api.db import StatusEnum +from api.db.db_models import API4Conversation +from api.db.services.api_service import API4ConversationService +from api.db.services.canvas_service import UserCanvasService +from api.db.services.dialog_service import DialogService, ConversationService, chat +from api.utils import get_uuid +from api.utils.api_utils import get_error_data_result +from api.utils.api_utils import get_result, token_required + + +@manager.route('/chats//sessions', methods=['POST']) +@token_required +def create(tenant_id,chat_id): + req = request.json + req["dialog_id"] = chat_id + dia = DialogService.query(tenant_id=tenant_id, id=req["dialog_id"], status=StatusEnum.VALID.value) + if not dia: + return get_error_data_result(message="You do not own the assistant.") + conv = { + "id": get_uuid(), + "dialog_id": req["dialog_id"], + "name": req.get("name", "New session"), + "message": [{"role": "assistant", "content": "Hi! I am your assistant,can I help you?"}] + } + if not conv.get("name"): + return get_error_data_result(message="`name` can not be empty.") + ConversationService.save(**conv) + e, conv = ConversationService.get_by_id(conv["id"]) + if not e: + return get_error_data_result(message="Fail to create a session!") + conv = conv.to_dict() + conv['messages'] = conv.pop("message") + conv["chat_id"] = conv.pop("dialog_id") + del conv["reference"] + return get_result(data=conv) + + +@manager.route('/agents//sessions', methods=['POST']) +@token_required +def create_agent_session(tenant_id, agent_id): + req = request.json + e, cvs = UserCanvasService.get_by_id(agent_id) + if not e: + return get_error_data_result("Agent not found.") + if cvs.user_id != tenant_id: + return get_error_data_result(message="You do not own the agent.") + + if not isinstance(cvs.dsl, str): + cvs.dsl = json.dumps(cvs.dsl, ensure_ascii=False) + + canvas = Canvas(cvs.dsl, tenant_id) + conv = { + "id": get_uuid(), + "dialog_id": cvs.id, + "user_id": req.get("user_id", ""), + "message": [{"role": "assistant", "content": canvas.get_prologue()}], + "source": "agent" + } + API4ConversationService.save(**conv) + return get_result(data=conv) + + +@manager.route('/chats//sessions/', methods=['PUT']) +@token_required +def update(tenant_id,chat_id,session_id): + req = request.json + req["dialog_id"] = chat_id + conv_id = session_id + conv = ConversationService.query(id=conv_id,dialog_id=chat_id) + if not conv: + return get_error_data_result(message="Session does not exist") + if not DialogService.query(id=chat_id, tenant_id=tenant_id, status=StatusEnum.VALID.value): + return get_error_data_result(message="You do not own the session") + if "message" in req or "messages" in req: + return get_error_data_result(message="`message` can not be change") + if "reference" in req: + return get_error_data_result(message="`reference` can not be change") + if "name" in req and not req.get("name"): + return get_error_data_result(message="`name` can not be empty.") + if not ConversationService.update_by_id(conv_id, req): + return get_error_data_result(message="Session updates error") + return get_result() + + +@manager.route('/chats//completions', methods=['POST']) +@token_required +def completion(tenant_id, chat_id): + req = request.json + if not req.get("session_id"): + conv = { + "id": get_uuid(), + "dialog_id": chat_id, + "name": req.get("name", "New session"), + "message": [{"role": "assistant", "content": "Hi! I am your assistant,can I help you?"}] + } + if not conv.get("name"): + return get_error_data_result(message="`name` can not be empty.") + ConversationService.save(**conv) + e, conv = ConversationService.get_by_id(conv["id"]) + session_id=conv.id + else: + session_id = req.get("session_id") + if not req.get("question"): + return get_error_data_result(message="Please input your question.") + conv = ConversationService.query(id=session_id,dialog_id=chat_id) + if not conv: + return get_error_data_result(message="Session does not exist") + conv = conv[0] + if not DialogService.query(id=chat_id, tenant_id=tenant_id, status=StatusEnum.VALID.value): + return get_error_data_result(message="You do not own the chat") + msg = [] + question = { + "content": req.get("question"), + "role": "user", + "id": str(uuid4()) + } + conv.message.append(question) + for m in conv.message: + if m["role"] == "system": continue + if m["role"] == "assistant" and not msg: continue + msg.append(m) + message_id = msg[-1].get("id") + e, dia = DialogService.get_by_id(conv.dialog_id) + + if not conv.reference: + conv.reference = [] + conv.message.append({"role": "assistant", "content": "", "id": message_id}) + conv.reference.append({"chunks": [], "doc_aggs": []}) + + def fillin_conv(ans): + nonlocal conv, message_id + if not conv.reference: + conv.reference.append(ans["reference"]) + else: + conv.reference[-1] = ans["reference"] + conv.message[-1] = {"role": "assistant", "content": ans["answer"], + "id": message_id, "prompt": ans.get("prompt", "")} + ans["id"] = message_id + ans["session_id"]=session_id + + def stream(): + nonlocal dia, msg, req, conv + try: + for ans in chat(dia, msg, **req): + fillin_conv(ans) + yield "data:" + json.dumps({"code": 0, "data": ans}, ensure_ascii=False) + "\n\n" + ConversationService.update_by_id(conv.id, conv.to_dict()) + except Exception as e: + yield "data:" + json.dumps({"code": 500, "message": str(e), + "data": {"answer": "**ERROR**: " + str(e),"reference": []}}, + ensure_ascii=False) + "\n\n" + yield "data:" + json.dumps({"code": 0, "data": True}, ensure_ascii=False) + "\n\n" + + if req.get("stream", True): + resp = Response(stream(), mimetype="text/event-stream") + resp.headers.add_header("Cache-control", "no-cache") + resp.headers.add_header("Connection", "keep-alive") + resp.headers.add_header("X-Accel-Buffering", "no") + resp.headers.add_header("Content-Type", "text/event-stream; charset=utf-8") + return resp + + else: + answer = None + for ans in chat(dia, msg, **req): + answer = ans + fillin_conv(ans) + ConversationService.update_by_id(conv.id, conv.to_dict()) + break + return get_result(data=answer) + + +@manager.route('/agents//completions', methods=['POST']) +@token_required +def agent_completion(tenant_id, agent_id): + req = request.json + e, cvs = UserCanvasService.get_by_id(agent_id) + if not e: + return get_error_data_result("Agent not found.") + if cvs.user_id != tenant_id: + return get_error_data_result(message="You do not own the agent.") + if not isinstance(cvs.dsl, str): + cvs.dsl = json.dumps(cvs.dsl, ensure_ascii=False) + + canvas = Canvas(cvs.dsl, tenant_id) + + msg = [] + for m in req["messages"]: + if m["role"] == "system": + continue + if m["role"] == "assistant" and not msg: + continue + msg.append(m) + if not msg[-1].get("id"): msg[-1]["id"] = get_uuid() + message_id = msg[-1]["id"] + + if not req.get("session_id"): + session_id = get_uuid() + conv = { + "id": session_id, + "dialog_id": cvs.id, + "user_id": req.get("user_id", ""), + "message": [{"role": "assistant", "content": canvas.get_prologue()}], + "source": "agent" + } + API4ConversationService.save(**conv) + conv = API4Conversation(**conv) + else: + session_id = req.get("session_id") + e, conv = API4ConversationService.get_by_id(req["session_id"]) + if not e: + return get_error_data_result(message="Session not found!") + + if "quote" not in req: req["quote"] = False + stream = req.get("stream", True) + + def fillin_conv(ans): + nonlocal conv, message_id + if not conv.reference: + conv.reference.append(ans["reference"]) + else: + conv.reference[-1] = ans["reference"] + conv.message[-1] = {"role": "assistant", "content": ans["answer"], "id": message_id} + ans["id"] = message_id + ans["session_id"] = session_id + + def rename_field(ans): + reference = ans['reference'] + if not isinstance(reference, dict): + return + for chunk_i in reference.get('chunks', []): + if 'docnm_kwd' in chunk_i: + chunk_i['doc_name'] = chunk_i['docnm_kwd'] + chunk_i.pop('docnm_kwd') + conv.message.append(msg[-1]) + + if not conv.reference: + conv.reference = [] + conv.message.append({"role": "assistant", "content": "", "id": message_id}) + conv.reference.append({"chunks": [], "doc_aggs": []}) + + final_ans = {"reference": [], "content": ""} + + canvas.messages.append(msg[-1]) + canvas.add_user_input(msg[-1]["content"]) + answer = canvas.run(stream=stream) + + assert answer is not None, "Nothing. Is it over?" + + if stream: + assert isinstance(answer, partial), "Nothing. Is it over?" + + def sse(): + nonlocal answer, cvs, conv + try: + for ans in answer(): + for k in ans.keys(): + final_ans[k] = ans[k] + ans = {"answer": ans["content"], "reference": ans.get("reference", [])} + fillin_conv(ans) + rename_field(ans) + yield "data:" + json.dumps({"code": 0, "message": "", "data": ans}, + ensure_ascii=False) + "\n\n" + + canvas.messages.append({"role": "assistant", "content": final_ans["content"], "id": message_id}) + if final_ans.get("reference"): + canvas.reference.append(final_ans["reference"]) + cvs.dsl = json.loads(str(canvas)) + API4ConversationService.append_message(conv.id, conv.to_dict()) + except Exception as e: + yield "data:" + json.dumps({"code": 500, "message": str(e), + "data": {"answer": "**ERROR**: " + str(e), "reference": []}}, + ensure_ascii=False) + "\n\n" + yield "data:" + json.dumps({"code": 0, "message": "", "data": True}, ensure_ascii=False) + "\n\n" + + resp = Response(sse(), mimetype="text/event-stream") + resp.headers.add_header("Cache-control", "no-cache") + resp.headers.add_header("Connection", "keep-alive") + resp.headers.add_header("X-Accel-Buffering", "no") + resp.headers.add_header("Content-Type", "text/event-stream; charset=utf-8") + return resp + + final_ans["content"] = "\n".join(answer["content"]) if "content" in answer else "" + canvas.messages.append({"role": "assistant", "content": final_ans["content"], "id": message_id}) + if final_ans.get("reference"): + canvas.reference.append(final_ans["reference"]) + cvs.dsl = json.loads(str(canvas)) + + result = {"answer": final_ans["content"], "reference": final_ans.get("reference", [])} + fillin_conv(result) + API4ConversationService.append_message(conv.id, conv.to_dict()) + rename_field(result) + return get_result(data=result) + + +@manager.route('/chats//sessions', methods=['GET']) +@token_required +def list(chat_id,tenant_id): + if not DialogService.query(tenant_id=tenant_id, id=chat_id, status=StatusEnum.VALID.value): + return get_error_data_result(message=f"You don't own the assistant {chat_id}.") + id = request.args.get("id") + name = request.args.get("name") + page_number = int(request.args.get("page", 1)) + items_per_page = int(request.args.get("page_size", 1024)) + orderby = request.args.get("orderby", "create_time") + if request.args.get("desc") == "False" or request.args.get("desc") == "false": + desc = False + else: + desc = True + convs = ConversationService.get_list(chat_id,page_number,items_per_page,orderby,desc,id,name) + if not convs: + return get_result(data=[]) + for conv in convs: + conv['messages'] = conv.pop("message") + infos = conv["messages"] + for info in infos: + if "prompt" in info: + info.pop("prompt") + conv["chat"] = conv.pop("dialog_id") + if conv["reference"]: + messages = conv["messages"] + message_num = 0 + chunk_num = 0 + while message_num < len(messages): + if message_num != 0 and messages[message_num]["role"] != "user": + chunk_list = [] + if "chunks" in conv["reference"][chunk_num]: + chunks = conv["reference"][chunk_num]["chunks"] + for chunk in chunks: + new_chunk = { + "id": chunk["chunk_id"], + "content": chunk["content_with_weight"], + "document_id": chunk["doc_id"], + "document_name": chunk["docnm_kwd"], + "dataset_id": chunk["kb_id"], + "image_id": chunk["img_id"], + "similarity": chunk["similarity"], + "vector_similarity": chunk["vector_similarity"], + "term_similarity": chunk["term_similarity"], + "positions": chunk["positions"], + } + chunk_list.append(new_chunk) + chunk_num += 1 + messages[message_num]["reference"] = chunk_list + message_num += 1 + del conv["reference"] + return get_result(data=convs) + + +@manager.route('/chats//sessions', methods=["DELETE"]) +@token_required +def delete(tenant_id,chat_id): + if not DialogService.query(id=chat_id, tenant_id=tenant_id, status=StatusEnum.VALID.value): + return get_error_data_result(message="You don't own the chat") + req = request.json + convs = ConversationService.query(dialog_id=chat_id) + if not req: + ids = None + else: + ids=req.get("ids") + + if not ids: + conv_list = [] + for conv in convs: + conv_list.append(conv.id) + else: + conv_list=ids + for id in conv_list: + conv = ConversationService.query(id=id,dialog_id=chat_id) + if not conv: + return get_error_data_result(message="The chat doesn't own the session") + ConversationService.delete_by_id(id) + return get_result() diff --git a/api/apps/system_app.py b/api/apps/system_app.py index 67611a57f413ca3dcc1ed357b7be89d3d6de4fbb..0ebe075ab23d1d0415da8dd09d5cde43d000e9c6 100644 --- a/api/apps/system_app.py +++ b/api/apps/system_app.py @@ -29,8 +29,6 @@ from api.utils.api_utils import ( get_data_error_result, server_error_response, generate_confirmation_token, - request, - validate_request, ) from api.versions import get_rag_version from rag.utils.es_conn import ELASTICSEARCH @@ -209,7 +207,7 @@ def new_token(): try: tenants = UserTenantService.query(user_id=current_user.id) if not tenants: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") tenant_id = tenants[0].tenant_id obj = { @@ -222,7 +220,7 @@ def new_token(): } if not APITokenService.save(**obj): - return get_data_error_result(retmsg="Fail to new a dialog!") + return get_data_error_result(message="Fail to new a dialog!") return get_json_result(data=obj) except Exception as e: @@ -263,7 +261,7 @@ def token_list(): try: tenants = UserTenantService.query(user_id=current_user.id) if not tenants: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") objs = APITokenService.query(tenant_id=tenants[0].tenant_id) return get_json_result(data=[o.to_dict() for o in objs]) diff --git a/api/apps/tenant_app.py b/api/apps/tenant_app.py index 98992c0339e83a8940a3146d37eac134c022644b..4ce652b1c0176188913b6e1b63d8f2390a9c2e8d 100644 --- a/api/apps/tenant_app.py +++ b/api/apps/tenant_app.py @@ -44,14 +44,14 @@ def create(tenant_id): req = request.json usrs = UserService.query(email=req["email"]) if not usrs: - return get_data_error_result(retmsg="User not found.") + return get_data_error_result(message="User not found.") user_id = usrs[0].id user_tenants = UserTenantService.query(user_id=user_id, tenant_id=tenant_id) if user_tenants: if user_tenants[0].status == UserTenantRole.NORMAL.value: - return get_data_error_result(retmsg="This user is in the team already.") - return get_data_error_result(retmsg="Invitation notification is sent.") + return get_data_error_result(message="This user is in the team already.") + return get_data_error_result(message="Invitation notification is sent.") UserTenantService.save( id=get_uuid(), diff --git a/api/apps/user_app.py b/api/apps/user_app.py index a9d5c51ac4547d91caed377b2a5a646caf742af7..04db59256e4840fd66aa1a27b3e04e28c23d300f 100644 --- a/api/apps/user_app.py +++ b/api/apps/user_app.py @@ -36,7 +36,7 @@ from api.utils import ( current_timestamp, datetime_format, ) -from api.db import UserTenantRole, LLMType, FileType +from api.db import UserTenantRole, FileType from api.settings import ( RetCode, GITHUB_OAUTH, @@ -90,7 +90,7 @@ def login(): """ if not request.json: return get_json_result( - data=False, retcode=RetCode.AUTHENTICATION_ERROR, retmsg="Unauthorized!" + data=False, code=RetCode.AUTHENTICATION_ERROR, message="Unauthorized!" ) email = request.json.get("email", "") @@ -98,8 +98,8 @@ def login(): if not users: return get_json_result( data=False, - retcode=RetCode.AUTHENTICATION_ERROR, - retmsg=f"Email: {email} is not registered!", + code=RetCode.AUTHENTICATION_ERROR, + message=f"Email: {email} is not registered!", ) password = request.json.get("password") @@ -107,7 +107,7 @@ def login(): password = decrypt(password) except BaseException: return get_json_result( - data=False, retcode=RetCode.SERVER_ERROR, retmsg="Fail to crypt password" + data=False, code=RetCode.SERVER_ERROR, message="Fail to crypt password" ) user = UserService.query_user(email, password) @@ -119,12 +119,12 @@ def login(): user.update_date = (datetime_format(datetime.now()),) user.save() msg = "Welcome back!" - return construct_response(data=response_data, auth=user.get_id(), retmsg=msg) + return construct_response(data=response_data, auth=user.get_id(), message=msg) else: return get_json_result( data=False, - retcode=RetCode.AUTHENTICATION_ERROR, - retmsg="Email and password do not match!", + code=RetCode.AUTHENTICATION_ERROR, + message="Email and password do not match!", ) @@ -323,7 +323,7 @@ def user_info_from_feishu(access_token): "Authorization": f"Bearer {access_token}", } res = requests.get( - f"https://open.feishu.cn/open-apis/authen/v1/user_info", headers=headers + "https://open.feishu.cn/open-apis/authen/v1/user_info", headers=headers ) user_info = res.json()["data"] user_info["email"] = None if user_info.get("email") == "" else user_info["email"] @@ -409,8 +409,8 @@ def setting_user(): ): return get_json_result( data=False, - retcode=RetCode.AUTHENTICATION_ERROR, - retmsg="Password error!", + code=RetCode.AUTHENTICATION_ERROR, + message="Password error!", ) if new_password: @@ -438,7 +438,7 @@ def setting_user(): except Exception as e: stat_logger.exception(e) return get_json_result( - data=False, retmsg="Update failure!", retcode=RetCode.EXCEPTION_ERROR + data=False, message="Update failure!", code=RetCode.EXCEPTION_ERROR ) @@ -474,21 +474,21 @@ def user_profile(): def rollback_user_registration(user_id): try: UserService.delete_by_id(user_id) - except Exception as e: + except Exception: pass try: TenantService.delete_by_id(user_id) - except Exception as e: + except Exception: pass try: u = UserTenantService.query(tenant_id=user_id) if u: UserTenantService.delete_by_id(u[0].id) - except Exception as e: + except Exception: pass try: TenantLLM.delete().where(TenantLLM.tenant_id == user_id).execute() - except Exception as e: + except Exception: pass @@ -581,16 +581,16 @@ def user_add(): if not re.match(r"^[\w\._-]+@([\w_-]+\.)+[\w-]{2,5}$", email_address): return get_json_result( data=False, - retmsg=f"Invalid email address: {email_address}!", - retcode=RetCode.OPERATING_ERROR, + message=f"Invalid email address: {email_address}!", + code=RetCode.OPERATING_ERROR, ) # Check if the email address is already used if UserService.query(email=email_address): return get_json_result( data=False, - retmsg=f"Email: {email_address} has already registered!", - retcode=RetCode.OPERATING_ERROR, + message=f"Email: {email_address} has already registered!", + code=RetCode.OPERATING_ERROR, ) # Construct user info data @@ -617,15 +617,15 @@ def user_add(): return construct_response( data=user.to_json(), auth=user.get_id(), - retmsg=f"{nickname}, welcome aboard!", + message=f"{nickname}, welcome aboard!", ) except Exception as e: rollback_user_registration(user_id) stat_logger.exception(e) return get_json_result( data=False, - retmsg=f"User registration failure, error: {str(e)}", - retcode=RetCode.EXCEPTION_ERROR, + message=f"User registration failure, error: {str(e)}", + code=RetCode.EXCEPTION_ERROR, ) @@ -661,7 +661,7 @@ def tenant_info(): try: tenants = TenantService.get_info_by(current_user.id) if not tenants: - return get_data_error_result(retmsg="Tenant not found!") + return get_data_error_result(message="Tenant not found!") return get_json_result(data=tenants[0]) except Exception as e: return server_error_response(e) diff --git a/api/utils/api_utils.py b/api/utils/api_utils.py index 4813acbe5012f107fd0220edcf1869f5ca781ca9..9aa548646a4c8c92219eca8604a68b3f4b6d8fa3 100644 --- a/api/utils/api_utils.py +++ b/api/utils/api_utils.py @@ -97,19 +97,19 @@ def get_exponential_backoff_interval(retries, full_jitter=False): return max(0, countdown) -def get_data_error_result(retcode=RetCode.DATA_ERROR, - retmsg='Sorry! Data missing!'): +def get_data_error_result(code=RetCode.DATA_ERROR, + message='Sorry! Data missing!'): import re result_dict = { - "retcode": retcode, - "retmsg": re.sub( + "code": code, + "message": re.sub( r"rag", "seceum", - retmsg, + message, flags=re.IGNORECASE)} response = {} for key, value in result_dict.items(): - if value is None and key != "retcode": + if value is None and key != "code": continue else: response[key] = value @@ -120,26 +120,26 @@ def server_error_response(e): stat_logger.exception(e) try: if e.code == 401: - return get_json_result(retcode=401, retmsg=repr(e)) + return get_json_result(code=401, message=repr(e)) except BaseException: pass if len(e.args) > 1: return get_json_result( - retcode=RetCode.EXCEPTION_ERROR, retmsg=repr(e.args[0]), data=e.args[1]) + code=RetCode.EXCEPTION_ERROR, message=repr(e.args[0]), data=e.args[1]) if repr(e).find("index_not_found_exception") >= 0: - return get_json_result(retcode=RetCode.EXCEPTION_ERROR, - retmsg="No chunk found, please upload file and parse it.") + return get_json_result(code=RetCode.EXCEPTION_ERROR, + message="No chunk found, please upload file and parse it.") - return get_json_result(retcode=RetCode.EXCEPTION_ERROR, retmsg=repr(e)) + return get_json_result(code=RetCode.EXCEPTION_ERROR, message=repr(e)) -def error_response(response_code, retmsg=None): - if retmsg is None: - retmsg = HTTP_STATUS_CODES.get(response_code, 'Unknown Error') +def error_response(response_code, message=None): + if message is None: + message = HTTP_STATUS_CODES.get(response_code, 'Unknown Error') return Response(json.dumps({ - 'retmsg': retmsg, - 'retcode': response_code, + 'message': message, + 'code': response_code, }), status=response_code, mimetype='application/json') @@ -171,7 +171,7 @@ def validate_request(*args, **kwargs): error_string += "required argument values: {}".format( ",".join(["{}={}".format(a[0], a[1]) for a in error_arguments])) return get_json_result( - retcode=RetCode.ARGUMENT_ERROR, retmsg=error_string) + code=RetCode.ARGUMENT_ERROR, message=error_string) return func(*_args, **_kwargs) return decorated_function @@ -196,8 +196,8 @@ def send_file_in_mem(data, filename): return send_file(f, as_attachment=True, attachment_filename=filename) -def get_json_result(retcode=RetCode.SUCCESS, retmsg='success', data=None): - response = {"retcode": retcode, "retmsg": retmsg, "data": data} +def get_json_result(code=RetCode.SUCCESS, message='success', data=None): + response = {"code": code, "message": message, "data": data} return jsonify(response) def apikey_required(func): @@ -207,7 +207,7 @@ def apikey_required(func): objs = APIToken.query(token=token) if not objs: return build_error_result( - error_msg='API-KEY is invalid!', retcode=RetCode.FORBIDDEN + message='API-KEY is invalid!', code=RetCode.FORBIDDEN ) kwargs['tenant_id'] = objs[0].tenant_id return func(*args, **kwargs) @@ -215,19 +215,19 @@ def apikey_required(func): return decorated_function -def build_error_result(retcode=RetCode.FORBIDDEN, error_msg='success'): - response = {"error_code": retcode, "error_msg": error_msg} +def build_error_result(code=RetCode.FORBIDDEN, message='success'): + response = {"code": code, "message": message} response = jsonify(response) - response.status_code = retcode + response.status_code = code return response -def construct_response(retcode=RetCode.SUCCESS, - retmsg='success', data=None, auth=None): - result_dict = {"retcode": retcode, "retmsg": retmsg, "data": data} +def construct_response(code=RetCode.SUCCESS, + message='success', data=None, auth=None): + result_dict = {"code": code, "message": message, "data": data} response_dict = {} for key, value in result_dict.items(): - if value is None and key != "retcode": + if value is None and key != "code": continue else: response_dict[key] = value @@ -284,7 +284,7 @@ def token_required(func): objs = APIToken.query(token=token) if not objs: return get_json_result( - data=False, retmsg='Token is not valid!', retcode=RetCode.AUTHENTICATION_ERROR + data=False, message='Token is not valid!', code=RetCode.AUTHENTICATION_ERROR ) kwargs['tenant_id'] = objs[0].tenant_id return func(*args, **kwargs) @@ -292,26 +292,26 @@ def token_required(func): return decorated_function -def get_result(retcode=RetCode.SUCCESS, retmsg='error', data=None): - if retcode == 0: +def get_result(code=RetCode.SUCCESS, message='error', data=None): + if code == 0: if data is not None: - response = {"code": retcode, "data": data} + response = {"code": code, "data": data} else: - response = {"code": retcode} + response = {"code": code} else: - response = {"code": retcode, "message": retmsg} + response = {"code": code, "message": message} return jsonify(response) -def get_error_data_result(retmsg='Sorry! Data missing!', retcode=RetCode.DATA_ERROR, +def get_error_data_result(message='Sorry! Data missing!', code=RetCode.DATA_ERROR, ): import re result_dict = { - "code": retcode, + "code": code, "message": re.sub( r"rag", "seceum", - retmsg, + message, flags=re.IGNORECASE)} response = {} for key, value in result_dict.items(): diff --git a/docs/references/faq.md b/docs/references/faq.md index 894e3164484303f8a62c8e9455f32e0d1df22a51..1aaee7d525927eba9008f94aadc26c45323eda3d 100644 --- a/docs/references/faq.md +++ b/docs/references/faq.md @@ -276,7 +276,7 @@ $ docker ps This is because you forgot to update the `vm.max_map_count` value in **/etc/sysctl.conf** and your change to this value was reset after a system reboot. -#### 4.10 `{"data":null,"retcode":100,"retmsg":""}` +#### 4.10 `{"data":null,"code":100,"message":""}` Your IP address or port number may be incorrect. If you are using the default configurations, enter `http://` (**NOT 9380, AND NO PORT NUMBER REQUIRED!**) in your browser. This should work. diff --git a/intergrations/chatgpt-on-wechat/plugins/ragflow_chat.py b/intergrations/chatgpt-on-wechat/plugins/ragflow_chat.py index 3d8b43ea6857f2a4d45d7471e08e223f842578eb..c280a93dbfb5e472459b2f5c9fc8cad30f681a31 100644 --- a/intergrations/chatgpt-on-wechat/plugins/ragflow_chat.py +++ b/intergrations/chatgpt-on-wechat/plugins/ragflow_chat.py @@ -1,10 +1,8 @@ import requests -import json -from bridge.context import Context, ContextType # Import Context, ContextType +from bridge.context import ContextType # Import Context, ContextType from bridge.reply import Reply, ReplyType # Import Reply, ReplyType from bridge import * from common.log import logger -from config import conf from plugins import Plugin, register # Import Plugin and register from plugins.event import Event, EventContext, EventAction # Import event-related classes @@ -68,12 +66,12 @@ class RAGFlowChat(Plugin): logger.debug(f"[RAGFlowChat] New conversation response: {response.text}") if response.status_code == 200: data = response.json() - if data.get("retcode") == 0: + if data.get("code") == 0: conversation_id = data["data"]["id"] self.conversations[user_id] = conversation_id else: - logger.error(f"[RAGFlowChat] Failed to create conversation: {data.get('retmsg')}") - return f"Sorry, unable to create a conversation: {data.get('retmsg')}" + logger.error(f"[RAGFlowChat] Failed to create conversation: {data.get('message')}") + return f"Sorry, unable to create a conversation: {data.get('message')}" else: logger.error(f"[RAGFlowChat] HTTP error when creating conversation: {response.status_code}") return f"Sorry, unable to connect to RAGFlow API (create conversation). HTTP status code: {response.status_code}" @@ -100,12 +98,12 @@ class RAGFlowChat(Plugin): logger.debug(f"[RAGFlowChat] Completion response: {response.text}") if response.status_code == 200: data = response.json() - if data.get("retcode") == 0: + if data.get("code") == 0: answer = data["data"]["answer"] return answer else: - logger.error(f"[RAGFlowChat] Failed to get answer: {data.get('retmsg')}") - return f"Sorry, unable to get a reply: {data.get('retmsg')}" + logger.error(f"[RAGFlowChat] Failed to get answer: {data.get('message')}") + return f"Sorry, unable to get a reply: {data.get('message')}" else: logger.error(f"[RAGFlowChat] HTTP error when getting answer: {response.status_code}") return f"Sorry, unable to connect to RAGFlow API (get reply). HTTP status code: {response.status_code}" diff --git a/sdk/python/test/conftest.py b/sdk/python/test/conftest.py index 455b6b5c17821a7bb552a766b9e23b23fed0cb01..bcad88f14c1a7ac92c45336c7c9b136579bc6c86 100644 --- a/sdk/python/test/conftest.py +++ b/sdk/python/test/conftest.py @@ -25,16 +25,16 @@ def register(): register_data = {"email":EMAIL,"nickname":name,"password":PASSWORD} res = requests.post(url=url,json=register_data) res = res.json() - if res.get("retcode") != 0: - raise Exception(res.get("retmsg")) + if res.get("code") != 0: + raise Exception(res.get("message")) def login(): url = HOST_ADDRESS + "/v1/user/login" login_data = {"email":EMAIL,"password":PASSWORD} response=requests.post(url=url,json=login_data) res = response.json() - if res.get("retcode")!=0: - raise Exception(res.get("retmsg")) + if res.get("code")!=0: + raise Exception(res.get("message")) auth = response.headers["Authorization"] return auth @@ -46,7 +46,7 @@ def get_api_key_fixture(): auth = {"Authorization": auth} response = requests.post(url=url,headers=auth) res = response.json() - if res.get("retcode") != 0: - raise Exception(res.get("retmsg")) + if res.get("code") != 0: + raise Exception(res.get("message")) return res["data"].get("token") diff --git a/sdk/python/test/ragflow.txt b/sdk/python/test/ragflow.txt index 59b7a28791f13f6bb88584cc4386fb1d0f0864d8..ad9ccb8db2d279d6a85d6937d01234094533bb40 100644 --- a/sdk/python/test/ragflow.txt +++ b/sdk/python/test/ragflow.txt @@ -1 +1 @@ -{"data":null,"retcode":100,"retmsg":"TypeError(\"download_document() got an unexpected keyword argument 'tenant_id'\")"} +{"data":null,"code":100,"message":"TypeError(\"download_document() got an unexpected keyword argument 'tenant_id'\")"} diff --git a/web/src/components/message-input/index.tsx b/web/src/components/message-input/index.tsx index d786869c0b54d449d68cd902fc872073f278dcf8..e026581a3754d08bf23118ca73dbc1385c0bb939 100644 --- a/web/src/components/message-input/index.tsx +++ b/web/src/components/message-input/index.tsx @@ -53,8 +53,8 @@ const getFileIds = (fileList: UploadFile[]) => { }; const isUploadSuccess = (file: UploadFile) => { - const retcode = get(file, 'response.retcode'); - return typeof retcode === 'number' && retcode === 0; + const code = get(file, 'response.code'); + return typeof code === 'number' && code === 0; }; interface IProps { @@ -116,7 +116,7 @@ const MessageInput = ({ const creatingRet = await createConversationBeforeUploadDocument( file.name, ); - if (creatingRet?.retcode === 0) { + if (creatingRet?.code === 0) { nextConversationId = creatingRet.data.id; } } @@ -140,7 +140,7 @@ const MessageInput = ({ originFileObj: file as any, response: ret, percent: 100, - status: ret?.retcode === 0 ? 'done' : 'error', + status: ret?.code === 0 ? 'done' : 'error', }); return nextList; }); diff --git a/web/src/components/message-item/hooks.ts b/web/src/components/message-item/hooks.ts index a411c570cc38c4083b53d33501d48513b964044e..cccfd234d447d3839edf0a697fda91b42759c4f4 100644 --- a/web/src/components/message-item/hooks.ts +++ b/web/src/components/message-item/hooks.ts @@ -43,8 +43,8 @@ export const useRemoveMessage = ( const onRemoveMessage = useCallback(async () => { const pureId = getMessagePureId(messageId); if (pureId) { - const retcode = await deleteMessage(pureId); - if (retcode === 0) { + const code = await deleteMessage(pureId); + if (code === 0) { removeMessageById?.(messageId); } } diff --git a/web/src/components/pdf-previewer/hooks.ts b/web/src/components/pdf-previewer/hooks.ts index 80bc641688ec465b4615e3417301de12c7f80407..0774a9d9ae7f3f77f4ac85099c9f66b09ca1a377 100644 --- a/web/src/components/pdf-previewer/hooks.ts +++ b/web/src/components/pdf-previewer/hooks.ts @@ -6,8 +6,8 @@ export const useCatchDocumentError = (url: string) => { const fetchDocument = useCallback(async () => { const { data } = await axios.get(url); - if (data.retcode !== 0) { - setError(data?.retmsg); + if (data.code !== 0) { + setError(data?.message); } }, [url]); useEffect(() => { diff --git a/web/src/hooks/chat-hooks.ts b/web/src/hooks/chat-hooks.ts index 00980a735df7de4b342ad4d3f0581e1cf11f63b7..7346c0475388009735f41df44d8f0c64dd63cf0d 100644 --- a/web/src/hooks/chat-hooks.ts +++ b/web/src/hooks/chat-hooks.ts @@ -99,7 +99,7 @@ export const useFetchNextDialogList = () => { console.log('🚀 ~ queryFn: ~ params:', params); const { data } = await chatService.listDialog(); - if (data.retcode === 0) { + if (data.code === 0) { const list: IDialog[] = data.data; if (list.length > 0) { if (list.every((x) => x.id !== dialogId)) { @@ -128,7 +128,7 @@ export const useSetNextDialog = () => { mutationKey: ['setDialog'], mutationFn: async (params: IDialog) => { const { data } = await chatService.setDialog(params); - if (data.retcode === 0) { + if (data.code === 0) { queryClient.invalidateQueries({ exact: false, queryKey: ['fetchDialogList'], @@ -141,7 +141,7 @@ export const useSetNextDialog = () => { i18n.t(`message.${params.dialog_id ? 'modified' : 'created'}`), ); } - return data?.retcode; + return data?.code; }, }); @@ -200,12 +200,12 @@ export const useRemoveNextDialog = () => { mutationKey: ['removeDialog'], mutationFn: async (dialogIds: string[]) => { const { data } = await chatService.removeDialog({ dialogIds }); - if (data.retcode === 0) { + if (data.code === 0) { queryClient.invalidateQueries({ queryKey: ['fetchDialogList'] }); message.success(i18n.t('message.deleted')); } - return data.retcode; + return data.code; }, }); @@ -231,7 +231,7 @@ export const useFetchNextConversationList = () => { enabled: !!dialogId, queryFn: async () => { const { data } = await chatService.listConversation({ dialogId }); - if (data.retcode === 0 && data.data.length > 0) { + if (data.code === 0 && data.data.length > 0) { handleClickConversation(data.data[0].id, ''); } return data?.data; @@ -303,7 +303,7 @@ export const useUpdateNextConversation = () => { ? params.conversation_id : getConversationId(), }); - if (data.retcode === 0) { + if (data.code === 0) { queryClient.invalidateQueries({ queryKey: ['fetchConversationList'] }); } return data; @@ -328,10 +328,10 @@ export const useRemoveNextConversation = () => { conversationIds, dialogId, }); - if (data.retcode === 0) { + if (data.code === 0) { queryClient.invalidateQueries({ queryKey: ['fetchConversationList'] }); } - return data.retcode; + return data.code; }, }); @@ -353,11 +353,11 @@ export const useDeleteMessage = () => { conversationId, }); - if (data.retcode === 0) { + if (data.code === 0) { message.success(i18n.t(`message.deleted`)); } - return data.retcode; + return data.code; }, }); @@ -378,10 +378,10 @@ export const useFeedback = () => { ...params, conversationId, }); - if (data.retcode === 0) { + if (data.code === 0) { message.success(i18n.t(`message.operated`)); } - return data.retcode; + return data.code; }, }); @@ -402,7 +402,7 @@ export const useCreateNextToken = () => { mutationKey: ['createToken'], mutationFn: async (params: Record) => { const { data } = await chatService.createToken(params); - if (data.retcode === 0) { + if (data.code === 0) { queryClient.invalidateQueries({ queryKey: ['fetchTokenList'] }); } return data?.data ?? []; @@ -445,7 +445,7 @@ export const useRemoveNextToken = () => { tokens: string[]; }) => { const { data } = await chatService.removeToken(params); - if (data.retcode === 0) { + if (data.code === 0) { queryClient.invalidateQueries({ queryKey: ['fetchTokenList'] }); } return data?.data ?? []; diff --git a/web/src/hooks/chunk-hooks.ts b/web/src/hooks/chunk-hooks.ts index deee3aada1951f6d90066e2c707e48ecb5d0e77f..374f1c983351d2513e13bf39bda8a09596684f1c 100644 --- a/web/src/hooks/chunk-hooks.ts +++ b/web/src/hooks/chunk-hooks.ts @@ -57,7 +57,7 @@ export const useFetchNextChunkList = (): ResponseGetType<{ available_int: available, keywords: searchString, }); - if (data.retcode === 0) { + if (data.code === 0) { const res = data.data; return { data: res.chunks, @@ -126,11 +126,11 @@ export const useDeleteChunk = () => { mutationKey: ['deleteChunk'], mutationFn: async (params: { chunkIds: string[]; doc_id: string }) => { const { data } = await kbService.rm_chunk(params); - if (data.retcode === 0) { + if (data.code === 0) { setPaginationParams(1); queryClient.invalidateQueries({ queryKey: ['fetchChunkList'] }); } - return data?.retcode; + return data?.code; }, }); @@ -152,11 +152,11 @@ export const useSwitchChunk = () => { doc_id: string; }) => { const { data } = await kbService.switch_chunk(params); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.modified')); queryClient.invalidateQueries({ queryKey: ['fetchChunkList'] }); } - return data?.retcode; + return data?.code; }, }); @@ -179,11 +179,11 @@ export const useCreateChunk = () => { service = kbService.set_chunk; } const { data } = await service(payload); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.created')); queryClient.invalidateQueries({ queryKey: ['fetchChunkList'] }); } - return data?.retcode; + return data?.code; }, }); diff --git a/web/src/hooks/document-hooks.ts b/web/src/hooks/document-hooks.ts index 1ee4384dd2b069a3851b5a1c13828b7ab1d25cdf..a794962df76ab30cd6cbfd711442e5632fc8a0bb 100644 --- a/web/src/hooks/document-hooks.ts +++ b/web/src/hooks/document-hooks.ts @@ -69,7 +69,7 @@ export const useFetchNextDocumentList = () => { page_size: pagination.pageSize, page: pagination.current, }); - if (ret.data.retcode === 0) { + if (ret.data.code === 0) { return ret.data.data; } @@ -118,7 +118,7 @@ export const useSetNextDocumentStatus = () => { doc_id: documentId, status: Number(status), }); - if (data.retcode === 0) { + if (data.code === 0) { message.success(i18n.t('message.modified')); queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); } @@ -149,11 +149,11 @@ export const useSaveNextDocumentName = () => { doc_id: documentId, name: name, }); - if (data.retcode === 0) { + if (data.code === 0) { message.success(i18n.t('message.renamed')); queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); } - return data.retcode; + return data.code; }, }); @@ -176,7 +176,7 @@ export const useCreateNextDocument = () => { name, kb_id: knowledgeId, }); - if (data.retcode === 0) { + if (data.code === 0) { if (page === 1) { queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); } else { @@ -185,7 +185,7 @@ export const useCreateNextDocument = () => { message.success(i18n.t('message.created')); } - return data.retcode; + return data.code; }, }); @@ -215,12 +215,12 @@ export const useSetNextDocumentParser = () => { doc_id: documentId, parser_config: parserConfig, }); - if (data.retcode === 0) { + if (data.code === 0) { queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); message.success(i18n.t('message.modified')); } - return data.retcode; + return data.code; }, }); @@ -246,12 +246,12 @@ export const useUploadNextDocument = () => { try { const ret = await kbService.document_upload(formData); - const retcode = get(ret, 'data.retcode'); - if (retcode === 0) { + const code = get(ret, 'data.code'); + if (code === 0) { message.success(i18n.t('message.uploaded')); } - if (retcode === 0 || retcode === 500) { + if (code === 0 || code === 500) { queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); } return ret?.data; @@ -281,12 +281,12 @@ export const useNextWebCrawl = () => { formData.append('kb_id', knowledgeId); const ret = await kbService.web_crawl(formData); - const retcode = get(ret, 'data.retcode'); - if (retcode === 0) { + const code = get(ret, 'data.code'); + if (code === 0) { message.success(i18n.t('message.uploaded')); } - return retcode; + return code; }, }); @@ -317,13 +317,13 @@ export const useRunNextDocument = () => { doc_ids: documentIds, run, }); - const retcode = get(ret, 'data.retcode'); - if (retcode === 0) { + const code = get(ret, 'data.code'); + if (code === 0) { queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); message.success(i18n.t('message.operated')); } - return retcode; + return code; }, }); @@ -338,7 +338,7 @@ export const useFetchDocumentInfosByIds = () => { initialData: [], queryFn: async () => { const { data } = await kbService.document_infos({ doc_ids: ids }); - if (data.retcode === 0) { + if (data.code === 0) { return data.data; } @@ -357,7 +357,7 @@ export const useFetchDocumentThumbnailsByIds = () => { initialData: {}, queryFn: async () => { const { data } = await kbService.document_thumbnails({ doc_ids: ids }); - if (data.retcode === 0) { + if (data.code === 0) { return data.data; } return {}; @@ -377,11 +377,11 @@ export const useRemoveNextDocument = () => { mutationKey: ['removeDocument'], mutationFn: async (documentIds: string | string[]) => { const { data } = await kbService.document_rm({ doc_id: documentIds }); - if (data.retcode === 0) { + if (data.code === 0) { message.success(i18n.t('message.deleted')); queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); } - return data.retcode; + return data.code; }, }); @@ -398,7 +398,7 @@ export const useDeleteDocument = () => { mutationKey: ['deleteDocument'], mutationFn: async (documentIds: string[]) => { const data = await kbService.document_delete({ doc_ids: documentIds }); - // if (data.retcode === 0) { + // if (data.code === 0) { // queryClient.invalidateQueries({ queryKey: ['fetchFlowList'] }); // } return data; diff --git a/web/src/hooks/file-manager-hooks.ts b/web/src/hooks/file-manager-hooks.ts index 1ae86786db80cfce9870edb4d3a2f99971db22eb..a7cbce87481242dfe8b55170ac582a4013384a93 100644 --- a/web/src/hooks/file-manager-hooks.ts +++ b/web/src/hooks/file-manager-hooks.ts @@ -103,11 +103,11 @@ export const useDeleteFile = () => { mutationKey: ['deleteFile'], mutationFn: async (params: { fileIds: string[]; parentId: string }) => { const { data } = await fileManagerService.removeFile(params); - if (data.retcode === 0) { + if (data.code === 0) { setPaginationParams(1); // TODO: There should be a better way to paginate the request list queryClient.invalidateQueries({ queryKey: ['fetchFileList'] }); } - return data.retcode; + return data.code; }, }); @@ -125,11 +125,11 @@ export const useRenameFile = () => { mutationKey: ['renameFile'], mutationFn: async (params: { fileId: string; name: string }) => { const { data } = await fileManagerService.renameFile(params); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.renamed')); queryClient.invalidateQueries({ queryKey: ['fetchFileList'] }); } - return data.retcode; + return data.code; }, }); @@ -170,12 +170,12 @@ export const useCreateFolder = () => { ...params, type: 'folder', }); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.created')); setPaginationParams(1); queryClient.invalidateQueries({ queryKey: ['fetchFileList'] }); } - return data.retcode; + return data.code; }, }); @@ -208,12 +208,12 @@ export const useUploadFile = () => { }); try { const ret = await fileManagerService.uploadFile(formData); - if (ret?.data.retcode === 0) { + if (ret?.data.code === 0) { message.success(t('message.uploaded')); setPaginationParams(1); queryClient.invalidateQueries({ queryKey: ['fetchFileList'] }); } - return ret?.data?.retcode; + return ret?.data?.code; } catch (error) { console.log('🚀 ~ useUploadFile ~ error:', error); } @@ -235,11 +235,11 @@ export const useConnectToKnowledge = () => { mutationKey: ['connectFileToKnowledge'], mutationFn: async (params: IConnectRequestBody) => { const { data } = await fileManagerService.connectFileToKnowledge(params); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.operated')); queryClient.invalidateQueries({ queryKey: ['fetchFileList'] }); } - return data.retcode; + return data.code; }, }); @@ -263,11 +263,11 @@ export const useMoveFile = () => { mutationKey: ['moveFile'], mutationFn: async (params: IMoveFileBody) => { const { data } = await fileManagerService.moveFile(params); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.operated')); queryClient.invalidateQueries({ queryKey: ['fetchFileList'] }); } - return data.retcode; + return data.code; }, }); diff --git a/web/src/hooks/flow-hooks.ts b/web/src/hooks/flow-hooks.ts index bde39217fd4ed0f1e9dbe324f00e637ac09a7623..bcd582bcb245a434eb1c9f5dcd99e1c93c2080a3 100644 --- a/web/src/hooks/flow-hooks.ts +++ b/web/src/hooks/flow-hooks.ts @@ -131,7 +131,7 @@ export const useSetFlow = () => { avatar?: string; }) => { const { data = {} } = await flowService.setCanvas(params); - if (data.retcode === 0) { + if (data.code === 0) { message.success( i18n.t(`message.${params?.id ? 'modified' : 'created'}`), ); @@ -154,7 +154,7 @@ export const useDeleteFlow = () => { mutationKey: ['deleteFlow'], mutationFn: async (canvasIds: string[]) => { const { data } = await flowService.removeCanvas({ canvasIds }); - if (data.retcode === 0) { + if (data.code === 0) { queryClient.invalidateQueries({ queryKey: ['fetchFlowList'] }); } return data?.data ?? []; @@ -173,7 +173,7 @@ export const useRunFlow = () => { mutationKey: ['runFlow'], mutationFn: async (params: { id: string; dsl: DSL }) => { const { data } = await flowService.runCanvas(params); - if (data.retcode === 0) { + if (data.code === 0) { message.success(i18n.t(`message.modified`)); } return data?.data ?? {}; @@ -209,7 +209,7 @@ export const useTestDbConnect = () => { mutationKey: ['testDbConnect'], mutationFn: async (params: any) => { const ret = await flowService.testDbConnect(params); - if (ret?.data?.retcode === 0) { + if (ret?.data?.code === 0) { message.success(ret?.data?.data); } else { message.error(ret?.data?.data); diff --git a/web/src/hooks/knowledge-hooks.ts b/web/src/hooks/knowledge-hooks.ts index 69cd1e9462fc849f663708622e47d74a00ca9ffa..0dc245c06d172e6d9d129b8fecf5c64d2ae85fd2 100644 --- a/web/src/hooks/knowledge-hooks.ts +++ b/web/src/hooks/knowledge-hooks.ts @@ -70,7 +70,7 @@ export const useCreateKnowledge = () => { mutationKey: ['createKnowledge'], mutationFn: async (params: { id?: string; name: string }) => { const { data = {} } = await kbService.createKb(params); - if (data.retcode === 0) { + if (data.code === 0) { message.success( i18n.t(`message.${params?.id ? 'modified' : 'created'}`), ); @@ -93,7 +93,7 @@ export const useDeleteKnowledge = () => { mutationKey: ['deleteKnowledge'], mutationFn: async (id: string) => { const { data } = await kbService.rmKb({ kb_id: id }); - if (data.retcode === 0) { + if (data.code === 0) { message.success(i18n.t(`message.deleted`)); queryClient.invalidateQueries({ queryKey: ['fetchKnowledgeList'] }); } @@ -120,7 +120,7 @@ export const useUpdateKnowledge = () => { kb_id: knowledgeBaseId, ...params, }); - if (data.retcode === 0) { + if (data.code === 0) { message.success(i18n.t(`message.updated`)); queryClient.invalidateQueries({ queryKey: ['fetchKnowledgeDetail'] }); } @@ -155,7 +155,7 @@ export const useTestChunkRetrieval = (): ResponsePostType & { page, size: pageSize, }); - if (data.retcode === 0) { + if (data.code === 0) { const res = data.data; return { chunks: res.chunks, diff --git a/web/src/hooks/llm-hooks.tsx b/web/src/hooks/llm-hooks.tsx index 2ee3236c1d96e58788cfb5e0d408cdab0eeca265..14520fb95ff83297599024a4ad0752eb5e33662d 100644 --- a/web/src/hooks/llm-hooks.tsx +++ b/web/src/hooks/llm-hooks.tsx @@ -211,12 +211,12 @@ export const useSaveApiKey = () => { mutationKey: ['saveApiKey'], mutationFn: async (params: IApiKeySavingParams) => { const { data } = await userService.set_api_key(params); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.modified')); queryClient.invalidateQueries({ queryKey: ['myLlmList'] }); queryClient.invalidateQueries({ queryKey: ['factoryList'] }); } - return data.retcode; + return data.code; }, }); @@ -242,10 +242,10 @@ export const useSaveTenantInfo = () => { mutationKey: ['saveTenantInfo'], mutationFn: async (params: ISystemModelSettingSavingParams) => { const { data } = await userService.set_tenant_info(params); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.modified')); } - return data.retcode; + return data.code; }, }); @@ -263,12 +263,12 @@ export const useAddLlm = () => { mutationKey: ['addLlm'], mutationFn: async (params: IAddLlmRequestBody) => { const { data } = await userService.add_llm(params); - if (data.retcode === 0) { + if (data.code === 0) { queryClient.invalidateQueries({ queryKey: ['myLlmList'] }); queryClient.invalidateQueries({ queryKey: ['factoryList'] }); message.success(t('message.modified')); } - return data.retcode; + return data.code; }, }); @@ -286,12 +286,12 @@ export const useDeleteLlm = () => { mutationKey: ['deleteLlm'], mutationFn: async (params: IDeleteLlmRequestBody) => { const { data } = await userService.delete_llm(params); - if (data.retcode === 0) { + if (data.code === 0) { queryClient.invalidateQueries({ queryKey: ['myLlmList'] }); queryClient.invalidateQueries({ queryKey: ['factoryList'] }); message.success(t('message.deleted')); } - return data.retcode; + return data.code; }, }); @@ -309,12 +309,12 @@ export const useDeleteFactory = () => { mutationKey: ['deleteFactory'], mutationFn: async (params: IDeleteLlmRequestBody) => { const { data } = await userService.deleteFactory(params); - if (data.retcode === 0) { + if (data.code === 0) { queryClient.invalidateQueries({ queryKey: ['myLlmList'] }); queryClient.invalidateQueries({ queryKey: ['factoryList'] }); message.success(t('message.deleted')); } - return data.retcode; + return data.code; }, }); diff --git a/web/src/hooks/logic-hooks.ts b/web/src/hooks/logic-hooks.ts index a2199637d6c5e8a083bbdbdd6abe370d5cd83b11..5ca6a895c4c5d8d192ea072dad549aaaad732ee0 100644 --- a/web/src/hooks/logic-hooks.ts +++ b/web/src/hooks/logic-hooks.ts @@ -248,8 +248,8 @@ export const useSpeechWithSse = (url: string = api.tts) => { }); try { const res = await response.clone().json(); - if (res?.retcode !== 0) { - message.error(res?.retmsg); + if (res?.code !== 0) { + message.error(res?.message); } } catch (error) { console.warn('🚀 ~ error:', error); diff --git a/web/src/hooks/login-hooks.ts b/web/src/hooks/login-hooks.ts index f149cdac1af6adb0a125467c1d30f625635d9930..35ee67f9f7f22e04362551a6c3233e4004d2f1ab 100644 --- a/web/src/hooks/login-hooks.ts +++ b/web/src/hooks/login-hooks.ts @@ -26,7 +26,7 @@ export const useLogin = () => { mutationKey: ['login'], mutationFn: async (params: { email: string; password: string }) => { const { data: res = {}, response } = await userService.login(params); - if (res.retcode === 0) { + if (res.code === 0) { const { data } = res; message.success(t('message.logged')); const authorization = response.headers.get(Authorization); @@ -42,7 +42,7 @@ export const useLogin = () => { Token: token, }); } - return res.retcode; + return res.code; }, }); @@ -64,10 +64,10 @@ export const useRegister = () => { nickname: string; }) => { const { data = {} } = await userService.register(params); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.registered')); } - return data.retcode; + return data.code; }, }); @@ -84,12 +84,12 @@ export const useLogout = () => { mutationKey: ['logout'], mutationFn: async () => { const { data = {} } = await userService.logout(); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.logout')); authorizationUtil.removeAll(); history.push('/login'); } - return data.retcode; + return data.code; }, }); diff --git a/web/src/hooks/user-setting-hooks.tsx b/web/src/hooks/user-setting-hooks.tsx index e27646bfdfee3bee6e783cecec55f5db6a0bda89..6b14f3536f68ab051e49fa0b8434f01fc0cb1cfe 100644 --- a/web/src/hooks/user-setting-hooks.tsx +++ b/web/src/hooks/user-setting-hooks.tsx @@ -32,7 +32,7 @@ export const useFetchUserInfo = (): ResponseGetType => { gcTime: 0, queryFn: async () => { const { data } = await userService.user_info(); - if (data.retcode === 0) { + if (data.code === 0) { i18n.changeLanguage( LanguageTranslationMap[ data.data.language as keyof typeof LanguageTranslationMap @@ -54,7 +54,7 @@ export const useFetchTenantInfo = (): ResponseGetType => { gcTime: 0, queryFn: async () => { const { data: res } = await userService.get_tenant_info(); - if (res.retcode === 0) { + if (res.code === 0) { // llm_id is chat_id // asr_id is speech2txt const { data } = res; @@ -116,11 +116,11 @@ export const useSaveSetting = () => { userInfo: { new_password: string } | Partial, ) => { const { data } = await userService.setting(userInfo); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.modified')); queryClient.invalidateQueries({ queryKey: ['userInfo'] }); } - return data?.retcode; + return data?.code; }, }); @@ -135,7 +135,7 @@ export const useFetchSystemVersion = () => { try { setLoading(true); const { data } = await userService.getSystemVersion(); - if (data.retcode === 0) { + if (data.code === 0) { setVersion(data.data); setLoading(false); } @@ -156,7 +156,7 @@ export const useFetchSystemStatus = () => { const fetchSystemStatus = useCallback(async () => { setLoading(true); const { data } = await userService.getSystemStatus(); - if (data.retcode === 0) { + if (data.code === 0) { setSystemStatus(data.data); setLoading(false); } @@ -200,7 +200,7 @@ export const useRemoveSystemToken = () => { mutationKey: ['removeSystemToken'], mutationFn: async (token: string) => { const { data } = await userService.removeToken({}, token); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.deleted')); queryClient.invalidateQueries({ queryKey: ['fetchSystemTokenList'] }); } @@ -221,7 +221,7 @@ export const useCreateSystemToken = () => { mutationKey: ['createSystemToken'], mutationFn: async (params: Record) => { const { data } = await userService.createToken(params); - if (data.retcode === 0) { + if (data.code === 0) { queryClient.invalidateQueries({ queryKey: ['fetchSystemTokenList'] }); } return data?.data ?? []; @@ -264,10 +264,10 @@ export const useAddTenantUser = () => { mutationKey: ['addTenantUser'], mutationFn: async (email: string) => { const { data } = await addTenantUser(tenantInfo.tenant_id, email); - if (data.retcode === 0) { + if (data.code === 0) { queryClient.invalidateQueries({ queryKey: ['listTenantUser'] }); } - return data?.retcode; + return data?.code; }, }); @@ -296,7 +296,7 @@ export const useDeleteTenantUser = () => { tenantId: tenantId ?? tenantInfo.tenant_id, userId, }); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.deleted')); queryClient.invalidateQueries({ queryKey: ['listTenantUser'] }); queryClient.invalidateQueries({ queryKey: ['listTenant'] }); @@ -342,7 +342,7 @@ export const useAgreeTenant = () => { mutationKey: ['agreeTenant'], mutationFn: async (tenantId: string) => { const { data } = await agreeTenant(tenantId); - if (data.retcode === 0) { + if (data.code === 0) { message.success(t('message.operated')); queryClient.invalidateQueries({ queryKey: ['listTenant'] }); } diff --git a/web/src/interfaces/database/base.ts b/web/src/interfaces/database/base.ts index 80d0c94e3b328683523d569a26e9a6930b44ca32..da02afc291b5bd8820aaf749252619a70cb2827b 100644 --- a/web/src/interfaces/database/base.ts +++ b/web/src/interfaces/database/base.ts @@ -1,7 +1,7 @@ export interface ResponseType { - retcode: number; + code: number; data: T; - retmsg: string; + message: string; status: number; } diff --git a/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-creating-modal/index.tsx b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-creating-modal/index.tsx index b9d70228f616d2518722ff3a7164660761efe1e9..7540c95545f43ecbe948d5eb7300976de1481160 100644 --- a/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-creating-modal/index.tsx +++ b/web/src/pages/add-knowledge/components/knowledge-chunk/components/chunk-creating-modal/index.tsx @@ -30,7 +30,7 @@ const ChunkCreatingModal: React.FC & kFProps> = ({ const { t } = useTranslation(); useEffect(() => { - if (data?.retcode === 0) { + if (data?.code === 0) { const { content_with_weight, important_kwd = [] } = data.data; form.setFieldsValue({ content: content_with_weight }); setKeywords(important_kwd); diff --git a/web/src/pages/add-knowledge/components/knowledge-chunk/hooks.ts b/web/src/pages/add-knowledge/components/knowledge-chunk/hooks.ts index 1db791f9db051fb6ac14f3541a03f0301e09882d..0e4a2742622367b13947d972cb6ecd1ac95ff0c4 100644 --- a/web/src/pages/add-knowledge/components/knowledge-chunk/hooks.ts +++ b/web/src/pages/add-knowledge/components/knowledge-chunk/hooks.ts @@ -96,14 +96,14 @@ export const useUpdateChunk = () => { const onChunkUpdatingOk = useCallback( async ({ content, keywords }: { content: string; keywords: string }) => { - const retcode = await createChunk({ + const code = await createChunk({ content_with_weight: content, doc_id: documentId, chunk_id: chunkId, important_kwd: keywords, // keywords }); - if (retcode === 0) { + if (code === 0) { hideChunkUpdatingModal(); } }, diff --git a/web/src/pages/add-knowledge/components/knowledge-file/hooks.ts b/web/src/pages/add-knowledge/components/knowledge-file/hooks.ts index 1d1c7973985869b731d919cc5da3037dcf5ca967..d156213020638eac78884580eb22933025f068eb 100644 --- a/web/src/pages/add-knowledge/components/knowledge-file/hooks.ts +++ b/web/src/pages/add-knowledge/components/knowledge-file/hooks.ts @@ -148,20 +148,20 @@ export const useHandleUploadDocument = () => { async (fileList: UploadFile[]): Promise => { if (fileList.length > 0) { const ret: any = await uploadDocument(fileList); - if (typeof ret?.retmsg !== 'string') { + if (typeof ret?.message !== 'string') { return; } - const count = getUnSupportedFilesCount(ret?.retmsg); + const count = getUnSupportedFilesCount(ret?.message); /// 500 error code indicates that some file types are not supported - let retcode = ret?.retcode; + let code = ret?.code; if ( - ret?.retcode === 0 || - (ret?.retcode === 500 && count !== fileList.length) // Some files were not uploaded successfully, but some were uploaded successfully. + ret?.code === 0 || + (ret?.code === 500 && count !== fileList.length) // Some files were not uploaded successfully, but some were uploaded successfully. ) { - retcode = 0; + code = 0; hideDocumentUploadModal(); } - return retcode; + return code; } }, [uploadDocument, hideDocumentUploadModal], diff --git a/web/src/pages/chat/hooks.ts b/web/src/pages/chat/hooks.ts index bc0348a8a5d8347cf4f821711940286c706ef7cf..6bf45c6c2c7d63567d4fbb505041631a4c819acd 100644 --- a/web/src/pages/chat/hooks.ts +++ b/web/src/pages/chat/hooks.ts @@ -176,7 +176,7 @@ export const useEditDialog = () => { async (dialogId?: string) => { if (dialogId) { const ret = await fetchDialog(dialogId); - if (ret.retcode === 0) { + if (ret.code === 0) { setDialog(ret.data); } } @@ -393,7 +393,7 @@ export const useSendNextMessage = (controller: AbortController) => { controller, ); - if (res && (res?.response.status !== 200 || res?.data?.retcode !== 0)) { + if (res && (res?.response.status !== 200 || res?.data?.code !== 0)) { // cancel loading setValue(message.content); console.info('removeLatestMessage111'); @@ -421,7 +421,7 @@ export const useSendNextMessage = (controller: AbortController) => { true, conversationId, ); - if (data.retcode === 0) { + if (data.code === 0) { setConversationIsNew(''); const id = data.data.id; // currentConversationIdRef.current = id; @@ -541,7 +541,7 @@ export const useRenameConversation = () => { is_new: false, }); - if (ret.retcode === 0) { + if (ret.code === 0) { hideConversationRenameModal(); } }, @@ -551,7 +551,7 @@ export const useRenameConversation = () => { const handleShowConversationRenameModal = useCallback( async (conversationId: string) => { const ret = await fetchConversation(conversationId); - if (ret.retcode === 0) { + if (ret.code === 0) { setConversation(ret.data); } showConversationRenameModal(); diff --git a/web/src/pages/chat/shared-hooks.ts b/web/src/pages/chat/shared-hooks.ts index fc618a3a18950afff16f40e32aade8aa2783ac24..8508746e58c3eea2bb8940fd2685e3b8627d6b5a 100644 --- a/web/src/pages/chat/shared-hooks.ts +++ b/web/src/pages/chat/shared-hooks.ts @@ -96,7 +96,7 @@ export const useSendSharedMessage = (conversationId: string) => { messages: [...(derivedMessages ?? []), message], }); - if (res && (res?.response.status !== 200 || res?.data?.retcode !== 0)) { + if (res && (res?.response.status !== 200 || res?.data?.code !== 0)) { // cancel loading setValue(message.content); removeLatestMessage(); @@ -111,7 +111,7 @@ export const useSendSharedMessage = (conversationId: string) => { sendMessage(message); } else { const data = await setConversation('user id'); - if (data.retcode === 0) { + if (data.code === 0) { const id = data.data.id; sendMessage(message, id); } diff --git a/web/src/pages/document-viewer/hooks.ts b/web/src/pages/document-viewer/hooks.ts index aff4c5e02a47c42c69afc50fb1114e8fd00d25de..59ebcc413cd4fbed205ffa5e1042a5f14e555832 100644 --- a/web/src/pages/document-viewer/hooks.ts +++ b/web/src/pages/document-viewer/hooks.ts @@ -8,8 +8,8 @@ export const useCatchError = (api: string) => { const fetchDocument = useCallback(async () => { const ret = await axios.get(api); const { data } = ret; - if (!(data instanceof ArrayBuffer) && data.retcode !== 0) { - setError(data.retmsg); + if (!(data instanceof ArrayBuffer) && data.code !== 0) { + setError(data.message); } return ret; }, [api]); diff --git a/web/src/pages/file-manager/hooks.ts b/web/src/pages/file-manager/hooks.ts index 6be87c3664c35598a0443505154dc88c076c4d31..d1145e5725dd0d82fb4802c03aeda5798fca7e6b 100644 --- a/web/src/pages/file-manager/hooks.ts +++ b/web/src/pages/file-manager/hooks.ts @@ -141,8 +141,8 @@ export const useHandleDeleteFile = ( const handleRemoveFile = () => { showDeleteConfirm({ onOk: async () => { - const retcode = await removeDocument({ fileIds, parentId }); - if (retcode === 0) { + const code = await removeDocument({ fileIds, parentId }); + if (code === 0) { setSelectedRowKeys([]); } return; diff --git a/web/src/pages/file-manager/move-file-modal/async-tree-select.tsx b/web/src/pages/file-manager/move-file-modal/async-tree-select.tsx index 7643f250b8cd991c2453d70f6c0a026d95947f76..2ed1c80d6e0c39c1c680a9c9dc9d508404051159 100644 --- a/web/src/pages/file-manager/move-file-modal/async-tree-select.tsx +++ b/web/src/pages/file-manager/move-file-modal/async-tree-select.tsx @@ -22,7 +22,7 @@ const AsyncTreeSelect = ({ value, onChange }: IProps) => { const onLoadData: TreeSelectProps['loadData'] = useCallback( async ({ id }) => { const ret = await fetchList(id); - if (ret.retcode === 0) { + if (ret.code === 0) { setTreeData((tree) => { return tree.concat( ret.data.files diff --git a/web/src/pages/flow/chat/hooks.ts b/web/src/pages/flow/chat/hooks.ts index b0a6df7384c8721dc52197d56518792cf8a11ee7..c7ceae8dd6cf150df92a143cd5b09a2fc6e5cb55 100644 --- a/web/src/pages/flow/chat/hooks.ts +++ b/web/src/pages/flow/chat/hooks.ts @@ -151,7 +151,7 @@ export const useSendMessage = ( const res = await send(params); if (receiveMessageError(res)) { - antMessage.error(res?.data?.retmsg); + antMessage.error(res?.data?.message); // cancel loading setValue(message.content); @@ -227,7 +227,7 @@ export const useSendNextMessage = () => { const res = await send(params); if (receiveMessageError(res)) { - antMessage.error(res?.data?.retmsg); + antMessage.error(res?.data?.message); // cancel loading setValue(message.content); diff --git a/web/src/pages/flow/hooks.ts b/web/src/pages/flow/hooks.ts index 91bd24e8e81573ee8dae973eda20e8476f986dfc..6ed0f519d8386a13ecd793c163ab2cc986fea509 100644 --- a/web/src/pages/flow/hooks.ts +++ b/web/src/pages/flow/hooks.ts @@ -497,15 +497,15 @@ export const useSaveGraphBeforeOpeningDebugDrawer = (show: () => void) => { const { send } = useSendMessageWithSse(api.runCanvas); const handleRun = useCallback(async () => { const saveRet = await saveGraph(); - if (saveRet?.retcode === 0) { + if (saveRet?.code === 0) { // Call the reset api before opening the run drawer each time const resetRet = await resetFlow(); // After resetting, all previous messages will be cleared. - if (resetRet?.retcode === 0) { + if (resetRet?.code === 0) { // fetch prologue const sendRet = await send({ id }); if (receiveMessageError(sendRet)) { - message.error(sendRet?.data?.retmsg); + message.error(sendRet?.data?.message); } else { refetch(); show(); diff --git a/web/src/pages/flow/list/hooks.ts b/web/src/pages/flow/list/hooks.ts index 5c4d3f903840b585611df6e1e04cd7df9b65ad7d..f82d9c0b65bc4277b4c4d34366d73b7fd6241a8e 100644 --- a/web/src/pages/flow/list/hooks.ts +++ b/web/src/pages/flow/list/hooks.ts @@ -53,7 +53,7 @@ export const useSaveFlow = () => { // }, }); - if (ret?.retcode === 0) { + if (ret?.code === 0) { hideFlowSettingModal(); navigate(`/flow/${ret.data.id}`); } diff --git a/web/src/pages/flow/utils.ts b/web/src/pages/flow/utils.ts index 0a9b8815fd80f8789ce6385047689bbcdb3169b5..2abafd194f0c3e7229ecb741c47b8df89a78c812 100644 --- a/web/src/pages/flow/utils.ts +++ b/web/src/pages/flow/utils.ts @@ -144,7 +144,7 @@ export const buildDslComponentsByGraph = ( }; export const receiveMessageError = (res: any) => - res && (res?.response.status !== 200 || res?.data?.retcode !== 0); + res && (res?.response.status !== 200 || res?.data?.code !== 0); // Replace the id in the object with text export const replaceIdWithText = ( diff --git a/web/src/pages/knowledge/hooks.ts b/web/src/pages/knowledge/hooks.ts index a52fbbdbcb6daafa2b26c59c0c80f1c4e06d0e74..e978a6243700028e907122ceaaa363cb10391ab1 100644 --- a/web/src/pages/knowledge/hooks.ts +++ b/web/src/pages/knowledge/hooks.ts @@ -27,7 +27,7 @@ export const useSaveKnowledge = () => { name, }); - if (ret?.retcode === 0) { + if (ret?.code === 0) { hideModal(); navigate( `/knowledge/${KnowledgeRouteKey.Configuration}?id=${ret.data.kb_id}`, diff --git a/web/src/pages/login/index.tsx b/web/src/pages/login/index.tsx index 0a42098deb177dc3013c2ba9f9054fe2846b4ff9..a9774aecf5898b88ec96dd0b20aee4a796468bce 100644 --- a/web/src/pages/login/index.tsx +++ b/web/src/pages/login/index.tsx @@ -33,20 +33,20 @@ const Login = () => { const rsaPassWord = rsaPsw(params.password) as string; if (title === 'login') { - const retcode = await login({ + const code = await login({ email: params.email, password: rsaPassWord, }); - if (retcode === 0) { + if (code === 0) { navigate('/knowledge'); } } else { - const retcode = await register({ + const code = await register({ nickname: params.nickname, email: params.email, password: rsaPassWord, }); - if (retcode === 0) { + if (code === 0) { setTitle('login'); } } diff --git a/web/src/pages/user-setting/setting-team/hooks.ts b/web/src/pages/user-setting/setting-team/hooks.ts index 88e2dabedb411f09c2db95e4210d412dcf08ed44..250f858a40ee2a95e41db549932d74b7cd1a1ad7 100644 --- a/web/src/pages/user-setting/setting-team/hooks.ts +++ b/web/src/pages/user-setting/setting-team/hooks.ts @@ -17,8 +17,8 @@ export const useAddUser = () => { const handleAddUserOk = useCallback( async (email: string) => { - const retcode = await addTenantUser(email); - if (retcode === 0) { + const code = await addTenantUser(email); + if (code === 0) { hideAddingTenantModal(); } }, @@ -40,8 +40,8 @@ export const useHandleDeleteUser = () => { const handleDeleteTenantUser = (userId: string) => () => { showDeleteConfirm({ onOk: async () => { - const retcode = await deleteTenantUser({ userId }); - if (retcode === 0) { + const code = await deleteTenantUser({ userId }); + if (code === 0) { } return; }, diff --git a/web/src/utils/request.ts b/web/src/utils/request.ts index 52ecc5f9c19c269779564435a5895d5f32449ca9..2d03c5e8f9d3634272d8cca5b8f26dbc03834d70 100644 --- a/web/src/utils/request.ts +++ b/web/src/utils/request.ts @@ -109,21 +109,21 @@ request.interceptors.response.use(async (response: any, options) => { const data: ResponseType = await response.clone().json(); - if (data.retcode === 401 || data.retcode === 401) { + if (data.code === 401 || data.code === 401) { notification.error({ - message: data.retmsg, - description: data.retmsg, + message: data.message, + description: data.message, duration: 3, }); authorizationUtil.removeAll(); history.push('/login'); // Will not jump to the login page - } else if (data.retcode !== 0) { - if (data.retcode === 100) { - message.error(data.retmsg); + } else if (data.code !== 0) { + if (data.code === 100) { + message.error(data.message); } else { notification.error({ - message: `${i18n.t('message.hint')} : ${data.retcode}`, - description: data.retmsg, + message: `${i18n.t('message.hint')} : ${data.code}`, + description: data.message, duration: 3, }); }