Swarm Weather Agent: 天気情報を提供するインテリジェントなエージェント

## はじめに

Swarm Weather Agentは、OpenAIのSwarmフレームワークを使用して構築された、インテリジェントな天気情報提供エージェントです。このプロジェクトは、単一のエージェントが複数の機能を持ち、ユーザーとのインタラクティブなやり取りを通じて天気情報の取得やメール送信を行う様子を示しています。

https://hamaruki.com/swarm-experimental-sample/

## 主な特徴

1. 天気情報取得: 特定の都市の天気を取得
2. メール送信: 天気情報を含むメールを送信
3. 単一エージェント: 複数の機能を1つのエージェントで処理

## エージェントのワークフロー

エージェントは以下のような流れで動作します：

1. ユーザーからの入力を受け取る
2. 入力内容を分析し、適切な機能（天気情報取得またはメール送信）を呼び出す
3. 結果をユーザーに返す
4. 追加の要求があれば再度処理を行い、なければ会話を終了する

## コードの解説

### agents.py

このファイルでは、天気エージェントの主要な機能が定義されています。

```python
import json
import random
from datetime import datetime
from swarm import Agent

# 天気情報のダミーデータ
weather_data = {
    "東京": {"temp_range": (10, 30), "conditions": ["晴れ", "曇り", "雨", "雪"]},
    # ... 他の都市のデータ ...
}

def get_weather(location, time="now"):
    """指定された場所の現在の天気を取得します。"""
    if location not in weather_data:
        return json.dumps({"error": "指定された都市の天気情報が見つかりません。"})
    
    city_data = weather_data[location]
    temperature = random.randint(*city_data["temp_range"])
    condition = random.choice(city_data["conditions"])
    
    current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    weather_info = {
        "location": location,
        "temperature": f"{temperature}°C",
        "condition": condition,
        "time": current_time
    }
    
    return json.dumps(weather_info, ensure_ascii=False)

def send_email(recipient, subject, body):
    """電子メールを送信するための関数"""
    print("メールを送信中...")
    print(f"宛先: {recipient}")
    print(f"件名: {subject}")
    print(f"本文: {body}")
    return "送信完了!"

weather_agent = Agent(
    name="Weather Agent",
    instructions="""あなたは親切な天気情報提供エージェントです。
    ユーザーから都市名を聞いたら、その都市の天気情報を提供してください。
    また、ユーザーが希望する場合は、天気情報をメールで送信することもできます。
    現在、東京、大阪、札幌、福岡、那覇の天気情報を提供できます。""",
    functions=[get_weather, send_email],
)
```

このコードでは、`get_weather`関数で天気情報を取得し、`send_email`関数でメール送信をシミュレートしています。`weather_agent`オブジェクトは、これらの機能を持つエージェントを定義しています。

### evals.py

このファイルには、エージェントの動作を評価するためのテストケースが含まれています。

```python
from swarm import Swarm
from agents import weather_agent
import pytest

client = Swarm()

def run_and_get_tool_calls(agent, query):
    """エージェントにクエリを実行させ、ツール呼び出しを取得する関数"""
    message = {"role": "user", "content": query}
    response = client.run(
        agent=agent,
        messages=[message],
        execute_tools=False,
    )
    return response.messages[-1].get("tool_calls")

@pytest.mark.parametrize(
    "query",
    [
        "東京の天気は？",
        "那覇の天気を教えて。",
        "今日、傘が必要？札幌にいます。",
    ],
)
def test_calls_weather_when_asked(query):
    """天気について尋ねられた時に正しく天気関数を呼び出すかテストする"""
    tool_calls = run_and_get_tool_calls(weather_agent, query)

    assert len(tool_calls) == 1
    assert tool_calls[0]["function"]["name"] == "get_weather"

# ... 他のテストケース ...
```

これらのテストは、エージェントが適切に天気情報を取得する関数を呼び出しているかを確認します。

## セットアップと実行方法

プロジェクトのセットアップには`uv`を使用します。以下のコマンドで環境を準備できます：

```bash
pip install uv
uv venv
source .venv/bin/activate  # Linux/macOSの場合
.venv\Scripts\activate  # Windowsの場合
uv pip install -r requirements.txt
```

エージェントを実行するには、以下のコマンドを使用します：

```bash
python run.py
```

## 評価テストの実行

テストを実行するには、以下のコマンドを使用します：

```bash
pytest evals.py
```

詳細な出力を得たい場合は、`-v`や`-s`オプションを追加できます。

## デモ動画

### エージェントの評価テストの実行動画

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">swarmの公式サンプルを日本語化してWeather Agentの評価やってみた<br>日本版にテストケースを修正してみました！ <a href="https://t.co/zXvTwN8enh">https://t.co/zXvTwN8enh</a> <a href="https://t.co/17o6GXhCcR">pic.twitter.com/17o6GXhCcR</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1845796857232121895?ref_src=twsrc%5Etfw">October 14, 2024</a></blockquote> 

### 天気情報を取得する動画

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">swarmの公式サンプルを日本語化してWeather Agentやってみた<br>＊天気情報はダミーデータです <a href="https://t.co/7Tujdx9DMm">https://t.co/7Tujdx9DMm</a> <a href="https://t.co/xdSm6GRYE6">pic.twitter.com/xdSm6GRYE6</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1845793634777796858?ref_src=twsrc%5Etfw">October 14, 2024</a></blockquote> 

### 天気情報を取得してメールを作成する動画

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">swarmの公式サンプルを日本語化してWeather Agentやってみた②<br>なぜかメールを送信する関数があってので、<br>天気の情報を取得してもらって、それをメールを処理する関数に投げてみた！<br>こんだけ関数通しの情報の伝達が簡単だとマジで夢が広がる！！！！ <a href="https://t.co/Z48xyboev7">https://t.co/Z48xyboev7</a> <a href="https://t.co/pRRHZHbB8g">pic.twitter.com/pRRHZHbB8g</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1845799410908942427?ref_src=twsrc%5Etfw">October 14, 2024</a></blockquote>

## まとめ

Swarm Weather Agentは、OpenAIのSwarmフレームワークを活用した実用的なデモプロジェクトです。このプロジェクトを通じて、AIエージェントがどのように複数の機能を組み合わせて複雑なタスクを実行できるかを学ぶことができます。また、テストケースの実装方法や、対話型のデモループの作成方法についても良い例を提供しています。

このプロジェクトは、AIエージェントの開発や、自然言語処理を活用したアプリケーションの構築に興味がある開発者にとって、有益な学習リソースとなるでしょう。


## リポジトリ

### Weather agent （サンプル）

https://github.com/Sunwood-ai-labs/swarm-sample-box/tree/main/examples/weather_agent

### 日本語化リポジトリ

https://github.com/Sunwood-ai-labs/swarm/blob/feature/docs-jp/README_JP.md

### 原点

https://github.com/openai/swarm

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>