suanming / app.py
mistpe's picture
Update app.py
ba1e087 verified
from flask import Flask, render_template, request, Response
from openai import OpenAI
from dotenv import load_dotenv
import os
import json
from datetime import datetime
load_dotenv()
app = Flask(__name__)
client = OpenAI(
api_key=os.getenv('OPENAI_API_KEY'),
base_url=os.getenv('OPENAI_BASE_URL')
)
class ChatBot:
def __init__(self):
self.messages = []
# 加载系统提示词
self.system_prompt = self.load_system_prompt()
def load_system_prompt(self):
# 从文件加载系统提示词
try:
with open('system_prompt.txt', 'r', encoding='utf-8') as file:
return file.read()
except Exception as e:
print(f"Error loading system prompt: {e}")
return ""
def format_birth_info(self, birth_info):
"""格式化出生信息用于分析"""
try:
birth_date = datetime.strptime(birth_info['date'], '%Y年%m月%d日')
formatted_date = birth_date.strftime('%Y年%m月%d日')
return f"{formatted_date} {birth_info['time']}"
except Exception as e:
print(f"Error formatting birth info: {e}")
return birth_info['raw']
def prepare_analysis_prompt(self, user_data):
"""准备用于分析的完整提示词"""
birth_info = self.format_birth_info(user_data['birth_info'])
analysis_prompt = f"""根据以下信息进行命理分析:
出生信息:{birth_info}
咨询问题:{user_data['question']}
请基于此信息,结合八字、紫微斗数等进行分析。"""
return analysis_prompt
def get_stream_response(self, user_input):
"""处理用户输入并生成流式响应"""
try:
# 解析用户输入的JSON数据
user_data = json.loads(user_input)
# 如果是新的对话,添加系统提示词
if not self.messages:
self.messages.append({"role": "system", "content": self.system_prompt})
# 准备分析提示词
analysis_prompt = self.prepare_analysis_prompt(user_data)
self.messages.append({"role": "user", "content": analysis_prompt})
# 创建流式响应
response = client.chat.completions.create(
model=os.getenv('OPENAI_MODEL'),
messages=self.messages,
stream=True,
temperature=0.7,
max_tokens=2000
)
for chunk in response:
if chunk.choices[0].delta.content:
yield f"data: {json.dumps({'content': chunk.choices[0].delta.content})}\n\n"
# 保存完整对话到历史记录
full_response = ''.join(chunk.choices[0].delta.content or ''
for chunk in response)
self.messages.append({"role": "assistant", "content": full_response})
except Exception as e:
yield f"data: {json.dumps({'error': str(e)})}\n\n"
chatbot = ChatBot()
@app.route('/')
def home():
return render_template('index.html')
@app.route('/chat', methods=['POST'])
def chat():
try:
user_message = request.get_json()
return Response(
chatbot.get_stream_response(json.dumps(user_message)),
mimetype='text/event-stream'
)
except Exception as e:
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860, debug=False)