From 226202d6eee6480f3386c6295be26fad42940cc8 Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期五, 28 三月 2025 09:41:39 +0800
Subject: [PATCH] 知识库分享,历史记录文件
---
app/service/v2/chat.py | 11 +-
app/api/knowledge.py | 59 +++++++++++---
app/models/knowledge_model.py | 43 ++++++++++
app/models/v2/session_model.py | 11 ++
app/config/env_conf/admin.yaml | 6
app/service/knowledge.py | 54 +++++++++++++
app/api/user.py | 7 +
app/models/v2/chat.py | 8 +
8 files changed, 171 insertions(+), 28 deletions(-)
diff --git a/app/api/knowledge.py b/app/api/knowledge.py
index acc454c..ef67a98 100644
--- a/app/api/knowledge.py
+++ b/app/api/knowledge.py
@@ -2,41 +2,48 @@
from fastapi import APIRouter, Depends, Query, HTTPException
from app.api import Response, get_current_user, ResponseList
-from app.models import klgParameter, klgIcon
+from app.models import klgParameter, klgIcon, KlgOwner
from app.models.base_model import get_db
from app.models.user_model import UserModel
from app.service.knowledge import get_knowledge_list, create_knowledge_service, sync_knowledge_service, \
- delete_knowledge_service, update_knowledge_icon_service
+ delete_knowledge_service, update_knowledge_icon_service, get_knowledge_users_service, set_knowledge_owner_service, \
+ add_knowledge_user_service
from typing import Optional
+
knowledge_router = APIRouter()
+
@knowledge_router.get("/list", response_model=Response)
async def knowledge_list(
current: int,
pageSize: int,
- keyword: str="",
- status: str="",
- knowledge: str="1",
- location: str="",
+ keyword: str = "",
+ status: str = "",
+ knowledge: str = "1",
+ location: str = "",
current_user: UserModel = Depends(get_current_user),
db=Depends(get_db)):
if current and not pageSize:
return ResponseList(code=400, msg="缂哄皯鍙傛暟")
- getknowledgelist = await get_knowledge_list(db, current_user.id, keyword, pageSize, current, status, knowledge, location)
+ getknowledgelist = await get_knowledge_list(db, current_user.id, keyword, pageSize, current, status, knowledge,
+ location)
return Response(code=200, msg="", data=getknowledgelist)
@knowledge_router.post("/create", response_model=Response)
-async def create_knowledge_api(klg: klgParameter, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
- is_create = await create_knowledge_service(db, klg.id, klg.name, klg.description, klg.icon, klg.klgType, current_user.id)
+async def create_knowledge_api(klg: klgParameter, current_user: UserModel = Depends(get_current_user),
+ db=Depends(get_db)):
+ is_create = await create_knowledge_service(db, klg.id, klg.name, klg.description, klg.icon, klg.klgType,
+ current_user.id)
if not is_create:
return Response(code=500, msg="role knowledge failure", data={})
return Response(code=200, msg="role knowledge success", data={})
@knowledge_router.get("/update", response_model=Response)
-async def change_knowledge_api(knowledgeId: str, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+async def change_knowledge_api(knowledgeId: str, current_user: UserModel = Depends(get_current_user),
+ db=Depends(get_db)):
# is_create = await update_dialog_status_service(db, dialog.id, dialog.status)
# if not is_create:
# return Response(code=500, msg="dialog update failure", data={})
@@ -59,10 +66,38 @@
return Response(code=200, msg="knowledge delete success", data={})
-
@knowledge_router.put("/update_icon", response_model=Response)
async def change_dialog_icon(klg: klgIcon, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
is_create = await update_knowledge_icon_service(db, klg.id, klg.icon)
if not is_create:
return Response(code=500, msg="knowledge update failure", data={})
- return Response(code=200, msg="knowledge update success", data={})
\ No newline at end of file
+ return Response(code=200, msg="knowledge update success", data={})
+
+
+@knowledge_router.get("/{knowledgeId}/users", response_model=Response)
+async def get_kb_users(knowledgeId: str,
+ current: int,
+ pageSize: int,
+ member:int = 0,
+ current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+ kb_user = await get_knowledge_users_service(db, knowledgeId, current_user.id, current, pageSize, member)
+
+ return Response(code=200, msg="knowledge user success", data={"rows": kb_user})
+
+
+@knowledge_router.post("/transfer/owner", response_model=Response)
+async def transfer_kb_owner(klgOwner: KlgOwner,
+ current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+ is_update = await set_knowledge_owner_service(db, klgOwner.knowledgeId, klgOwner.UserId, current_user.id)
+ if not is_update:
+ return Response(code=500, msg="knowledge update failure", data={})
+ return Response(code=200, msg="knowledge update success", data={})
+
+
+@knowledge_router.get("/{knowledgeId}/join", response_model=Response)
+async def join_kb_user(knowledgeId: str,
+ current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+ is_add = await add_knowledge_user_service(db, knowledgeId, current_user.id)
+ if not is_add:
+ return Response(code=500, msg="knowledge join failure", data={})
+ return Response(code=200, msg="knowledge join success", data={})
\ No newline at end of file
diff --git a/app/api/user.py b/app/api/user.py
index 3dca8be..0213ddc 100644
--- a/app/api/user.py
+++ b/app/api/user.py
@@ -154,4 +154,9 @@
is_edit = await edit_user_dept(db, user.userId, user.depts)
if not is_edit:
return Response(code=500, msg="user edit failure", data={})
- return Response(code=200, msg="user edit successfully", data={})
\ No newline at end of file
+ return Response(code=200, msg="user edit successfully", data={})
+
+
+@user_router.get("/ping", response_model=Response)
+async def user_ping(current_user: UserModel = Depends(get_current_user)):
+ return Response(code=200, msg="", data={})
\ No newline at end of file
diff --git a/app/config/env_conf/admin.yaml b/app/config/env_conf/admin.yaml
index 7c12711..9d8259a 100644
--- a/app/config/env_conf/admin.yaml
+++ b/app/config/env_conf/admin.yaml
@@ -3,9 +3,9 @@
password: gAAAAABnvAq8bErFiR9x_ZcODjUeOdrDo8Z5UVOzyqo6SxIhAvLpw81kciQN0frwIFVfY9wrxH1WqrpTICpEwfH7r2SkLjS7SQ==
chat_server:
- id: 2c039666c29d11efa4670242ac1b0006
- account: zhao1@example.com
- password: gAAAAABnpFLtotY2OIRH12BJh4MzMgn5Zil7-DVpIeuqlFwvr0g6g_n4ULogn-LNhCbtk6cCDkzZlqAHvBSX2e_zf7AsoyzbiQ==
+ id: e7f1b3a6062911f0a9650242ac120004
+ account: 1528276425@qq.com
+ password: gAAAAABn4MzQzoGBSFI6Gx1Nz1RdEY31E0exNFwUtD7q0iWtaUeFCgA6ruDxjLxA7sNgP_lV_Un_SgN0xnaCdwd9a_XH3VAHMg==
workflow_server:
account: admin@basic.com
diff --git a/app/models/knowledge_model.py b/app/models/knowledge_model.py
index c3c5bb2..a7f0494 100644
--- a/app/models/knowledge_model.py
+++ b/app/models/knowledge_model.py
@@ -30,7 +30,7 @@
def get_id(self):
return str(self.id)
- def to_json(self):
+ def to_json(self, user_id=""):
return {
'id': self.id,
'name': self.name,
@@ -42,7 +42,8 @@
'status': self.status,
'documents': self.documents if self.documents else 0,
'icon': self.icon,
- 'embd_id': self.embd_id
+ 'embd_id': self.embd_id,
+ 'link': True if (self.tenant_id == user_id or user_id == "admin" ) and self.permission == "team" else False,
}
def __repr__(self):
return '<Knowledge name:%r url:%r>\n' % (self.name, self.id)
@@ -59,4 +60,40 @@
class klgIcon(BaseModel):
id: str
- icon: str
\ No newline at end of file
+ icon: str
+
+
+
+class KnowledgeUserModel(Base):
+ __tablename__ = 'knowledgebase_user'
+
+ id = Column(Integer, primary_key=True) # id
+ kb_id = Column(String(36))
+ user_id = Column(Integer)
+ create_date = Column(DateTime, default=datetime.now()) # 鍒涘缓鏃堕棿
+ update_date = Column(DateTime, default=datetime.now(), onupdate=datetime.now()) # 鏇存柊鏃堕棿
+ status = Column(Integer) # 鐘舵��
+
+
+
+ def get_id(self):
+ return str(self.id)
+
+ def to_json(self, user_id=""):
+ return {
+ 'id': self.id,
+ 'kb_id': self.kb_id,
+ 'create_time': self.create_date.strftime('%Y-%m-%d %H:%M:%S'),
+ 'update_time': self.update_date.strftime('%Y-%m-%d %H:%M:%S'),
+ 'user_id': self.user_id,
+ 'status': self.status,
+ 'owner': True if str(self.user_id) == user_id else False,
+ }
+ def __repr__(self):
+ return '<Knowledge name:%r url:%r>\n' % (self.name, self.id)
+
+
+
+class KlgOwner(BaseModel):
+ knowledgeId: str
+ UserId: int
\ No newline at end of file
diff --git a/app/models/v2/chat.py b/app/models/v2/chat.py
index e7fa060..1397edc 100644
--- a/app/models/v2/chat.py
+++ b/app/models/v2/chat.py
@@ -177,16 +177,17 @@
}
def log_to_json(self):
+ query = {}
+ if self.query:
+ query = json.loads(self.query)
if self.message_type == 1:
return {
'id': self.id,
'role': "user",
'content': self.content,
+ 'files': query.get("files", []),
}
else:
- query = {}
- if self.query:
- query = json.loads(self.query)
res = {
'id': self.id,
@@ -195,6 +196,7 @@
'chat_mode': self.chat_mode,
"parentId": query.get("parentId"),
"isDeep": query.get("isDeep", 1),
+ "mindmap": True if self.mindmap else False,
}
if self.chat_mode == complex_knowledge_chat:
res['reference'] = json.loads(self.node_data) if self.node_data else {}
diff --git a/app/models/v2/session_model.py b/app/models/v2/session_model.py
index 3fa4eef..c1ec605 100644
--- a/app/models/v2/session_model.py
+++ b/app/models/v2/session_model.py
@@ -82,6 +82,17 @@
+ def to_dict(self):
+ res = {"files": [], "inputs": {}}
+ if hasattr(self, 'files'):
+ res['files'] = self.files
+ if hasattr(self, 'inputs'):
+ res['inputs'] = self.inputs
+ return res
+
+
+
+
class ChatSessionDao:
def __init__(self, db: Session):
self.db = db
diff --git a/app/service/knowledge.py b/app/service/knowledge.py
index f6250b7..880b68b 100644
--- a/app/service/knowledge.py
+++ b/app/service/knowledge.py
@@ -2,7 +2,7 @@
from sqlalchemy import or_
-from app.models import KnowledgeModel, group_knowledge_table
+from app.models import KnowledgeModel, group_knowledge_table, KnowledgeUserModel
from app.models.user_model import UserModel
from Log import logger
from app.task.fetch_agent import get_one_from_ragflow_knowledge
@@ -15,6 +15,9 @@
query = db.query(KnowledgeModel).filter(KnowledgeModel.knowledge_type==knowledge)
if user.permission != "admin":
klg_list = [j.id for i in user.groups for j in i.knowledges]
+ for i in db.query(KnowledgeUserModel).filter(KnowledgeUserModel.user_id == user_id, KnowledgeUserModel.status == 1).all():
+ if i.kb_id not in klg_list:
+ klg_list.append(i.kb_id)
query = query.filter(or_(KnowledgeModel.id.in_(klg_list), KnowledgeModel.tenant_id == str(user_id)))
if location:
@@ -25,13 +28,16 @@
total = query.count()
if page_size:
query = query.order_by(KnowledgeModel.update_date.desc()).limit(page_size).offset((page_index - 1) * page_size)
- return {"total": total, "rows": [kld.to_json() for kld in query.all()]}
+ return {"total": total, "rows": [kld.to_json(str(user_id) if user.permission != "admin" else "admin") for kld in query.all()]}
async def create_knowledge_service(db, klg_id, name, description, icon, klg_type, user_id):
try:
dialog_model = KnowledgeModel(id=klg_id,name=name, description=description,icon=icon, knowledge_type=klg_type, tenant_id=user_id,update_date=datetime.now(),create_date=datetime.now())
db.add(dialog_model)
+ kb_user = KnowledgeUserModel(kb_id=klg_id, user_id=user_id, status=1, update_date=datetime.now(),
+ create_date=datetime.now())
+ db.add(kb_user)
db.commit()
db.refresh(dialog_model)
except Exception as e:
@@ -87,3 +93,47 @@
return False
return True
+
+
+async def get_knowledge_users_service(db, kb_id, user_id, page, page_size, member):
+ kb_user_list = []
+ user_ids = []
+ kb_info = db.query(KnowledgeModel).filter(KnowledgeModel.id == kb_id).first()
+ query = db.query(KnowledgeUserModel).filter(KnowledgeUserModel.kb_id == kb_id)
+ if member:
+ query = query.filter(KnowledgeUserModel.user_id != user_id)
+ total = query.count()
+
+ for kld in query.limit(page_size).offset((page - 1) * page_size).all():
+ user_ids.append(kld.user_id)
+ print(kb_info.tenant_id)
+ kb_user_list.append(kld.to_json(kb_info.tenant_id))
+ user = {i.id: i.username for i in db.query(UserModel).filter(UserModel.id.in_(user_ids)).all()}
+ for kld in kb_user_list:
+ kld["username"] = user.get(kld["user_id"], "")
+ return {"total": total, "rows": kb_user_list}
+
+
+async def set_knowledge_owner_service(db, kb_id, user_id, u_id):
+ try:
+ db.query(KnowledgeModel).filter_by(id=kb_id).update({"tenant_id": str(user_id), "update_date": datetime.now()})
+ db.commit()
+ except Exception as e:
+ logger.error(e)
+ db.rollback()
+ return False
+ return True
+
+
+async def add_knowledge_user_service(db, kb_id, user_id):
+ try:
+
+ kb_user = KnowledgeUserModel(kb_id=kb_id, user_id=user_id, status=1, update_date=datetime.now(),
+ create_date=datetime.now())
+ db.add(kb_user)
+ 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/v2/chat.py b/app/service/v2/chat.py
index 3982bdc..0919b08 100644
--- a/app/service/v2/chat.py
+++ b/app/service/v2/chat.py
@@ -14,7 +14,7 @@
from app.config.config import settings
from app.config.const import *
from app.models import DialogModel, ApiTokenModel, UserTokenModel, ComplexChatSessionDao, ChatDataRequest, \
- ComplexChatDao, KnowledgeModel, UserModel
+ ComplexChatDao, KnowledgeModel, UserModel, KnowledgeUserModel
from app.models.v2.session_model import ChatSessionDao, ChatData
from app.service.v2.app_driver.chat_agent import ChatAgent
from app.service.v2.app_driver.chat_data import ChatBaseApply
@@ -34,7 +34,7 @@
async def add_session_log(db, session_id: str, question: str, chat_id: str, user_id, event_type: str,
- conversation_id: str, agent_type):
+ conversation_id: str, agent_type, query: dict=None):
try:
session = await ChatSessionDao(db).update_or_insert_by_id(
session_id=session_id,
@@ -42,7 +42,7 @@
agent_id=chat_id,
agent_type=agent_type,
tenant_id=user_id,
- message={"role": "user", "content": question},
+ message={"role": "user", "content": question, "query": query},
conversation_id=conversation_id,
event_type=event_type
)
@@ -97,6 +97,9 @@
query = db.query(KnowledgeModel)
if user.permission != "admin":
klg_list = [j.id for i in user.groups for j in i.knowledges]
+ for i in db.query(KnowledgeUserModel).filter(KnowledgeUserModel.user_id == user_id, KnowledgeUserModel.status == 1).all():
+ if i.kb_id not in klg_list:
+ klg_list.append(i.kb_id)
query = query.filter(or_(KnowledgeModel.id.in_(klg_list), KnowledgeModel.tenant_id == str(user_id)))
kb_list= query.all()
for kb in kb_list:
@@ -204,7 +207,7 @@
else:
query = "start new conversation"
session = await add_session_log(db, session_id, query if query else "start new conversation", chat_id, user_id,
- mode, conversation_id, DF_TYPE)
+ mode, conversation_id, DF_TYPE, chat_data.to_dict())
if session:
conversation_id = session.conversation_id
try:
--
Gitblit v1.8.0