import gradio as gr import openai import base64 import os # ✅ 輸入你的 OpenAI API 金鑰 openai.api_key = os.environ.get("OPENAI_API_KEY") # ✅ 圖片轉 base64 def image_to_base64(image_path): with open(image_path, "rb") as img_file: return base64.b64encode(img_file.read()).decode("utf-8") # ✅ GPT-4o 分析餐點圖片 def analyze_diet(image_path, goal, gender, age): try: img_b64 = image_to_base64(image_path) messages = [ { "role": "user", "content": [ { "type": "text", "text": f"這是使用者的餐點圖片。性別:{gender},年齡:{age} 歲,目標:{goal}。請根據圖片中的內容,給出健康分析與一句鼓勵話。格式如下:\n建議:...\n鼓勵:..." }, { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{img_b64}" } } ] } ] response = openai.ChatCompletion.create( model="gpt-4o", messages=messages, temperature=0.7 ) result = response.choices[0].message.content.strip() if "建議:" in result and "鼓勵:" in result: suggestion = result.split("建議:")[1].split("鼓勵:")[0].strip() encouragement = result.split("鼓勵:")[1].strip() else: suggestion = result encouragement = "你的飲食選擇很棒!繼續保持~" return suggestion, encouragement except Exception as e: return "❌ 分析失敗:" + str(e), "" # ✅ 運動分析(仍為文字輸入) def analyze_workout(text, goal, gender, age): prompt = f""" 你是一位健身教練,使用者性別為 {gender},年齡 {age} 歲,目標是「{goal}」。 以下是他的運動紀錄: {text} 請給出運動分析與一句鼓勵話,格式如下: 建議:... 鼓勵:... """ try: response = openai.ChatCompletion.create( model="gpt-4o", messages=[ {"role": "system", "content": "你是一位健身教練"}, {"role": "user", "content": prompt} ], temperature=0.7 ) result = response.choices[0].message.content.strip() if "建議:" in result and "鼓勵:" in result: suggestion = result.split("建議:")[1].split("鼓勵:")[0].strip() encouragement = result.split("鼓勵:")[1].strip() else: suggestion = result encouragement = "保持運動習慣,健康就靠你!" return suggestion, encouragement except Exception as e: return "❌ 分析失敗:" + str(e), "" # ✅ Gradio UI with gr.Blocks() as health_ai: gr.Markdown("# 🧠 我的健康管家 AI") gr.Markdown("上傳你的餐點圖片或輸入運動內容,AI 幫你分析健康狀況並給鼓勵 💪") with gr.Tabs(): with gr.Tab("🍱 飲食分析(圖片)"): diet_input = gr.Image(label="上傳你的餐點圖片", type="filepath") diet_goal = gr.Radio(["減脂", "增肌", "維持體態"], label="你的目標") diet_gender = gr.Radio(["男", "女"], label="你的性別") diet_age = gr.Textbox(label="你的年齡", placeholder="例如:22") diet_button = gr.Button("開始分析") diet_output = gr.Textbox(label="AI 分析建議") diet_encourage = gr.Textbox(label="AI 鼓勵語") with gr.Tab("🏃‍♂️ 運動分析(文字)"): workout_input = gr.Textbox(lines=5, placeholder="例如:慢跑30分鐘,核心訓練15分鐘...") workout_goal = gr.Radio(["減脂", "增肌", "維持體態"], label="你的目標") workout_gender = gr.Radio(["男", "女"], label="你的性別") workout_age = gr.Textbox(label="你的年齡", placeholder="例如:22") workout_button = gr.Button("開始分析") workout_output = gr.Textbox(label="AI 評估與建議") workout_encourage = gr.Textbox(label="AI 鼓勵語") diet_button.click(analyze_diet, inputs=[diet_input, diet_goal, diet_gender, diet_age], outputs=[diet_output, diet_encourage]) workout_button.click(analyze_workout, inputs=[workout_input, workout_goal, workout_gender, workout_age], outputs=[workout_output, workout_encourage]) health_ai.launch()