OpenAI AgentSDKとfunction_toolの機能がすごかった話

## はじめに

自分全然知らなかったんですけど
3月に追加されたOpenAI AgentSDKのドキュメントを見ていたら
ChatGPTって自作関数の実行ができたんですね。

gitへのプルリクや自分のPC操作など必要に応じてPythonの関数を作成することで結構な自動化ができるんじゃないのかなとということで
OpenAIのAgentSDKとfunction_toolを使って、ためしにファイルを自動で作成するシステムを作成しました。

## 構成

このシステムは、以下の主要な構成要素で成り立っています。

- **AgentSDK**: AIエージェントを作成し、インタラクティブなやり取りを実現
- **function_tool**: 実行可能なツールとして、ファイル生成の処理を自動化

## 必要な準備

まず、環境を整えるために、必要なライブラリをインストールします。

```bash
pip install openai
pip install python-dotenv
```

次に、.envファイルを作成して、必要なAPIキーや設定を行います。

```
OPENAI_API_KEY=your_openai_api_key
```

## コード解説
### dotenvによる環境変数の読み込み
最初に、.envファイルからAPIキーを読み込むために、dotenvライブラリを使用します。

```python
from dotenv import load_dotenv

load_dotenv()

```

### function_toolによるファイル作成ツールの定義
次に、ファイルを作成するためのツールを定義します。このツールは、指定されたテキストをもとに、現在の日付と時刻を使ってファイルを作成します。
今回はファイル作成関数を作りましたが必要に応じて実行したい関数を作ります。
このデコレータ機能自体は昔からあった？（笑）

```python
import pathlib
import datetime

@function_tool
def create_file(text: str):
    """ファイルを作成するツール
    このツールは、現在の日付と時刻を使用して、指定されたディレクトリにファイルを作成します。
    ディレクトリ名はYYYYMMDD形式、ファイル名はHHMMSS.py形式です。
    例: 20231001/120000.py
    """
    now = datetime.datetime.now()
    dir_name = now.strftime("%Y%m%d")
    file_name = now.strftime("%H%M%S") + ".py"

    dir_path = pathlib.Path(dir_name)
    dir_path.mkdir(exist_ok=True)

    file_path = dir_path / file_name
    file_path.touch(exist_ok=True)

    with file_path.open("w", encoding="utf-8") as f:
        f.write(text)

    return file_path

```

### エージェントの作成
AIエージェントを作成し、ファイル生成の依頼を受け付ける指示を設定します。
このAIエージェントを複数作ることでユーザーからの入力を適切なエージェントに受け渡すことができるのだけれども今回はエージェントではなく関数を実行するようとして使用。
```python
from agents import Agent

agent = Agent(
    name="Assistant",
    instructions=(
        "あなたは有能なアシスタントです。ファイルを作成する依頼がある場合はtoolsを使ってファイルを作成します"
    ),
    tools=[create_file],
)
```

### エージェントとのインタラクション
ユーザーからの入力を受け取り、エージェントに処理を依頼します。結果として、作成されたファイルのパスを表示します。

```python

import asyncio
from agents import Runner

async def main():
    text = input("何を手伝いましょうか？")
    result = await Runner.run(agent, input=text)
    print(result.final_output)

asyncio.run(main())


```

## 実行結果
作成したコードを実行して実際にpyファイルができているか確認してみましょう。

### コードを実行
mainファイルを実行したら依頼内容を入力します。
語尾にファイルを作成してって付け加えると目的の関数を実行する精度が上がるのかな？

```bash
Pythonの基本的な四則演算を行う関数についてのコードをファイルに作成して
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633766/0f62c04e-210a-4441-b783-786e93778334.png)

実行するとディレクトリとファイルが作成されます。

```bash
基本的な四則演算を行う関数を含むコードをファイルに作成しました。ファイル名は`20250405/161735.py`です。

以下はそのコードです：
---省略----

必要に応じてこのファイルを使用してください。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633766/5f74fee5-c48c-4e52-a60f-b5302a4404b0.png)

作成されたファイルの中身には正しく四則演算の関数ができたpyファイルが出来上がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633766/b6647379-551c-486f-a152-96a9bad67405.png)

すごい。

## まとめ
完成コードはこちらです。
```python
import datetime
import pathlib

import asyncio
from agents import Agent, Runner, function_tool

from dotenv import load_dotenv
load_dotenv()

@function_tool
def create_file(text: str):
    """ファイルを作成するツール
    このツールは、現在の日付と時刻を使用して、指定されたディレクトリにファイルを作成します。
    ディレクトリ名はYYYYMMDD形式、ファイル名はHHMMSS.py形式です。
    例: 20231001/120000.py
    """
    now = datetime.datetime.now()
    dir_name = now.strftime("%Y%m%d")
    file_name = now.strftime("%H%M%S") + ".py"

    dir_path = pathlib.Path(dir_name)
    dir_path.mkdir(exist_ok=True)

    file_path = dir_path / file_name
    file_path.touch(exist_ok=True)

    with file_path.open("w", encoding="utf-8") as f:
        f.write(text)

    return file_path


agent = Agent(
    name="Assistant",
    instructions=(
        "あなたは有能なアシスタントです。ファイルを作成する依頼がある場合はtoolsを使ってファイルを作成します"
    ),
    tools=[create_file],
)


async def main():
    text = input("何を手伝いましょうか？")
    result = await Runner.run(agent, input=text)
    print(result.final_output)


asyncio.run(main())

```