Просмотр исходного кода

modify:增加字节错误代码情况

zhusc 3 месяцев назад
Родитель
Сommit
ab30e2d771
1 измененных файлов с 91 добавлено и 21 удалено
  1. 91 21
      coze_bot_api.py

+ 91 - 21
coze_bot_api.py

@@ -11,17 +11,20 @@ Create Date: 2021/6/19
 """
 import re
 import time
-
-from django.db.models.fields import return_None
-from fastapi import FastAPI, Response, Request, BackgroundTasks
+import sys
+from fastapi import FastAPI, Response, Request, BackgroundTasks, Body
 from WXBizMsgCrypt3 import WXBizMsgCrypt
 from xml.etree.ElementTree import fromstring
 import uvicorn
 import requests
 import json
 
+from commom import get_logger
+
+logger = get_logger()
+
 # 加载配置文件
-with open('config.json', 'r') as f:
+with open('cqrcb_config.json', 'r') as f:
     config = json.load(f)
 
 # 从配置文件中提取参数
@@ -31,7 +34,7 @@ corpid = config['corpid']
 corpsecret = config['corpsecret']
 coze_access_token = config['coze_access_token']
 bot_id = config['bot_id']
-port = config['port']
+#port = config['port']
 
 
 # token = "EcSp"#企业微信应用api信息
@@ -74,6 +77,7 @@ def call_llm(prompt: str, bot_id: str,coze_access_token:str):
         "user_id": "123456789",
         "stream": False,
         "auto_save_history": True,
+
         "additional_messages": [
             {
                 "role": "user",
@@ -88,16 +92,38 @@ def call_llm(prompt: str, bot_id: str,coze_access_token:str):
     chat_id = res_chat.json()["data"]["id"]
     while True:
         res_retrieve = requests.get(f" https://api.coze.cn/v3/chat/retrieve?chat_id={chat_id}&conversation_id={conversation_id}", headers=req_head)
-        print(res_retrieve.json()["data"]["status"])
-        status = res_retrieve.json()["data"]["status"]
+        res_json = res_retrieve.json()
+        # 首先判断状态码是否为0
+        if res_retrieve.status_code != 200:
+            logger.error(f"网络状态码失败,错误码:{res_retrieve.status_code }")
+            coze_response = f"网络状态码失败,错误码:{res_retrieve.status_code }"
+            return coze_response
+        # 首先判断状态码是否为0
+        if res_json["code"] != 0 :
+            logger.error(f"API调用失败,错误码:{res_json['code']}")
+            coze_response = f"API调用失败,错误码:{res_json['code']}"
+            return coze_response
+        # 打印并记录状态
+        logger.info(res_json["data"]["status"])
+        status = res_json["data"]["status"]
+        # 检查是否为错误状态
+        error_statuses = {"failed", "requires_action", "canceled"}
+        if status in error_statuses:
+            error_message = res_json["data"]["last_error"]
+            logger.error(f"对话错误,状态:{status},错误信息:{error_message}")
+            coze_response = f"对话错误,状态:{status},错误信息:{error_message}"
+            return coze_response
+        # 如果状态为completed,则获取消息
         if status == "completed":
-            res_message = requests.get(f" https://api.coze.cn/v3/chat/message/list?chat_id={chat_id}&conversation_id={conversation_id}", headers=req_head)
-            # print(res_message.json())
-            return res_message.json()
+            res_message = requests.get(f"https://api.coze.cn/v3/chat/message/list?chat_id={chat_id}&conversation_id={conversation_id}", headers=req_head)
+            coze_response = res_message.json()['data'][1]['content'].replace(" ", "")  # v3 删除图片url中的空格
+            # coze_response = coze_response['data'][1]['content'].replace(" ", "")  # v3 删除图片url中的空格
+            return coze_response
         time.sleep(1)
 
 
 
+
 def qiwei_get():
     res = requests.get(f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}")
     qw_access_token = res.json()["access_token"]
@@ -120,19 +146,44 @@ def qiwei_post(username: str, answer: str,agentid:str):
             "duplicate_check_interval": 1800
     }
     res = requests.post(f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={qiwei_get()}", json=req_data)
-    print(res.json())
+    # print(res.json())
+    logger.info(res.json())
     #return res.json()
 
+#问题传入字节服务器进行回答后发送给企业微信,行内服务器只进行接收然后发给字节,防止网络延迟
+def post_consumer_api(user_query, decrypt_data):
+    data = {
+        "user_query": user_query,
+        "decrypt_data": decrypt_data
+    }
+    url = "https://101.126.81.2:18088/consumer"
+    try:
+        response = requests.post(url, json=data, verify=False)  # 忽略SSL证书验证
+        response.raise_for_status()  # 检查响应状态码是否为200
+        logger.info(f"post_consumer_api 请求成功: {response.json()}")
+    except requests.exceptions.RequestException as e:
+        logger.error(f"post_consumer_api 请求失败: {e}")
+
+@app.post("/consumer")
+async def consumer(
+request: Request
+):
+    # print(f"请求:{user_query}")
+
+    body = await request.body()
+    body = body.decode()
+    body = json.loads(body)
+    user_query = body["user_query"]
+    decrypt_data = body["decrypt_data"]
 
 
-def consumer(user_query,decrypt_data):
-    print(f"请求:{user_query}")
+    logger.info(f"consumer 请求:{user_query}")
     username = decrypt_data.get('FromUserName', '')
     agentid = decrypt_data.get('AgentID', '')
     # 返回coze结果
     coze_response = call_llm(prompt=user_query,bot_id=bot_id,coze_access_token = coze_access_token)
     # answer = coze_response['messages'][1]['content']#v2
-    answer = coze_response['data'][1]['content'].replace(" ","") #v3 删除图片url中的空格
+    # answer = coze_response['data'][1]['content'].replace(" ","") #v3 删除图片url中的空格
 
     ##处理图片链接
     image_counter = 1
@@ -145,15 +196,19 @@ def consumer(user_query,decrypt_data):
         image_counter += 1
         return replacement
     # 将Markdown格式的图片链接转换为HTML格式的文字链接,并添加序号
-    answer = re.sub(r'!\[(.*?)\]\((https?://[^)]+)\)', replace_with_counter, answer)
+    answer = re.sub(r'!\[(.*?)\]\((https?://[^)]+)\)', replace_with_counter, coze_response)
 
-    print(f"结果:{answer}")
+    # print(f"结果:{answer}")
+    logger.info(f"结果:{answer}")
     # 主动发结果给qiwei
     qiwei_post(username, answer, agentid)
 
-# @app.get("/ok")
-# async def ok():
-#     return "ok"
+
+
+
+@app.get("/ok")
+async def ok():
+    return "ok"
 
 
 @app.get("/bot")
@@ -162,7 +217,8 @@ async def verify(msg_signature: str, timestamp: str, nonce: str, echostr: str):
     if ret == 0:
         return Response(content=sEchoStr.decode('utf-8'))
     else:
-        print(sEchoStr)
+        # print(sEchoStr)
+        logger.info(sEchoStr)
 
 @app.post("/bot")
 async def recv(msg_signature: str, timestamp: str, nonce: str, request: Request, background_tasks: BackgroundTasks):
@@ -173,7 +229,15 @@ async def recv(msg_signature: str, timestamp: str, nonce: str, request: Request,
     for node in list(fromstring(sMsg.decode('utf-8'))):
         decrypt_data[node.tag] = node.text
     user_query = decrypt_data.get('Content', '')
-    background_tasks.add_task(consumer, user_query, decrypt_data)
+    logger.info(f"start: {user_query}")
+    background_tasks.add_task(post_consumer_api, user_query, decrypt_data)
+    # data = {
+    #     "user_query":user_query,
+    #     "decrypt_data":decrypt_data
+    # }
+    # requests.post(
+    #     f"https://101.126.81.2:18066/consumer",
+    #     data=data)
     return Response(content="")
 
 
@@ -182,4 +246,10 @@ async def recv(msg_signature: str, timestamp: str, nonce: str, request: Request,
 if __name__ == "__main__":
     # coze_response = call_llm(prompt="房快贷是什么",bot_id=bot_id,coze_access_token = coze_access_token)
     # print(coze_response)
+    try:
+        port = sys.argv[1]
+        int(port)
+    except:
+        port = 18088
+    logger.info(f'{port=}')
     uvicorn.run("coze_bot_api:app", port=port, host='0.0.0.0', reload=False,ssl_keyfile="./key.pem", ssl_certfile="./cert.pem")