[生成AI] OpenAI Agents SDKによる、シンプルなコード生成エージェント

# 1.動機
 久しぶりにブログの記事です。
 簡単なコードの生成ができるシンプルなエージェントの作成です。

 元となるプログラムは下記の株式会社マインディア テックブログの記事で紹介されていたもので、非常に分かりやすくエージェントの動作が説明されています。こんな簡潔なんだと、感銘を受けました。

 https://zenn.dev/minedia/articles/11822c2b509a79
 
上記の記事で紹介されていたコードは、go言語によるものですが、これを、python版、及び、OpenAI Agents SDKにポーティングしました。Cursorに指示して:sweat_smile:

# 2. python版にポーティング
### 2.1 最初の失敗は、文字化け
最初の指示は、下記のようなものでしたが、「文字化けが発生」→「修正」→「ファイル削除」を繰り返してしまいました。

:::note info
goフォルダ配下のファイルは、go言語で記載された、coding agentのサンプルで、これを元に、python言語で同様なcoding agentを作成して、tool.pyに記載してください。
::: 

そこで、下記のように、文字コードを明確に指定して、やり直しました。

:::note info
goフォルダ下のファイルは、go言語で記載されたAI coding Agentです。文字コードはutf-8です。これを元に、python言語で記載されたAI coding Agentのプログラムを作成し、pythonフォルダ下に格納してください。使用する文字コードはutf-8としてください。なお、実行環境はWindows上のPowershellです。
:::

### 2.2 ログの強化
プログラムが起動するようになりましたが、下記のようなコンソール出力となり、何が起きているか分かりませんでした。

```ruby
(.venv) PS C:\Users\yamaz\Dropbox\work\20250329_test-coding-agent\python> python .\main.py
コーディングエージェントにタスクを入力してください:
電卓アプリを作成してください。

[] 有効なツールが見つかりませんでした

[] 有効なツールが見つかりませんでした

[] 有効なツールが見つかりませんでした

[write_file] ファイルの書き込みに失敗しました: [WinError 3] 指定されたパスが見つかりません。: ''

[] 有効なツールが見つかりませんでした

[] 有効なツールが見つかりませんでした

```

ログ情報の出力が必要でしたが、以前にCurosrやWinsurfを試したときは、「ログファイルが生成されない」「ログファイルに情報が出力されていない」「意図した情報ではない」など、ログ出力から破綻の契機となりがちでした。今回は、ソースコードを確認し、ログ出力内容を明確に指示しました。

:::note info
main.pyの中で、client.chat.completions.createの送信データであるmessagesと、受信データであるassistant_responseの値を追記式で、ログファイルへ格納するように、改造を提案してください。改造は、現状のソースコードへの影響が最小限になるようにしてください。

:::

### 2.3 AIからの応答が期待通りでない。
ログを強化して、何が起きたか分かるようになりましたが、AIモデルから下記のような応答を受け取っていました。

:::note info
{"timestamp": "2025-03-29T23:57:02.509700", "type": "response", "data": "申し訳ありませんが、上記のツールを使用して電卓アプリを直接作成することはできません。ただし、Pythonなどの一般的なプログラミング言語を使って示すことは可能です。\n\n電卓アプリのシンプルな例を以下に示します：\n\n```python\ndef add(x, y):\n   return x + y\n\ndef subtract(x, y):\n   return x - y\n\ndef multiply(x, y):\n   return x * y\n\ndef divide(x, y):\n   if y == 0:\n       return \"Division by 0 is not allowed\"\n   else:\n       return x / y\n\nprint(\"Select operation.\")\nprint(\"1.Add\")\nprint(\"2.Subtract\")\nprint(\"3.Multiply\")\nprint(\"4.Divide\")\n\nchoice = input(\"Enter choice(1/2/3/4): \")\n\nnum1 = int(input(\"Enter first number: \"))\nnum2 = int(input(\"Enter second number: \"))\n\nif choice == '1':\n   print(num1,\"+\",num2,\"=\", add(num1,num2))\nelif choice == '2':\n   print(num1,\"-\",num2,\"=\", subtract(num1,num2))\nelif choice == '3':\n   print(num1,\"*\",num2,\"=\", multiply(num1,num2))\nelif choice == '4':\n   print(num1,\"/\",num2,\"=\", divide(num1,num2))\nelse:\n    print(\"Invalid input\")\n\n```\nこのコードはユーザーに4つの操作（加算、減算、乗算、除算）を選択するように促し、その後それぞれの操作に必要な二つの数値を入力するように促します。選択された操作を適用すると、その結果が出力されます。\n"}
:::

システムプロンプトの指示には、『必ず上記のいずれかのツールを使用してください。ツールを使わずに直接回答しないでください。』とあったのですが、無視されたようです。

正確には、一回目のプログラム起動時の呼出しではツールを使用した痕跡があるので、ツールを使用したり、しなかったりというAIの応答の揺らぎがあったようです。

Cusor (Cluade 3.7 Sonnet-thinking)に、

