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