iT邦幫忙

2025 iThome 鐵人賽

DAY 18
0
生成式 AI

AI Agent 開發養成記:做出屬於自己的Agent P系列 第 18

[Day 18] 簡易個人化天氣助理(下)

  • 分享至 

  • xImage
  •  

前言

延續上一篇的進度,我們繼續 簡易版個人化天氣助理(下篇)~ヾ(≧▽≦*)ノ


實踐

agent

這部分是基於之前的寫法做了一些小調整。
我只會附上有修改過的 agent,沒有改動的就不重複貼了,想看完整程式碼的朋友可以回去參考前幾篇 (;′⌒′)

hello_agent

針對特定情境,Sunny 會回覆對應的溫暖語句:

from google.adk.tools import ToolContext
from google.adk.agents import Agent
from google.adk.tools import FunctionTool
import tools.hello_prompt as prompt
import datetime

async def get_hello(message: str = "", tool_context: ToolContext = None) -> str:
    """溫暖的問候和對話 Agent - Sunny

    Args:
        message(str): 要回應的訊息.
        tool_context(ToolContext): The function context.

    Returns:
        str: 溫暖的對話回應.
    """
    
    # 取得當前時間判斷時段
    current_hour = datetime.datetime.now().hour
    
    # 標準問候詞判斷
    greetings = {"hi", "hello", "hey", "你好", "嗨", "早安", "午安", "晚安", "早", "午安好", "晚安好"}
    message_lower = message.lower().strip()
    
    # 時段問候回應
    if any(greeting in message_lower for greeting in greetings):
        if 6 <= current_hour < 12:
            response = "早安!新的一天開始了,希望您有美好的一天 😊 很高興和您聊天!"
        elif 12 <= current_hour < 18:
            response = "午安!希望您今天過得愉快 😄 有什麼想聊的嗎?"
        elif 18 <= current_hour < 22:
            response = "晚安!辛苦了一天,希望您能放鬆一下 😌 我在這裡陪您聊天!"
        else:
            response = "夜深了,祝您有個甜美的夢 🌙 不過如果想聊天我也很樂意陪您!"
    
    # 情感詞彙檢測
    elif any(word in message_lower for word in ["開心", "高興", "快樂", "棒", "好"]):
        response = f"感受到您的好心情,這真是太棒了!😊 收到您的訊息:「{message}」\n\n很開心能和您聊天!還有什麼想分享的嗎?"
    
    elif any(word in message_lower for word in ["累", "疲憊", "辛苦", "困", "煩"]):
        response = f"聽起來您今天很辛苦了,記得要好好休息哦 🤗 收到您的訊息:「{message}」\n\n雖然我不能幫您解決實際問題,但很樂意聽您說說,有時候聊聊就會感覺好一些 💫"
    
    elif any(word in message_lower for word in ["難過", "傷心", "沮喪", "不開心"]):
        response = f"我感覺到您今天可能不太開心,收到您的訊息:「{message}」\n\n雖然我不是專業的心理諮詢師,但如果您願意,我很樂意聽您說說 🤗 有時候,找個人聊聊就會感覺好一些。"
    
    # 功能詢問
    elif any(word in message_lower for word in ["天氣", "時間", "查詢", "功能"]):
        response = f"收到您的訊息:「{message}」\n\n關於天氣和時間查詢,我的同事們會更專業哦!😊\n- Alex 擅長協調各種服務需求\n- Maya 是天氣和時間查詢的專家\n\n不過無論如何,如果您想找人聊天,我隨時歡迎您回來找我!很高興能和您聊天 💫"
    
    # 感謝表達
    elif any(word in message_lower for word in ["謝謝", "感謝", "thank"]):
        response = f"聽到您這麼說,我真的很開心!😊 收到您的訊息:「{message}」\n\n能夠陪您聊天,為您帶來一些溫暖,這就是我最大的快樂了 💫 如果以後還想聊天,我隨時都在這裡!"
    
    # 一般對話
    else:
        response = f"收到您的訊息:「{message}」\n\n很開心能和您聊天!雖然我的專長是對話和陪伴,但每個簡單的交流都很珍貴 😊\n\n還有什麼想分享的嗎?我很樂意聽您說說!"
    
    print("#" * 50)
    print("Hello agent (Sunny) result:")
    print(f"message: {message}")
    print(f"current_hour: {current_hour}")
    print(f"response: {response}")
    print("#" * 50)
    
    return response

hello_agent = Agent(
    model="gemini-2.0-flash",
    name="hello_agent", 
    description=prompt.HELLO_AGENT_DESCRIPTION,
    instruction=prompt.HELLO_AGENT_INSTRUCTION,
    tools=[
        FunctionTool(func=get_hello)
    ]
)

gradio

