From f249dda1376dd5a525e74617900351c5bbc61705 Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期一, 02 十二月 2024 09:26:18 +0800
Subject: [PATCH] 报告生成
---
app/service/bisheng.py | 19 +++++
app/api/chat.py | 18 ++++--
app/api/report.py | 61 ++++++++++++++++----
app/api/agent.py | 51 ++++++++++------
4 files changed, 110 insertions(+), 39 deletions(-)
diff --git a/app/api/agent.py b/app/api/agent.py
index 698ca0d..a9efc92 100644
--- a/app/api/agent.py
+++ b/app/api/agent.py
@@ -7,6 +7,7 @@
from sqlalchemy.orm import Session
from app.api import Response, get_current_user, ResponseList
+from app.api.user import reset_user_pwd
from app.config.config import settings
from app.models.agent_model import AgentType, AgentModel
from app.models.base_model import get_db
@@ -120,29 +121,36 @@
last_question = None
for session in result:
- message = session['message']
+ print(session)
+ # 妫�鏌� session 鏄惁涓� None
+ if session is None:
+ continue
- # 鍒ゆ柇message鏄瓧绗︿覆杩樻槸json 瀵硅薄,濡傛灉鏄痡son鍙栧叾涓殑question瀛楁锛屾垨鑰卹eport_name瀛楁璧嬪�肩粰message
- try:
- message_json = json.loads(message)
- if 'question' in message_json:
- message = message_json['question']
- elif 'query' in message_json:
- message = message_json['query']
- elif 'report_name' in message_json:
- message = message_json['report_name']
- except json.JSONDecodeError:
- pass
+ message = session.get('message')
- if session['role'] == 'question':
+ # 鍒ゆ柇 message 鏄惁鏄瓧绗︿覆锛岀劧鍚庡皾璇曡В鏋愪负 JSON 瀵硅薄
+ if isinstance(message, str):
+ try:
+ message_json = json.loads(message)
+ if 'question' in message_json:
+ message = message_json['question']
+ elif 'query' in message_json:
+ message = message_json['query']
+ elif 'report_name' in message_json:
+ message = message_json['report_name']
+ except json.JSONDecodeError:
+ pass # 闈� JSON 瀛楃涓诧紝缁х画浣跨敤鍘熷 message
+
+ # 妫�鏌� message 鏄惁涓� None
+ if message is None:
+ continue
+
+ if session.get('role') == 'question':
last_question = message
- elif session['role'] == 'answer' and last_question:
- combined_logs.append({
- 'question': last_question,
- 'answer': message
- })
+ elif session.get('role') == 'answer' and last_question:
+ combined_logs.append(last_question + "\n" + message)
last_question = None
- return JSONResponse(status_code=200, content={"code": 200, "data": combined_logs})
+ return JSONResponse(status_code=200, content={"code": 200, "data": {"question":"", "answer": "\n".join(combined_logs)}})
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
elif agent.agent_type == AgentType.BASIC:
@@ -172,6 +180,11 @@
tmp_data["code"] = i.get("code")
if "e" in i:
tmp_data["e"] = i.get("e")
+
+ if "image_name" in i:
+ tmp_data["image_name"] = i.get("image_name")
+ if "excel_name" in i:
+ tmp_data["excel_name"] = i.get("excel_name")
data.append(tmp_data)
tmp_data = {}
diff --git a/app/api/chat.py b/app/api/chat.py
index f21f07c..51c8409 100644
--- a/app/api/chat.py
+++ b/app/api/chat.py
@@ -255,26 +255,32 @@
logger.error("---------------------excel_talk-----------------------------")
excel_url = ""
image_url = ""
+ image_name = ""
+ excel_name = ""
async for data in service.excel_talk(question, chat_id):
# logger.error(data)
output = data.get("output", "")
- excel_name = data.get("excel_name", "")
- image_name = data.get("image_name", "")
+ e_name = data.get("excel_name", "")
+ i_name = data.get("image_name", "")
def build_file_url(name, file_type):
if not name:
return None
return (f"/api/files/download/?agent_id={agent_id}&file_id={name}"
f"&file_type={file_type}")
- if excel_name:
- excel_url = build_file_url(excel_name, 'excel')
- if image_name:
- image_url = build_file_url(image_name, 'image')
+ if e_name:
+ excel_url = build_file_url(e_name, 'excel')
+ excel_name = e_name
+ if i_name:
+ image_url = build_file_url(i_name, 'image')
+ image_name = i_name
if data["type"] == "message":
message_data = {
"content": output,
"excel_url": excel_url,
"image_url": image_url,
+ "image_name": image_name,
+ "excel_name": excel_name,
"sql": data.get("sql", ""),
"code": data.get("code", ""),
"e": data.get("e", ""),
diff --git a/app/api/report.py b/app/api/report.py
index f8d32fa..213fdc7 100644
--- a/app/api/report.py
+++ b/app/api/report.py
@@ -4,6 +4,8 @@
import asyncio
import websockets
from sqlalchemy.orm import Session
+
+from Log import logger
from app.api import get_current_user_websocket, ResponseList, get_current_user, format_file_url, process_files
from app.config.config import settings
from app.models.agent_model import AgentModel, AgentType
@@ -57,7 +59,7 @@
# 鐩戝惉姣曟槆鍙戞潵鐨勬秷鎭苟杞彂缁欏鎴风
async def forward_to_client():
- last_message = "step"
+ is_answer = False
while True:
message = await service_websocket.recv()
print(f"Received from bisheng: {message}")
@@ -67,19 +69,54 @@
msg = data.get("message", "")
category = data.get("category", "")
- if len(files) != 0 or (msg and category != "answer") or data["type"] == "close":
- if data["type"] == "close":
- t = "close"
+ if category == "question" and steps:
+ is_answer = False
+ if not steps:
+ steps = "\n"
else:
- t = "stream"
- process_files(files, agent_id)
- result = {"message": msg, "type": t, "files": files}
- await websocket.send_json(result)
- elif steps and last_message == "step":
- result = {"step_message": steps, "type": "stream", "files": files}
- await websocket.send_json(result)
+ steps =steps + "\n"
- last_message = "message" if msg else "step"
+ result = {"message": steps, "type": "stream", "files": files}
+ await websocket.send_json(result)
+ if category == "answer" and not is_answer:
+ process_files(files, agent_id)
+ if not steps.endswith("\n"):
+ steps+= "\n\n"
+ result = {"message": steps, "type": "stream", "files": files}
+ await websocket.send_json(result)
+ if category == "answer" and is_answer:
+ process_files(files, agent_id)
+ result = {"message": "\n", "type": "stream", "files": files}
+ await websocket.send_json(result)
+ elif category == "processing":
+ process_files(files, agent_id)
+ is_answer = True
+ result = {"message": msg, "type": "stream", "files": files}
+ await websocket.send_json(result)
+ elif files:
+ process_files(files, agent_id)
+ result = {"message": "", "type": "stream", "files": files}
+ await websocket.send_json(result)
+ elif data["type"] == "close":
+ process_files(files, agent_id)
+ result = {"message": "", "type": "close", "files": files}
+ await websocket.send_json(result)
+ else:
+ logger.error("-------------------11111111111111--------------------------")
+ logger.error(data)
+ # if len(files) != 0 or (msg and category != "answer") or data["type"] == "close":
+ # if data["type"] == "close":
+ # t = "close"
+ # else:
+ # t = "stream"
+ # process_files(files, agent_id)
+ # result = {"message": msg, "type": t, "files": files}
+ # await websocket.send_json(result)
+ # elif steps and last_message == "step":
+ # result = {"step_message": steps, "type": "stream", "files": files}
+ # await websocket.send_json(result)
+
+ # last_message = "message" if msg else "step"
# 鍚姩涓や釜浠诲姟锛屽垎鍒鐞嗗鎴风鍜屾湇鍔$鐨勬秷鎭�
tasks = [
diff --git a/app/service/bisheng.py b/app/service/bisheng.py
index e8405fd..9be6692 100644
--- a/app/service/bisheng.py
+++ b/app/service/bisheng.py
@@ -2,6 +2,7 @@
from datetime import datetime
import httpx
+from Log import logger
from app.config.config import settings
from app.utils.rsa_crypto import BishengCrypto
@@ -76,6 +77,9 @@
# ]
def process_name(item):
+ # logger.error("-----------------------process_name-------------------------------------")
+ # logger.error(item)
+
message = item.get("latest_message", {}).get("message", "")
name = message
try:
@@ -88,6 +92,15 @@
name = message_json['report_name']
except json.JSONDecodeError:
pass
+ if not name:
+ name = item.get("flow_name")
+ return name
+
+ def process_name_report(item):
+ # logger.error("-----------------------process_name-------------------------------------")
+ # logger.error(item)
+ name = item.get("flow_name", "鎶ュ憡鐢熸垚")
+
return name
result = [
@@ -98,7 +111,7 @@
"updated_time": int(datetime.strptime(item["update_time"], "%Y-%m-%dT%H:%M:%S").timestamp() * 1000)
}
for item in data
- if "latest_message" in item and "message" in item["latest_message"] and item["latest_message"]["message"] and item.get("flow_id") == agent_id
+ if item.get("flow_id") == agent_id #if "latest_message" in item and "message" in item["latest_message"] and item["latest_message"]["message"] and
]
return result
@@ -113,10 +126,12 @@
async with httpx.AsyncClient() as client:
response = await client.get(url, headers=headers)
response.raise_for_status()
+ # print(response.text)
data = self._check_response(response)
session_log = [
{
- "message": message.get("message"),
+ "message": message.get("intermediate_steps", ""),
+ "intermediate_steps": message.get("message", ""),
"role": message.get("category"),
"ts": message.get("create_time")
}
--
Gitblit v1.8.0