powered by TechFeed
表示モード
ハウツー

デコレータ1行でPythonスクリプトをAIエージェントに変える — コードの書き直しは不要、既存関数をそのままLLMのツールに変換する方法

9月21日、Abid Ali Awanが「How to Turn a Python Script Into an AI Agent」と題した記事を公開した。この記事では、既存のPython関数を最小限の変更でAIエージェントのオーケストレーション基盤に組み込む手順について詳しく紹介されている。

9月21日、Abid Ali Awanが「How to Turn a Python Script Into an AI Agent」と題した記事を公開した。この記事では、既存のPython関数を最小限の変更でAIエージェントのオーケストレーション基盤に組み込む手順について詳しく紹介されている。


なぜ今「既存コードのエージェント化」が注目されるのか

LLMを活用したAIエージェントへの関心が急速に高まっている。背景にあるのは、モデル単体での問答にとどまらず、外部ツールやAPIを自律的に呼び出して複雑なタスクを実行させたいというニーズの拡大だ。

こうした流れを受け、エージェント構築を支援するSDKやフレームワークが相次いでリリースされている。LangChainLlamaIndexはその代表格だが、2025年にOpenAIが公開したOpenAI Agents SDKは、より軽量でOpenAIのモデルとの統合に特化した設計が特徴だ。エージェント、ツール、ハンドオフ(※後述)、セッション、トレーシング(※後述)を管理するランタイムを提供し、既存のPythonコードをエージェントのツールとして公開するための仕組みが整っている。

本記事が注目するのは、「新たにエージェント専用のコードを書く」のではなく、「すでに動いているPythonスクリプトをそのままエージェントに組み込む」アプローチだ。ここでの役割分担を明確にしておくと、Pythonコードが実際の処理(HTTPリクエスト、データ取得、ログ解析など)を担い、エージェントが自然言語の理解・ツールの選択・呼び出し順序のオーケストレーションを担う。タイトルで言う「AIエージェントに変える」とは、Pythonスクリプト自体をエージェントに作り替えるのではなく、エージェントが活用できるツールとして組み込むという意味だ。


既存コードを「そのまま使う」のがポイント

AIエージェントへの移行と聞くと、コードを大幅に書き直すイメージがある。しかしこの記事の核心は「書き直しは不要」という点だ。既存のPython関数に@function_toolデコレータを1行追加するだけで、LLM(大規模言語モデル)が呼び出せるツールに変換できる。


ベースとなるPythonスクリプト

出発点は、ウェブサイトの死活確認と応答時間を計測するシンプルなスクリプトだ。

from time import perf_counter
import requests

def check_website(url: str) -> str:
    start = perf_counter()
    try:
        response = requests.get(url, timeout=10)
        latency = perf_counter() - start
        return (
            f"{url}\n"
            f"Status: {response.status_code}\n"
            f"Response time: {latency:.2f}s"
        )
    except requests.RequestException as error:
        return f"{url}\nError: {error}"

print(check_website("https://www.python.org"))

出力:

https://www.python.org
Status: 200
Response time: 0.99s

このスクリプト単体では、複数サイトをまとめてチェックしたり結果を比較したりするロジックは自分で書く必要がある。エージェントに組み込むことで、その判断をモデルに委ねられる。


Step 1: SDKのインストール

mkdir website-agent
cd website-agent
uv init
uv add openai-agents requests

または:

pip install openai-agents requests

OpenAI APIキーを環境変数に設定しておく:

export OPENAI_API_KEY="your-api-key"

Step 2: @function_toolで既存関数をツール化

変更箇所は実質2つだけ——from agents import function_toolのインポートと、@function_toolデコレータの追加だ。

from time import perf_counter
import requests
from agents import function_tool

@function_tool
def check_website(url: str) -> str:
   """Check a website's HTTP status and response time."""
   start = perf_counter()
   try:
       response = requests.get(url, timeout=10)
       latency = perf_counter() - start
       return (
           f"URL: {url}\n"
           f"Status: {response.status_code}\n"
           f"Response time: {latency:.2f}s"
       )
   except requests.RequestException as error:
       return f"URL: {url}\nError: {error}"

SDKは関数のシグネチャ(引数の型など)を自動でJSON Schema(※ツールの入出力仕様をJSON形式で記述する標準規格。モデルがどのような引数を渡すべきかを把握するために使われる)に変換する。関数名とdocstringがそのままツールの説明としてモデルに渡される。ツールスキーマを手動で書く必要はない。


Step 3: エージェントを作成して実行

from agents import Agent, Runner

agent = Agent(
   name="Website Monitor",
   model="gpt-5.6-luna",  # ※記事掲載時点のモデル名。最新の利用可能モデルは公式ドキュメントを参照
   instructions="""
   Monitor websites using the available tool.
   Compare results and explain problems clearly.
   """,
   tools=[check_website],
)

result = Runner.run_sync(
   agent,
   "Check python.org, github.com, and openai.com. "
   "Which one has the slowest response?"
)
print(result.final_output)

出力:

python.org is the slowest, responding in 1.59 seconds.
- github.com: 0.83s
- openai.com: 0.49s
All returned HTTP 200.

従来ならfor url in urls: check_website(url)と比較ロジックを自分で書く必要があった。エージェント化後は、モデルが「どのURLを確認するか」「何回ツールを呼ぶか」「結果をどう解釈するか」を自律的に判断する。


エージェントループの仕組み

Runnerがモデルとツールのやりとりを管理する。モデルが追加情報を必要とすればツールを再度呼び出し、十分な情報が集まった時点で最終回答を生成する。固定シーケンスではなく、モデルが状況に応じて次のアクションを決定するのがエージェント的な動作の核心だ。

OpenAI Agents SDKが提供する主要な概念を整理しておく:

  • ハンドオフ:あるエージェントが別のエージェントにタスクを引き渡す仕組み。専門エージェントへの委譲などマルチエージェント構成で活用される
  • トレーシング:エージェントがどのツールをどの順序で呼び出したかを記録・可視化する仕組み。デバッグや動作検証に役立つ

同じパターンで応用できる例

記事では、同じ@function_toolパターンが使える既存スクリプトとして以下を挙げている:

  • CSVアナライザー:フィルタリングや集計関数を公開 → 自然言語でデータ質問に回答
  • サーバー監視:CPU・メモリ・ディスク・プロセスの確認関数 → 異常原因の調査
  • ログ解析:エラー検索・カウント関数 → インシデントの自動調査とサマリー生成
  • API自動化:データ取得・更新・レポート作成関数 → 必要な操作順序をモデルが判断

いずれも共通するのは、「すでに動いているPythonの処理ロジックをそのまま活かし、判断・調整・まとめの部分だけをモデルに任せる」設計思想だ。ゼロからエージェントを構築するのではなく、既存コードの資産を最大限に再利用できる点が、このアプローチの最大の強みといえる。


記事では、掲載時点で紹介されているモデルの登場により、ツール使用型・マルチエージェントシステムをスケールで運用するコストが大幅に下がっていることにも触れている。既存コードの資産を活かしながらAIエージェントを試すための、現時点でもっとも低コストなアプローチの一つだ。

詳細はHow to Turn a Python Script Into an AI Agentを参照していただきたい。