From a791022ff1311e1fb76930c398d6ff91036d0456 Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期三, 11 十二月 2024 17:57:52 +0800
Subject: [PATCH] 新增加标签功能
---
app/service/v2/app_register.py | 6
app/service/label.py | 64 +++++++++
app/service/service_token.py | 23 ++-
app/api/chat.py | 3
app/service/knowledge.py | 21 --
app/api/user.py | 2
alembic/versions/c437168c1da4_label_tabel_add.py | 53 +++++++
app/api/auth.py | 9
app/service/auth.py | 36 +++++
app/models/__init__.py | 1
alembic/versions/b2f03e852b6e_agent_type_add.py | 30 ++++
app/service/dialog.py | 46 ++++--
app/api/dialog.py | 4
app/api/label.py | 45 ++++++
main.py | 3
app/models/label_model.py | 46 ++++++
app/models/dialog_model.py | 5
app/models/token_model.py | 8
18 files changed, 351 insertions(+), 54 deletions(-)
diff --git a/alembic/versions/b2f03e852b6e_agent_type_add.py b/alembic/versions/b2f03e852b6e_agent_type_add.py
new file mode 100644
index 0000000..a19c34c
--- /dev/null
+++ b/alembic/versions/b2f03e852b6e_agent_type_add.py
@@ -0,0 +1,30 @@
+"""agent type add
+
+Revision ID: b2f03e852b6e
+Revises: c437168c1da4
+Create Date: 2024-12-11 17:56:12.125274
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision: str = 'b2f03e852b6e'
+down_revision: Union[str, None] = 'c437168c1da4'
+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('dialog_type', sa.String(length=1), nullable=True))
+ # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.drop_column('dialogs', 'dialog_type')
+ # ### end Alembic commands ###
diff --git a/alembic/versions/c437168c1da4_label_tabel_add.py b/alembic/versions/c437168c1da4_label_tabel_add.py
new file mode 100644
index 0000000..91026a3
--- /dev/null
+++ b/alembic/versions/c437168c1da4_label_tabel_add.py
@@ -0,0 +1,53 @@
+"""label tabel add
+
+Revision ID: c437168c1da4
+Revises: 2f304d60542b
+Create Date: 2024-12-11 15:01:45.049315
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision: str = 'c437168c1da4'
+down_revision: Union[str, None] = '2f304d60542b'
+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.create_table('label',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('created_at', sa.DateTime(), nullable=True),
+ sa.Column('updated_at', sa.DateTime(), nullable=True),
+ sa.Column('name', sa.String(length=128), nullable=False),
+ sa.Column('status', sa.String(length=10), nullable=True),
+ sa.Column('creator', sa.Integer(), nullable=True),
+ sa.Column('label_type', sa.Integer(), nullable=True),
+ sa.PrimaryKeyConstraint('id')
+ )
+ op.create_index(op.f('ix_label_id'), 'label', ['id'], unique=False)
+ op.create_index(op.f('ix_label_name'), 'label', ['name'], unique=True)
+ op.create_table('label_worker',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('label_id', sa.Integer(), nullable=True),
+ sa.Column('object_id', sa.String(length=36), nullable=True),
+ sa.PrimaryKeyConstraint('id'),
+ sa.UniqueConstraint('label_id', 'object_id', name='label_object_id_ix')
+ )
+ op.create_index(op.f('ix_label_worker_id'), 'label_worker', ['id'], unique=False)
+ # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.drop_index(op.f('ix_label_worker_id'), table_name='label_worker')
+ op.drop_table('label_worker')
+ op.drop_index(op.f('ix_label_name'), table_name='label')
+ op.drop_index(op.f('ix_label_id'), table_name='label')
+ op.drop_table('label')
+ # ### end Alembic commands ###
diff --git a/app/api/auth.py b/app/api/auth.py
index f850882..ba86a89 100644
--- a/app/api/auth.py
+++ b/app/api/auth.py
@@ -16,7 +16,7 @@
from app.models.user import UserCreate, LoginData
from app.models.user_model import UserModel
from app.service.auth import authenticate_user, create_access_token, is_valid_password, save_register_user, \
- update_user_token, UserAppDao
+ update_user_token, UserAppDao, update_user_info
from app.service.bisheng import BishengService
from app.service.v2.app_register import AppRegisterDao
from app.service.difyService import DifyService
@@ -83,13 +83,13 @@
access_token = create_access_token(data={"sub": user.username, "user_id": user.id})
upsert_token(db, user.id, access_token, bisheng_token, ragflow_token)
-
+ # print(111)
return Response(code=200, msg="Login successful", data={
"access_token": access_token,
"token_type": "bearer",
"username": user.username,
"nickname": "",
- "user": user.to_login_json()
+ # "user": user.to_login_json()
})
@@ -120,9 +120,12 @@
logger.error("鏈煡娉ㄥ唽搴旂敤---")
continue
try:
+ name = login_data.username
user_app = await UserAppDao(db).get_data_by_id(user.id, app["id"])
if user_app:
name = user_app.username
+ else:
+ await update_user_info(db, user.id)
token = await service.login(name, login_data.password)
token_dict[app["id"]] = token
except Exception as e:
diff --git a/app/api/chat.py b/app/api/chat.py
index cde74ff..2628bac 100644
--- a/app/api/chat.py
+++ b/app/api/chat.py
@@ -41,13 +41,16 @@
ret = {"message": "Agent not found", "type": "close"}
await websocket.send_json(ret)
return
+ print(1111)
agent_type = agent.agent_type
+ print(agent_type)
if chat_id == "" or chat_id == "0":
ret = {"message": "Chat ID not found", "type": "close"}
await websocket.send_json(ret)
return
if agent_type == AgentType.RAGFLOW:
+ print(222)
ragflow_service = RagflowService(settings.fwr_base_url)
token = await get_ragflow_token(db, current_user.id)
try:
diff --git a/app/api/dialog.py b/app/api/dialog.py
index e50cfd3..cb2b1e4 100644
--- a/app/api/dialog.py
+++ b/app/api/dialog.py
@@ -14,8 +14,10 @@
async def dialog_list(current: int,
pageSize: int,
keyword: str = "",
+ label: int =0,
+ status: str ="",
current_user: UserModel = Depends(get_current_user),
db=Depends(get_db)):
if current and not pageSize:
return ResponseList(code=400, msg="缂哄皯鍙傛暟")
- return Response(code=200, msg="", data=await get_dialog_list(db, current_user.id, keyword, pageSize, current))
+ return Response(code=200, msg="", data=await get_dialog_list(db, current_user.id, keyword, label, status, pageSize, current))
diff --git a/app/api/label.py b/app/api/label.py
new file mode 100644
index 0000000..85744a5
--- /dev/null
+++ b/app/api/label.py
@@ -0,0 +1,45 @@
+# 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.label_model import LabelData, LabelModel, SignLabelData
+from app.models.user_model import UserModel
+from app.service.label import create_label_service, label_list_service, delete_role_service, sign_label_service
+
+label_router = APIRouter()
+
+@label_router.get("/list", response_model=Response)
+async def get_label_list(keyword="", labelType=1,current_user: UserModel = Depends(get_current_user),
+ db=Depends(get_db)):
+
+ return Response(code=200, msg="", data=await label_list_service(db, keyword,labelType))
+
+
+@label_router.post("/add_label", response_model=Response)
+async def add_label_api(label: LabelData, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+ if not label.labelName:
+ return Response(code=400, msg="The labelName cannot be empty!")
+ db_role = db.query(LabelModel).filter(LabelModel.name == label.labelName).first()
+ if db_role:
+ return Response(code=400, msg="label already created")
+ is_create = await create_label_service(db, label.labelName, label.labelType, current_user.id)
+ if not is_create:
+ return Response(code=500, msg="label create failure", data={})
+ return Response(code=200, msg="label create successfully", data={"roleName": label.labelName})
+
+
+@label_router.delete("/delete_label", response_model=Response)
+async def delete_label_api(labelId: int, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+ is_delete = await delete_role_service(db, labelId)
+ if not is_delete:
+ return Response(code=500, msg="label delete failure", data={})
+ return Response(code=200, msg="label delete successfully", data={})
+
+
+@label_router.post("/sign_label", response_model=Response)
+async def sign_label_api(sign: SignLabelData, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+ is_add = await sign_label_service(db, sign.objectId, sign.labelIdList)
+ if not is_add:
+ return Response(code=500, msg="label add failure", data={})
+ return Response(code=200, msg="label sign add successfully", data={})
\ No newline at end of file
diff --git a/app/api/user.py b/app/api/user.py
index b5bd520..b442af8 100644
--- a/app/api/user.py
+++ b/app/api/user.py
@@ -99,7 +99,7 @@
@user_router.get("/menus", response_model=ResponseList)
-async def user_menus(current_user: UserModel = Depends(get_current_user),db=Depends(get_db)):
+async def user_menus(keyword="", current_user: UserModel = Depends(get_current_user),db=Depends(get_db)):
menus = await get_user_menus(db, current_user.id)
# return Response(code=200, msg="successfully", data=menus)
# result = [item.to_dict() for item in agents]
diff --git a/app/models/__init__.py b/app/models/__init__.py
index c6370a9..126abc8 100644
--- a/app/models/__init__.py
+++ b/app/models/__init__.py
@@ -15,6 +15,7 @@
from .session_model import SessionModel
from .public_api_model import *
from .menu_model import *
+from .label_model import *
# 鑾峰彇褰撳墠鏃跺尯鐨勬椂闂�
diff --git a/app/models/dialog_model.py b/app/models/dialog_model.py
index de1e2b5..f08ca78 100644
--- a/app/models/dialog_model.py
+++ b/app/models/dialog_model.py
@@ -18,7 +18,7 @@
description = Column(Text) # 璇存槑
icon = Column(Text) # 鍥炬爣
status = Column(String(1)) # 鐘舵��
- # dialog_type = Column(String(1)) # # 骞冲彴
+ dialog_type = Column(String(1)) # # 骞冲彴
def get_id(self):
return str(self.id)
@@ -32,7 +32,8 @@
'name': self.name,
'description': self.description,
'icon': self.icon,
- 'status': self.status
+ 'status': self.status,
+ 'agentType': self.dialog_type,
}
diff --git a/app/models/label_model.py b/app/models/label_model.py
new file mode 100644
index 0000000..41a6fe3
--- /dev/null
+++ b/app/models/label_model.py
@@ -0,0 +1,46 @@
+from datetime import datetime
+from typing import Optional
+
+from pydantic import BaseModel, constr
+from sqlalchemy import Column, Integer, String, DateTime, Table, ForeignKey, UniqueConstraint
+from sqlalchemy.orm import relationship, backref
+
+from app.models.base_model import Base
+
+
+class LabelModel(Base):
+ __tablename__ = 'label'
+ id = Column(Integer, primary_key=True, index=True)
+ created_at = Column(DateTime, default=datetime.now())
+ updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now())
+ name = Column(String(128), unique=True, nullable=False, index=True)
+ status = Column(String(10), default="1")
+ creator = Column(Integer)
+ label_type = Column(Integer, default=1)
+
+ def to_json(self):
+ return {
+ 'labelId': self.id,
+ 'labelName': self.name,
+ 'labelType': self.label_type
+ }
+
+
+class LabelWorkerModel(Base):
+ __tablename__ = 'label_worker'
+ __table_args__ = (UniqueConstraint('label_id', 'object_id', name='label_object_id_ix'),)
+ id = Column(Integer, primary_key=True, index=True)
+ label_id = Column(Integer)
+ object_id = Column(String(36))
+
+
+
+class LabelData(BaseModel):
+ labelName: str
+ labelType: Optional[int] = 1
+
+
+class SignLabelData(BaseModel):
+ labelIdList: list
+ objectId:str
+
diff --git a/app/models/token_model.py b/app/models/token_model.py
index fad57e0..febe111 100644
--- a/app/models/token_model.py
+++ b/app/models/token_model.py
@@ -90,6 +90,8 @@
async def get_token(db: Session, user_id: int):
- # return db.query(TokenModel).filter_by(user_id=user_id).first()
-
- return {i.app_type.replace("app", "token"): i.access_token for i in await UserAppDao(db).get_user_datas(user_id)}
+ res = {i.app_type.replace("app", "token"): i.access_token for i in await UserAppDao(db).get_user_datas(user_id)}
+ if not res:
+ token = db.query(TokenModel).filter_by(user_id=user_id).first()
+ res = {"ragflow_token": token.ragflow_token, "bisheng_token": token.bisheng_token}
+ return res
diff --git a/app/service/auth.py b/app/service/auth.py
index 46c42dd..a0a1952 100644
--- a/app/service/auth.py
+++ b/app/service/auth.py
@@ -9,8 +9,10 @@
from Log import logger
from app.config.config import settings
+from app.config.const import RAGFLOW, BISHENG, DIFY
from app.models import RoleModel, GroupModel
from app.models.user_model import UserModel, UserAppModel
+from app.service.v2.app_register import AppRegisterDao
SECRET_KEY = settings.secret_key
ALGORITHM = "HS256"
@@ -103,6 +105,40 @@
return True
+async def update_user_info(db, user_id):
+ app_register = AppRegisterDao(db).get_apps()
+ register_dict = {}
+ user = db.query(UserModel).filter(UserModel.id==user_id).first()
+ for app in app_register:
+ if app["id"] == RAGFLOW:
+ register_dict[app['id']] = {"id": user.ragflow_id, "name": user.username, "email": f"{user.username}@example.com"}
+ elif app["id"] == BISHENG:
+ register_dict[app['id']] = {"id": user.bisheng_id, "name": user.username, "email": ""}
+ elif app["id"] == DIFY:
+ register_dict[app['id']] = {"id": "", "name": user.username, "email": ""}
+ else:
+ logger.error("鏈煡娉ㄥ唽搴旂敤---")
+ continue
+
+ try:
+ for k, v in register_dict.items():
+ await UserAppDao(db).update_and_insert_data(v.get("name"), user.password, v.get("email"), user_id,
+ str(v.get("id")), k)
+ except Exception as e:
+ logger.error(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)
+
+ is_sava = await save_register_user(db, user.username, user.password, user.email, register_dict)
+
class UserAppDao:
def __init__(self, db: Session):
self.db = db
diff --git a/app/service/dialog.py b/app/service/dialog.py
index d78fbbe..623477a 100644
--- a/app/service/dialog.py
+++ b/app/service/dialog.py
@@ -1,43 +1,55 @@
from datetime import datetime
-from app.models import KnowledgeModel, GroupModel, DialogModel, ConversationModel, group_dialog_table
+from sqlalchemy import or_
+
+from app.models import KnowledgeModel, GroupModel, DialogModel, ConversationModel, group_dialog_table, LabelWorkerModel, \
+ LabelModel
from app.models.user_model import UserModel
from Log import logger
-async def get_dialog_list(db, user_id, keyword, page_size, page_index):
+async def get_dialog_list(db, user_id, keyword, label, status, page_size, page_index):
user = db.query(UserModel).filter(UserModel.id == user_id).first()
if user is None:
return {"rows": []}
- if user.permission == "admin":
- query = db.query(DialogModel)
+ query = db.query(DialogModel)
+ id_list = []
+ if label:
+ id_list = [i.object_id for i in db.query(LabelWorkerModel).filter(LabelWorkerModel.label_id==label).all()]
+ if user.permission != "admin":
+ dia_list = [j.id for i in user.groups for j in i.dialogs if not label or j.id in id_list]
+ query = query.filter(or_(DialogModel.tenant_id == user_id, DialogModel.id.in_(dia_list)))
else:
- group_list = [i.id for i in user.groups]
- query = db.query(DialogModel)
- query = query.filter(DialogModel.tenant_id == user_id)
- query = query.union(
- db.query(DialogModel).join(
- group_dialog_table,
- DialogModel.id == group_dialog_table.c.dialog_id
- ).filter(
- group_dialog_table.c.group_id.in_(group_list)
- )
- )
+ if label:
+ query = query.filter(or_(DialogModel.id.in_(id_list)))
+
if keyword:
query = query.filter(DialogModel.name.like('%{}%'.format(keyword)))
+
+ if status:
+ print(status)
+ query = query.filter(DialogModel.status == status)
total = query.count()
if page_size:
query = query.limit(page_size).offset((page_index - 1) * page_size)
rows = []
user_id_set = set()
+ dialog_id_set = set()
+ label_dict = {}
for kld in query.all():
user_id_set.add(kld.tenant_id)
+ dialog_id_set.add(kld.id)
rows.append(kld.to_json())
- print(rows)
- user_dict = {i.id: i.to_dict() for i in db.query(UserModel).filter(UserModel.id.in_(user_id_set)).all()}
+ user_dict = {str(i.id): i.to_dict() for i in db.query(UserModel).filter(UserModel.id.in_(user_id_set)).all()}
+ for i in db.query(LabelModel.id, LabelModel.name, LabelWorkerModel.object_id).outerjoin(LabelWorkerModel,
+ LabelModel.id == LabelWorkerModel.label_id).filter(
+ LabelWorkerModel.object_id.in_(dialog_id_set)).all():
+
+ label_dict[i.object_id] = label_dict.get(i.object_id, []) +[{"labelId": i.id, "labelName": i.name}]
for r in rows:
r["user"] = user_dict.get(r["user_id"], {})
+ r["label"] = label_dict.get(r["id"], [])
return {"total": total, "rows": rows}
diff --git a/app/service/knowledge.py b/app/service/knowledge.py
index 91022c3..b927feb 100644
--- a/app/service/knowledge.py
+++ b/app/service/knowledge.py
@@ -1,3 +1,5 @@
+from sqlalchemy import or_
+
from app.models import KnowledgeModel, group_knowledge_table
from app.models.user_model import UserModel
from Log import logger
@@ -7,21 +9,10 @@
user = db.query(UserModel).filter(UserModel.id == user_id).first()
if user is None:
return {"rows": []}
- if user.permission == "admin":
- query = db.query(KnowledgeModel)
- else:
- group_list = [i.id for i in user.groups]
- query = db.query(KnowledgeModel)
- query = query.filter(KnowledgeModel.tenant_id == user_id)
-
- query = query.union(
- db.query(KnowledgeModel).join(
- group_knowledge_table,
- KnowledgeModel.id == group_knowledge_table.c.knowledge_id
- ).filter(
- group_knowledge_table.c.group_id.in_(group_list)
- )
- )
+ query = db.query(KnowledgeModel)
+ if user.permission != "admin":
+ klg_list = [j.id for i in user.groups for j in i.knowledges]
+ query = query.filter(or_(KnowledgeModel.tenant_id == user_id, KnowledgeModel.id.in_(klg_list)))
if keyword:
query = query.filter(KnowledgeModel.name.like('%{}%'.format(keyword)))
total = query.count()
diff --git a/app/service/label.py b/app/service/label.py
new file mode 100644
index 0000000..54448b5
--- /dev/null
+++ b/app/service/label.py
@@ -0,0 +1,64 @@
+import uuid
+
+from streamlit.time_util import adjust_years
+
+from Log import logger
+from app.models.label_model import LabelModel, LabelWorkerModel
+from app.models.role_model import RoleModel
+
+
+async def label_list_service(db, keyword: str, label_type):
+ query = db.query(LabelModel)
+ if keyword:
+ query = query.filter(LabelModel.name.like('%{}%'.format(keyword)))
+ if label_type:
+ query = query.filter(LabelModel.label_type==label_type)
+ labels = query.order_by(LabelModel.id.desc()).all()
+ return {"total": query.count(), "rows": [label.to_json() for label in labels]}
+
+
+
+async def create_label_service(db, label_name, label_type, user_id):
+ try:
+ label_model = LabelModel(name=label_name,creator=user_id, label_type=label_type)
+ db.add(label_model)
+ db.commit()
+ db.refresh(label_model)
+ except Exception as e:
+ logger.error(e)
+ db.rollback()
+ return False
+ return True
+
+
+async def delete_role_service(db, label_id: int):
+ try:
+ db.query(LabelModel).filter(LabelModel.id == label_id).delete()
+ db.commit()
+ except Exception as e:
+ logger.error(e)
+ db.rollback()
+ return False
+ return True
+
+
+async def sign_label_service(db, object_id, label_list):
+ delete_list = []
+ has_list = []
+ for i in db.query(LabelWorkerModel).filter(LabelWorkerModel.object_id == object_id).all():
+ if i.label_id not in label_list:
+ delete_list.append(i.id)
+ else:
+ has_list.append(i.label_id)
+ for label_id in label_list:
+ if label_id in has_list:
+ continue
+ try:
+ label = LabelWorkerModel(label_id=label_id, object_id=object_id)
+ db.add(label)
+ db.commit()
+ except Exception as e:
+ logger.error(e)
+ db.rollback()
+ # return False
+ return True
\ No newline at end of file
diff --git a/app/service/service_token.py b/app/service/service_token.py
index 8fffc99..215353b 100644
--- a/app/service/service_token.py
+++ b/app/service/service_token.py
@@ -9,19 +9,24 @@
async def get_bisheng_token(db, user_id: int):
- # token = db.query(TokenModel).filter(TokenModel.user_id == user_id).first()
- token = await UserAppDao.get_data_by_id(user_id, BISHENG)
+ token = await UserAppDao(db).get_data_by_id(user_id, BISHENG)
if not token:
- return None
- return token.access_token
-
+ token = db.query(TokenModel).filter(TokenModel.user_id == user_id).first()
+ if not token:
+ return None
+ else:
+ return token.access_token
+ return token.bisheng_token
async def get_ragflow_token(db, user_id: int):
- token = await UserAppDao.get_data_by_id(user_id, RAGFLOW)
+ token = await UserAppDao(db).get_data_by_id(user_id, RAGFLOW)
if not token:
- return None
- return token.access_token
-
+ token = db.query(TokenModel).filter(TokenModel.user_id == user_id).first()
+ if not token:
+ return None
+ else:
+ return token.access_token
+ return token.ragflow_token
async def get_ragflow_new_token(db, user_id: int, app_type):
user = db.query(UserModel).filter(UserModel.id == user_id).first()
diff --git a/app/service/v2/app_register.py b/app/service/v2/app_register.py
index e30816b..88c5393 100644
--- a/app/service/v2/app_register.py
+++ b/app/service/v2/app_register.py
@@ -1,6 +1,8 @@
+from datetime import datetime
+
from app.models.public_api_model import AppRegisterModel
from Log import logger
-from app.models import current_time
+# from app.models import current_time
from sqlalchemy.orm import Session
from typing import Type
@@ -18,7 +20,7 @@
logger.error("鏇存柊鏁版嵁: app register---------------------------")
try:
- self.db.query(AppRegisterModel).filter(AppRegisterModel.id==app_id).update({"status":status, "updated_at": current_time()})
+ self.db.query(AppRegisterModel).filter(AppRegisterModel.id==app_id).update({"status":status, "updated_at": datetime.now()})
self.db.commit()
except Exception as e:
logger.error(e)
diff --git a/main.py b/main.py
index 9c00b97..a9e4f0f 100644
--- a/main.py
+++ b/main.py
@@ -12,6 +12,7 @@
from app.api.excel import router as excel_router
from app.api.files import router as files_router
from app.api.knowledge import knowledge_router
+from app.api.label import label_router
from app.api.llm import llm_router
from app.api.organization import dept_router
from app.api.v2.public_api import public_api
@@ -74,7 +75,7 @@
app.include_router(llm_router, prefix='/api/llm', tags=["llm"])
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(label_router, prefix='/api/label', tags=["label"])
app.include_router(public_api, prefix='/v1/api', tags=["public_api"])
app.mount("/static", StaticFiles(directory="app/images"), name="static")
--
Gitblit v1.8.0