leonsimon23 commited on
Commit
1cd9c4c
·
verified ·
1 Parent(s): 81d5111

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +12 -79
app.py CHANGED
@@ -1,90 +1,23 @@
1
- import os
2
- import requests
3
- import json
4
- from flask import Flask, request, jsonify, send_from_directory
5
 
6
- #app = Flask(__name__, static_folder='static', static_url_path='')
7
- # 正确的行
8
  app = Flask(__name__, static_folder='static', static_url_path='')
9
 
10
- GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
11
- GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent"
12
-
13
- SYSTEM_PROMPT = """
14
- 你是一个世界顶级的皮肤科医生AI助手。你的任务是基于用户上传的皮肤图像和病历文本,进行专业的临床诊疗辅助分析。
15
- 你的输出必须是一个单一、有效的JSON对象,不包含任何JSON格式之外的文字或标记(例如不要使用 "```json")。
16
- 请严格遵循以下JSON结构:
17
- {
18
- "image_features": ["从图像中识别出的关键皮损形态学特征列表", "例如:色素网络不规则", "例如:蓝白结构"],
19
- "differential_diagnosis": [
20
- { "diagnosis": "可能性最高的诊断名称", "likelihood": "高", "evidence": "支持该诊断的关键图像和文本依据" },
21
- { "diagnosis": "可能性次之的诊断名称", "likelihood": "中", "evidence": "支持该诊断的关键依据" }
22
- ],
23
- "comprehensive_analysis": "一段对整个病情的全面、综合性分析和总结。",
24
- "recommendations": {
25
- "further_examinations": ["建议的下一步检查列表", "例如:皮肤镜检查", "例如:皮肤活检"],
26
- "treatment_suggestions": ["初步的、符合临床指南的治疗方向建议列表", "例如:外用糖皮质激素", "例如:建议手术切除"]
27
- }
28
- }
29
- """
30
-
31
- @app.route('/healthz')
32
- def health_check():
33
- """专门用于平台健康检查的路由,确保100%稳定"""
34
- return "OK", 200
35
-
36
  @app.route('/')
37
  def index():
38
  """提供前端HTML页面"""
39
- return send_from_directory(app.static_folder, 'index.html')
40
-
41
- @app.route('/api/analyze', methods=['POST'])
42
- def analyze_skin():
43
- """处理分析请求的核心API端点"""
44
- if not GEMINI_API_KEY:
45
- return jsonify({"error": "服务端未配置GEMINI_API_KEY"}), 500
46
-
47
- data = request.json
48
- if not data or 'image' not in data or 'text' not in data:
49
- return jsonify({"error": "请求中缺少图像或文本信息"}), 400
50
-
51
- image_base64 = data.get('image')
52
- text_prompt = data.get('text')
53
-
54
- headers = {'Content-Type': 'application/json'}
55
-
56
- payload = {
57
- "contents": [{"parts": [
58
- {"text": SYSTEM_PROMPT},
59
- {"text": f"临床病历信息如下:\n{text_prompt}"},
60
- {"inline_data": {"mime_type": "image/jpeg", "data": image_base64}}
61
- ]}]
62
- }
63
-
64
  try:
65
- response = requests.post(f"{GEMINI_API_URL}?key={GEMINI_API_KEY}", headers=headers, json=payload, timeout=60)
66
- response.raise_for_status()
67
-
68
- gemini_result = response.json()
69
-
70
- # 稳健地提取内容
71
- analysis_content_string = gemini_result['candidates']['content']['parts']['text']
72
- parsed_json = json.loads(analysis_content_string)
73
-
74
- return jsonify(parsed_json)
75
-
76
- except requests.exceptions.RequestException as e:
77
- return jsonify({"error": f"调用Gemini API时发生网络错误: {e}"}), 500
78
- except (KeyError, IndexError, TypeError):
79
- error_details = response.json() if 'response' in locals() else "No response from API"
80
- return jsonify({"error": "解析Gemini API响应失败,格式不正确", "details": error_details}), 500
81
- except json.JSONDecodeError:
82
- return jsonify({"error": "Gemini API未返回有效的JSON格式", "details": analysis_content_string}), 500
83
  except Exception as e:
84
- return jsonify({"error": f"发生未知错误: {e}"}), 500
85
 
86
- #if __name__ == '__main__':
87
- #app.run(host='0.0.0.0', port=8080)
88
 
 
 
 
 
 
 
89
  if __name__ == '__main__':
90
- app.run(host='0.0.0.0', port=8080, debug=True) # 本地测试时可以加上 debug=True
 
1
+ from flask import Flask, send_from_directory
 
 
 
2
 
3
+ # 使用一个绝对不会出错的最简化的 Flask 应用
 
4
  app = Flask(__name__, static_folder='static', static_url_path='')
5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  @app.route('/')
7
  def index():
8
  """提供前端HTML页面"""
9
+ # 就算 index.html 不存在或路径错误,这里也只会返回 404,不会让服务崩溃
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  try:
11
+ return send_from_directory(app.static_folder, 'index.html')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  except Exception as e:
13
+ return f"Error finding index.html: {e}", 404
14
 
 
 
15
 
16
+ @app.route('/healthz')
17
+ def health_check():
18
+ """一个健康的、永远返回 OK 的端点"""
19
+ return "OK", 200
20
+
21
+ # 注意:下面的 __main__ 块在 Gunicorn 部署时不会运行,仅用于本地调试
22
  if __name__ == '__main__':
23
+ app.run(host='0.0.0.0', port=8080)