From d961b5e9290edef3bee5cd6adc4a636af209c1e7 Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期四, 09 一月 2025 18:52:21 +0800
Subject: [PATCH] tmp
---
app/service/v2/app_driver/chat_dialog.py | 31 +-
app/service/v2/app_driver/chat_smart.py | 0
app/models/v2/session_model.py | 22 +
app/service/v2/app_driver/chat_agent.py | 75 ++++++
app/api/v2/chat.py | 72 +++++
app/service/v2/app_driver/chat_base.py | 8
app/config/agent_base_url.py | 10
app/service/v2/app_driver/chat_data.py | 47 ++++
app/service/v2/chat.py | 236 +++++++++++++++++---
app/service/v2/app_driver/chat_workflow.py | 74 ++++++
app/config/const.py | 58 ++++
main.py | 4
app/models/token_model.py | 10
13 files changed, 565 insertions(+), 82 deletions(-)
diff --git a/app/api/v2/chat.py b/app/api/v2/chat.py
index 037b0ef..b8ec8c7 100644
--- a/app/api/v2/chat.py
+++ b/app/api/v2/chat.py
@@ -1,15 +1,69 @@
+import json
+import uuid
+
from fastapi import Depends, APIRouter
from sqlalchemy.orm import Session
-from starlette.responses import StreamingResponse
-from app.api import get_current_user
-from app.models import UserModel
+from starlette.responses import StreamingResponse, Response
+from app.config.const import dialog_chat, advanced_chat, base_chat, agent_chat, workflow_chat, basic_chat, \
+ smart_message_error, http_400, http_500, http_200
from app.models.base_model import get_db
-from app.models.v2.session_model import ChatDialogData
-from app.service.v2.chat import service_chat_dialog
+from app.models.v2.session_model import ChatData
+from app.service.v2.chat import service_chat_dialog, get_chat_info, service_chat_basic, \
+ service_chat_workflow, service_chat_parameters, service_chat_sessions
-chat1_router = APIRouter()
+chat_router_v2 = APIRouter()
-@chat1_router.post("/chat_dialog")
-async def api_chat_dialog(dialog: ChatDialogData, db: Session = Depends(get_db)): # current_user: UserModel = Depends(get_current_user)
- return StreamingResponse(service_chat_dialog(db, dialog.chatId ,dialog.question, dialog.sessionId, 1), media_type="text/event-stream")
\ No newline at end of file
+@chat_router_v2.post("/{chatId}/run")
+async def api_chat_dialog(chatId:str, dialog: ChatData, db: Session = Depends(get_db)): # current_user: UserModel = Depends(get_current_user)
+
+ chat_info = await get_chat_info(db, chatId)
+ if not chat_info:
+ error_msg = json.dumps({"message": smart_message_error, "error": "**ERROR**: parameter exception", "status": http_400})
+ return StreamingResponse(f"data: {error_msg}\n\n",
+ media_type="text/event-stream")
+ session_id = dialog.sessionId
+ if chat_info.mode == dialog_chat:
+ if not dialog.query:
+ error_msg = json.dumps(
+ {"message": smart_message_error, "error": "**ERROR**: question cannot be empty.", "status": http_400})
+ return StreamingResponse(f"data: {error_msg}\n\n",
+ media_type="text/event-stream")
+ if not session_id:
+ session = await service_chat_sessions(db, chatId, dialog.query)
+ if not session or session.get("code") != 0:
+ error_msg = json.dumps(
+ {"message": smart_message_error, "error": "**ERROR**: chat agent error", "status": http_500})
+ return StreamingResponse(f"data: {error_msg}\n\n",
+ media_type="text/event-stream")
+ session_id = session.get("data", {}).get("id")
+ return StreamingResponse(service_chat_dialog(db, chatId ,dialog.query, session_id, 1, chat_info.mode), media_type="text/event-stream")
+ elif chat_info.mode == agent_chat or chat_info.mode == workflow_chat or chat_info.mode == advanced_chat or chat_info.mode == base_chat:
+ if not session_id:
+ session_id = str(uuid.uuid4()).replace("-", "")
+ return StreamingResponse(service_chat_workflow(db, chatId, dialog, session_id, 1, chat_info.mode),
+ media_type="text/event-stream")
+ elif chat_info.mode == basic_chat:
+ return StreamingResponse(service_chat_basic(db, chatId, dialog.question, dialog_chat.sessionId, 1),
+ media_type="text/event-stream")
+ else:
+ error_msg = json.dumps({"message": smart_message_error, "error": "**ERROR**: chat agent error", "status": http_500})
+ return StreamingResponse(f"data: {error_msg}\n\n",
+ media_type="text/event-stream")
+
+
+@chat_router_v2.get("/{chatId}/parameters")
+async def api_chat_parameters(chatId:str, db: Session = Depends(get_db)): # current_user: UserModel = Depends(get_current_user)
+ status_code = http_200
+ data = await service_chat_parameters(db, chatId, 1)
+ if not data:
+ status_code = http_400
+ return Response(json.dumps(data), media_type="application/json", status_code=status_code)
+
+# @chat_router_v2.get("/{chatId}/parameters")
+# async def api_chat_parameters(chatId:str, db: Session = Depends(get_db)): # current_user: UserModel = Depends(get_current_user)
+# status_code = http_200
+# data = await service_chat_parameters(db, chatId, 1)
+# if not data:
+# status_code = http_400
+# return Response(json.dumps(data), media_type="application/json", status_code=status_code)
\ No newline at end of file
diff --git a/app/config/agent_base_url.py b/app/config/agent_base_url.py
index 6d903d2..368bb0f 100644
--- a/app/config/agent_base_url.py
+++ b/app/config/agent_base_url.py
@@ -1 +1,9 @@
-RG_CHAT_DIALOG= "/api/v1/chats/{}/completions"
\ No newline at end of file
+
+####------
+RG_CHAT_DIALOG= "/api/v1/chats/{}/completions"
+RG_CHAT_SESSIONS= "/api/v1/chats/{}/sessions"
+
+### ----------
+DF_CHAT_AGENT= "/v1/chat-messages"
+DF_CHAT_WORKFLOW= "/v1/workflows/run"
+DF_CHAT_PARAMETERS= "/v1/parameters"
\ No newline at end of file
diff --git a/app/config/const.py b/app/config/const.py
index 6e6f8a3..4f173bc 100644
--- a/app/config/const.py
+++ b/app/config/const.py
@@ -13,10 +13,10 @@
DIFY = "dify_app"
### ---------------app type-----------------
-BASIC_ID = 3
-RAGFLOW_ID = 1
-BISHENG_ID = 2
-DIFY_ID = 4
+BASIC_TYPE = "3"
+RG_TYPE = "1"
+BS_TYPE = "2"
+DF_TYPE = "4"
### ------------------status--------------------
USER_STATSU_DELETE = "2"
@@ -41,4 +41,52 @@
###
-max_chunk_size =5000
\ No newline at end of file
+max_chunk_size =5000
+
+
+### ---------chat mode--------------
+dialog_chat = "agent-dialog"
+workflow_chat = "workflow"
+advanced_chat = "advanced-chat"
+agent_chat = "agent-chat"
+base_chat = "chat"
+basic_chat = "agent-basic"
+
+
+### ------------------------------
+rg_api_token = "6b8ee426c67511efb1510242ac1b0006"
+
+
+### ----------------evnet message value----------------------
+message_event = "message"
+message_agent_thought = "agent_thought"
+message_agent = "agent_message"
+message_end = "message_end"
+message_error = "error"
+message_file = "message_file"
+message_tts = "tts_message"
+message_tts_end = "tts_message_end"
+message_replace = "message_replace"
+message_ping = "ping"
+workflow_started = "workflow_started"
+node_started = "node_started"
+node_finished = "node_finished"
+workflow_finished = "workflow_finished"
+
+
+### --------------------smart output event message----------------------------------
+smart_message_cover = "message"
+smart_message_stream = "stream"
+smart_message_file = "message_file"
+smart_message_end = "message_end"
+smart_message_error = "error"
+smart_workflow_started = "workflow_started"
+smart_node_started = "node_started"
+smart_node_finished = "node_finished"
+smart_workflow_finished = "workflow_finished"
+
+
+### ---------------------------http status--------------------------------------
+http_200 = 200
+http_400 = 400
+http_500 = 500
\ No newline at end of file
diff --git a/app/models/token_model.py b/app/models/token_model.py
index 736720c..7ad0e01 100644
--- a/app/models/token_model.py
+++ b/app/models/token_model.py
@@ -1,7 +1,7 @@
from datetime import datetime
from typing import Type
-from sqlalchemy import Column, Integer, DateTime, Text
+from sqlalchemy import Column, Integer, DateTime, Text, String
from sqlalchemy.orm import Session
from app.config.const import RAGFLOW
@@ -92,3 +92,11 @@
+class ApiTokenModel(Base):
+ __tablename__ = "chat_api_tokens"
+ id = Column(String(32), primary_key=True)
+ app_id = Column(String(32), index=True)
+ type = Column(String(16))
+ token = Column(String(255))
+ created_at = Column(DateTime, default=datetime.now())
+ last_used_at = Column(DateTime, default=datetime.now())
diff --git a/app/models/v2/session_model.py b/app/models/v2/session_model.py
index aa85f19..fad5bc1 100644
--- a/app/models/v2/session_model.py
+++ b/app/models/v2/session_model.py
@@ -7,7 +7,7 @@
from pydantic import BaseModel
from sqlalchemy import Column, String, Integer, DateTime, JSON, TEXT, Index
-from Log import logger
+# from Log import logger
from app.models.agent_model import AgentType
from app.models.base_model import Base
@@ -35,14 +35,17 @@
reference = Column(TEXT)
conversation_id = Column(String(36), index=True)
event_type = Column(String(16))
+ session_type = Column(String(16))
# to_dict 鏂规硶
def to_dict(self):
return {
- 'id': self.id,
+ 'session_id': self.id,
'name': self.name,
'agent_type': self.agent_type,
'agent_id': self.agent_id,
+ 'event_type': self.event_type,
+ 'session_type': self.session_type,
'create_date': self.create_date.strftime("%Y-%m-%d %H:%M:%S"),
'update_date': self.update_date.strftime("%Y-%m-%d %H:%M:%S"),
}
@@ -71,10 +74,12 @@
-class ChatDialogData(BaseModel):
+class ChatData(BaseModel):
sessionId: Optional[str] = ""
- question: str
- chatId: str
+
+ class Config:
+ extra = 'allow' # 鍏佽鍏朵粬鍔ㄦ�佸瓧娈�
+
class ChatSessionDao:
@@ -98,17 +103,20 @@
session = self.db.query(ChatSessionModel).filter_by(id=session_id).first()
return session
- async def update_session_by_id(self, session_id: str, session, message: dict) -> ChatSessionModel | None:
+ async def update_session_by_id(self, session_id: str, session, message: dict, conversation_id=None) -> ChatSessionModel | None:
+ print(message)
if not session:
session = await self.get_session_by_id(session_id)
if session:
try:
+ if conversation_id:
+ session.conversation_id=conversation_id
session.add_message(message)
session.update_date = current_time()
self.db.commit()
self.db.refresh(session)
except Exception as e:
- logger.error(e)
+ # logger.error(e)
self.db.rollback()
return session
diff --git a/app/service/v2/app_driver/chat_agent.py b/app/service/v2/app_driver/chat_agent.py
index e69de29..45f804e 100644
--- a/app/service/v2/app_driver/chat_agent.py
+++ b/app/service/v2/app_driver/chat_agent.py
@@ -0,0 +1,75 @@
+import json
+
+# from Log import logger
+from app.models.v2.session_model import ChatData
+from app.service.v2.app_driver.chat_base import ChatBase
+
+
+class ChatAgent(ChatBase):
+
+ async def chat_completions(self, url, data, headers):
+ complete_response = ""
+ async for line in self.http_stream(url, data, headers):
+ # logger.error(line)
+ if line.startswith("data:"):
+ complete_response = line.strip("data:").strip()
+ elif line.startswith("Error: "):
+ yield {"event": "error", "message": line}
+ else:
+ complete_response += line.strip()
+ try:
+ json_data = json.loads(complete_response)
+ # 澶勭悊 JSON 鏁版嵁
+ # print(json_data)
+ complete_response = ""
+ yield json_data
+
+ except json.JSONDecodeError as e:
+ # logger.info("Invalid JSON data------------------")
+ print(e)
+
+ @staticmethod
+ async def request_data(query: str, conversation_id: str, user:str, chat_data: ChatData) -> dict:
+ inputs = []
+ files = []
+ if hasattr(chat_data, "inputs"):
+ inputs = chat_data.inputs
+ if hasattr(chat_data, "files"):
+ files = chat_data.files
+
+ return {
+ "inputs":inputs,
+ "query": query,
+ "response_mode": "streaming",
+ "conversation_id": conversation_id,
+ "user": user,
+ "files": files
+ }
+
+
+if __name__ == "__main__":
+ async def aa():
+ chat_id = "16954f6d-c1e6-4a0b-b371-363c28e8a48b"
+ token = "app-79ndndjNAFSV3qTuDAjDwuSO"
+ base_url = "http://192.168.20.116"
+ url = f"{base_url}/v1/chat-messages"
+ chat = ChatAgent()
+ data = {
+ "inputs":{},
+ "query": "浣犲ソ锛屼綘鑳藉仛浠�涔堬紵",
+ "response_mode": "streaming",
+ "conversation_id": "",
+ "user": "1",
+ "files": []
+ }
+ headers = {
+ 'Content-Type': 'application/json',
+ 'Authorization': f"Bearer {token}"
+ }
+ async for ans in chat.chat_completions(url, data, headers):
+ print(ans)
+
+
+ import asyncio
+
+ asyncio.run(aa())
diff --git a/app/service/v2/app_driver/chat_base.py b/app/service/v2/app_driver/chat_base.py
index baacbc9..787a89b 100644
--- a/app/service/v2/app_driver/chat_base.py
+++ b/app/service/v2/app_driver/chat_base.py
@@ -22,19 +22,19 @@
@staticmethod
async def http_post(url, data, headers, timeout=300):
async with httpx.AsyncClient(timeout=timeout) as client:
- response = client.post(url, json=data, headers=headers)
+ response = await client.post(url, json=data, headers=headers)
return response
@staticmethod
async def http_get(url, params, headers, timeout=300):
async with httpx.AsyncClient(timeout=timeout) as client:
- response = client.get(url, params=params, headers=headers)
+ response = await client.get(url, params=params, headers=headers)
return response
@staticmethod
async def get_headers(token):
- headers = {
- # 'Content-Type': 'application/json',
+ return {
+ 'Content-Type': 'application/json',
'Authorization': f'Bearer {token}'
}
diff --git a/app/service/v2/app_driver/chat_data.py b/app/service/v2/app_driver/chat_data.py
new file mode 100644
index 0000000..ebfa63d
--- /dev/null
+++ b/app/service/v2/app_driver/chat_data.py
@@ -0,0 +1,47 @@
+import json
+
+# from Log import logger
+from app.service.v2.app_driver.chat_base import ChatBase
+
+
+class ChatBaseApply(ChatBase):
+
+ async def chat_parameters(self, url, params, headers):
+
+ res = await self.http_get(url, params, headers)
+ if res.status_code == 200:
+ return res.json()
+ else:
+ return {}
+
+
+
+
+
+
+if __name__ == "__main__":
+ async def aa():
+ chat_id = "bcb56e4b-8f21-41f1-b22a-80335fe58345"
+ token = "app-9sbGzhtFuGIducdepzQgX06v"
+ base_url = "http://192.168.20.116"
+ url = f"{base_url}/v1/parameters"
+ chat = ChatBaseApply()
+ data = {
+ "question": "鐢电綉鎶�鏈�荤粨300瀛�",
+ "stream": True,
+ "session_id": "9969c152cce411ef8a140242ac1b0002"
+ }
+ params = {
+ "user": "1"
+ }
+ headers = {
+ 'Content-Type': 'application/json',
+ 'Authorization': f"Bearer {token}"
+ }
+ ans = await chat.chat_parameters(url, params, headers)
+ print(ans)
+
+
+ import asyncio
+
+ asyncio.run(aa())
diff --git a/app/service/v2/app_driver/chat_dialog.py b/app/service/v2/app_driver/chat_dialog.py
index 27807fd..df7a5d1 100644
--- a/app/service/v2/app_driver/chat_dialog.py
+++ b/app/service/v2/app_driver/chat_dialog.py
@@ -6,22 +6,10 @@
class ChatDialog(ChatBase):
-
- def __init__(self, token):
- self.token = token
-
-
- async def get_headers(self):
- return {
- 'Content-Type': 'application/json',
- 'Authorization': f'Bearer {self.token}'
- }
-
-
async def chat_completions(self, url, data, headers):
complete_response = ""
async for line in self.http_stream(url, data, headers):
- # logger.error(line)
+ print(line)
if line.startswith("data:"):
complete_response = line.strip("data:").strip()
else:
@@ -37,6 +25,23 @@
logger.info("Invalid JSON data------------------")
# print(e)
+ async def chat_sessions(self, url, data, headers):
+
+ res = await self.http_post(url, data, headers)
+ if res.status_code == 200:
+ return res.json()
+ else:
+ return {}
+
+
+
+ @staticmethod
+ async def request_data(question, session_id=""):
+ return {
+ "question": question,
+ "stream": True,
+ "session_id": session_id
+ }
diff --git a/app/service/v2/app_driver/chat_basic.py b/app/service/v2/app_driver/chat_smart.py
similarity index 100%
rename from app/service/v2/app_driver/chat_basic.py
rename to app/service/v2/app_driver/chat_smart.py
diff --git a/app/service/v2/app_driver/chat_workflow.py b/app/service/v2/app_driver/chat_workflow.py
index e69de29..64e071d 100644
--- a/app/service/v2/app_driver/chat_workflow.py
+++ b/app/service/v2/app_driver/chat_workflow.py
@@ -0,0 +1,74 @@
+import json
+
+# from Log import logger
+from app.models.v2.session_model import ChatData
+from app.service.v2.app_driver.chat_base import ChatBase
+
+
+class ChatWorkflow(ChatBase):
+
+ async def chat_completions(self, url, data, headers):
+ complete_response = ""
+ async for line in self.http_stream(url, data, headers):
+ if line.startswith("data:"):
+ complete_response = line.strip("data:").strip()
+ elif line.startswith("Error: "):
+ yield {"event": "error", "message": line}
+ else:
+ complete_response += line.strip()
+ try:
+ json_data = json.loads(complete_response)
+ # 澶勭悊 JSON 鏁版嵁
+ # print(json_data)
+ complete_response = ""
+ yield json_data
+
+ except json.JSONDecodeError as e:
+ # logger.info("Invalid JSON data------------------")
+ print(e)
+
+ @staticmethod
+ async def request_data(query: str, conversation_id: str, user:str, chat_data: ChatData) -> dict:
+ inputs = []
+ files = []
+ if hasattr(chat_data, "inputs"):
+ inputs = chat_data.inputs
+ if hasattr(chat_data, "files"):
+ files = chat_data.files
+
+ return {
+ "inputs":inputs,
+ "query": query,
+ "response_mode": "streaming",
+ "conversation_id": conversation_id,
+ "user": user,
+ "files": files
+ }
+
+
+if __name__ == "__main__":
+ async def aa():
+ chat_id = "16954f6d-c1e6-4a0b-b371-363c28e8a48b"
+ token = "app-79ndndjNAFSV3qTuDAjDwuSO"
+ base_url = "http://192.168.20.116"
+ url = f"{base_url}/v1/chat-messages"
+ chat = ChatAgent()
+ data = {
+ "inputs":{},
+ "query": "浣犲ソ锛屼綘鑳藉仛浠�涔堬紵",
+ "response_mode": "streaming",
+ "conversation_id": "",
+ "user": "1",
+ "files": []
+ }
+ headers = {
+ 'Content-Type': 'application/json',
+ 'Authorization': f"Bearer {token}"
+ }
+ async for ans in chat.chat_completions(url, data, headers):
+ print(ans)
+
+
+ import asyncio
+
+ asyncio.run(aa())
diff --git a/app/service/v2/chat.py b/app/service/v2/chat.py
index 982ed43..5273f9b 100644
--- a/app/service/v2/chat.py
+++ b/app/service/v2/chat.py
@@ -1,70 +1,226 @@
import json
from Log import logger
-from app.config.agent_base_url import RG_CHAT_DIALOG
+from app.config.agent_base_url import RG_CHAT_DIALOG, DF_CHAT_AGENT, DF_CHAT_PARAMETERS, RG_CHAT_SESSIONS, \
+ DF_CHAT_WORKFLOW
from app.config.config import settings
-from app.config.const import max_chunk_size
-from app.models.v2.session_model import ChatSessionDao
+from app.config.const import *
+from app.models import DialogModel, ApiTokenModel
+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
from app.service.v2.app_driver.chat_dialog import ChatDialog
+from app.service.v2.app_driver.chat_workflow import ChatWorkflow
-async def service_chat_dialog(db, chat_id:str, question: str, session_id: str, user_id):
- token = "ragflow-YzMzE1NDRjYzMyZjExZWY5ZjkxMDI0Mm"
- url = settings.fwr_base_url+RG_CHAT_DIALOG.format(chat_id)
- chat = ChatDialog(token)
- request_data = {
- "question": question,
- "stream": True,
- "session_id": session_id
- }
- headers = {
- 'Content-Type': 'application/json',
- 'Authorization': f"Bearer {token}"
- }
+async def update_session_log(db, session_id: str, message: dict, conversation_id: str):
+ await ChatSessionDao(db).update_session_by_id(
+ session_id=session_id,
+ session=None,
+ message=message,
+ conversation_id=conversation_id
+ )
+
+
+async def add_session_log(db, session_id: str, question: str, chat_id: str, user_id, event_type: str,
+ conversation_id: str):
try:
- await ChatSessionDao(db).update_or_insert_by_id(
+ session = await ChatSessionDao(db).update_or_insert_by_id(
session_id=session_id,
name=question[:255],
agent_id=chat_id,
agent_type=1,
tenant_id=user_id,
message={"role": "user", "content": question},
- conversation_id=session_id,
- event_type="message"
+ conversation_id=conversation_id,
+ event_type=event_type
)
+ return session
except Exception as e:
logger.error(e)
+ return None
+
+
+async def get_chat_token(db, app_id):
+ app_token = db.query(ApiTokenModel).filter_by(app_id=app_id).first()
+ if app_token:
+ return app_token.token
+ return ""
+
+
+async def get_chat_info(db, chat_id: str):
+ return db.query(DialogModel).filter_by(id=chat_id, status=Dialog_STATSU_ON).first()
+
+
+async def get_chat_object(mode):
+ if mode == workflow_chat:
+ url = settings.dify_base_url + DF_CHAT_WORKFLOW
+ return ChatWorkflow(), url
+ else:
+ url = settings.dify_base_url + DF_CHAT_AGENT
+ return ChatAgent(), url
+
+
+async def service_chat_dialog(db, chat_id: str, question: str, session_id: str, user_id, mode: str):
+ conversation_id = ""
+ token = await get_chat_token(db, rg_api_token)
+ url = settings.fwr_base_url + RG_CHAT_DIALOG.format(chat_id)
+ chat = ChatDialog()
+ session = await add_session_log(db, session_id, question, chat_id, user_id, mode, session_id)
+ if session:
+ conversation_id = session.conversation_id
+ message = {"role": "assistant", "answer": "", "reference": {}}
try:
- message = {"role": "assistant","answer":"", "reference": {}}
- async for ans in chat.chat_completions(url, request_data, headers):
+ async for ans in chat.chat_completions(url, await chat.request_data(question, conversation_id),
+ await chat.get_headers(token)):
+ data = {}
+ error = ""
+ status = http_200
if ans.get("code", None) == 102:
- error = ans.get("message", "璇疯緭鍏ヤ綘鐨勯棶棰橈紒")
- data = {"answer":error}
- event = "message"
+ error = ans.get("message", "error锛�")
+ status = http_400
+ event = smart_message_error
else:
if isinstance(ans.get("data"), bool) and ans.get("data") is True:
- data = {}
- event = "message_end"
+ event = smart_message_end
else:
data = ans.get("data", {})
- message = ans.get("data", {})
- event = "message"
- message_str = "data: " + json.dumps({"event": event, "data": data}, ensure_ascii=False) + "\n\n"
+ # conversation_id = data.get("session_id", "")
+ if "session_id" in data:
+ del data["session_id"]
+ message = data
+ event = smart_message_cover
+ message_str = "data: " + json.dumps(
+ {"event": event, "data": data, "error": error, "status": status, "session_id": session_id},
+ ensure_ascii=False) + "\n\n"
for i in range(0, len(message_str), max_chunk_size):
chunk = message_str[i:i + max_chunk_size]
# print(chunk)
yield chunk # 鍙戦�佸垎鍧楁秷鎭�
- await ChatSessionDao(db).update_session_by_id(
- session_id=session_id,
- session=None,
- message=message
- )
+ except Exception as e:
+
+ logger.error(e)
+ try:
+ yield "data: " + json.dumps({"message": smart_message_error,
+ "error": "**ERROR**: " + str(e), "status": http_500},
+ ensure_ascii=False) + "\n\n"
+ except:
+ ...
+ finally:
+ await update_session_log(db, session_id, message, conversation_id)
+
+
+async def service_chat_workflow(db, chat_id: str, chat_data: ChatData, session_id: str, user_id, mode: str):
+ conversation_id = ""
+ answer_event = ""
+ answer_agent = ""
+ message_id = ""
+ task_id = ""
+ error = ""
+ files = []
+ node_list = []
+ token = await get_chat_token(db, chat_id)
+
+ chat, url = await get_chat_object(mode)
+ if hasattr(chat_data, "query"):
+ query = chat_data.query
+ else:
+ query = "start new workflow"
+ session = await add_session_log(db, session_id, query, chat_id, user_id, mode, conversation_id)
+ if session:
+ conversation_id = session.conversation_id
+ try:
+ async for ans in chat.chat_completions(url,
+ await chat.request_data(query, conversation_id, str(user_id), chat_data),
+ await chat.get_headers(token)):
+ data = {}
+ status = http_200
+ conversation_id = ans.get("conversation_id")
+ task_id = ans.get("task_id")
+ if ans.get("event") == message_error:
+ error = ans.get("message", "鍙傛暟寮傚父锛�")
+ status = http_400
+ event = smart_message_error
+ elif ans.get("event") == message_agent:
+ data = {"answer": ans.get("answer", ""), "id": ans.get("message_id", "")}
+ answer_agent += ans.get("answer", "")
+ message_id = ans.get("message_id", "")
+ event = smart_message_stream
+ elif ans.get("event") == message_event:
+ data = {"answer": ans.get("answer", ""), "id": ans.get("message_id", "")}
+ answer_event += ans.get("answer", "")
+ message_id = ans.get("message_id", "")
+ event = smart_message_stream
+ elif ans.get("event") == message_file:
+ data = {"url": ans.get("url", ""), "id": ans.get("id", ""),
+ "type": ans.get("type", "")}
+ files.append(data)
+ event = smart_message_file
+ elif ans.get("event") in [workflow_started, node_started, node_finished]:
+ data = ans.get("data", {})
+ data["inputs"] = []
+ data["outputs"] = []
+ data["process_data"] = ""
+ node_list.append(ans)
+ event = [smart_workflow_started, smart_node_started, smart_node_finished][
+ [workflow_started, node_started, node_finished].index(ans.get("event"))]
+ elif ans.get("event") == workflow_finished:
+ data = ans.get("data", {})
+ event = smart_workflow_finished
+ node_list.append(ans)
+ elif ans.get("event") == message_end:
+ event = smart_message_end
+ else:
+ continue
+
+ yield "data: " + json.dumps(
+ {"event": event, "data": data, "error": error, "status": status, "task_id": task_id,
+ "session_id": session_id},
+ ensure_ascii=False) + "\n\n"
+
except Exception as e:
logger.error(e)
- yield "data: " + json.dumps({"message": "message",
- "data": {"answer": "**ERROR**: " + str(e), "reference": []}},
- ensure_ascii=False) + "\n\n"
+ try:
+ yield "data: " + json.dumps({"message": smart_message_error,
+ "error": "**ERROR**: " + str(e), "status": http_500},
+ ensure_ascii=False) + "\n\n"
+ except:
+ ...
+ finally:
+ await update_session_log(db, session_id, {"role": "assistant", "answer": answer_event or answer_agent,
+ "node_list": node_list, "task_id": task_id, "id": message_id,
+ "error": error}, conversation_id)
- yield "data: " + json.dumps({"message": "message_end",
- "data": {}},
- ensure_ascii=False) + "\n\n"
\ No newline at end of file
+
+async def service_chat_basic(db, chat_id: str, question: str, session_id: str, user_id):
+ ...
+
+
+async def service_chat_parameters(db, chat_id, user_id):
+ chat_info = db.query(DialogModel).filter_by(id=chat_id).first()
+ if not chat_info:
+ return {}
+ if chat_info.dialog_type == RG_TYPE:
+ return {"retriever_resource":
+ {
+ "enabled": True
+ }
+ }
+ elif chat_info.dialog_type == BASIC_TYPE:
+ ...
+ elif chat_info.dialog_type == DF_TYPE:
+ token = await get_chat_token(db, chat_id)
+ if not token:
+ return {}
+ url = settings.dify_base_url + DF_CHAT_PARAMETERS
+ chat = ChatBaseApply()
+ return await chat.chat_parameters(url, {"user": str(user_id)}, await chat.get_headers(token))
+
+
+async def service_chat_sessions(db, chat_id, name):
+ token = await get_chat_token(db, rg_api_token)
+ if not token:
+ return {}
+ url = settings.fwr_base_url + RG_CHAT_SESSIONS.format(chat_id)
+ chat = ChatDialog()
+ return await chat.chat_sessions(url, {"name": name}, await chat.get_headers(token))
diff --git a/main.py b/main.py
index 881517c..dc14409 100644
--- a/main.py
+++ b/main.py
@@ -15,7 +15,7 @@
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.chat import chat1_router
+from app.api.v2.chat import chat_router_v2
from app.api.v2.public_api import public_api
from app.api.report import router as report_router
from app.api.resource import menu_router
@@ -89,7 +89,7 @@
app.include_router(canvas_router, prefix='/api/canvas', tags=["canvas"])
app.include_router(label_router, prefix='/api/label', tags=["label"])
app.include_router(public_api, prefix='/v1/api', tags=["public_api"])
-app.include_router(chat1_router, prefix='/v1/chat', tags=["chat1"])
+app.include_router(chat_router_v2, prefix='/v1/chat', tags=["chat1"])
app.mount("/static", StaticFiles(directory="app/images"), name="static")
if __name__ == "__main__":
--
Gitblit v1.8.0