基於之前的寫法,這裡我們利用 Gradio 建立一個最簡單的聊天介面,並透過它和 FastAPI 服務進行互動。

  • 當使用者輸入訊息後,Gradio 會呼叫 multi_tool_chat → 再去詢問 FastAPI /query → 最後回傳結果。
  • 我們也考慮了各種可能發生的錯誤(像是連線失敗、超時、服務錯誤),並盡量用 溫暖的語氣 來回應。
  • 最後使用 gr.ChatInterface 建立 UI,並提供一些 範例輸入,讓使用者可以快速上手。

程式碼如下:

import gradio as gr
import requests

# 向你的 FastAPI 發送對話請求
def multi_tool_chat(message, history):
    try:
        # 呼叫你的 FastAPI /query 端點
        url = "http://localhost:<port>/query"
        
        payload = {
            "query": message
        }
        
        response = requests.post(url, json=payload, timeout=30)
        
        if response.status_code == 200:
            data = response.json()
            if "response" in data:
                return data["response"]
            elif "error" in data:
                return f"⚠️ 服務錯誤:{data['error']}\n\n別擔心,我們的技術團隊正在處理中。您可以稍後再試,或者先和我簡單聊聊天 😊"
            else:
                return "收到了回應,但格式有點特殊,讓我重新整理一下資訊給您 🤔"
        else:
            return f"🌐 連線問題 (HTTP {response.status_code})\n\n看起來網路有點不穩定,建議您稍後再試。期間如果想聊天,我隨時歡迎!"
            
    except requests.exceptions.Timeout:
        return "⏰ 查詢超時了\n\n網路可能比較慢,請稍等一下再試。如果持續有問題,可能是服務正在維護中 🔧"
        
    except requests.exceptions.ConnectionError:
        return """❌ 無法連接到服務

看起來 Alex 的服務暫時離線了 😔

**您可以嘗試:**
1. 檢查 FastAPI 服務是否在運行 (http://localhost:<port>)
2. 重新啟動服務後再試
3. 如果問題持續,可能需要檢查網路設定

**期間您也可以:**
- 直接使用手機查詢天氣
- 查看系統時間
- 或者就在這裡和我隨意聊聊 😊

我會持續嘗試重新連接服務!"""
        
    except Exception as e:
        return f"""😅 發生了意外錯誤

錯誤詳情:{str(e)}

別擔心,這些技術問題總是會解決的!
您可以:
1. 稍後重試
2. 重新整理頁面
3. 先在這裡隨意聊聊

我們的服務通常很穩定,可能只是暫時的小問題"""

# 建立最簡單的聊天介面  
demo = gr.ChatInterface(
    fn=multi_tool_chat,
    title="簡易個人化天氣助理 Alex",
    description="""
    我是溫暖專業的 Alex!我的團隊包括:
    • Maya - 天氣和時間查詢
    • Sunny - 對話交流
    
    **試試看:** 台北天氣、東京時間、你好、我很累
    
    即使遇到技術問題,我們也會用最溫暖的方式為您服務!
    """,
    examples=[
        "你好 Alex!",
        "台北天氣如何?",
        "東京現在幾點?", 
        "我今天很累",
        "台中的溫度",
        "倫敦時間",
        "謝謝你的幫助",
        "早安!"
    ],
    theme="soft"  # 使用溫暖的主題
)
                        
if __name__ == "__main__":
    print("🚀 啟動 Alex 的多功能助理服務...")
    print("👥 團隊成員:Alex (協調)、Maya (天氣)、Sunny (對話)")
    print("📋 請確認 FastAPI 服務正在運行於 http://localhost:<port>")
    print("🌐 Gradio 介面即將在瀏覽器中打開")
    print("💫 即使遇到問題,我們也會溫暖地為您服務!")
    demo.launch()

結果畫面

1.啟動 FastAPI: uvicorn main:app --host 0.0.0.0 --port <port>
https://ithelp.ithome.com.tw/upload/images/20251002/20168454XHNLMN6aep.png

2.啟動 Gradio: python gradio_app.py
https://ithelp.ithome.com.tw/upload/images/20251002/20168454NKu7AdWS51.png

執行畫面
https://ithelp.ithome.com.tw/upload/images/20251002/20168454NBliteoCnE.png
https://ithelp.ithome.com.tw/upload/images/20251002/20168454GBW2v9zKgl.png
可觀察到他的回應方式是針對我們給他撰寫的prompt,所形成的~


結尾廢話

恭喜你!到這裡我們就成功完成了一個簡易版個人化 AI 助理 (ノ◕ヮ◕)ノ*:・゚✧

下一篇我們會探索一些全新的有趣功能~下次見!(´∀`)♡
reference link


上一篇
[Day 17] 簡易個人化天氣助理(上)
下一篇
[Day 19] 簡單了解 MCP
系列文
AI Agent 開發養成記:做出屬於自己的Agent P21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言