From cdb5f8bf45f117831959291c89e0694606ebb479 Mon Sep 17 00:00:00 2001 From: zhaoqingang <zhaoqg0118@163.com> Date: 星期三, 04 十二月 2024 17:28:58 +0800 Subject: [PATCH] 增加公开api --- app/service/common/api_token.py | 48 ++++++ app/api/chat.py | 22 ++ app/service/common/app_register.py | 53 +++++ app/service/user.py | 4 app/models/public_api_model.py | 61 +++++++ app/api/public_api.py | 62 +++++++ app/api/user.py | 2 app/task/sync_resources.py | 2 app/api/auth.py | 81 +++++++-- app/models/user.py | 1 app/models/postgresql_base_model.py | 2 /dev/null | 32 ---- app/config/const.py | 11 + main.py | 6 app/api/files.py | 8 app/models/token_model.py | 36 ++++ 16 files changed, 361 insertions(+), 70 deletions(-) diff --git a/app/api/auth.py b/app/api/auth.py index 6e74966..f0c6fce 100644 --- a/app/api/auth.py +++ b/app/api/auth.py @@ -1,18 +1,23 @@ import json +from Tools.scripts.mailerdaemon import emparse_list_from from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from sqlalchemy.ext.asyncio import AsyncSession + +from Log import logger from app.api import Response, pwd_context, get_current_user from app.config.config import settings +from app.config.const import RAGFLOW, BISHENG, DIFY from app.models.app_token_model import AppToken from app.models.base_model import get_db from app.models.postgresql_base_model import get_pdb -from app.models.token_model import upsert_token, get_token +from app.models.token_model import upsert_token, get_token, update_token from app.models.user import UserCreate, LoginData from app.models.user_model import UserModel from app.service.auth import authenticate_user, create_access_token from app.service.bisheng import BishengService +from app.service.common.app_register import AppRegisterDao from app.service.ragflow import RagflowService from sqlalchemy.future import select @@ -102,30 +107,32 @@ user = authenticate_user(db, login_data.username, login_data.password) if not user: return Response(code=400, msg="Incorrect username or password") - - bisheng_service = BishengService(settings.sgb_base_url) - ragflow_service = RagflowService(settings.fwr_base_url) - - # 鐧诲綍鍒版瘯鏄� - try: - bisheng_token = await bisheng_service.login(login_data.username, login_data.password) - except Exception as e: - return Response(code=500, msg=f"Failed to login with Bisheng: {str(e)}") - - # 鐧诲綍鍒皉agflow - try: - ragflow_token = await ragflow_service.login(login_data.username, login_data.password) - except Exception as e: - return Response(code=500, msg=f"Failed to login with Ragflow: {str(e)}") + app_register = AppRegisterDao(db).get_apps() + token_dict = {} + for app in app_register: + if app["id"] == RAGFLOW: + service = RagflowService(settings.fwr_base_url) + elif app["id"] == BISHENG: + service = BishengService(settings.sgb_base_url) + elif app["id"] == DIFY: + continue + else: + logger.error("鏈煡娉ㄥ唽搴旂敤---") + continue + try: + token = await service.login(login_data.username, login_data.password) + token_dict[app["id"]] = token + except Exception as e: + return Response(code=500, msg=f"Failed to login with {app['id']}: {str(e)}") # 鍒涘缓鏈湴token access_token = create_access_token(data={"sub": user.username, "user_id": user.id}) - upsert_token(db, user.id, access_token, bisheng_token, ragflow_token) + await update_token(db, user.id, access_token, token_dict) result = await pdb.execute(select(AppToken).where(AppToken.id == user.id)) db_app_token = result.scalars().first() if not db_app_token: - app_token_str = json.dumps({"rag_token": ragflow_token, "bs_token":bisheng_token}) + app_token_str = json.dumps(token_dict) # print(app_token_str) app_token = AppToken(id=user.id, token=access_token.decode(), app_token=app_token_str) pdb.add(app_token) @@ -133,7 +140,7 @@ await pdb.refresh(app_token) else: db_app_token.token = access_token.decode() - db_app_token.app_token = json.dumps({"rag_token": ragflow_token, "bs_token":bisheng_token}) + db_app_token.app_token = json.dumps(token_dict) await pdb.commit() await pdb.refresh(db_app_token) return Response(code=200, msg="Login successful", data={ @@ -143,3 +150,39 @@ "nickname": "", # "user": user.to_login_json() }) + + + +@router.post("/register_test", response_model=Response) +async def register_test(user: UserCreate, db=Depends(get_db)): + db_user = db.query(UserModel).filter(UserModel.username == user.username).first() + if db_user: + return Response(code=200, msg="Username already registered") + app_register = AppRegisterDao(db).get_apps() + register_dict = {} + for app in app_register: + if app["id"] == RAGFLOW: + service = RagflowService(settings.fwr_base_url) + elif app["id"] == BISHENG: + service = BishengService(settings.sgb_base_url) + elif app["id"] == DIFY: + continue + else: + logger.error("鏈煡娉ㄥ唽搴旂敤---") + continue + try: + register_info = await service.register(user.username, user.password) + register_dict[app['id']] = register_info.get("id") if app['id'] == RAGFLOW else register_info.get("user_id") if app['id'] == BISHENG else "" + except Exception as e: + return Response(code=500, msg=f"Failed to register with {app['id']}: {str(e)}") + + # 瀛樺偍鐢ㄦ埛淇℃伅 + hashed_password = pwd_context.hash(user.password) + db_user = UserModel(username=user.username, hashed_password=hashed_password, email=user.email) + db_user.password = db_user.encrypted_password(user.password) + for k, v in register_dict.items(): + setattr(db_user, k.replace("app", "id"), v) + db.add(db_user) + db.commit() + db.refresh(db_user) + return Response(code=200, msg="User registered successfully",data={"username": db_user.username}) \ No newline at end of file diff --git a/app/api/chat.py b/app/api/chat.py index 3b14b8b..4344b62 100644 --- a/app/api/chat.py +++ b/app/api/chat.py @@ -10,9 +10,11 @@ from Log import logger from app.api import get_current_user_websocket from app.config.config import settings +from app.config.const import IMAGE_TO_TEXT, DOCUMENT_TO_REPORT, DOCUMENT_TO_CLEANING from app.models.agent_model import AgentModel, AgentType from app.models.base_model import get_db from app.models.user_model import UserModel +from app.service.common.api_token import DfTokenDao from app.service.dialog import update_session_history from app.service.basic import BasicService from app.service.difyService import DifyService @@ -310,7 +312,10 @@ try: async def forward_to_dify(): if agent.type == "imageTalk": - token = settings.dify_api_token + token = DfTokenDao(db).get_token_by_id(IMAGE_TO_TEXT) + if not token: + await websocket.send_json({"message": "Invalid token", "type": "error"}) + while True: image_list = [] is_image = False @@ -334,9 +339,11 @@ except Exception as e: logger.error(e) # complete_response = "" + answer_str = "" async for rag_response in dify_service.chat(token, current_user.id, question, upload_file_id, conversation_id): + # print(rag_response) try: if rag_response[:5] == "data:": # 濡傛灉鏄紝鍒欐埅鍙栨帀鍓�5涓瓧绗︼紝骞跺幓闄ら灏剧┖鐧界 @@ -403,8 +410,10 @@ await websocket.send_json(result) print(f"Error process message of ragflow: {e2}") elif agent.type == "reportWorkflow": - print(2323333232) - token = settings.dify_workflow_clean + + token = DfTokenDao(db).get_token_by_id(DOCUMENT_TO_CLEANING) + if not token: + await websocket.send_json({"message": "Invalid token document_to_cleaning", "type": "error"}) while True: receive_message = await websocket.receive_json() print(f"Received from client {chat_id}: {receive_message}") @@ -440,10 +449,13 @@ if workflow_type == 2: inputs["file_list"] = files inputs["Completion_of_main_indicators"] = title - token = settings.dify_workflow_report + token = DfTokenDao(db).get_token_by_id(DOCUMENT_TO_REPORT) + if not token: + await websocket.send_json( + {"message": "Invalid token document_to_cleaning", "type": "error"}) complete_response = "" async for rag_response in dify_service.workflow(token, current_user.id, inputs): - print(rag_response) + # print(rag_response) try: if rag_response[:5] == "data:": # 濡傛灉鏄紝鍒欐埅鍙栨帀鍓�5涓瓧绗︼紝骞跺幓闄ら灏剧┖鐧界 diff --git a/app/api/files.py b/app/api/files.py index 4be3304..dca7d3c 100644 --- a/app/api/files.py +++ b/app/api/files.py @@ -15,6 +15,7 @@ from app.models.user_model import UserModel from app.service.basic import BasicService from app.service.bisheng import BishengService +from app.service.common.api_token import DfTokenDao from app.service.difyService import DifyService from app.service.ragflow import RagflowService from app.service.service_token import get_ragflow_token, get_bisheng_token @@ -96,9 +97,11 @@ # result = await service.paper_file_upload(chat_id, file.filename, file_content) elif agent.agent_type == AgentType.DIFY: - token = settings.dify_api_token dify_service = DifyService(base_url=settings.dify_base_url) if agent.type == "imageTalk": + token = DfTokenDao(db).get_token_by_id("image_and_text_conversion") + if not token: + raise HTTPException(status_code=500, detail="鑾峰彇token澶辫触锛宨mage_and_text_conversion锛�") file = file[0] # 璇诲彇涓婁紶鐨勬枃浠跺唴瀹� try: @@ -110,6 +113,9 @@ except Exception as e: raise HTTPException(status_code=500, detail=str(e)) elif agent.type == "reportWorkflow": + token = DfTokenDao(db).get_token_by_id("document_to_report") + if not token: + raise HTTPException(status_code=500, detail="鑾峰彇token澶辫触锛宒ocument_to_report锛�") result = [] for f in file: try: diff --git a/app/api/public_api.py b/app/api/public_api.py new file mode 100644 index 0000000..06a37dc --- /dev/null +++ b/app/api/public_api.py @@ -0,0 +1,62 @@ +import json + +from fastapi import APIRouter, Depends + +from Log import logger +from app.api import Response +from app.api.auth import login +from app.config.const import IMAGE_TO_TEXT, DOCUMENT_TO_CLEANING, DOCUMENT_TO_REPORT, DIFY, BISHENG, RAGFLOW +from app.models.base_model import get_db +from app.models.public_api_model import DfToken, AppRegister +from app.service.common.api_token import DfTokenDao +from app.service.common.app_register import AppRegisterDao +from app.task.sync_resources import sync_knowledge, sync_dialog, sync_agent, sync_llm, sync_resource + +public_api = APIRouter() + + +@public_api.post("/sync/df_token", response_model=Response) +async def sync_df_token(df: DfToken, db=Depends(get_db)): + token_dict = {IMAGE_TO_TEXT: df.image, DOCUMENT_TO_CLEANING: df.clean, DOCUMENT_TO_REPORT: df.report} + + try: + for api_id, token in token_dict.items(): + if not token: + continue + DfTokenDao(db).update_and_insert_token(api_id, token) + except Exception as e: + logger.error(e) + return Response(code=500, msg="failed", data={}) + + return Response(code=200, msg="successfully", data={}) + + +@public_api.post("/sync/app_register", response_model=Response) +async def sync_app_register(apr: AppRegister, db=Depends(get_db)): + app_dict = {RAGFLOW: apr.rg, BISHENG: apr.bs, DIFY: apr.df} + + try: + for app_id, status in app_dict.items(): + + AppRegisterDao(db).update_and_insert_app(app_id, status) + except Exception as e: + logger.error(e) + return Response(code=500, msg="failed", data={}) + + return Response(code=200, msg="successfully", data={}) + + +@public_api.get("/sync/resource", response_model=Response) +async def user_group_list(resource_type:int, db=Depends(get_db)): + if resource_type == 1: + await sync_knowledge() + elif resource_type == 2: + await sync_dialog() + elif resource_type == 3: + await sync_agent() + elif resource_type == 4: + await sync_llm() + else: + await sync_resource() + + return Response(code=200, msg="", data={}) \ No newline at end of file diff --git a/app/api/sync_data.py b/app/api/sync_data.py deleted file mode 100644 index 30bfbe3..0000000 --- a/app/api/sync_data.py +++ /dev/null @@ -1,26 +0,0 @@ -# coding:utf-8 - -from fastapi import APIRouter, Depends -from app.api import Response, get_current_user -from app.models.base_model import get_db -from app.models.user_model import UserModel -from app.task.sync_resources import sync_knowledge, sync_dialog, sync_agent, sync_resource, sync_llm - -sync_router = APIRouter() - - -@sync_router.get("/data", response_model=Response) -async def user_group_list(resource_type:int, current_user: UserModel = Depends(get_current_user), - db=Depends(get_db)): - if resource_type == 1: - await sync_knowledge() - elif resource_type == 2: - await sync_dialog() - elif resource_type == 3: - await sync_agent() - elif resource_type == 4: - await sync_llm() - else: - await sync_resource() - - return Response(code=200, msg="", data={}) \ No newline at end of file diff --git a/app/api/user.py b/app/api/user.py index 6b6c866..e9d34b3 100644 --- a/app/api/user.py +++ b/app/api/user.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, Depends from app.api import Response, pwd_context, get_current_user -from app.models.app_model import AppRegisterModel +from app.models.public_api_model import AppRegisterModel from app.models.base_model import get_db from app.models.user import PageParameter, UserStatus, UserInfo, LoginData from app.models.user_model import UserModel diff --git a/app/config/const.py b/app/config/const.py new file mode 100644 index 0000000..007e8e4 --- /dev/null +++ b/app/config/const.py @@ -0,0 +1,11 @@ + +### ----------dify------api token +DOCUMENT_TO_CLEANING = "document_to_cleaning" +DOCUMENT_TO_REPORT = "document_to_report" +IMAGE_TO_TEXT = "image_and_text_conversion" + + +### -----------app register -------------- +RAGFLOW = "ragflow_app" +BISHENG = "bisheng_app" +DIFY = "dify_app" \ No newline at end of file diff --git a/app/models/app_model.py b/app/models/app_model.py deleted file mode 100644 index 46e9caf..0000000 --- a/app/models/app_model.py +++ /dev/null @@ -1,32 +0,0 @@ -from datetime import datetime -from enum import IntEnum -from sqlalchemy import Column, String, Enum as SQLAlchemyEnum, Integer, BigInteger, DateTime, Text, Float, Boolean -from app.models.base_model import Base - -class AppType(IntEnum): - BASIC = 0 - RAGFLOW = 1 - BISHENG = 2 - - - -class AppRegisterModel(Base): - __tablename__ = "app_register" - id = Column(Integer, primary_key=True) - name = Column(String(255)) - app_type = Column(Integer, nullable=False) - status = Column(Integer, nullable=False, default=1) - created_at = Column(DateTime, default=datetime.now()) - updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now()) - - - # to_dict 鏂规硶 - def to_dict(self): - return { - 'id': self.id, - 'name': self.name, - 'agent_type': self.agent_type, - 'type': self.type - } - - diff --git a/app/models/postgresql_base_model.py b/app/models/postgresql_base_model.py index f139db8..b4b244e 100644 --- a/app/models/postgresql_base_model.py +++ b/app/models/postgresql_base_model.py @@ -7,7 +7,7 @@ DATABASE_URL = os.getenv('POSTGRESQL_DATABASE_URL') or settings.postgresql_database_url -engine = create_async_engine(DATABASE_URL, echo=True) +engine = create_async_engine(DATABASE_URL, echo=False) PostgresqlSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine, class_=AsyncSession) PostgresqlBase = declarative_base() diff --git a/app/models/public_api_model.py b/app/models/public_api_model.py new file mode 100644 index 0000000..8edffde --- /dev/null +++ b/app/models/public_api_model.py @@ -0,0 +1,61 @@ +from datetime import datetime +from enum import IntEnum +from typing import Optional + +from pydantic import BaseModel +from sqlalchemy import Column, String, Enum as SQLAlchemyEnum, Integer, BigInteger, DateTime, Text, Float, Boolean +from app.models.base_model import Base + +class AppType(IntEnum): + BASIC = 0 + RAGFLOW = 1 + BISHENG = 2 + + + +class AppRegisterModel(Base): + __tablename__ = "app_register" + id = Column(String(36), primary_key=True) + name = Column(String(255)) + status = Column(Integer, nullable=False, default=1) + created_at = Column(DateTime, default=datetime.now()) + updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now()) + + + # to_dict 鏂规硶 + def to_dict(self): + return { + 'id': self.id, + 'name': self.name, + 'status': self.status + } + + +class DfTokenModel(Base): + __tablename__ = "df_api_token" + id = Column(String(36), primary_key=True) + token = Column(String(36)) + created_at = Column(DateTime, default=datetime.now()) + updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now()) + + + # to_dict 鏂规硶 + def to_dict(self): + return { + 'id': self.id, + 'token': self.token, + 'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'), + # 'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M:%S') + } + + +class DfToken(BaseModel): + image: Optional[str] = "" + clean: Optional[str] = "" + report: Optional[str] = "" + + +class AppRegister(BaseModel): + rg: Optional[int] = 0 + bs: Optional[int] = 0 + df: Optional[int] = 0 diff --git a/app/models/token_model.py b/app/models/token_model.py index 066c73e..2b50bfd 100644 --- a/app/models/token_model.py +++ b/app/models/token_model.py @@ -4,6 +4,8 @@ from sqlalchemy import Column, Integer, DateTime, Text from sqlalchemy.orm import Session +from Log import logger +from app.config.const import RAGFLOW from app.models.base_model import Base @@ -52,5 +54,39 @@ db.rollback() # 鍥炴粴浜嬪姟 +async def update_token(db: Session, user_id: int, access_token: str, token: dict): + # 鍙傛暟楠岃瘉 + if not isinstance(user_id, int) or user_id <= 0: + return + db_token = None + print(token) + try: + # 鏌ヨ鐜版湁璁板綍 + db_token = db.query(TokenModel).filter_by(user_id=user_id).first() + if db_token: + # 璁板綍瀛樺湪锛岃繘琛屾洿鏂� + db_token.token = access_token + for k, v in token.items(): + setattr(db_token, k.replace("app", "token"), v) + else: + # 璁板綍涓嶅瓨鍦紝杩涜鎻掑叆 + db_token = TokenModel( + user_id=user_id, + token=access_token, + ) + for k, v in token.items(): + setattr(db_token, k.replace("app", "token"), v) + db.add(db_token) + + # 鎻愪氦浜嬪姟 + db.commit() + db.refresh(db_token) + + except Exception as e: + logger.error(e) + # 寮傚父澶勭悊 + db.rollback() # 鍥炴粴浜嬪姟 + + def get_token(db: Session, user_id: int) -> Type[TokenModel] | None: return db.query(TokenModel).filter_by(user_id=user_id).first() diff --git a/app/models/user.py b/app/models/user.py index ab53067..daff50c 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -6,6 +6,7 @@ class UserCreate(BaseModel): username: str password: str + email: Optional[str] = "" # 瀹氫箟璇锋眰浣撴ā鍨� diff --git a/app/service/common/api_token.py b/app/service/common/api_token.py new file mode 100644 index 0000000..636babb --- /dev/null +++ b/app/service/common/api_token.py @@ -0,0 +1,48 @@ +from Log import logger +from app.models import current_time +from app.models.public_api_model import DfTokenModel +from sqlalchemy.orm import Session +from typing import Type + + +class DfTokenDao: + def __init__(self, db: Session): + self.db = db + + def get_token_by_id(self, api_id: str) -> Type[DfTokenModel] | None: + session = self.db.query(DfTokenModel).filter_by(id=api_id).first() + if session: + return session.token + return None + + def update_token(self, api_id: str, token: str): + + logger.error("鏇存柊鏁版嵁df api token---------------------------") + try: + self.db.query(DfTokenModel).filter(DfTokenModel.id==api_id).update({"token":token, "updated_at": current_time()}) + self.db.commit() + except Exception as e: + logger.error(e) + self.db.rollback() + raise Exception("鏇存柊澶辫触锛�") + + def insert_token(self, api_id: str, token: str): + logger.error("鏂板鏁版嵁df api token---------------------------") + new_session = DfTokenModel( + id=api_id, + token=token + ) + self.db.add(new_session) + self.db.commit() + self.db.refresh(new_session) + return new_session + + + def update_and_insert_token(self, api_id: str, token: str): + + logger.error("鏇存柊鎴栬�呮坊鍔犳暟鎹甦f api token---------------------------") + token_boj = self.get_token_by_id(api_id) + if token_boj: + self.update_token(api_id, token) + else: + self.insert_token(api_id, token) diff --git a/app/service/common/app_register.py b/app/service/common/app_register.py index 1ea947c..e30816b 100644 --- a/app/service/common/app_register.py +++ b/app/service/common/app_register.py @@ -1,12 +1,53 @@ -from app.models.app_model import AppRegisterModel +from app.models.public_api_model import AppRegisterModel +from Log import logger +from app.models import current_time +from sqlalchemy.orm import Session +from typing import Type -class AppRegister: - app = AppRegisterModel - def __init__(self, db): +class AppRegisterDao: + def __init__(self, db: Session): self.db = db + def get_app_by_id(self, api_id: str) -> Type[AppRegisterModel] | None: + session = self.db.query(AppRegisterModel).filter_by(id=api_id).first() - def get_app(self): + return session - return [i.app_type for i in self.db.query(self.app).filter_by(status=1).all()] \ No newline at end of file + def update_app(self, app_id: str, status: int): + + logger.error("鏇存柊鏁版嵁: app register---------------------------") + try: + self.db.query(AppRegisterModel).filter(AppRegisterModel.id==app_id).update({"status":status, "updated_at": current_time()}) + self.db.commit() + except Exception as e: + logger.error(e) + self.db.rollback() + raise Exception("鏇存柊澶辫触锛�") + + def insert_app(self, app_id: str, status: int): + logger.error("鏂板鏁版嵁: app register---------------------------") + new_session = AppRegisterModel( + id=app_id, + status=status + ) + self.db.add(new_session) + self.db.commit() + self.db.refresh(new_session) + return new_session + + + def update_and_insert_app(self, app_id: str, status: int): + + logger.error("鏇存柊鎴栬�呮坊鍔犳暟鎹�: app register---------------------------") + token_boj = self.get_app_by_id(app_id) + if token_boj: + self.update_app(app_id, status) + else: + self.insert_app(app_id, status) + + + def get_apps(self): + app_list = self.db.query(AppRegisterModel).filter_by(status=1).all() + + return [i.to_dict() for i in app_list] \ No newline at end of file diff --git a/app/service/user.py b/app/service/user.py index f5cc7ea..cd7a053 100644 --- a/app/service/user.py +++ b/app/service/user.py @@ -6,7 +6,7 @@ from app.models.user_model import UserModel from Log import logger from app.service.bisheng import BishengService -from app.service.common.app_register import AppRegister +from app.service.common.app_register import AppRegisterDao from app.service.ragflow import RagflowService from app.service.service_token import get_ragflow_token, get_bisheng_token, get_ragflow_new_token @@ -104,7 +104,7 @@ try: user = db.query(UserModel).filter(UserModel.id == user_id).first() pwd = user.decrypted_password() - for app_type in AppRegister(db).get_app(): + for app_type in AppRegisterDao(db).get_app(): if app_type == AgentType.RAGFLOW: token = await get_ragflow_new_token(db, user_id, app_type) ragflow_service = RagflowService(settings.fwr_base_url) diff --git a/app/task/sync_resources.py b/app/task/sync_resources.py index 15ed55d..fca2ae8 100644 --- a/app/task/sync_resources.py +++ b/app/task/sync_resources.py @@ -5,7 +5,7 @@ from Log import logger from app.config.config import settings from app.models import AgentType -from app.models.app_model import AppRegisterModel +from app.models.public_api_model import AppRegisterModel from app.models.base_model import get_db from app.service.bisheng import BishengService from app.service.ragflow import RagflowService diff --git a/main.py b/main.py index f07896a..ea704da 100644 --- a/main.py +++ b/main.py @@ -13,9 +13,10 @@ from app.api.files import router as files_router from app.api.knowledge import knowledge_router from app.api.organization import dept_router +from app.api.public_api import public_api from app.api.report import router as report_router from app.api.resource import menu_router -from app.api.sync_data import sync_router +# from app.api.sync_data import sync_router from app.api.user import user_router from app.api.group import group_router from app.api.role import role_router @@ -71,7 +72,8 @@ app.include_router(knowledge_router, prefix='/api/knowledge', tags=["knowledge"]) app.include_router(dialog_router, prefix='/api/dialog', tags=["dialog"]) app.include_router(canvas_router, prefix='/api/canvas', tags=["canvas"]) -app.include_router(sync_router, prefix='/api/sync', tags=["sync"]) +# app.include_router(sync_router, prefix='/api/sync', tags=["sync"]) +app.include_router(public_api, prefix='/v1/api', tags=["public_api"]) app.mount("/static", StaticFiles(directory="app/images"), name="static") if __name__ == "__main__": -- Gitblit v1.8.0