PR

OpenAI Agents SDK を使ってみた

1. はじめに

OpenAIとグーグルが相次ぎAIエージェントSDKを発表、エンタープライズAIの新局面
いつの間にか Swarm から OpenAI Agents SDK に変わっていたので触ってみました。

動作させた環境は

  • Ubuntu 24.04
  • Python 3.12.4
  • uvicorn 0.35.0
  • openai-agents 0.2.3
  • fastapi 0.116.1

を使用しています。
他にも細かいのありますが割愛。

LM Studio を使用し、モデルは openai/gpt-oss-20b を使用しています。

環境構築は、クイックスタート を参考にしました。

2. Chat Completions API

OpenAI のチャットを呼び出す API です。
現在は Responses API が推奨されているようですが、こちらの方が都合よかったので使用しています。
簡潔に書いているので上手く動作しないかも。

from openai import OpenAI
from fastapi import APIRouter
from pydantic import BaseModel

router = APIRouter()

# OpenAI クライアントの初期化
# BASE_URLは LM Studio の URL
# API_KEY は何でも良い
client = OpenAI(
    base_url="http://localhost:1234/v1",
    api_key="lm-studio",
    )

# テキスト生成のためのリクエストモデル
class PromptRequest(BaseModel):
    prompt: str

@router.post("/openai")
async def generate_text(request: PromptRequest):
    # 入力メッセージを設定
    messages = [{"role": "user", "content": request.prompt}]

    # チャットの呼び出し
    response = client.chat.completions.create(
        model="openai/gpt-oss-20b",
        messages=messages
        )

    # 生成されたテキストを返す
    return response.choices[0].message.content

動作確認は以下のコマンドを実行します。

curl -X POST "http://localhost:8000/openai" -H "Content-Type: application/json" -d '{"prompt": "Hello, world!"}'

生成されたテキストが返ってくれば成功です。

3. サーバー送信イベントに対応

生成されたテキストが長い場合、レスポンスが返ってくるまで時間がかかります。
サーバー送信イベント(Server-Sent Events、SSE)に対応することで、生成されたテキストをリアルタイムに受け取ることができます。

from openai import OpenAI
from fastapi import APIRouter
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
import json

router = APIRouter()

client = OpenAI(
    base_url="http://localhost:1234/v1",
    api_key="lm-studio",
    )

class PromptRequest(BaseModel):
    prompt: str

# OpenAIのレスポンスをSSE形式に変換するジェネレーター
def generate_sse_response(response):
    for chunk in response:
        if chunk.choices[0].delta.content is not None:
            # SSE形式でデータを返す
            data = {
                "content": chunk.choices[0].delta.content,
                "finish_reason": chunk.choices[0].finish_reason
            }
            yield f"data: {json.dumps(data, ensure_ascii=False)}\n\n"

    # ストリーム終了を示す
    yield "data: [DONE]\n\n"

@router.post("/openai")
async def generate_text(request: PromptRequest):
    messages = [{"role": "user", "content": request.prompt}]

    response = client.chat.completions.create(
        model="openai/gpt-oss-20b",
        messages=messages,
        stream=True  # ストリーミングを有効化
    )

    return StreamingResponse(
        generate_sse_response(response),
        media_type="text/plain",
        headers={
            "Cache-Control": "no-cache",
            "Connection": "keep-alive",
            "Content-Type": "text/event-stream",
        }
    )

先ほどと同じコマンドで動作確認します。

curl -X POST "http://localhost:8000/openai" -H "Content-Type: application/json" -d '{"prompt": "Hello, world!"}'

以下のようにレスポンスがワード毎に返ってきます。

data: {"content": "I", "finish_reason": null}
data: {"content": " am", "finish_reason": null}
data: {"content": " doing", "finish_reason": null}
data: {"content": " well", "finish_reason": null}
data: {"content": ",", "finish_reason": null}
...

4. まとめ

OpenAI Agents SDK を使ってチャットボットを作成してみました。
公式や他のブログ記事を参考に実装してみましたが今のところ単文に対しての応答しかできていません。
session を使って会話を続ける方法もあるようなのでもう少し複雑な会話もできるようにしたいところです。

今回の記事も、Github Copilot が7割くらい書いてくれました。

A. 参考サイト

OpenAI Agents SDK
AIアプリを陰で支える通信プロトコル「SSE」を学びましょう
【OpenAI】MCPとは?Agents SDK・ResponsesAPIとの使い方、連携方法をご紹介
【解説つき】OpenAI Agents SDK, Responses APIでAIエージェント作成
AIエージェントをどう扱うか?~ローカルLLMで戯れる~
Agent Development Kit によるエージェント開発入門

B. 関連書籍

コメント