OpenAI Agents SDK と Gradio ですぐに動かせるチャットボットを作る(Google Colab)

# はじめに

OpenAI Agents SDK が 2025 年 3 月 11 日にリリースされました。この記事では、[公式ドキュメント](https://openai.github.io/openai-agents-python/)を参考にして実際に動作を確認しながら、特に重要なポイントや興味深い点を深掘りしていきます。

使用したライブラリのバージョンは openai-agents==0.0.6 です。

# OpenAI Agents SDK の紹介

別のページでご紹介します。


https://qiita.com/osamasao/items/a9f2dffa1f310c5ed8b7#openai-agents-sdk-%E3%81%AE%E7%B4%B9%E4%BB%8B


# 背景と目的

AI といえば ChatGPT みたいなチャットインタフェースが有名です。動作、構造、ライブラリの使いやすさ等を確認するため作ってみることにしました。

# 使い方

1. [OpenAI Platform](https://platform.openai.com/) で API キーを取得します
1. [OpenAI Agents SDK を使った AI チャットボットの Notebook](https://colab.research.google.com/github/u-masao/openai-agents-sdk-samples/blob/main/notebools/GradioChatBot.ipynb) をクリックして Google Colaboratory を開きます
1. 画面左側の鍵のマークをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126852/a72d8fa1-8405-4281-9b59-42f974771204.png)

1. 「＋ 新しいシークレットを追加」をクリックします
1. 入力欄に以下を設定します
    - ノートブックからのアクセス: 有効
    - 名前: OPENAI_API_KEY
    - 値: OpenAI Platform で取得した API キー
1. Ctrl-F9 キーを押してすべてのセルを実行します
1. 一番下までスクロールします
1. メッセージを送信して LLM との会話を楽しみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126852/bc5bcafe-dac4-460f-bdf6-5667ab36ba37.png)


# 結果

普通に動くものが作れました。

## ソースコード


```python
import json

import gradio as gr
from agents import Agent, Runner

with gr.Blocks() as demo:
    # UI を定義
    chatbot = gr.Chatbot(type="messages")
    with gr.Row():
        msg = gr.Textbox(show_label=False, scale=7)
        with gr.Column(scale=1):
            submit = gr.Button("送信")
            clear = gr.ClearButton([msg, chatbot], value="リセット")

    # エージェントを定義
    agent = Agent(
        name="素っ気ないアシスタント",
        instructions="あなたは素っ気ないアシスタントです。"
        "ユーザーの言葉に対して最小限のテキストで応答して。"
        "ユーザーはJSON形式でメッセージを送りますが、"
        "応答は日本語の文字列にして。",
        model="gpt-4o-mini",
    )

    # Runner.run() を非同期で呼ぶので async def を指定
    async def respond(message, chat_history):
        """メッセージ送信時の処理"""
        # 会話履歴にユーザーの発言を追加
        chat_history.append({"role": "user", "content": message})

        # エージェントに会話履歴を送信
        response = await Runner.run(
            # ensure_ascii=False することで JSON エンコードを抑制
            # LLM がメッセージを解釈しやすくなるようです
            agent, json.dumps(chat_history, ensure_ascii=False)
        )

        # エージェントの出力を取得
        bot_message = response.final_output

        # エージェントの出力を会話履歴に追加
        chat_history.append({"role": "assistant", "content": bot_message})

        # Gradui UI に会話履歴を返す
        return "", chat_history

    # Gradio UI にコールバックを設定
    gr.on(
        triggers=[msg.submit, submit.click],
        fn=respond,
        inputs=[msg, chatbot],
        outputs=[msg, chatbot],
    )

if __name__ == "__main__":
    # gradio を起動
    demo.launch(share=True, debug=True)
```

コードのポイントです。

-  OpenAI Agents SDK の使い方
    - 低コストなモデルを指定 → gpt-4o-mini
    - 送信のたびに会話の履歴を Runner.run() 経由で Agent に送信
    - トークン数の節約のため「素っ気ないキャラ」で召喚
- Gradio の使い方
    - Chatbot コンポーネントを使用して会話履歴を表示
    - テキスト入力は Textbox コンポーネント
    - 非同期関数で Agent を呼び出すので Gradio のコールバックは async def で定義
    - 検証を想定して share=True にして外部に UI を公開（デフォルト設定が True）
        - 機密データ等を扱うときは False にすることをご検討ください
- API キー
    - Google Colab の「シークレット」機能を利用
 

## 対話の例


| LLM |   人間 |
|:-----------|------------:|
|       |       旅行行きたいな     |
| いいね。どこに行きたい？ | |
| | 鹿児島|
|いいね。楽しそう。 | |
| |いま仙台にいるんだけどどうやって行けばいい？ |
| 飛行機か新幹線が便利。| |
| | 徒歩は？|
|遠い。やめたほうがいい。 | |
| | どこまで行くつもり？|
|目的地は鹿児島。 | |

当たり前ですが過去の会話の内容を覚えているように見えます。

直後に別のセッションでも会話してみました。

| LLM |   人間 |
|:-----------|------------:|
|  | どこへいkの？ |
| どこにも行かない。 |  |
|  | さっき言ったじゃん。忘れた？ |
| 忘れた。 |  |
|  | 嘘だろ思い出せよ |
| 思い出せない。 |  |
|  | 絶対に言ったって |
| 言ってない。 |  |
|  | 何を？ |
| 「何も。」 | |


# 考察


動作は問題ないです。至って普通のチャットボットになりました。

構造はシンプルで再利用しやすそうです。Agent の機能を拡充すればいろいろな応用ができそうです。本番環境 launch するときは share=False が安心ですね。Google Colab のシークレット機能は地味に便利で良いです。

ライブラリも問題なさそうです。仙台とか鹿児島のことは他のセッションには漏れていなさそうです。タイポも気にせず会話してくれます。なんの変哲もない AI チャットボットになりました。


# まとめ

簡単にチャットボットの UI が作れました。あとは OpenAI Agents SDK の Agent でより複雑な LLM とのやり取りを追加したり、Tool を経由した外部 API の利用などにより、様々なタスクを遂行するエージェントを作ることができます。


# 参考

### ノートブックを保存したリポジトリ

https://github.com/u-masao/openai-agents-sdk-samples/blob/main/notebools/GradioChatBot.ipynb


### 公式サンプルコード集

一通り眺めると色々と詳しくなれそうです。

https://github.com/openai/openai-agents-python/tree/main/examples

### 公式ドキュメント

それなりに充実しています。

https://openai.github.io/openai-agents-python/