:::note info
pythonフォルダ下のAI coding agentプログラムを実行したところ、添付の実行結果になりました。AIからの回答が、ツールの呼出しができる回答になっていないようですが、どのようにすれば改善できるか、検討してください
:::

と指示したところ、直してくれました。
<font color="red">重要な指示として、くどいくらい具体的に指示し、動作の例も追加</font>されています。

```ruby: 変更前
必ず上記のいずれかのツールを使用してください。ツールを使わずに直接回答しないでください。
```

```ruby:変更後
重要な指示：
1. 必ず上記のいずれかのツールを使用してください。
2. ツールを使わずに直接回答することは絶対に禁止です。
3. 直接コードを提示するのではなく、WriteFileツールを使用してファイルを作成してください。
4. タスクが完了したらCompleteツールを使用して明示的に終了を示してください。
5. タスクが複雑な場合は、まずAskQuestionツールを使用して詳細を確認してください。

例：電卓アプリ作成の場合は、WriteFileツールを使用してcalculator.pyなどのファイルにコードを書き込み、必要に応じてExecuteCommandでテストを実行し、最終的にCompleteで完了を示してください。

回答形式の例：
<write_file>
<path>example.py</path>
<content>
print("Hello World")
</content>
</write_file>

```

また、AI呼出しのパラメータの追加が提案されました。

```ruby
temperature=0.2,  # より決定論的な応答を促す
max_tokens=2000,  # 十分な長さの応答を確保
top_p=0.95        # 出力の多様性を若干制限
```

この変更で、一通り動作するようになりました:sweat_smile:

# 3.OpenAI Agents SDK版にポーティング
### 3.1 OpenAI Agents SDKの知識を用意
リリース日が早いので、Claude 3.7 Sonnetは、OpenAI Agents SDKを知らないはずです。
そこで、Cursorのルールを用意しました。

```ruby: .cursor/rule/agents_sdk.mdc
#概要
 - 本ルールは、OpenAI Agents SDKの資料です。
 - Agents SDKを使用するときは、下記の資料を参照してください。

#資料
## 公式資料
 - OpenAI Agents SDK
   https://openai.github.io/openai-agents-python/

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

 - openai/openai-agents-python: A lightweight, powerful framework for multi-agent workflows
   https://github.com/openai/openai-agents-python

## 有用な情報源
### OpenAI Responses API 入門 
	- 新しい OpenAI API の クイックスタート - Responses API ・ Agents SDK
      https://note.com/npaka/n/nf6cc94556c67
		
	- OpenAI Responses API 入門 (1) - テキスト生成とプロンプト
      https://note.com/npaka/n/nc497666772b8
		
	- OpenAI Responses API 入門 (2) - 画像とVision
	  https://note.com/npaka/n/n68863a1fa403
		
	- OpenAI Responses API 入門 (3) - 構造化出力
	  https://note.com/npaka/n/n6229e275cbfb
		
	- OpenAI Responses API 入門 (4) - Function Calling
	  https://note.com/npaka/n/n07378b5a4579
		
	- OpenAI Responses API 入門 (5) - 会話状態
	  https://note.com/npaka/n/nb4f1961664d6

	- OpenAI Responses API 入門 (6) - ストリーミング
	  https://note.com/npaka/n/nce4e1830b004
		
	- OpenAI Responses API 入門 (7) - ファイル入力
      https://note.com/npaka/n/na9881511f1c8
		
	- OpenAI Responses API 入門 (8) - Reasoningモデル
	  https://note.com/npaka/n/nb10ccc6608b3
		
	- OpenAI Responses API 入門 (9) - Web search
      https://note.com/npaka/n/n0410c8e3f31e
		
	- OpenAI Responses API 入門 (10) - File search
	  https://note.com/npaka/n/n0a15aa971ebe
		
    - OpenAI Responses API 入門 (11) - Computer use
	  https://note.com/npaka/n/naed673290cf6	
		
### OpenAI Agents SDK 入門 
	- OpenAI Agents SDK 入門 (1) - 事始め	
	  https://note.com/npaka/n/n4afc430b7be1
		
	- OpenAI Agents SDK 入門 (2) - Agent ・ Runner ・ Result	
	  https://note.com/npaka/n/ndbf7ba2795fe	
		
	- OpenAI Agents SDK 入門 (3) - Tool ・ Handoff ・ Tracing	
	  https://note.com/npaka/n/nb83f80a0b023	
		
	- OpenAI Agents SDK 入門 (4) - Guardrail ・ Orchestration ・ Model	
	  https://note.com/npaka/n/nf706e8f3552f	
		
	- OpenAI Agents SDK 入門 (5) - MCP	
	  https://note.com/npaka/n/n1eded3a66914	

### 他のモデルを使用することが可能
    - OpenAI Agents SDKでOllama, Claude, Geminiのモデルを利用する
      https://qiita.com/kitfactory/items/5a169e66b7205f83b555

    - OpenAIのAgents SDKだけどGeminiやClaudeを使いたい！
      https://note.com/rosso_blog/n/n876213348857

```

