This commit is contained in:
2025-08-19 11:31:30 +08:00
parent 802b604a0b
commit ebc42552c4

View File

@@ -1,8 +1,14 @@
import json import json
import uuid import uuid
import time
import logging
import requests import requests
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# 服务器地址 # 服务器地址
BASE_URL = "http://localhost:8000" BASE_URL = "http://localhost:8000"
CHAT_ENDPOINT = f"{BASE_URL}/api/chat" CHAT_ENDPOINT = f"{BASE_URL}/api/chat"
@@ -11,10 +17,23 @@ CHAT_ENDPOINT = f"{BASE_URL}/api/chat"
USER_ID = "test_user_123" USER_ID = "test_user_123"
# 会话ID固定一个以便模拟多轮对话 # 会话ID固定一个以便模拟多轮对话
SESSION_ID = str(uuid.uuid4()) SESSION_ID = str(uuid.uuid4())
# 防止重复发送的时间间隔(秒)
MIN_QUERY_INTERVAL = 1
# 上次查询时间
last_query_time = 0
def send_message(query): def send_message(query):
"""发送消息到聊天API并接收流式响应""" """发送消息到聊天API并接收流式响应"""
global last_query_time
current_time = time.time()
# 检查查询间隔
if current_time - last_query_time < MIN_QUERY_INTERVAL:
print(f"\n请等待 {MIN_QUERY_INTERVAL} 秒后再发送消息")
return
last_query_time = current_time
headers = { headers = {
"Content-Type": "application/json" "Content-Type": "application/json"
} }
@@ -29,32 +48,55 @@ def send_message(query):
try: try:
print(f"\n你: {query}") print(f"\n你: {query}")
print("老师: ", end="", flush=True) print("老师: ", end="", flush=True)
logger.info(f"发送查询: {query}")
# 发送POST请求使用stream=True以流式接收响应 # 发送POST请求使用stream=True以流式接收响应
with requests.post(CHAT_ENDPOINT, json=data, headers=headers, stream=True) as response: with requests.post(CHAT_ENDPOINT, json=data, headers=headers, stream=True, timeout=30) as response:
if response.status_code == 200: if response.status_code == 200:
# 逐行处理流式响应 # 逐行处理流式响应
for line in response.iter_lines(): for line in response.iter_lines():
if line: if line:
# 去掉前缀'data: ' # 去掉前缀'data: '
line = line.decode('utf-8').replace('data: ', '') line_str = line.decode('utf-8').strip()
if line_str.startswith('data:'):
line_str = line_str.replace('data:', '')
# 处理[DONE]标记
if line_str == '[DONE]':
break
if not line_str: # 跳过空行
continue
try: try:
# 解析JSON # 解析JSON
data = json.loads(line) data = json.loads(line_str)
if 'reply' in data: if 'reply' in data:
print(data['reply'], end="", flush=True) print(data['reply'], end="", flush=True)
elif 'error' in data: elif 'error' in data:
print(f"\n错误: {data['error']}") print(f"\n错误: {data['error']}")
logger.error(f"API错误: {data['error']}")
else:
print(f"\n未知响应格式: {data}")
logger.warning(f"未知响应格式: {data}")
except json.JSONDecodeError: except json.JSONDecodeError:
# 非JSON格式的响应 # 非JSON格式的响应
print(f"\n无法解析的响应: {line}") print(f"\n无法解析的响应: {line_str}")
logger.error(f"无法解析的响应: {line_str}")
print() # 换行 print() # 换行
else: else:
print(f"\n请求失败,状态码: {response.status_code}") error_msg = f"请求失败,状态码: {response.status_code},错误信息: {response.text}"
print(f"错误信息: {response.text}") print(f"\n{error_msg}")
logger.error(error_msg)
except requests.exceptions.RequestException as e: except requests.exceptions.RequestException as e:
print(f"\n请求异常: {str(e)}") error_msg = f"请求异常: {str(e)}"
print(f"\n{error_msg}")
logger.error(error_msg)
except Exception as e:
error_msg = f"发生未知错误: {str(e)}"
print(f"\n{error_msg}")
logger.exception(error_msg)
def main(): def main():
@@ -62,6 +104,7 @@ def main():
print("===== 教育助手对话系统 =====") print("===== 教育助手对话系统 =====")
print("请输入您的问题,比如:帮我讲解一下勾股定理的证明。输入'退出'结束对话") print("请输入您的问题,比如:帮我讲解一下勾股定理的证明。输入'退出'结束对话")
print("===========================") print("===========================")
logger.info("教育助手对话系统已启动")
while True: while True:
try: try:
@@ -71,6 +114,7 @@ def main():
# 检查是否退出 # 检查是否退出
if query.strip() == '退出': if query.strip() == '退出':
print("对话已结束,再见!") print("对话已结束,再见!")
logger.info("对话已结束")
break break
# 发送消息 # 发送消息
@@ -78,9 +122,12 @@ def main():
except KeyboardInterrupt: except KeyboardInterrupt:
print("\n程序被中断,再见!") print("\n程序被中断,再见!")
logger.info("程序被用户中断")
break break
except Exception as e: except Exception as e:
print(f"\n发生错误: {str(e)}") error_msg = f"发生错误: {str(e)}"
print(f"\n{error_msg}")
logger.exception(error_msg)
if __name__ == "__main__": if __name__ == "__main__":