import gradio as gr from groq import Groq from twilio.rest import Client import base64 import io from PIL import Image def encode_image(image): """將PIL圖片編碼為base64字符串""" buffered = io.BytesIO() image.save(buffered, format="JPEG") return base64.b64encode(buffered.getvalue()).decode("utf-8") def analyze_and_send_sms( image, groq_api_key, account_sid, auth_token, from_number, to_number, custom_message="" ): """ 分析圖片並發送SMS訊息 Args: image: 上傳的圖片 groq_api_key: Groq API金鑰 account_sid: Twilio帳戶SID auth_token: Twilio認證令牌 from_number: Twilio虛擬手機號碼 to_number: 接收SMS的手機號碼 custom_message: 自定義訊息內容 Returns: tuple: (圖片分析結果, SMS發送狀態) """ try: # 步驟1: 使用Groq分析圖片 if image is None: return "錯誤:請上傳圖片", "未發送SMS" if not groq_api_key: return "錯誤:請輸入Groq API金鑰", "未發送SMS" # 編碼圖片 base64_image = encode_image(image) image_content = { "type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"} } # 設定提示詞 prompt = "解釋圖片的內容,10個字說明,使用繁體中文。" # 建立Groq客戶端 groq_client = Groq(api_key=groq_api_key) # 呼叫Groq API completion = groq_client.chat.completions.create( model="meta-llama/llama-4-scout-17b-16e-instruct", messages=[{ "role": "user", "content": [ {"type": "text", "text": prompt}, image_content ] }], temperature=1, max_completion_tokens=512, top_p=1, stream=False, stop=None, ) # 取得圖片分析結果 analysis_result = completion.choices[0].message.content # 步驟2: 發送SMS if not all([account_sid, auth_token, from_number, to_number]): return analysis_result, "錯誤:請填入所有Twilio設定" # 準備SMS內容 if custom_message: sms_body = custom_message else: sms_body = f"圖片分析結果:{analysis_result}" # 建立Twilio客戶端 twilio_client = Client(account_sid, auth_token) # 發送SMS message = twilio_client.messages.create( from_=from_number, to=to_number, body=sms_body ) sms_status = f"SMS發送成功!訊息SID: {message.sid}" return analysis_result, sms_status except Exception as e: error_msg = f"發生錯誤: {str(e)}" return error_msg, "SMS發送失敗" # 建立Gradio介面 with gr.Blocks(title="圖片分析與SMS發送應用") as demo: gr.Markdown("# 圖片分析與SMS發送應用") gr.Markdown("上傳圖片進行AI分析,並可選擇發送分析結果到手機") with gr.Row(): with gr.Column(): # 圖片上傳 image_input = gr.Image( type="pil", label="上傳圖片", height=300 ) # Groq API設定 groq_key = gr.Textbox( label="Groq API金鑰", type="password", placeholder="輸入您的Groq API金鑰" ) with gr.Column(): # Twilio設定 account_sid = gr.Textbox( label="Twilio Account SID", placeholder="ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ) auth_token = gr.Textbox( label="Twilio Auth Token", type="password", placeholder="輸入您的Twilio認證令牌" ) from_number = gr.Textbox( label="Twilio虛擬手機號碼", placeholder="+1xxxxxxxxxx" ) to_number = gr.Textbox( label="接收SMS的手機號碼", placeholder="+886xxxxxxxxx" ) custom_message = gr.Textbox( label="自定義訊息內容 (選填)", placeholder="留空則自動使用圖片分析結果", lines=3 ) # 執行按鈕 analyze_button = gr.Button("分析圖片並發送SMS", variant="primary") # 輸出結果 with gr.Row(): analysis_output = gr.Textbox( label="圖片分析結果", interactive=False ) sms_output = gr.Textbox( label="SMS發送狀態", interactive=False ) # 設定按鈕點擊事件 analyze_button.click( fn=analyze_and_send_sms, inputs=[ image_input, groq_key, account_sid, auth_token, from_number, to_number, custom_message ], outputs=[analysis_output, sms_output] ) # 使用範例 gr.Markdown(""" ## 使用說明: 1. **上傳圖片**:選擇要分析的圖片檔案 2. **輸入Groq API金鑰**:從Groq官網取得您的API金鑰 3. **設定Twilio參數**: - Account SID:您的Twilio帳戶識別碼 - Auth Token:您的Twilio認證令牌 - 虛擬手機號碼:Twilio提供的發送號碼 - 接收手機號碼:要接收SMS的號碼 4. **自定義訊息**(選填):如果留空,會自動發送圖片分析結果 5. **點擊執行**:系統會分析圖片並發送SMS ## 注意事項: - 請確保Twilio帳戶有足夠餘額 - 手機號碼需包含國碼(如台灣:+886) - API金鑰請妥善保管,勿洩露給他人 """) # 啟動應用程式 if __name__ == "__main__": demo.launch( share=False, # 設為True可產生公開連結 debug=True, # 移除固定端口設定,讓Gradio自動尋找可用端口 )