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