### What problem does this PR solve? #918 ### Type of change - [x] New Feature (non-breaking change which adds functionality)tags/v0.8.0
| @@ -19,6 +19,7 @@ from functools import partial | |||
| from flask import request, Response | |||
| from flask_login import login_required, current_user | |||
| from api.db.db_models import UserCanvas | |||
| from api.db.services.canvas_service import CanvasTemplateService, UserCanvasService | |||
| from api.utils import get_uuid | |||
| from api.utils.api_utils import get_json_result, server_error_response, validate_request | |||
| @@ -34,8 +35,9 @@ def templates(): | |||
| @manager.route('/list', methods=['GET']) | |||
| @login_required | |||
| def canvas_list(): | |||
| return get_json_result(data=[c.to_dict() for c in UserCanvasService.query(user_id=current_user.id)]) | |||
| return get_json_result(data=sorted([c.to_dict() for c in \ | |||
| UserCanvasService.query(user_id=current_user.id)], key=lambda x: x["update_time"]) | |||
| ) | |||
| @manager.route('/rm', methods=['POST']) | |||
| @@ -53,7 +55,7 @@ def rm(): | |||
| def save(): | |||
| req = request.json | |||
| req["user_id"] = current_user.id | |||
| if not isinstance(req["dsl"], str):req["dsl"] = json.dumps(req["dsl"], ensure_ascii=False) | |||
| if not isinstance(req["dsl"], str): req["dsl"] = json.dumps(req["dsl"], ensure_ascii=False) | |||
| req["dsl"] = json.loads(req["dsl"]) | |||
| if "id" not in req: | |||
| @@ -111,7 +113,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({"retcode": 0, "retmsg": "", "data": ans}, ensure_ascii=False) + "\n\n" | |||
| canvas.messages.append({"role": "assistant", "content": final_ans["content"]}) | |||
| if "reference" in final_ans: | |||
| @@ -153,5 +155,3 @@ def reset(): | |||
| return get_json_result(data=req["dsl"]) | |||
| except Exception as e: | |||
| return server_error_response(e) | |||
| @@ -91,4 +91,9 @@ class FileSource(StrEnum): | |||
| KNOWLEDGEBASE = "knowledgebase" | |||
| S3 = "s3" | |||
| class CanvasType(StrEnum): | |||
| ChatBot = "chatbot" | |||
| DocBot = "docbot" | |||
| KNOWLEDGEBASE_FOLDER_NAME=".knowledgebase" | |||
| @@ -13,6 +13,7 @@ | |||
| # See the License for the specific language governing permissions and | |||
| # limitations under the License. | |||
| # | |||
| import json | |||
| import os | |||
| import time | |||
| import uuid | |||
| @@ -21,11 +22,13 @@ from copy import deepcopy | |||
| from api.db import LLMType, UserTenantRole | |||
| from api.db.db_models import init_database_tables as init_web_db, LLMFactories, LLM, TenantLLM | |||
| from api.db.services import UserService | |||
| from api.db.services.canvas_service import CanvasTemplateService | |||
| from api.db.services.document_service import DocumentService | |||
| from api.db.services.knowledgebase_service import KnowledgebaseService | |||
| from api.db.services.llm_service import LLMFactoriesService, LLMService, TenantLLMService, LLMBundle | |||
| from api.db.services.user_service import TenantService, UserTenantService | |||
| from api.settings import CHAT_MDL, EMBEDDING_MDL, ASR_MDL, IMAGE2TEXT_MDL, PARSERS, LLM_FACTORY, API_KEY, LLM_BASE_URL | |||
| from api.utils.file_utils import get_project_base_directory | |||
| def init_superuser(): | |||
| @@ -694,6 +697,20 @@ def init_llm_factory(): | |||
| """ | |||
| def add_graph_templates(): | |||
| dir = os.path.join(get_project_base_directory(), "graph", "templates") | |||
| for fnm in os.listdir(dir): | |||
| try: | |||
| cnvs = json.load(open(os.path.join(dir, fnm), "r")) | |||
| try: | |||
| CanvasTemplateService.save(**cnvs) | |||
| except: | |||
| CanvasTemplateService.update_by_id(cnvs["id"], cnvs) | |||
| except Exception as e: | |||
| print("Add graph templates error: ", e) | |||
| print("------------", flush=True) | |||
| def init_web_data(): | |||
| start_time = time.time() | |||
| @@ -701,6 +718,7 @@ def init_web_data(): | |||
| if not UserService.get_all().count(): | |||
| init_superuser() | |||
| add_graph_templates() | |||
| print("init web data success:{}".format(time.time() - start_time)) | |||
| @@ -158,7 +158,7 @@ | |||
| } | |||
| }, | |||
| "downstream": ["answer:1"], | |||
| "upstream": ["relevant:0"] | |||
| "upstream": ["retrieval:0"] | |||
| }, | |||
| "generate:get_wechat": { | |||
| "obj": { | |||
| @@ -0,0 +1,39 @@ | |||
| { | |||
| "components": { | |||
| "begin": { | |||
| "obj":{ | |||
| "component_name": "Begin", | |||
| "params": { | |||
| "prologue": "Hi there! Please enter the text you want to translate in format like: 'text you want to translate' => target language. For an example: 您好! => English" | |||
| } | |||
| }, | |||
| "downstream": ["answer:0"], | |||
| "upstream": [] | |||
| }, | |||
| "answer:0": { | |||
| "obj": { | |||
| "component_name": "Answer", | |||
| "params": {} | |||
| }, | |||
| "downstream": ["generate:0"], | |||
| "upstream": ["begin", "generate:0"] | |||
| }, | |||
| "generate:0": { | |||
| "obj": { | |||
| "component_name": "Generate", | |||
| "params": { | |||
| "llm_id": "deepseek-chat", | |||
| "prompt": "You are an professional interpreter.\n- Role: an professional interpreter.\n- Input format: content need to be translated => target language. \n- Answer format: => translated content in target language. \n- Examples:\n - user: 您好! => English. assistant: => How are you doing!\n - user: You look good today. => Japanese. assistant: => 今日は調子がいいですね 。\n", | |||
| "temperature": 0.5 | |||
| } | |||
| }, | |||
| "downstream": ["answer:0"], | |||
| "upstream": ["answer:0"] | |||
| } | |||
| }, | |||
| "history": [], | |||
| "messages": [], | |||
| "reference": {}, | |||
| "path": [], | |||
| "answer": [] | |||
| } | |||
| @@ -587,5 +587,6 @@ You're a question analyzer. | |||
| Answer format: (in language of user's question) | |||
| - keyword: | |||
| """ | |||
| kwd, _ = chat_mdl.chat(prompt, [{"role": "user", "content": content}], {"temperature": 0.2}) | |||
| kwd = chat_mdl.chat(prompt, [{"role": "user", "content": content}], {"temperature": 0.2}) | |||
| if isinstance(kwd, tuple): return kwd[0] | |||
| return kwd | |||