zhaoqingang
2024-12-02 f249dda1376dd5a525e74617900351c5bbc61705
报告生成
4个文件已修改
149 ■■■■ 已修改文件
app/api/agent.py 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/api/chat.py 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/api/report.py 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/service/bisheng.py 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 对象,如果是json取其中的question字段,或者report_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 = {}
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", ""),
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 = [
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")
                }