Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from groq import Groq | |
| import base64 | |
| import io | |
| from PIL import Image | |
| def encode_image(image): | |
| """將 PIL Image 編碼為 base64 字符串""" | |
| buffered = io.BytesIO() | |
| image.save(buffered, format="JPEG") | |
| return base64.b64encode(buffered.getvalue()).decode("utf-8") | |
| def analyze_image(api_key, image, prompt, temperature=1, max_tokens=512): | |
| """使用 Groq API 分析圖片""" | |
| try: | |
| # 檢查 API Key 是否為空 | |
| if not api_key or api_key.strip() == "": | |
| return "錯誤:請輸入有效的 Groq API Key" | |
| # 檢查圖片是否上傳 | |
| if image is None: | |
| return "錯誤:請上傳一張圖片" | |
| # 檢查 prompt 是否為空 | |
| if not prompt or prompt.strip() == "": | |
| return "錯誤:請輸入分析提示文字" | |
| # 初始化 Groq 客戶端 | |
| client = Groq(api_key=api_key.strip()) | |
| # 編碼圖片 | |
| base64_image = encode_image(image) | |
| image_content = { | |
| "type": "image_url", | |
| "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"} | |
| } | |
| # 發送請求到 Groq API | |
| completion = client.chat.completions.create( | |
| model="meta-llama/llama-4-scout-17b-16e-instruct", | |
| messages=[{ | |
| "role": "user", | |
| "content": [ | |
| { | |
| "type": "text", | |
| "text": prompt | |
| }, | |
| image_content | |
| ] | |
| }], | |
| temperature=temperature, | |
| max_completion_tokens=max_tokens, | |
| top_p=1, | |
| stream=False, | |
| stop=None, | |
| ) | |
| # 返回分析結果 | |
| return completion.choices[0].message.content | |
| except Exception as e: | |
| return f"錯誤:{str(e)}" | |
| # 創建 Gradio 界面 | |
| with gr.Blocks(title="Groq 圖片分析器", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown( | |
| """ | |
| # 🔍 Groq 圖片分析器 | |
| 使用 Groq API 和 Llama-4-Scout 模型來分析圖片內容 | |
| **使用說明:** | |
| 1. 輸入您的 Groq API Key | |
| 2. 上傳要分析的圖片 | |
| 3. 輸入分析提示文字 | |
| 4. 調整參數(可選) | |
| 5. 點擊「分析圖片」按鈕 | |
| """ | |
| ) | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| # API Key 輸入 | |
| api_key = gr.Textbox( | |
| label="Groq API Key", | |
| placeholder="輸入您的 Groq API Key (例: gsk_...)", | |
| type="password", | |
| info="您的 API Key 將被安全處理,不會被儲存" | |
| ) | |
| # 圖片上傳 | |
| image = gr.Image( | |
| label="上傳圖片", | |
| type="pil", | |
| format="jpeg" | |
| ) | |
| # Prompt 輸入 | |
| prompt = gr.Textbox( | |
| label="分析提示", | |
| placeholder="請描述您想要分析的內容...", | |
| lines=5, | |
| value="""幫我算出有幾個人和大象,同時說明 | |
| 這可能是什麼儀式? | |
| 天氣和季節在某個時段? | |
| 在什麼國家?""" | |
| ) | |
| # 進階參數 | |
| with gr.Accordion("進階設定", open=False): | |
| temperature = gr.Slider( | |
| label="Temperature (創意度)", | |
| minimum=0.1, | |
| maximum=2.0, | |
| value=1.0, | |
| step=0.1, | |
| info="數值越高,回答越有創意但可能不太準確" | |
| ) | |
| max_tokens = gr.Slider( | |
| label="最大回應長度", | |
| minimum=100, | |
| maximum=2048, | |
| value=512, | |
| step=50, | |
| info="限制回應的最大字數" | |
| ) | |
| # 分析按鈕 | |
| analyze_btn = gr.Button( | |
| "🔍 分析圖片", | |
| variant="primary", | |
| size="lg" | |
| ) | |
| with gr.Column(scale=1): | |
| # 分析結果輸出 | |
| output = gr.Textbox( | |
| label="分析結果", | |
| lines=20, | |
| max_lines=30, | |
| show_copy_button=True, | |
| placeholder="分析結果將顯示在這裡..." | |
| ) | |
| # 綁定事件 | |
| analyze_btn.click( | |
| fn=analyze_image, | |
| inputs=[api_key, image, prompt, temperature, max_tokens], | |
| outputs=output | |
| ) | |
| # 示例區域 | |
| gr.Markdown( | |
| """ | |
| ## 💡 提示範例 | |
| **分析人物和動物:** | |
| - "請計算圖片中有多少人和動物,並描述他們在做什麼" | |
| **場景描述:** | |
| - "描述這張圖片的場景,包括時間、地點、天氣狀況" | |
| **文化分析:** | |
| - "這看起來像什麼文化活動或儀式?可能在哪個國家或地區?" | |
| **物體識別:** | |
| - "識別圖片中的所有物體並說明它們的用途" | |
| """ | |
| ) | |
| # 啟動應用 | |
| if __name__ == "__main__": | |
| demo.launch( | |
| server_name="0.0.0.0", | |
| server_port=7860, | |
| share=True, | |
| debug=False | |
| ) |