🫠

【Claude-Agent-SDK/FastAPI】API実行できるAIエージェントを作る

に公開

1.はじめに

本記事では、Claude Agent SDK と FastAPI と組み合わせて 「API経由で実行できるAIエージェント」 を構築してみました。

Claude Agent SDK とFastAPI を組み合わせることで、下記のようなことが実現できます。

  • HTTP経由でエージェントにタスクをリクエストできる
  • エージェントの実行状態やキャンセル操作をAPIで管理できる
  • 他システムやフロントエンドからも利用しやすくなる

今回作ったものは GitHub で公開しています。
また、記事の内容は下記を前提に記述しています。
https://github.com/is0383kk/Claude-Agent-API-Server

■ FastAPI

FastAPI は、PythonでAPIサーバを構築するのによく使用されています。
今回のようにAIエージェントを非同期で実行する場合に有効的なフレームワークです。
https://fastapi.tiangolo.com/ja/

■ Claude Agent SDK

Claude Agent SDK は、Anthropic社が開発したAIエージェントを構築するためのソフトウェア開発キットです。
Claude CodeではCLI上でAIエージェントを実行しているのに対して、
Claude Agent SDKではプログラム上でAIエージェントを定義して実行することができます。
https://docs.claude.com/ja/api/agent-sdk/python

2.今回実装したAPI

今回実装したAPIは下記の通りです。

エンドポイント メソッド 説明
/execute/ POST 新規エージェントセッションを開始/再開
/status/{session_id} GET セッションの状態、メッセージ履歴、結果を取得
/cancel/{session_id} POST 実行中のセッションを中断
/sessions/ GET 全セッションの詳細情報を取得
/sessions/cleanup DELETE 古いセッションを削除

例えば /execute/ エンドポイントを実行する場合は、
次のようなリクエストを送ると新規エージェントが実行されます。

curl -X POST "http://localhost:8000/execute/" \
  -H "Content-Type: application/json" \
  -d '{
        "prompt": "私はis0383kkです。自己紹介をしてください。",
        "model": "us.anthropic.claude-3-5-sonnet-20241022-v1:0",
        "max_turns": 10
      }'

返却されるレスポンスは下記のようになります。
※非同期実行なので、この時点でレスポンスに実行結果のメッセージは含まれません。

{
  "session_id": "XXXXXX",
  "status": "running",
  "message": "Session XXXXXX started successfully"
}

実行中の状況を取得する場合は、下記APIを実行することで取得できます。

curl "http://localhost:8000/status/XXXXXX"  

■ セッション管理の仕組み

エージェント実行をAPI化する上で、各エージェントの実行を「セッション」として管理しています。
今回はエージェントのセッションを以下ステータスで管理しています。

  • pending: エージェント初期化中
  • running: エージェントが実行中
  • completed: 正常終了
  • error: 例外発生時
  • cancelled: ユーザーがキャンセルした場合

■ エージェント実行の基本方針

公式が提供しているサンプルをAPI実行できるように拡張しました。

Claude-Agent-SDKでは、下記のようにプロンプトとClaudeAgentOptionsで指定できるオプションqueryメソッドの引数として使用することでAIエージェントを実行できます。

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions

async def main():
    options = ClaudeAgentOptions(
        system_prompt="You are an expert Python developer",
        permission_mode='acceptEdits',
        cwd="/home/user/project"
    )

    async for message in query(
        prompt="Create a Python web server",
        options=options
    ):
        print(message)


asyncio.run(main())

上記に対して FastAPI の非同期機能を活用して、エージェントをバックグラウンドで実行しています。
エージェントを実行する際は、uuidをセッションIDとして発行しています。

@app.post("/execute/", response_model=ExecuteResponse)
async def execute_agent(request: ExecuteRequest):
    session_id = str(uuid.uuid4())
    
    # セッション情報を作成
    session_info = SessionInfo(
        session_id=session_id,
        status="pending",
        prompt=request.prompt,
        options=request.to_claude_options()
    )
    
    # バックグラウンドタスクとして実行
    task = asyncio.create_task(run_agent_session(session_info))
    session_info.task = task
    
    # セッション管理に登録
    await session_manager.add_session(session_info)
    
    return ExecuteResponse(
        session_id=session_id,
        status="pending",
        message=f"Session {session_id} started successfully"
    )

セッションを保持したまま再開する場合、
ClaudeAgentOptionsresumeというオプションがありますので、そこで保持したいセッションID(uuid)を指定することで会話履歴を保持したままエージェント実行が可能です。

3.フロントエンドから実行してみる

それでは、実装した下記APIを画面から実行してみます。

  • /execute/:新規エージェントセッションを開始/再開
  • /status/{session_id}:セッションの状態、メッセージ履歴、結果を取得
  • /cancel/{session_id}:実行中のセッションを中断

■ 事前準備

本記事では下記前提とします。

  • Python 3.8 以上
  • Claude Codeが利用できる状態

requirements.txt を用意しているのでライブラリをインストールします。
https://github.com/is0383kk/Claude-Agent-API-Server/blob/main/requirements.txt

pip install -r requirements.txt

準備が整ったら FastAPI サーバを下記コマンドで起動します。

$ python main.py
INFO:     Started server process [17844]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

(Claude Codeに)動作確認用の画面を用意してもらいました。
ブラウザ上でindex.htmlを開けば準備完了です。

■ エージェントを実行

FastAPIサーバが起動している状態で、
プロンプトを入力して「エージェントを実行」ボタンから実行することができます。

実行の状況は「状態を確認」ボタンを押すことでレスポンスを確認できます。

■ セッションを保持したままエージェントを再実行

プロンプト+セッションIDを指定して実行することでセッションを保持したままエージェントの実行ができます。

■ セッションを中断する

「セッションをキャンセル」ボタンから実行中のエージェント処理を中断できます。

4.おわりに

最近はAIエージェントを使ってAI駆動開発する流れから、AIエージェントを自分たちで作り運用/提供する流れにシフトしているように感じます。
従来は 「モデルをどう使うか」に注目が集まっていましたが、これからは「どんなエージェントをどう組み込むか」 という部分が重要になるのかなと思いました。

今回作ったリポジトリは比較的簡単に動かすことができるので、良かったら手元で動かしてみてください!
https://github.com/is0383kk/Claude-Agent-API-Server

Discussion