Multitwilio / app.py
jerrychen428's picture
Update app.py
ec593e6 verified
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自動尋找可用端口
)