Spaces:
Sleeping
Sleeping
| from flask import Flask, render_template, request, jsonify, session | |
| import base64 | |
| import io | |
| import os | |
| import json | |
| from PIL import Image | |
| from service import Service | |
| app = Flask(__name__) | |
| app.secret_key = os.urandom(24) # 用于session加密 | |
| # 初始化服务 | |
| service = Service() | |
| # 确保目录存在 | |
| if not os.path.exists('static'): | |
| os.makedirs('static') | |
| if not os.path.exists('static/uploads'): | |
| os.makedirs('static/uploads') | |
| def index(): | |
| """渲染主页""" | |
| return render_template('index.html') | |
| def chat(): | |
| """处理聊天请求""" | |
| data = request.json | |
| prompt = data.get('message', '') | |
| image_data = data.get('image', None) | |
| history = data.get('history', []) | |
| # 确保历史记录包含系统提示 | |
| has_system_prompt = False | |
| for msg in history: | |
| if msg.get('role') == 'system': | |
| has_system_prompt = True | |
| break | |
| if not has_system_prompt: | |
| # 添加默认的系统提示 | |
| history.insert(0, { | |
| "role": "system", | |
| "content": "你是一个AI度量专家助手。你可以分析文本和图像的内容。能根据用户的需求,给出度量建议和洞察" | |
| }) | |
| try: | |
| if image_data: | |
| # 使用图像调用API | |
| response = service.chat_with_image( | |
| text_prompt=prompt, | |
| image_base64=image_data, | |
| history=history | |
| ) | |
| else: | |
| # 添加当前用户消息 | |
| current_history = history.copy() | |
| current_history.append({"role": "user", "content": prompt}) | |
| # 纯文本请求 | |
| response = service.get_response(current_history) | |
| return jsonify({ | |
| 'status': 'success', | |
| 'response': response | |
| }) | |
| except Exception as e: | |
| return jsonify({ | |
| 'status': 'error', | |
| 'message': str(e) | |
| }), 500 | |
| def upload_image(): | |
| """处理图片上传""" | |
| if 'file' not in request.files: | |
| return jsonify({'status': 'error', 'message': '没有文件'}) | |
| file = request.files['file'] | |
| if file.filename == '': | |
| return jsonify({'status': 'error', 'message': '没有选择文件'}) | |
| if file: | |
| filename = f"upload_{os.urandom(8).hex()}.png" | |
| filepath = os.path.join('static/uploads', filename) | |
| # 保存文件 | |
| file.save(filepath) | |
| # 读取文件并转为base64 | |
| with open(filepath, "rb") as img_file: | |
| img_str = base64.b64encode(img_file.read()).decode('utf-8') | |
| image_data = f"data:image/png;base64,{img_str}" | |
| return jsonify({ | |
| 'status': 'success', | |
| 'image_data': image_data, | |
| 'image_url': f"/static/uploads/{filename}" | |
| }) | |
| def paste_image(): | |
| """处理粘贴的图片""" | |
| data = request.json | |
| image_data = data.get('image_data') | |
| if not image_data or not image_data.startswith('data:image'): | |
| return jsonify({'status': 'error', 'message': '无效的图片数据'}) | |
| try: | |
| # 从base64解码 | |
| image_data_parts = image_data.split(',') | |
| if len(image_data_parts) != 2: | |
| return jsonify({'status': 'error', 'message': '图片格式错误'}) | |
| # 保存图片到文件 | |
| filename = f"paste_{os.urandom(8).hex()}.png" | |
| filepath = os.path.join('static/uploads', filename) | |
| image_bytes = base64.b64decode(image_data_parts[1]) | |
| with open(filepath, "wb") as f: | |
| f.write(image_bytes) | |
| return jsonify({ | |
| 'status': 'success', | |
| 'image_data': image_data, | |
| 'image_url': f"/static/uploads/{filename}" | |
| }) | |
| except Exception as e: | |
| return jsonify({'status': 'error', 'message': str(e)}) | |
| if __name__ == '__main__': | |
| app.run(debug=True, port=5000) |