From 244c884d0a7c54c4a37de18c1c2c8ff15a506ff7 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期二, 15 十月 2024 00:11:31 +0800 Subject: [PATCH] 智能体列表接口,智能体会话记录接口 --- app/models/agent_model.py | 15 +++++ app/service/bisheng.py | 21 +++++++ requirements.txt | 0 app/service/ragflow.py | 21 +++++++ app/api/chat.py | 2 main.py | 2 app/api/agent.py | 67 ++++++++++++++++++++++ app/api/__init__.py | 6 ++ 8 files changed, 132 insertions(+), 2 deletions(-) diff --git a/app/api/__init__.py b/app/api/__init__.py index 51c31da..8bd4579 100644 --- a/app/api/__init__.py +++ b/app/api/__init__.py @@ -21,6 +21,12 @@ data: dict = {} +class ResponseList(BaseModel): + code: int = 200 + msg: str = "" + data: list[dict] = [] + + def get_current_user(token: str = Depends(oauth2_scheme)): try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) diff --git a/app/api/agent.py b/app/api/agent.py new file mode 100644 index 0000000..cded0f8 --- /dev/null +++ b/app/api/agent.py @@ -0,0 +1,67 @@ +from fastapi import Depends, APIRouter, Query, HTTPException +from pydantic import BaseModel +from sqlalchemy.orm import Session + +from app.api import Response, get_current_user, ResponseList +from app.config.config import settings +from app.models.agent_model import AgentType, AgentModel +from app.models.base_model import get_db +from app.models.user_model import UserModel +from app.service.bisheng import BishengService +from app.service.ragflow import RagflowService +from app.service.token import get_ragflow_token, get_bisheng_token + +router = APIRouter() + + +# Pydantic 妯″瀷鐢ㄤ簬鍝嶅簲 +class AgentResponse(BaseModel): + id: str + name: str + agent_type: AgentType + + class Config: + orm_mode = True + + +@router.get("/list", response_model=ResponseList) +async def agent_list(db: Session = Depends(get_db)): + agents = db.query(AgentModel).all() + result = [ + { + "id": item.id, + "name": item.name, + "agent_type": item.agent_type + } + for item in agents + ] + return ResponseList(code=200, msg="", data=result) + + +@router.get("/{agent_id}/sessions", response_model=ResponseList) +async def chat_list(agent_id: str, db: Session = Depends(get_db), current_user: UserModel = Depends(get_current_user)): + agent = db.query(AgentModel).filter(AgentModel.id == agent_id).first() + if not agent: + return ResponseList(code=404, msg="Agent not found") + + if agent.agent_type == AgentType.RAGFLOW: + ragflow_service = RagflowService(base_url=settings.ragflow_base_url) + try: + token = get_ragflow_token(db, current_user.id) + result = await ragflow_service.get_chat_sessions(token, agent_id) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + return ResponseList(code=200, msg="", data=result) + + elif agent.agent_type == AgentType.BISHENG: + bisheng_service = BishengService(base_url=settings.bisheng_base_url) + try: + token = get_bisheng_token(db, current_user.id) + result = await bisheng_service.get_chat_sessions(token) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + return ResponseList(code=200, msg="", data=result) + + else: + return ResponseList(code=200, msg="Unsupported agent type") + diff --git a/app/api/chat.py b/app/api/chat.py index 7667736..d5ab09d 100644 --- a/app/api/chat.py +++ b/app/api/chat.py @@ -135,5 +135,3 @@ print(f"Client {chat_id} disconnected") finally: del client_websockets[chat_id] - - diff --git a/app/models/agent_model.py b/app/models/agent_model.py new file mode 100644 index 0000000..1b2bdb2 --- /dev/null +++ b/app/models/agent_model.py @@ -0,0 +1,15 @@ +from enum import IntEnum +from sqlalchemy import Column, String, Enum as SQLAlchemyEnum +from app.models.base_model import Base + + +class AgentType(IntEnum): + RAGFLOW = 1 + BISHENG = 2 + + +class AgentModel(Base): + __tablename__ = "agent" + id = Column(String(255), primary_key=True, index=True) + name = Column(String(255), index=True) + agent_type = Column(SQLAlchemyEnum(AgentType), nullable=False) # 1 ragflow 2 bisheng diff --git a/app/service/bisheng.py b/app/service/bisheng.py index b71a932..3eb0dfd 100644 --- a/app/service/bisheng.py +++ b/app/service/bisheng.py @@ -1,3 +1,5 @@ +from datetime import datetime + import httpx from app.config.config import settings @@ -42,3 +44,22 @@ if response.status_code != 200: raise Exception(f"Failed to get public key: {response.text}") return response.json().get('data', {}).get('public_key') + + async def get_chat_sessions(self, token: str) -> list: + url = f"{self.base_url}/api/v1/chat/list?page=1&limit=40" + headers = {'cookie': f"access_token_cookie={token};"} + async with httpx.AsyncClient() as client: + response = await client.get(url, headers=headers) + if response.status_code != 200: + raise Exception(f"Failed to fetch data from Bisheng API: {response.text}") + + data = response.json().get("data", []) + result = [ + { + "id": item["chat_id"], + "name": item["latest_message"]["message"], + "updated_time": int(datetime.strptime(item["update_time"], "%Y-%m-%dT%H:%M:%S").timestamp() * 1000) + } + for item in data + ] + return result diff --git a/app/service/ragflow.py b/app/service/ragflow.py index df131f1..934af1a 100644 --- a/app/service/ragflow.py +++ b/app/service/ragflow.py @@ -59,3 +59,24 @@ return else: yield f"Error: {response.status_code}" + + async def get_chat_sessions(self, token: str, dialog_id: str) -> list: + url = f"{self.base_url}/v1/conversation/list?dialog_id={dialog_id}" + headers = { + "Authorization": token + } + async with httpx.AsyncClient() as client: + response = await client.get(url, headers=headers) + if response.status_code != 200: + raise Exception(f"Failed to fetch data from Ragflow API: {response.text}") + + data = response.json().get("data", []) + result = [ + { + "id": item["id"], + "name": item["name"], + "updated_time": item["update_time"] + } + for item in data + ] + return result diff --git a/main.py b/main.py index 95945d6..d5a8c5d 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,7 @@ from fastapi import FastAPI from app.api.auth import router as auth_router from app.api.chat import router as chat_router +from app.api.agent import router as agent_router from app.models.base_model import init_db init_db() @@ -12,6 +13,7 @@ app.include_router(auth_router, prefix='/auth', tags=["auth"]) app.include_router(chat_router, prefix='/chat', tags=["chat"]) +app.include_router(agent_router, prefix='/agent', tags=["agent"]) if __name__ == "__main__": import uvicorn diff --git a/requirements.txt b/requirements.txt index da3411d..a1e863b 100644 --- a/requirements.txt +++ b/requirements.txt Binary files differ -- Gitblit v1.8.0