### 3.2 なかなか、用意した知識を使用してくれない。
最初の指示では、ファイルをマージしただけでした。

:::note info
pythonフォルダ下に、AI coding agentsのプログラムが格納されています。.cursor\rules\agents_sdk.mdcの情報を元に、OpenAI Agents SDKのAPIを使用するように、改修してください。改修後のソースコードは、agents_sdkフォルダの下に格納してください。ファイルの文字コードはutf8としてください。

:::

引き続き、指示を繰り返しますが、なかなかうまくいきません

:::note info
作成されたmain.pyは、OpenAI Agents SDKを使用していません。agents_sdk.mdcの情報を参照して、Webを検索してください。そして、変更に必要なタスクを整理してください。
:::

:::note info
変更内容が間違っています。OpenAI Agents SDKは、2025/03にOpenAIからリリースされたもので、langchainとは無関係です。pythonのインストールコマンドは"pip install openai-agents"です。@agents_sdk.mdcを元に、Webを検索して情報を調査したうえで、変更点を整理してください。 
:::

やっと、期待通りに応答した感じだったので、作業を進めました。

:::note info
新しいSDKのパラダイムに合わせた再設計を行い、その結果をagets_sdk/doc/redesign.mdファイルに出力してください。その後、実装に必要なタスクを整理して、agets_sdk/doc/tasklist.mdファイルに出力してください。
:::

:::note info
再設計結果とタスクリストに従い、実装を行ってください。
:::

ところが、<font color="red">「正しいモジュール名でインポートしてくれない」「エラーが出るとＡgents SDKのモジュールを削除して、知識にある別のモジュールを使おうとする」</font>ので困りました。

効果のあった指示が、下記の二つです。<font color="red">明確にインポート文等のコードを指示し、知識にない状態であることを分からせると、Webの検索をするようになりました。</font>


<b>・agentsモジュールの使用をやめたがるので</b>

:::note info 
@agents_sdk.mdc 添付を元に、OpenAI agents sdkの情報をwebで検索して確認してください。"Hello world example"では、インポート文は"from agents import Agent, Runner"となっています。
:::


<b>・違うライブラリのToolを使用したがるので</b>

:::note info
@agents_sdk.mdc OpenAI sdkの機能を使用してください。"@https://note.com/npaka/n/nb83f80a0b023 "のWebの記事では、"from agents import Agent, FunctionTool, RunContextWrapper, function_tool"でインポートした機能"@function_tool"を使用してツールを定義しています。
:::

あとは、少しデバッグすることで、OpenAI Agents SDK版が動作するようになりました。
下記は、OpenAI Agents SDKのサーバ側のトレース情報です。

![スクリーンショット 2025-03-31 23.53.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982568/7cf2d981-af89-48bf-bc3b-e560b467ada9.png)

![スクリーンショット 2025-03-31 23.54.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3982568/ee4fd383-b45b-4005-9479-11770f683fcd.png)

# 4.リポジトリ
今回の作業の成果は、下記のリポジトリにまとめています。

https://github.com/michihiro88/test-coding-agent

# 5.資料
OpenAI Agents SDKの勉強に、下記の資料がとても役に立ちました。

## 5.1. 公式資料
 - OpenAI Agents SDK
   https://openai.github.io/openai-agents-python/

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

 - openai/openai-agents-python: A lightweight, powerful framework for multi-agent workflows
   https://github.com/openai/openai-agents-python

## 5.2. 有用な情報源
(a)npakaさん記載の『OpenAI Responses API 入門』
	
https://note.com/npaka/n/nf6cc94556c67
    	
https://note.com/npaka/n/nc497666772b8
		
https://note.com/npaka/n/n68863a1fa403

https://note.com/npaka/n/n6229e275cbfb

https://note.com/npaka/n/n07378b5a4579
		
https://note.com/npaka/n/nb4f1961664d6

https://note.com/npaka/n/nce4e1830b004

https://note.com/npaka/n/na9881511f1c8
		
https://note.com/npaka/n/nb10ccc6608b3
		
https://note.com/npaka/n/n0410c8e3f31e
		
https://note.com/npaka/n/n0a15aa971ebe
		
https://note.com/npaka/n/naed673290cf6	
		
(b)npakaさん記載の『OpenAI Agents SDK 入門』 

https://note.com/npaka/n/n4afc430b7be1
		
https://note.com/npaka/n/ndbf7ba2795fe	
		
https://note.com/npaka/n/nb83f80a0b023	

https://note.com/npaka/n/nf706e8f3552f	

https://note.com/npaka/n/n1eded3a66914	

(c)他のモデルを使用することが可能
・kitfactoryさん記載の記事

https://qiita.com/kitfactory/items/5a169e66b7205f83b555

・株式会社Rosso公式noteの記事

https://note.com/rosso_blog/n/n876213348857


(d)手前みそ:sweat_smile:

https://qiita.com/michihiro88/items/d07bd7f8b270be961acb

2025.04.01 山崎作成