From f2c43713b16e821f4a1ae97804c60f18734d5f6a Mon Sep 17 00:00:00 2001 From: zhaoqingang <zhaoqg0118@163.com> Date: 星期五, 13 十二月 2024 17:25:12 +0800 Subject: [PATCH] 问题优化 --- app/api/role.py | 18 app/service/user.py | 100 ++++---- alembic/versions/ef06c24632a7_dialog_id_to_update.py | 34 +++ app/models/user.py | 7 app/service/auth.py | 13 env_conf/api_key_conf.json | 5 env_conf/default_agent_conf.json | 33 +++ app/service/dialog.py | 4 alembic/versions/ba24e02a6610_menu_table_update.py | 32 ++ app/task/fetch_agent.py | 10 main.py | 4 app/service/role.py | 3 app/models/dialog_model.py | 9 env_conf/menu_conf.json | 62 ++++- app/service/service_token.py | 35 ++- app/models/menu_model.py | 3 env_conf/app_register_conf.json | 5 app/utils/password_handle.py | 31 ++ app/api/user.py | 33 ++ app/api/auth.py | 25 + app/models/role_model.py | 4 app/init_config/init_run_data.py | 14 + app/models/user_model.py | 18 + alembic/versions/1c4af61d72a5_dialog_id_to_36.py | 52 ++++ app/models/knowledge_model.py | 2 app/api/dialog.py | 2 app/init_config/__init__.py | 0 app/service/v2/initialize_data.py | 53 ++++ app/models/token_model.py | 8 29 files changed, 480 insertions(+), 139 deletions(-) diff --git a/alembic/versions/1c4af61d72a5_dialog_id_to_36.py b/alembic/versions/1c4af61d72a5_dialog_id_to_36.py new file mode 100644 index 0000000..8362b50 --- /dev/null +++ b/alembic/versions/1c4af61d72a5_dialog_id_to_36.py @@ -0,0 +1,52 @@ +"""dialog id to 36 + +Revision ID: 1c4af61d72a5 +Revises: 0366cf835bba +Create Date: 2024-12-13 11:24:57.138214 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision: str = '1c4af61d72a5' +down_revision: Union[str, None] = '0366cf835bba' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column('dialogs', 'id', + existing_type=mysql.VARCHAR(length=32), + type_=sa.String(length=36), + existing_nullable=False) + op.alter_column('dialogs', 'agent_id', + existing_type=mysql.VARCHAR(length=32), + type_=sa.String(length=36), + existing_nullable=True) + op.alter_column('knowledgebase', 'id', + existing_type=mysql.VARCHAR(length=32), + type_=sa.String(length=36), + existing_nullable=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column('knowledgebase', 'id', + existing_type=sa.String(length=36), + type_=mysql.VARCHAR(length=32), + existing_nullable=False) + op.alter_column('dialogs', 'agent_id', + existing_type=sa.String(length=36), + type_=mysql.VARCHAR(length=32), + existing_nullable=True) + op.alter_column('dialogs', 'id', + existing_type=sa.String(length=36), + type_=mysql.VARCHAR(length=32), + existing_nullable=False) + # ### end Alembic commands ### diff --git a/alembic/versions/ba24e02a6610_menu_table_update.py b/alembic/versions/ba24e02a6610_menu_table_update.py new file mode 100644 index 0000000..6990720 --- /dev/null +++ b/alembic/versions/ba24e02a6610_menu_table_update.py @@ -0,0 +1,32 @@ +"""menu table update + +Revision ID: ba24e02a6610 +Revises: ef06c24632a7 +Create Date: 2024-12-13 17:19:35.020328 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'ba24e02a6610' +down_revision: Union[str, None] = 'ef06c24632a7' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('menu_capacity', sa.Column('chat_id', sa.String(length=36), nullable=True)) + op.add_column('menu_capacity', sa.Column('chat_type', sa.String(length=36), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('menu_capacity', 'chat_type') + op.drop_column('menu_capacity', 'chat_id') + # ### end Alembic commands ### diff --git a/alembic/versions/ef06c24632a7_dialog_id_to_update.py b/alembic/versions/ef06c24632a7_dialog_id_to_update.py new file mode 100644 index 0000000..1912f2c --- /dev/null +++ b/alembic/versions/ef06c24632a7_dialog_id_to_update.py @@ -0,0 +1,34 @@ +"""dialog id to update + +Revision ID: ef06c24632a7 +Revises: 1c4af61d72a5 +Create Date: 2024-12-13 16:18:18.486282 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'ef06c24632a7' +down_revision: Union[str, None] = '1c4af61d72a5' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('dialogs', sa.Column('mode', sa.String(length=36), nullable=True)) + op.add_column('user', sa.Column('sync_flag', sa.String(length=36), nullable=True)) + op.add_column('web_menu', sa.Column('rank', sa.Integer(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('web_menu', 'rank') + op.drop_column('user', 'sync_flag') + op.drop_column('dialogs', 'mode') + # ### end Alembic commands ### diff --git a/app/api/auth.py b/app/api/auth.py index 116d9e2..faad16d 100644 --- a/app/api/auth.py +++ b/app/api/auth.py @@ -12,7 +12,7 @@ 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 +from app.models.token_model import upsert_token, update_token from app.models.user import UserCreate, LoginData from app.models.user_model import UserModel, UserAppModel from app.service.auth import authenticate_user, create_access_token, is_valid_password, save_register_user, \ @@ -24,6 +24,7 @@ from app.service.ragflow import RagflowService from sqlalchemy.future import select +from app.utils.password_handle import generate_password router = APIRouter() @@ -122,12 +123,14 @@ continue try: name = login_data.username + app_password = login_data.password user_app = await UserAppDao(db).get_data_by_id(user.id, app["id"]) if user_app: name = user_app.username + app_password = user_app.decrypted_password(user_app.password) else: await update_user_info(db, user.id) - token = await service.login(name, login_data.password) + token = await service.login(name, app_password) token_dict[app["id"]] = token except Exception as e: return Response(code=500, msg=f"Failed to login with {app['id']}: {str(e)}") @@ -135,7 +138,7 @@ # 鍒涘缓鏈湴token access_token = create_access_token(data={"sub": user.username, "user_id": user.id}) - # await update_token(db, user.id, access_token, token_dict) + await update_token(db, user.id, access_token, token_dict) await update_user_token(db, user.id, token_dict) result = await pdb.execute(select(AppToken).where(AppToken.id == user.id)) db_app_token = result.scalars().first() @@ -173,6 +176,7 @@ app_register = AppRegisterDao(db).get_apps() register_dict = {} token = "" + app_password = await generate_password(10) for app in app_register: if app["id"] == RAGFLOW: service = RagflowService(settings.fwr_base_url) @@ -190,13 +194,20 @@ continue try: name = app["id"] + str(int(time.time())) - register_info = await service.register(name, user.password, token) + register_info = await service.register(name, app_password, token) # print(register_info) register_dict[app['id']] = {"id":register_info.get("id"), "name": name, "email": register_info.get("email")} except Exception as e: return Response(code=500, msg=f"Failed to register with {app['id']}: {str(e)}") - user_id = await save_register_user(db, user.username, user.password, user.email, register_dict) + user_id = await save_register_user(db, user.username, user.password, user.email, app_password, register_dict) if not user_id: return Response(code=500, msg=f"Failed to register with app") - is_update = await update_user_group(db, user_id) - return Response(code=200, msg="User registered successfully",data={"username": user.username}) \ No newline at end of file + return Response(code=200, msg="User registered successfully",data={"userFlag": user_id}) + + +@router.get("/v2/sync", response_model=Response) +async def sync_user_tenant(userFlag: str, db=Depends(get_db)): + app_register = AppRegisterDao(db).get_app_by_id(RAGFLOW) + if app_register: + is_update = await update_user_group(db, userFlag) + return Response(code=200, msg="success", data={}) \ No newline at end of file diff --git a/app/api/dialog.py b/app/api/dialog.py index 44030a2..28bd1df 100644 --- a/app/api/dialog.py +++ b/app/api/dialog.py @@ -25,7 +25,7 @@ @dialog_router.post("/create", response_model=Response) async def create_dialog_api(dialog: dialogData, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)): - is_create = await create_dialog_service(db, dialog.id, dialog.name, dialog.description, dialog.icon, dialog.dialogType, current_user.id) + is_create = await create_dialog_service(db, dialog.id, dialog.name, dialog.description, dialog.icon, dialog.dialogType, dialog.mode,current_user.id) if not is_create: return Response(code=500, msg="role create failure", data={}) return Response(code=200, msg="role create success", data={}) diff --git a/app/api/role.py b/app/api/role.py index e32764c..ad5e78d 100644 --- a/app/api/role.py +++ b/app/api/role.py @@ -29,14 +29,14 @@ return Response(code=500, msg="role create failure", data={}) return Response(code=200, msg="role create successfully", data={"roleName": role.roleName}) -@role_router.delete("/delete_role/{role_id}", response_model=Response) -async def delete_group(role_id: str, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)): - db_role = db.query(RoleModel).filter(RoleModel.id == role_id).first() +@role_router.delete("/delete_role/{roleId}", response_model=Response) +async def delete_group(roleId: str, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)): + db_role = db.query(RoleModel).filter(RoleModel.id == roleId).first() if not db_role: return Response(code=200, msg="role does not exist") if db_role.role_type ==2: return Response(code=400, msg="榛樿瑙掕壊涓嶅厑璁稿垹闄�!") - is_edit = await delete_role_data(db, role_id) + is_edit = await delete_role_data(db, roleId) if not is_edit: return Response(code=500, msg="role delete failure", data={}) return Response(code=200, msg="role delete successfully", data={}) @@ -46,10 +46,10 @@ async def edit_group_status(role: RoleStatus, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)): if role.status not in ["0", "1"]: return Response(code=400, msg="The status cannot be {}!".format(role.status)) - db_role = db.query(RoleModel).filter(RoleModel.id == role.role_id).first() + db_role = db.query(RoleModel).filter(RoleModel.id == role.roleId).first() if not db_role: return Response(code=200, msg="role does not exist") - is_edit = await edit_role_status(db, role.status,role.role_id) + is_edit = await edit_role_status(db, role.status,role.roleId) if not is_edit: return Response(code=500, msg="role status edit failure", data={}) return Response(code=200, msg="role status edit successfully", data={}) @@ -59,14 +59,14 @@ if role.editType == 1: if not role.roleName: return Response(code=400, msg="The roleName cannot be empty!") - db_role = db.query(RoleModel).filter(RoleModel.id == role.role_id).first() + db_role = db.query(RoleModel).filter(RoleModel.id == role.roleId).first() if not db_role: return Response(code=200, msg="role does not exist") db_role = db.query(RoleModel).filter(RoleModel.name == role.roleName).first() - if db_role and db_role.id != role.role_id: + if db_role and db_role.id != role.roleId: return Response(code=200, msg="role already created") - is_edit = await edit_role_resource(db, role.role_id,role.roleName, role.remark, role.roleKey, role.dataScope, role.resources, role.editType) + is_edit = await edit_role_resource(db, role.roleId,role.roleName, role.remark, role.roleKey, role.dataScope, role.resources, role.editType) if not is_edit: return Response(code=500, msg="role edit failure", data={}) return Response(code=200, msg="role edit successfully", data={}) \ No newline at end of file diff --git a/app/api/user.py b/app/api/user.py index 506c1b4..78666b4 100644 --- a/app/api/user.py +++ b/app/api/user.py @@ -1,12 +1,12 @@ from fastapi import APIRouter, Depends from app.api import Response, pwd_context, get_current_user, ResponseList -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 import PageParameter, UserStatus, UserInfo, LoginData, UserPassword from app.models.user_model import UserModel -from app.service.auth import is_valid_password +from app.service.auth import is_valid_password, verify_password from app.service.user import get_user_list, edit_user_status, delete_user_data, create_user, edit_user_data, \ - edit_user_pwd, get_user_info, get_user_routers, get_user_menus, get_user_permission, get_user_dept + edit_user_pwd, get_user_info, get_user_routers, get_user_menus, get_user_permission, get_user_dept, change_user_pwd, \ + user_data_service user_router = APIRouter() @@ -86,6 +86,21 @@ return Response(code=200, msg="user pwd reset successfully", data={}) +@user_router.put("/change_password", response_model=Response) +async def change_user_password(user: UserPassword, current_user: UserModel = Depends(get_current_user),db=Depends(get_db)): + user_info = db.query(UserModel).filter(UserModel.id==current_user.id).first() + if not user_info: + return Response(code=401, msg="Incorrect change password !") + if not verify_password(user.oldPassword, user_info.hashed_password): + return Response(code=400, msg="Incorrect password !") + if not is_valid_password(user.newPassword): + return Response(code=400, msg="The password must be at least 8 and contain both numbers and letters") + is_edit = await change_user_pwd(db, user_info.id, user.newPassword) + if not is_edit: + return Response(code=500, msg="user pwd change failure", data={}) + return Response(code=200, msg="user pwd change success", data={}) + + @user_router.get("/user_info", response_model=Response) async def user_info(current_user: UserModel = Depends(get_current_user),db=Depends(get_db)): user_info = await get_user_info(db, current_user.id) @@ -119,4 +134,12 @@ @user_router.get("/dept", response_model=Response) async def user_dept_api(userId:int, current_user: UserModel = Depends(get_current_user),db=Depends(get_db)): menus = await get_user_dept(db, userId) - return Response(code=200, msg="successfully", data=menus) \ No newline at end of file + return Response(code=200, msg="successfully", data=menus) + + +@user_router.get("/user_data", response_model=Response) +async def user_data_api(userId, current_user: UserModel = Depends(get_current_user),db=Depends(get_db)): + user_info = await user_data_service(db, userId) + if not user_info: + return Response(code=500, msg="user get failure", data={}) + return Response(code=200, msg="successfully", data=user_info) \ No newline at end of file diff --git a/app/init_config/__init__.py b/app/init_config/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/app/init_config/__init__.py diff --git a/app/init_config/init_run_data.py b/app/init_config/init_run_data.py new file mode 100644 index 0000000..b562456 --- /dev/null +++ b/app/init_config/init_run_data.py @@ -0,0 +1,14 @@ +from app.models.base_model import SessionLocal +from app.service.v2.initialize_data import dialog_menu_sync, default_group_sync, default_role_sync, app_register_sync, \ + basic_agent_sync + + +async def sync_default_data(): + db = SessionLocal() + await dialog_menu_sync(db) # 灏忔暟 + await default_group_sync(db) # 榛樿缁� + await default_role_sync(db) # 榛樿瑙掕壊 + await app_register_sync(db) # 娉ㄥ唽鐨勫簲鐢� + await basic_agent_sync(db) # 寮�鍙戠殑agent + # await default_role_sync(db) # 椤甸潰璧勬簮閰嶇疆淇℃伅 + # await default_role_sync(db) # 榛樿鐨勮鑹茶祫婧� \ No newline at end of file diff --git a/app/models/dialog_model.py b/app/models/dialog_model.py index 1934388..d8c7a7a 100644 --- a/app/models/dialog_model.py +++ b/app/models/dialog_model.py @@ -12,7 +12,7 @@ __mapper_args__ = { # "order_by": 'SEQ' } - id = Column(String(32), primary_key=True) # id + id = Column(String(36), primary_key=True) # id create_date = Column(DateTime, default=datetime.now()) # 鍒涘缓鏃堕棿 update_date = Column(DateTime, default=datetime.now(), onupdate=datetime.now()) # 鏇存柊鏃堕棿 tenant_id = Column(String(32)) # 鍒涘缓浜� @@ -20,8 +20,9 @@ description = Column(Text) # 璇存槑 icon = Column(Text) # 鍥炬爣 status = Column(String(1), default="1") # 鐘舵�� - dialog_type = Column(String(1)) # # 骞冲彴 - agent_id = Column(String(32)) + dialog_type = Column(String(1)) # 骞冲彴 + agent_id = Column(String(36)) + mode = Column(String(36)) def get_id(self): return str(self.id) @@ -38,6 +39,7 @@ 'status': self.status, 'agentType': self.dialog_type, 'agentId': self.agent_id, + 'mode': self.mode, } @@ -73,6 +75,7 @@ description: Optional[str] = "" dialogType: str icon: str + mode: str class dialogDataUpdate(BaseModel): diff --git a/app/models/knowledge_model.py b/app/models/knowledge_model.py index afc89e5..661423e 100644 --- a/app/models/knowledge_model.py +++ b/app/models/knowledge_model.py @@ -13,7 +13,7 @@ __mapper_args__ = { # "order_by": 'SEQ' } - id = Column(String(32), primary_key=True) # id + id = Column(String(36), primary_key=True) # id name = Column(String(128)) # 鍚嶇О create_date = Column(DateTime, default=datetime.now()) # 鍒涘缓鏃堕棿 update_date = Column(DateTime, default=datetime.now(), onupdate=datetime.now()) # 鏇存柊鏃堕棿 diff --git a/app/models/menu_model.py b/app/models/menu_model.py index 77c00d9..1832514 100644 --- a/app/models/menu_model.py +++ b/app/models/menu_model.py @@ -12,6 +12,7 @@ desc = Column(String(1000)) icon = Column(String(16)) img = Column(String(255)) + rank = Column(Integer) def to_dict(self): @@ -36,4 +37,6 @@ menu_id = Column(Integer) capacity_id = Column(String(36)) capacity_type = Column(Integer) + chat_id = Column(String(36)) + chat_type = Column(String(36)) diff --git a/app/models/role_model.py b/app/models/role_model.py index 74d79dd..22f73c5 100644 --- a/app/models/role_model.py +++ b/app/models/role_model.py @@ -90,12 +90,12 @@ class RoleStatus(BaseModel): - role_id: str + roleId: str status: constr(min_length=1, max_length=1, pattern='^(0|1)$') class RoleEdit(BaseModel): - role_id: str + roleId: str remark: Optional[str] = "" roleName: Optional[str] = "" resources: Optional[list] = [] diff --git a/app/models/token_model.py b/app/models/token_model.py index aa37d12..43dd2d0 100644 --- a/app/models/token_model.py +++ b/app/models/token_model.py @@ -65,16 +65,16 @@ if db_token: # 璁板綍瀛樺湪锛岃繘琛屾洿鏂� db_token.token = access_token - for k, v in token.items(): - setattr(db_token, k.replace("app", "token"), v) + # 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) + # for k, v in token.items(): + # setattr(db_token, k.replace("app", "token"), v) db.add(db_token) # 鎻愪氦浜嬪姟 diff --git a/app/models/user.py b/app/models/user.py index daff50c..1d96a23 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -46,3 +46,10 @@ groups: Optional[list] = [] + +class UserPassword(BaseModel): + # userId: int + newPassword: str + oldPassword: str + + diff --git a/app/models/user_model.py b/app/models/user_model.py index eeaf3e6..dcbb612 100644 --- a/app/models/user_model.py +++ b/app/models/user_model.py @@ -39,6 +39,7 @@ sex = Column(String(1)) permission = Column(String(16), default="general") age = Column(Integer) + sync_flag = Column(String(36)) created_at = Column(DateTime, default=datetime.now()) updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now()) @@ -115,6 +116,7 @@ for ogt in self.organizations: if ogt.id in ogt_set: continue + print(ogt.id) ogt_set.add(ogt.id) for role in ogt.roles: roles[role.id] = role.to_dict() @@ -122,9 +124,12 @@ while parent_ogt: if parent_ogt.id not in ogt_set: ogt_set.add(ogt.id) - for role in ogt.roles: + for role in parent_ogt.roles: roles[role.id] = role.to_dict() - parent_ogt = ogt.parent + parent_ogt = parent_ogt.parent + else: + break + json['roles'] = list(roles.values()) return json @@ -220,9 +225,10 @@ "app_type": self.app_type, 'status': self.status, } - - def encrypted_password(self, password): + @staticmethod + def encrypted_password(password): return cipher_suite.encrypt(password.encode("utf-8")).decode("utf-8") - def decrypted_password(self): - return cipher_suite.decrypt(self.password).decode("utf-8") \ No newline at end of file + @staticmethod + def decrypted_password(password): + return cipher_suite.decrypt(password).decode("utf-8") \ No newline at end of file diff --git a/app/service/auth.py b/app/service/auth.py index 4353fcd..8c41fe9 100644 --- a/app/service/auth.py +++ b/app/service/auth.py @@ -1,6 +1,8 @@ import re +import uuid from datetime import datetime, timedelta from typing import Type +from uuid import uuid4 from jwt import encode, decode, exceptions from passlib.context import CryptContext @@ -69,12 +71,13 @@ return has_digit is not None and has_letter is not None -async def save_register_user(db, username, password, email, register_dict): +async def save_register_user(db, username, password, email, app_password, register_dict): user_id = "" + sync_flag = str(uuid.uuid4()) try: hashed_password = pwd_context.hash(password) - db_user = UserModel(username=username, hashed_password=hashed_password, email=email) - pwd = db_user.encrypted_password(password) + db_user = UserModel(username=username, hashed_password=hashed_password, email=email, sync_flag=sync_flag) + pwd = db_user.encrypted_password(app_password) db_user.password = pwd db_user.roles = [db.query(RoleModel).filter(RoleModel.role_type == 2).first()] db_user.groups = [db.query(GroupModel).filter(GroupModel.group_type == 2).first()] @@ -92,7 +95,7 @@ db.query(UserModel).filter(UserModel.id == user_id).delete() db.commit return False - return user_id + return sync_flag async def update_user_token(db, user_id, token_dict): @@ -139,7 +142,7 @@ # db.commit() # db.refresh(db_user) - is_sava = await save_register_user(db, user.username, user.password, user.email, register_dict) + # is_sava = await save_register_user(db, user.username, user.password, user.email, register_dict) class UserAppDao: def __init__(self, db: Session): diff --git a/app/service/dialog.py b/app/service/dialog.py index fa678ce..8a1ccbc 100644 --- a/app/service/dialog.py +++ b/app/service/dialog.py @@ -90,9 +90,9 @@ -async def create_dialog_service(db, dialog_id, dialog_name, description, icon, dialog_type, user_id): +async def create_dialog_service(db, dialog_id, dialog_name, description, icon, dialog_type, mode, user_id): try: - dialog_model = DialogModel(id=dialog_id,name=dialog_name, description=description,icon=icon, dialog_type=dialog_type, tenant_id=user_id, agent_id=dialog_id) + dialog_model = DialogModel(id=dialog_id,name=dialog_name, description=description,icon=icon, dialog_type=dialog_type, tenant_id=user_id, agent_id=dialog_id, mode=mode) db.add(dialog_model) db.commit() db.refresh(dialog_model) diff --git a/app/service/role.py b/app/service/role.py index fd7d91d..bc3e1af 100644 --- a/app/service/role.py +++ b/app/service/role.py @@ -12,9 +12,10 @@ # query.filter(RoleModel.creator==user_id) if keyword: query = query.filter(RoleModel.name.like('%{}%'.format(keyword))) + total = query.count() roles = query.order_by(RoleModel.id.desc()).limit(page_size).offset( (page_index - 1) * page_size).all() - return {"total": query.count(), "rows": [role.to_json() for role in roles]} + return {"total": total, "rows": [role.to_json() for role in roles]} async def create_role(db, role_name: str, description: str, role_key, data_scope, user_id): diff --git a/app/service/service_token.py b/app/service/service_token.py index dd6b1e3..7a2a695 100644 --- a/app/service/service_token.py +++ b/app/service/service_token.py @@ -11,24 +11,28 @@ async def get_bisheng_token(db, user_id: int): - token = await UserAppDao(db).get_data_by_id(user_id, BISHENG) + + token = db.query(TokenModel).filter(TokenModel.user_id == user_id).first() if not token: - token = db.query(TokenModel).filter(TokenModel.user_id == user_id).first() + token = await UserAppDao(db).get_data_by_id(user_id, BISHENG) if not token: return None - else: return token.access_token - return token.bisheng_token + else: + return token.bisheng_token + async def get_ragflow_token(db, user_id: int): - token = await UserAppDao(db).get_data_by_id(user_id, RAGFLOW) + # token = await UserAppDao(db).get_data_by_id(user_id, RAGFLOW) + token = db.query(TokenModel).filter(TokenModel.user_id == user_id).first() if not token: - token = db.query(TokenModel).filter(TokenModel.user_id == user_id).first() + token = await UserAppDao(db).get_data_by_id(user_id, RAGFLOW) if not token: return None - else: return token.access_token - return token.ragflow_token + else: + return token.ragflow_token + async def get_dify_token(db, user_id: int): @@ -42,11 +46,12 @@ user = db.query(UserAppModel).filter(UserAppModel.user_id == user_id, UserAppModel.app_type==app_type).first() if not user: return None + pwd = user.password if app_type == RAGFLOW: ragflow_service = RagflowService(settings.fwr_base_url) # 鐧诲綍鍒皉agflow try: - ragflow_token = await ragflow_service.login(user.username, user.decrypted_password()) + ragflow_token = await ragflow_service.login(user.username, user.decrypted_password(pwd)) return ragflow_token except Exception as e: logger.error(e) @@ -56,7 +61,7 @@ bisheng_service = BishengService(settings.sgb_base_url) # 鐧诲綍鍒版瘯鏄� try: - bisheng_token = await bisheng_service.login(user.username, user.decrypted_password()) + bisheng_token = await bisheng_service.login(user.username, user.decrypted_password(pwd)) return bisheng_token except Exception as e: logger.error(e) @@ -67,7 +72,7 @@ dify_service = DifyService(settings.dify_base_url) # 鐧诲綍鍒版瘯鏄� try: - dify_token = await dify_service.login(user.username, user.decrypted_password()) + dify_token = await dify_service.login(user.username, user.decrypted_password(pwd)) return dify_token except Exception as e: logger.error(e) @@ -86,15 +91,19 @@ return res -async def update_user_group(db, user_id): +async def update_user_group(db, sync_flag): admin_user = db.query(UserModel).filter(UserModel.permission == "admin").first() + sync_user = db.query(UserModel).filter(UserModel.sync_flag == sync_flag).first() + if not admin_user or not sync_user: + logger.error("娉ㄥ唽鐢ㄦ埛澶辫触锛�--------") + return False token = await get_new_token(db, admin_user.id, RAGFLOW) # print(token) if not token: logger.error("娉ㄥ唽鐢ㄦ埛鑾峰彇token澶辫触锛�") return False user_list = db.query(UserAppModel).filter(UserAppModel.app_type==RAGFLOW).all() - user = db.query(UserAppModel).filter(UserAppModel.user_id==user_id, UserAppModel.app_type == RAGFLOW).first() + user = db.query(UserAppModel).filter(UserAppModel.userFlag==sync_user.id, UserAppModel.app_type == RAGFLOW).first() if not user: logger.error("娉ㄥ唽鐢ㄦ埛鑾峰彇淇℃伅澶辫触锛�") return False diff --git a/app/service/user.py b/app/service/user.py index a86047f..1ce7417 100644 --- a/app/service/user.py +++ b/app/service/user.py @@ -15,6 +15,7 @@ from app.service.difyService import DifyService from app.service.ragflow import RagflowService from app.service.service_token import get_ragflow_token, get_bisheng_token, get_new_token, get_dify_token +from app.utils.password_handle import generate_password async def get_user_list(db, page_index: int, page_size: int, keyword: str, role_key: str, user_id): @@ -23,9 +24,10 @@ # query.filter(UserModel.creator==user_id) if keyword: query = query.filter(UserModel.username.like('%{}%'.format(keyword))) + total = query.count() users = query.order_by(UserModel.id.desc()).limit(page_size).offset( (page_index - 1) * page_size).all() - return {"total": query.count(), "rows": [user.to_json() for user in users]} + return {"total": total, "rows": [user.to_json() for user in users]} async def edit_user_status(db, status: str, user_id: int): @@ -52,39 +54,24 @@ async def create_user(db, user_name, email, phone, login_name, password, roles, groups, user_id): try: - # bisheng_service = BishengService(settings.sgb_base_url) - # ragflow_service = RagflowService(settings.fwr_base_url) - # - # # 娉ㄥ唽鍒版瘯鏄� - # try: - # bisheng_info = await bisheng_service.register(user_name, password) - # except Exception as e: - # logger.error(f"Failed to register with Bisheng: {str(e)}") - # return False - # - # # 娉ㄥ唽鍒皉agflow - # try: - # ragflow_info = await ragflow_service.register(user_name, password) - # except Exception as e: - # logger.error(f"Failed to register with Ragflow: {str(e)}") - # return False app_register = AppRegisterDao(db).get_apps() register_dict = {} token = "" + app_password = generate_password() 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: - token = await get_dify_token() + token = await get_dify_token(db, user_id) service = DifyService(settings.dify_base_url) else: logger.error("鏈煡娉ㄥ唽搴旂敤---") continue try: name = app["id"] + str(int(time.time())) - register_info = await service.register(name, password, token) + register_info = await service.register(name, app_password, token) # print(register_info) register_dict[app['id']] = {"id": register_info.get("id"), "name": name, "email": register_info.get("email")} @@ -98,7 +85,7 @@ user_model = UserModel(username=user_name, hashed_password=hashed_password, email=email, ## ragflow_id=ragflow_info.get("id"),bisheng_id=bisheng_info.get("user_id"), phone=phone, login_name=login_name) - pwd = user_model.encrypted_password(password) + pwd = user_model.encrypted_password(app_password) user_model.roles = [db.get(RoleModel, roleId) for roleId in roles] user_model.password = pwd if groups: @@ -126,7 +113,7 @@ user.email = email user.updated_at = datetime.now() user.roles = [db.get(RoleModel, roleId) for roleId in roles] - user.groups = [db.get(GroupModel, groupId) for groupId in groups] + # user.groups = [db.get(GroupModel, groupId) for groupId in groups] db.commit() except Exception as e: logger.error(e) @@ -138,26 +125,38 @@ async def edit_user_pwd(db, user_id, current_user_id, new_password="basic123456"): try: user = db.query(UserModel).filter(UserModel.id == user_id).first() - pwd = user.decrypted_password() - for app in AppRegisterDao(db).get_apps(): - if app.get("id") == RAGFLOW: - token = await get_new_token(db, user_id, app.get("id")) - ragflow_service = RagflowService(settings.fwr_base_url) - await ragflow_service.set_user_password(token, pwd, new_password) - elif app.get("id") == BISHENG: - token = await get_bisheng_token(db, current_user_id) - bisheng_service = BishengService(settings.sgb_base_url) - await bisheng_service.change_password_public(token, user.username, pwd, new_password) - else: - logger.error("娉ㄥ唽鏈煡搴旂敤锛歿}".format(app.get("id"))) + # pwd = user.decrypted_password() + # for app in AppRegisterDao(db).get_apps(): + # if app.get("id") == RAGFLOW: + # token = await get_new_token(db, user_id, app.get("id")) + # ragflow_service = RagflowService(settings.fwr_base_url) + # await ragflow_service.set_user_password(token, pwd, new_password) + # elif app.get("id") == BISHENG: + # token = await get_bisheng_token(db, current_user_id) + # bisheng_service = BishengService(settings.sgb_base_url) + # await bisheng_service.change_password_public(token, user.username, pwd, new_password) + # else: + # logger.error("娉ㄥ唽鏈煡搴旂敤锛歿}".format(app.get("id"))) user.hashed_password = pwd_context.hash(new_password) - user.password = user.encrypted_password(new_password) + # user.password = user.encrypted_password(new_password) db.commit() except Exception as e: logger.error(e) db.rollback() return False return True + +async def change_user_pwd(db, user_id, new_password): + try: + user = db.query(UserModel).filter(UserModel.id == user_id).first() + user.hashed_password = pwd_context.hash(new_password) + db.commit() + except Exception as e: + logger.error(e) + db.rollback() + return False + return True + async def get_user_info(db, user_id): @@ -223,7 +222,9 @@ if parent_ogt.id not in dept_set: await role_resource(role_set, permissions, parent_ogt.roles) dept_set.add(parent_ogt.id) - parent_ogt = parent_ogt.parent + parent_ogt = parent_ogt.parent + else: + break tmp_dit = {} for permission in permissions.values(): tmp_dit[permission["parentId"]] = tmp_dit.get(permission["parentId"], []) + [permission] @@ -238,17 +239,14 @@ async def get_user_menus(db, user_id): dialog_list = [] - agent_list = [] menu_dict = {} res = [] user = db.query(UserModel).filter_by(id=user_id).first() for group in user.groups: for dialog in group.dialogs: dialog_list.append(dialog.id) - for agent in group.agents: - agent_list.append(agent.id) - menu_list = db.query(WebMenuModel.id, WebMenuModel.title, WebMenuModel.describe, WebMenuModel.icon, WebMenuModel.desc, - WebMenuModel.img, MenuCapacityModel.capacity_id, MenuCapacityModel.capacity_type, DialogModel.agent_id.label("agentId")).outerjoin( + menu_list = db.query(WebMenuModel.id, WebMenuModel.title, WebMenuModel.describe, WebMenuModel.icon, WebMenuModel.desc,WebMenuModel.rank, + WebMenuModel.img, MenuCapacityModel.capacity_id, MenuCapacityModel.capacity_type, MenuCapacityModel.chat_id.label("agentId")).outerjoin( MenuCapacityModel, WebMenuModel.id == MenuCapacityModel.menu_id).outerjoin( DialogModel, MenuCapacityModel.capacity_id == DialogModel.id).filter(DialogModel.status=="1").all() @@ -262,8 +260,6 @@ continue elif not m.capacity_type or m.capacity_type == 1 and m.capacity_id not in dialog_list: break - elif not m.capacity_type or m.capacity_type == 2 and m.capacity_id not in agent_list: - break else: res.append({ 'id': menus[0].id, @@ -272,9 +268,10 @@ 'img': menus[0].img, 'desc': menus[0].desc, 'dialog': menus[0].describe, - 'agentId': menus[0].agentId + 'agentId': menus[0].agentId, + 'rank': menus[0].rank }) - return res + return sorted(res, key=lambda x: x['rank'], reverse=True) async def get_user_permission(db, user_id): @@ -286,7 +283,7 @@ knowledge_dict = {} user = db.query(UserModel).filter_by(id=user_id).first() parent_id = "" - print(111111111111111) + # print(111111111111111) async def role_resource(role_set, permissions, roles): nonlocal parent_id for role in roles: @@ -311,7 +308,9 @@ await role_resource(role_set, permissions, parent_ogt.roles) dept_set.add(parent_ogt.id) - parent_ogt = parent_ogt.parent + parent_ogt = parent_ogt.parent + else: + break tmp_dit = {} for permission in permissions.values(): @@ -337,4 +336,11 @@ res = {} user = db.query(UserModel).filter_by(id=user_id).first() res["rows"] = [i.to_dict() for i in user.organizations] - return res \ No newline at end of file + return res + + +async def user_data_service(db, user_id): + user = db.query(UserModel).filter_by(id=user_id).first() + + + return {"roles": [i.to_dict() for i in user.roles], "user": user.to_dict()} \ No newline at end of file diff --git a/app/service/v2/initialize_data.py b/app/service/v2/initialize_data.py index 4929401..b5f2002 100644 --- a/app/service/v2/initialize_data.py +++ b/app/service/v2/initialize_data.py @@ -1,7 +1,8 @@ import json from Log import logger -from app.models import MenuCapacityModel, WebMenuModel, GroupModel, RoleModel +from app.models import MenuCapacityModel, WebMenuModel, GroupModel, RoleModel, DialogModel, UserModel +from app.service.v2.app_register import AppRegisterDao async def dialog_menu_sync(db): @@ -17,13 +18,9 @@ for menu in menu_list: # print(menu) - agent = menu.pop("agent", []) - for i in agent: - capacity = MenuCapacityModel(menu_id=menu["id"], capacity_id=i, capacity_type=2) - db.add(capacity) dialog = menu.pop("dialog", []) for i in dialog: - capacity = MenuCapacityModel(menu_id=menu["id"], capacity_id=i, capacity_type=1) + capacity = MenuCapacityModel(menu_id=menu["id"], capacity_id=i["id"], capacity_type=i["agentType"], chat_id=i["id"] if not i["chat_id"] else i["chat_id"], chat_type=i["chat_type"]) db.add(capacity) menu_obj = WebMenuModel(**menu) db.add(menu_obj) @@ -53,4 +50,46 @@ db.add(group) db.commit() except Exception as e: - logger.error(e) \ No newline at end of file + logger.error(e) + + +async def app_register_sync(db): + app_dict = {} + with open("env_conf/app_register_conf.json", 'r', encoding='utf-8') as file: + # 鍔犺浇JSON鏁版嵁 + app_dict = json.load(file) + 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) + + +async def basic_agent_sync(db): + agent_list = [] + with open("env_conf/default_agent_conf.json", 'r', encoding='utf-8') as file: + # 鍔犺浇JSON鏁版嵁 + agent_dict = json.load(file) + agent_list = agent_dict.get("basic", []) + user = db.query(UserModel).filter_by(permission="admin").first() + for agent in agent_list: + dialog = db.query(DialogModel).filter(DialogModel.id==agent["id"]).first() + if dialog: + try: + dialog.name = agent["name"] + dialog.description = agent["description"] + dialog.icon = agent["icon"] + db.commit() + except Exception as e: + logger.error(e) + else: + try: + dialog = DialogModel(id=agent["id"], name=agent["name"], description=agent["description"], + icon=agent["icon"], tenant_id=user.id if user else "", dialog_type="3", + agent_id=agent["id"]) + db.add(dialog) + db.commit() + db.refresh(dialog) + except Exception as e: + print(e) + db.rollback() \ No newline at end of file diff --git a/app/task/fetch_agent.py b/app/task/fetch_agent.py index 0f4fe22..991c0d0 100644 --- a/app/task/fetch_agent.py +++ b/app/task/fetch_agent.py @@ -1,14 +1,12 @@ from typing import Dict, List, Tuple from sqlalchemy import create_engine, Column, String, Integer -from sqlalchemy.dialects.postgresql import array from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import sessionmaker from app.config.config import settings from app.models.agent_model import AgentModel from app.models.base_model import SessionLocal, Base -from app.service.v2.initialize_data import dialog_menu_sync, default_group_sync, default_role_sync # 鍒涘缓鏁版嵁搴撳紩鎿庡拰浼氳瘽宸ュ巶 engine_bisheng = create_engine(settings.sgb_db_url) @@ -151,13 +149,5 @@ print(f"Failed to sync agents: {str(e)}") -async def sync_web_menu(): - db = SessionLocal() - await dialog_menu_sync(db) - -async def sync_default_data(): - db = SessionLocal() - await default_group_sync(db) - await default_role_sync(db) diff --git a/app/utils/password_handle.py b/app/utils/password_handle.py new file mode 100644 index 0000000..8852a11 --- /dev/null +++ b/app/utils/password_handle.py @@ -0,0 +1,31 @@ +import asyncio +import random +import string + + +async def generate_password(length=10): + if length < 6: # 鑷冲皯闇�瑕�3浣嶅瘑鐮佷互鍖呭惈鎵�鏈夊繀瑕佺殑瀛楃 + raise ValueError("Password length should be at least 3") + + # 纭繚瀵嗙爜涓嚦灏戝寘鍚竴涓瓧姣嶅拰涓�涓暟瀛� + password = [ + random.choice(string.ascii_uppercase), # 澶у啓瀛楁瘝 + random.choice(string.ascii_lowercase), # 灏忓啓瀛楁瘝 + random.choice(string.digits) # 鏁板瓧 + ] + + # 娣诲姞鍓╀綑鐨勯殢鏈哄瓧绗� + characters = string.ascii_letters + string.digits + password.extend(random.choice(characters) for _ in range(length - 3)) + + # 鎵撲贡瀵嗙爜浠ョ‘淇濋殢鏈烘�� + random.shuffle(password) + + # 灏嗗垪琛ㄨ浆鎹负瀛楃涓� + return ''.join(password) + +if __name__ == "__main__": + # 鐢熸垚涓�涓�10浣嶇殑瀵嗙爜 + asyncio.run(generate_password(10)) + # password = generate_password(10) + # print(password) \ No newline at end of file diff --git a/env_conf/api_key_conf.json b/env_conf/api_key_conf.json new file mode 100644 index 0000000..8a5b98e --- /dev/null +++ b/env_conf/api_key_conf.json @@ -0,0 +1,5 @@ +{ + "image_and_text_conversion": "", + "document_to_report": "", + "document_to_cleaning": "" +} \ No newline at end of file diff --git a/env_conf/app_register_conf.json b/env_conf/app_register_conf.json new file mode 100644 index 0000000..75cbbbb --- /dev/null +++ b/env_conf/app_register_conf.json @@ -0,0 +1,5 @@ +{ + "bisheng_app": 1, + "dify_app": 1, + "ragflow_app": 1 +} \ No newline at end of file diff --git a/env_conf/default_agent_conf.json b/env_conf/default_agent_conf.json new file mode 100644 index 0000000..70c35f7 --- /dev/null +++ b/env_conf/default_agent_conf.json @@ -0,0 +1,33 @@ +{ + "basic": [ + { + "id": "basic_excel_merge", + "name": "鎶ヨ〃鍚堝苟", + "description": "鎶ヨ〃鍚堝苟", + "icon": "intellFrame4", + "agentType": "excelMerge" + }, + { + "id": "basic_excel_talk", + "name": "鏅鸿兘鏁版嵁", + "description": "鏅鸿兘鏁版嵁", + "icon": "intellFrame4", + "agentType": "excelTalk" + }, + { + "id": "basic_question_talk", + "name": "鍑洪缁勫嵎", + "description": "鍑洪缁勫嵎", + "icon": "intellFrame4", + "agentType": "questionTalk" + }, + { + "id": "basic_paper_talk", + "name": "鏂囨。鍑哄嵎", + "description": "鏂囨。鍑哄嵎", + "icon": "intellFrame4", + "agentType": "paperTalk" + } + ], + "bs": [] +} \ No newline at end of file diff --git a/env_conf/menu_conf.json b/env_conf/menu_conf.json index 8376abd..6139123 100644 --- a/env_conf/menu_conf.json +++ b/env_conf/menu_conf.json @@ -7,8 +7,15 @@ "img": "/src/assets/index/2.png", "desc": "鍩轰簬鎮ㄥ垱寤虹殑鎶ュ憡鏍煎紡鍜岀煡璇嗗簱涓殑鏂囨。鍐呭锛屽揩閫熺敓鎴愬畾鍒舵姤鍛婏紝骞舵敮鎸佷竴閿笅杞姐��", "describe": "鍩轰簬鎮ㄥ垱寤虹殑鎶ュ憡鏍煎紡鍜岀煡璇嗗簱涓殑鏂囨。鍐呭锛屽揩閫熺敓鎴愬畾鍒舵姤鍛婏紝骞舵敮鎸佷竴閿笅杞姐��", - "agent" : [], - "dialog": ["1"] + "rank": 100, + "dialog": [ + { + "id": "1", + "chat_id": "", + "chat_type": "report", + "agentType": 2 + } + ] }, { "id": 1, @@ -17,8 +24,15 @@ "img": "/src/assets/index/6.png", "desc": "鍩轰簬鎮ㄤ笂浼犵殑鎶ヨ〃杩涜鍚堝苟锛屽姪鎮ㄥ揩閫熷畬鎴愭姤琛ㄦ暣鍚堜笌鍒嗘瀽", "describe": "鍩轰簬鎮ㄤ笂浼犵殑鎶ヨ〃杩涜鍚堝苟锛屽姪鎮ㄥ揩閫熷畬鎴愭姤琛ㄦ暣鍚堜笌鍒嗘瀽", - "agent" : [], - "dialog": ["2"] + "dialog": [ + { + "id": "2", + "chat_id": "", + "chat_type": "excelMerge", + "agentType": 1 + } + ], + "rank": 99 }, { "id": 2, @@ -27,7 +41,7 @@ "img": "/src/assets/index/5.png", "desc": "閬嶅巻宸插垱寤虹殑鏂囨。鐭ヨ瘑搴擄紝鐢熸垚瀹屾暣鍜屽噯纭殑绛旀锛屽悓鏃舵樉绀烘潵婧愭枃妗d緵鎮ㄥ弬鑰�", "describe": "鍨傚煙鐭ヨ瘑鐨勯棶绛斿姪鎵嬶紝閽堝浣犵殑鎻愰棶锛屾垜浠皢閬嶅巻宸插垱寤虹殑鏂囨。鐭ヨ瘑搴擄紝鐢熸垚瀹屾暣鍜屽噯纭殑绛旀锛屽悓鏃舵樉绀烘潵婧愭枃妗d緵鎮ㄥ弬鑰冦��", - "agent" : [], + "rank": 98, "dialog": [] }, { @@ -37,8 +51,15 @@ "img": "/src/assets/index/7.png", "desc": "涓汉鐭ヨ瘑搴撶殑闂瓟鍔╂墜锛屽熀浜庢偍涓婁紶鐨勬枃妗h繘琛岄棶绛旓紝鏀寔澶氭枃妗�", "describe": "涓汉鐭ヨ瘑搴撶殑闂瓟鍔╂墜锛屽熀浜庢偍涓婁紶鐨勬枃妗h繘琛岄棶绛旓紝鏀寔澶氭枃妗o紝澶у皬鍦�30M浠ュ唴銆�", - "agent" : [], - "dialog": ["3"] + "rank": 97, + "dialog": [ + { + "id": "3", + "chat_id": "", + "chat_type": "report", + "agentType": 1 + } + ] }, { "id": 4, @@ -47,7 +68,7 @@ "img": "/src/assets/index/1.png", "desc": "鑳藉鐞嗚В鍜屽涔犱汉绫荤殑璇█锛屽叿澶囧杞璇濈殑鑳藉姏", "describe": "鎴戝彲浠ョ悊瑙e拰瀛︿範浜虹被鐨勮瑷�锛屽叿澶囧杞璇濈殑鑳藉姏锛岀幇鍦ㄥ拰鎴戝紑濮嬩氦娴佸惂锝�", - "agent" : [], + "rank": 96, "dialog": [] }, { @@ -57,7 +78,7 @@ "img": "/src/assets/index/8.png", "desc": "鎮ㄥ彲浠ヤ笂浼犳枃妗f垨娣诲姞鏁版嵁搴撳湴鍧�锛屽皬鏁板彲閽堝浣犳枃妗g殑鏁版嵁杩涜鍒嗘瀽锛屽苟鐢熸垚鎸囧畾鐨勫浘琛�", "describe": "鎮ㄥ彲浠ヤ笂浼犳枃妗f垨娣诲姞鏁版嵁搴撳湴鍧�锛屽皬鏁板彲閽堝浣犳枃妗g殑鏁版嵁杩涜鍒嗘瀽锛屽苟鐢熸垚鎸囧畾鐨勫浘琛�", - "agent" : ["3", "4"], + "rank": 95, "dialog": [] }, { @@ -67,7 +88,7 @@ "img": "/src/assets/index/7.png", "desc": "鍩轰簬鎮ㄤ笂浼犵殑鍥剧墖锛岀敓鎴愬搴旂殑鏂囧瓧鎻忚堪骞跺熀浜庡浘鐗囧唴瀹瑰疄鐜伴棶绛斻��", "describe": "鍩轰簬鎮ㄤ笂浼犵殑鍥剧墖锛岀敓鎴愬搴旂殑鏂囧瓧鎻忚堪骞跺熀浜庡浘鐗囧唴瀹瑰疄鐜伴棶绛斻��", - "agent" : ["3"], + "rank": 94, "dialog": [] }, { @@ -77,7 +98,7 @@ "img": "/src/assets/index/6.png", "desc": "鎮ㄥ彲浠ヤ笂浼犳枃妗o紝灏忔暟鑳介拡瀵瑰崟鏂囨。鎴栧涓枃妗e唴瀹硅嚜鍔ㄥ嚭棰橈紝楂樻晥渚挎嵎鐨勫府鍔╀綘寤虹珛绉佷汉棰樺簱銆�", "describe": "鎮ㄥ彲浠ヤ笂浼犳枃妗o紝灏忔暟鑳介拡瀵瑰崟鏂囨。鎴栧涓枃妗e唴瀹硅嚜鍔ㄥ嚭棰橈紝楂樻晥渚挎嵎鐨勫府鍔╀綘寤虹珛绉佷汉棰樺簱銆�", - "agent" : [], + "rank": 93, "dialog": [] }, { @@ -87,7 +108,7 @@ "img": "/src/assets/index/6.png", "desc": "鎮ㄥ彲浠ヤ笂浼犳枃妗o紝灏忔暟鑳介拡瀵瑰崟鏂囨。鎴栧涓枃妗e唴瀹硅嚜鍔ㄥ嚭棰橈紝楂樻晥渚挎嵎鐨勫府鍔╀綘寤虹珛绉佷汉棰樺簱銆�", "describe": "鎮ㄥ彲浠ヤ笂浼犳枃妗o紝灏忔暟鑳介拡瀵瑰崟鏂囨。鎴栧涓枃妗e唴瀹硅嚜鍔ㄥ嚭棰橈紝楂樻晥渚挎嵎鐨勫府鍔╀綘寤虹珛绉佷汉棰樺簱銆�", - "agent" : ["4"], + "rank": 92, "dialog": [] }, { @@ -97,8 +118,21 @@ "img": "/src/assets/index/2.png", "desc": "鍩轰簬鎮ㄥ垱寤虹殑鎶ュ憡鏍煎紡鍜屼笂浼犵殑鏂囨。鍐呭锛屽揩閫熺敓鎴愬畾鍒舵姤鍛婏紝骞舵敮鎸佷竴閿笅杞姐��", "describe": "鍩轰簬鎮ㄥ垱寤虹殑鎶ュ憡鏍煎紡鍜屼笂浼犵殑鏂囨。鍐呭锛屽揩閫熺敓鎴愬畾鍒舵姤鍛婏紝骞舵敮鎸佷竴閿笅杞姐��", - "agent" : [], - "dialog": [] + "rank": 91, + "dialog": [ + { + "id": "basic_excel_merge", + "chat_id": "basic_report_clean", + "chat_type": "reportWorkflow", + "agentType": 4 + }, + { + "id": "basic_paper_talk", + "chat_id": "basic_report_clean", + "chat_type": "reportWorkflow", + "agentType": 4 + } + ] } ] } \ No newline at end of file diff --git a/main.py b/main.py index a9e4f0f..d3bac9a 100644 --- a/main.py +++ b/main.py @@ -22,7 +22,8 @@ from app.api.user import user_router from app.api.group import group_router from app.api.role import role_router -from app.task.fetch_agent import sync_agents, initialize_agents, sync_web_menu, sync_default_data +from app.task.fetch_agent import sync_agents, initialize_agents +from app.init_config.init_run_data import sync_default_data # 浣跨敤 Lifespan 浜嬩欢澶勭悊绋嬪簭 @@ -33,7 +34,6 @@ # 鍦ㄥ簲鐢ㄥ惎鍔ㄦ椂鍚屾浠g悊 sync_agents() await sync_default_data() - await sync_web_menu() yield # 鍦ㄥ簲鐢ㄥ叧闂椂鎵ц娓呯悊鎿嶄綔锛堝鏋滈渶瑕侊級 pass -- Gitblit v1.8.0