1.動機
久しぶりにブログの記事です。
簡単なコードの生成ができるシンプルなエージェントの作成です。
元となるプログラムは下記の株式会社マインディア テックブログの記事で紹介されていたもので、非常に分かりやすくエージェントの動作が説明されています。こんな簡潔なんだと、感銘を受けました。
上記の記事で紹介されていたコードは、go言語によるものですが、これを、python版、及び、OpenAI Agents SDKにポーティングしました。Cursorに指示して
2. python版にポーティング
2.1 最初の失敗は、文字化け
最初の指示は、下記のようなものでしたが、「文字化けが発生」→「修正」→「ファイル削除」を繰り返してしまいました。
goフォルダ配下のファイルは、go言語で記載された、coding agentのサンプルで、これを元に、python言語で同様なcoding agentを作成して、tool.pyに記載してください。
そこで、下記のように、文字コードを明確に指定して、やり直しました。
goフォルダ下のファイルは、go言語で記載されたAI coding Agentです。文字コードはutf-8です。これを元に、python言語で記載されたAI coding Agentのプログラムを作成し、pythonフォルダ下に格納してください。使用する文字コードはutf-8としてください。なお、実行環境はWindows上のPowershellです。
2.2 ログの強化
プログラムが起動するようになりましたが、下記のようなコンソール出力となり、何が起きているか分かりませんでした。
(.venv) PS C:\Users\yamaz\Dropbox\work\20250329_test-coding-agent\python> python .\main.py
コーディングエージェントにタスクを入力してください:
電卓アプリを作成してください。
[] 有効なツールが見つかりませんでした
[] 有効なツールが見つかりませんでした
[] 有効なツールが見つかりませんでした
[write_file] ファイルの書き込みに失敗しました: [WinError 3] 指定されたパスが見つかりません。: ''
[] 有効なツールが見つかりませんでした
[] 有効なツールが見つかりませんでした
ログ情報の出力が必要でしたが、以前にCurosrやWinsurfを試したときは、「ログファイルが生成されない」「ログファイルに情報が出力されていない」「意図した情報ではない」など、ログ出力から破綻の契機となりがちでした。今回は、ソースコードを確認し、ログ出力内容を明確に指示しました。
main.pyの中で、client.chat.completions.createの送信データであるmessagesと、受信データであるassistant_responseの値を追記式で、ログファイルへ格納するように、改造を提案してください。改造は、現状のソースコードへの影響が最小限になるようにしてください。
2.3 AIからの応答が期待通りでない。
ログを強化して、何が起きたか分かるようになりましたが、AIモデルから下記のような応答を受け取っていました。
{"timestamp": "2025-03-29T23:57:02.509700", "type": "response", "data": "申し訳ありませんが、上記のツールを使用して電卓アプリを直接作成することはできません。ただし、Pythonなどの一般的なプログラミング言語を使って示すことは可能です。\n\n電卓アプリのシンプルな例を以下に示します:\n\npython\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)に、
pythonフォルダ下のAI coding agentプログラムを実行したところ、添付の実行結果になりました。AIからの回答が、ツールの呼出しができる回答になっていないようですが、どのようにすれば改善できるか、検討してください
と指示したところ、直してくれました。
重要な指示として、くどいくらい具体的に指示し、動作の例も追加されています。
必ず上記のいずれかのツールを使用してください。ツールを使わずに直接回答しないでください。
重要な指示:
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呼出しのパラメータの追加が提案されました。
temperature=0.2, # より決定論的な応答を促す
max_tokens=2000, # 十分な長さの応答を確保
top_p=0.95 # 出力の多様性を若干制限
この変更で、一通り動作するようになりました
3.OpenAI Agents SDK版にポーティング
3.1 OpenAI Agents SDKの知識を用意
リリース日が早いので、Claude 3.7 Sonnetは、OpenAI Agents SDKを知らないはずです。
そこで、Cursorのルールを用意しました。
#概要
- 本ルールは、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 なかなか、用意した知識を使用してくれない。
最初の指示では、ファイルをマージしただけでした。
pythonフォルダ下に、AI coding agentsのプログラムが格納されています。.cursor\rules\agents_sdk.mdcの情報を元に、OpenAI Agents SDKのAPIを使用するように、改修してください。改修後のソースコードは、agents_sdkフォルダの下に格納してください。ファイルの文字コードはutf8としてください。
引き続き、指示を繰り返しますが、なかなかうまくいきません
作成されたmain.pyは、OpenAI Agents SDKを使用していません。agents_sdk.mdcの情報を参照して、Webを検索してください。そして、変更に必要なタスクを整理してください。
変更内容が間違っています。OpenAI Agents SDKは、2025/03にOpenAIからリリースされたもので、langchainとは無関係です。pythonのインストールコマンドは"pip install openai-agents"です。@agents_sdk.mdcを元に、Webを検索して情報を調査したうえで、変更点を整理してください。
やっと、期待通りに応答した感じだったので、作業を進めました。
新しいSDKのパラダイムに合わせた再設計を行い、その結果をagets_sdk/doc/redesign.mdファイルに出力してください。その後、実装に必要なタスクを整理して、agets_sdk/doc/tasklist.mdファイルに出力してください。
再設計結果とタスクリストに従い、実装を行ってください。
ところが、「正しいモジュール名でインポートしてくれない」「エラーが出るとAgents SDKのモジュールを削除して、知識にある別のモジュールを使おうとする」ので困りました。
効果のあった指示が、下記の二つです。明確にインポート文等のコードを指示し、知識にない状態であることを分からせると、Webの検索をするようになりました。
・agentsモジュールの使用をやめたがるので
@agents_sdk.mdc 添付を元に、OpenAI agents sdkの情報をwebで検索して確認してください。"Hello world example"では、インポート文は"from agents import Agent, Runner"となっています。
・違うライブラリのToolを使用したがるので
@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のサーバ側のトレース情報です。
4.リポジトリ
今回の作業の成果は、下記のリポジトリにまとめています。
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 入門』
(b)npakaさん記載の『OpenAI Agents SDK 入門』
(c)他のモデルを使用することが可能
・kitfactoryさん記載の記事
・株式会社Rosso公式noteの記事
(d)手前みそ
2025.04.01 山崎作成