登録して招待リンクを共有すると、動画再生報酬と紹介報酬を獲得できます。

検索結果 OpenAIAgentSDK
OpenAIAgentSDK コミュニティ
1つのキーワードが1つのコミュニティです。
コミュニティ作成
アカウント
見つかりません
OpenAIAgentSDK を含む検索結果
# OpenAI Agent SDKの便利だけど知られていない機能 🌍 トレースデータをOpenAI以外の観測基盤にも送りたいと思ったことはありませんか? カスタムトレースプロセッサを使えば、W&B、Arize、DataDogなど好みのプラットフォームにトレースを送信できます。 📌 タイトル:カスタムトレースプロセッサ 🔗 URL: 🧩 概要 `add_trace_processor()` を使うと、デフォルトのトレースプロセッサに加えて独自のプロセッサを追加できます。一方、`set_trace_processors()` を使うとデフォルトのプロセッサを完全に置き換えることができます。これにより、Weights & Biases、Arize、DataDog、独自のログ基盤など、任意のバックエンドにトレースデータを送信するカスタム連携が実現できます。 🛠 使い方 ```python from agents.tracing import ( add_trace_processor, set_trace_processors, TracingProcessor, ) # カスタムプロセッサを定義 class DataDogProcessor(TracingProcessor): def on_trace_start(self, trace): dd_tracer.start_span( def on_trace_end(self, trace): dd_tracer.finish_span() def on_span_start(self, span): dd_tracer.start_child_span( def on_span_end(self, span): dd_tracer.finish_child_span() # shutdown と force_flush も抽象メソッドなので実装が必要 def shutdown(self): dd_tracer.shutdown() def force_flush(self): dd_tracer.flush() # デフォルトに追加(OpenAIとDataDog両方に送信) add_trace_processor(DataDogProcessor()) # または、デフォルトを置き換え(DataDogのみに送信) set_trace_processors([DataDogProcessor()]) ``` 🏗 本番システムへの組み込み方 ・`add_trace_processor()` で既存のOpenAIトレースを維持しつつ、社内の観測基盤にも並行送信する ・障害調査用に独自のログストレージにトレースを保存するプロセッサを追加する ・環境変数でプロセッサの切り替えを制御し、開発/本番で送信先を変える ・プロセッサ内でのエラーが本体処理に影響しないよう、例外ハンドリングを適切に行う 💡 ユースケース 📊 Weights & Biasesでエージェント実行のメトリクスを可視化 🔍 Arize AIでLLM出力の品質モニタリング 📈 DataDogでエージェントのパフォーマンスダッシュボードを構築 🗄 社内データレイクへのトレースデータのアーカイブ ⚠️ 注意点 `set_trace_processors()` を使うとデフォルトのOpenAIトレースプロセッサが無効になります。OpenAIダッシュボードでのトレース確認も必要な場合は `add_trace_processor()` を使いましょう。カスタムプロセッサのパフォーマンスがエージェント全体の速度に影響する可能性があるため、軽量な実装を心がけてください。 ✨ カスタムトレースプロセッサで、既存の観測基盤とシームレスに統合しましょう。 #OpenAIAgentSDK# #AIAgent#
もっと見る
# OpenAI Agent SDKの便利だけど知られていない機能 🌍 複雑なマルチエージェント構成、頭の中だけで把握できていますか? draw_graphを使えば、エージェントの構成をGraphvizで視覚的に可視化し、全体像を一目で確認できます。 📌 タイトル:draw_graph によるエージェント可視化 🔗 URL: 🧩 概要 `draw_graph(agent)` を呼び出すだけで、エージェント・ツール・ハンドオフの関係をGraphvizのグラフとして描画できます。エージェントは黄色の四角形、ツールは緑の楕円、MCPサーバーは灰色で表示されます。ハンドオフは実線矢印、ツール接続は点線、MCP接続は破線で区別されます。生成されたグラフは `.view()` でブラウザ表示、`filename=` でファイル保存が可能です。 🛠 使い方 ```python # vizオプション付きでインストール # pip install "openai-agents[viz]" from agents import Agent, function_tool from agents.extensions.visualization import draw_graph @function_tool def search(query: str) -> str: return "results" sub_agent = Agent(name="Researcher", tools=[search]) main_agent = Agent( name="Coordinator", handoffs=[sub_agent], ) # グラフを描画してブラウザで表示 graph = draw_graph(main_agent) graph.view() # ファイルに保存 draw_graph(main_agent, filename="agent_graph") ``` 🏗 本番システムへの組み込み方 ・CI/CDパイプラインでグラフを自動生成し、ドキュメントとして保存する ・コードレビュー時にエージェント構成の変更を視覚的に確認する ・新しいメンバーのオンボーディングに、システム全体像の把握資料として活用する ・構成変更前後のグラフを比較して、意図しないハンドオフの追加・削除を検出する 💡 ユースケース 🗺 マルチエージェントシステムのアーキテクチャドキュメント自動生成 👥 チーム内でのエージェント構成の共有・レビュー 🐛 ハンドオフの循環参照や孤立ツールの検出 📊 プロジェクト提案時のシステム構成図作成 ⚠️ 注意点 利用には `pip install "openai-agents[viz]"` で追加依存(Graphviz)のインストールが必要です。システムにGraphvizバイナリもインストールされている必要があります。非常に大規模なエージェント構成では、グラフが複雑になりすぎる場合があります。 ✨ draw_graphで、エージェント構成を「見える化」してチーム全体の理解を深めましょう。 #OpenAIAgentSDK# #AIAgent#
もっと見る
# OpenAI Agent SDKの便利だけど知られていない機能 🌍 ツールの出力が巨大すぎて、コンテキストウィンドウを圧迫していませんか? ToolOutputTrimmerを使えば、古いツール出力を自動的にトリミングし、コンテキストを効率的に管理できます。 📌 タイトル:Tool output trimmer 拡張 🔗 URL: 🧩 概要 `ToolOutputTrimmer` は `CallModelInputFilter` として動作し、会話履歴内のツール出力をスライディングウィンドウ方式でトリミングします。直近のターン(デフォルト2ターン)はそのまま保持し、古いターンの出力が `max_output_chars`(デフォルト500文字)を超える場合、先頭 `preview_chars`(デフォルト200文字)だけを残して切り詰めます。元のメッセージは変更せず、浅いコピーで非破壊的に処理されます。 🛠 使い方 ```python from agents import RunConfig from agents.extensions.tool_output_trimmer import ToolOutputTrimmer # デフォルト設定で使用 trimmer = ToolOutputTrimmer() # カスタム設定 trimmer = ToolOutputTrimmer( recent_turns=3, # 直近3ターンは保持 max_output_chars=1000, # 1000文字超でトリミング preview_chars=300, # 先頭300文字を残す trimmable_tools=["search", "fetch_page"], # 特定ツールのみ対象 ) # RunConfigに設定 config = RunConfig(call_model_input_filter=trimmer) result = await "質問", run_config=config) ``` 🏗 本番システムへの組み込み方 ・大量のテキストを返すツール(検索、Web取得など)には積極的に適用する ・`trimmable_tools` で対象ツールを限定し、重要なツール出力は保持する ・`recent_turns` はエージェントの推論に必要な直近のコンテキスト量に合わせて調整する ・非破壊的なので、デバッグ時に元のメッセージを確認できる 💡 ユースケース 🔍 大量の検索結果を返すRAGパイプラインのコンテキスト最適化 📄 長文Webページの取得結果を効率的に管理 🔄 マルチターン会話でのトークン消費量削減 💰 コンテキストウィンドウの有効活用によるAPIコスト最適化 ⚠️ 注意点 トリミングにより古いターンの詳細情報が失われるため、エージェントが過去のツール出力を参照する必要がある場合は `recent_turns` を十分に大きく設定してください。また、`trimmable_tools` を指定しない場合は全ツールが対象になります。 ✨ ToolOutputTrimmerで、長い会話でもコンテキストを賢く管理しましょう。 #OpenAIAgentSDK# #AIAgent#
もっと見る
# OpenAI Agent SDKの便利だけど知られていない機能 🌍 エージェントの会話履歴に機密情報が含まれているのに、平文で保存していませんか? EncryptedSessionを使えば、会話データをFernet暗号化で保護し、TTLによる自動失効も設定できます。 📌 タイトル:暗号化セッション (EncryptedSession) 🔗 URL: 🧩 概要 `EncryptedSession` は、任意のセッションバックエンドを `underlying_session` としてラップし会話データを暗号化するドロップインラッパーです。Fernet暗号化を採用し、HKDF(info 文字列 `"agents.session-store.hkdf.v1"`、salt は session_id)によるセッションごとの鍵導出でセッション間の暗号分離を実現します。`ttl`(既定 600 秒)を超えた項目は取得時に自動的にスキップされます。マスターキーには `Fernet.generate_key()` などの高エントロピーな値を使います(生の文字列も互換性のため受け付けますが、パスワードのような低エントロピーの秘密は不適切です)。 🛠 使い方 ```python import os from cryptography.fernet import Fernet from agents import SQLiteSession from agents.extensions.memory import EncryptedSession # 基底セッションを暗号化でラップ base_session = SQLiteSession("chat-001", "sessions.db") # マスターキーは Fernet.generate_key() などの高エントロピーな値を使う encryption_key = Fernet.generate_key().decode("ascii") encrypted = EncryptedSession( session_id="chat-001", underlying_session=base_session, encryption_key=encryption_key, ttl=3600, # 1時間で失効(既定は 600 秒) ) # 永続化する場合は同じキーを Secret Manager 等から読み込んで再利用する encrypted = EncryptedSession( session_id="chat-001", underlying_session=base_session, encryption_key=os.environ["SESSION_ENCRYPTION_KEY"], ttl=7200, ) # 通常のセッションと同じインターフェースで利用可能 items = await encrypted.get_items() ``` 🏗 本番システムへの組み込み方 ・医療・金融など規制業界のコンプライアンス要件に対応する ・HKDFによりセッションごとに異なる暗号鍵が導出されるため、1セッションの漏洩が他に波及しない ・TTLを設定して、一定期間後に復号不能にする「暗号学的データ消去」を実現する ・既存のSQLiteSession / RedisSession等をそのままラップでき、移行コストが極めて低い 💡 ユースケース 🏥 医療情報を含む会話の暗号化保存 🏦 金融データを扱うエージェントのセキュリティ強化 🔐 GDPRの「忘れられる権利」対応(TTL失効) 🛡 マルチテナント環境でのセッション間データ分離 ⚠️ 注意点 利用には `pip install 'openai-agents[encrypt]'` で `encrypt` extra をインストールしてください。暗号化されたデータに対しては `find_turns_by_content()` などの内容検索が機能しません。検索が必要な場合は検索用のインデックスを別途管理する必要があります。また、暗号鍵を紛失するとデータが復元不能になるため、鍵の安全な管理(Secret Manager等)が必須です。`encryption_key` を変更しても既存レコードは再暗号化されないため、古いデータの復号には元のキーが必要です。 ✨ EncryptedSessionで、会話データの保護をコード1行で実現しましょう。 #OpenAIAgentSDK# #AIAgent#
もっと見る
# OpenAI Agent SDKの便利だけど知られていない機能 🌍 会話の途中から「もしあの時違う回答をしていたら?」と試したくなったことはありませんか? AdvancedSQLiteSessionの会話ブランチング機能を使えば、会話履歴の任意の地点から分岐を作り、代替パスを探索できます。 📌 タイトル:AdvancedSQLiteSession の会話ブランチング 🔗 URL: 🧩 概要 `AdvancedSQLiteSession` は、ターン番号や検索語句を指定して会話を分岐させる機能を備えています。`create_branch_from_turn(turn_number)` で特定のターンから、`create_branch_from_content(search_term)` で特定の内容を含むターンから分岐を作成できます。`list_branches()` で一覧、`switch_to_branch()` で切替、`delete_branch()` で削除も可能です。 🛠 使い方 ```python from agents.extensions.memory import AdvancedSQLiteSession session = AdvancedSQLiteSession( session_id="chat-001", db_path="sessions.db", create_tables=True, # 既定は False。ブランチ用テーブルの作成に必要 ) # ターン3の時点から新しいブランチを作成 branch_id = await session.create_branch_from_turn(turn_number=3) # 特定のキーワードを含むターンからブランチを作成 branch_id = await session.create_branch_from_content("APIの設計について") # ブランチの管理 branches = await session.list_branches() await session.switch_to_branch(branch_id) await session.delete_branch(branch_id, force=True) # 現在のブランチを削除するには force=True ``` 🏗 本番システムへの組み込み方 ・ユーザーが「やり直したい」と言った際に、直前のターンからブランチを作成して再試行する ・エージェント評価で、同じ入力に対して複数の応答パスを比較分析する ・顧客サポートで、異なる解決策を並行で探索し最適なものを選ぶ ・会話のチェックポイントとしてブランチを活用し、重要な分岐点を記録する 💡 ユースケース 🔀 会話の「what-if」分析 🧪 エージェント応答品質のA/Bテスト 🎯 複数の解決策パスの並行探索 📝 会話履歴のチェックポイント管理 ⚠️ 注意点 ブランチが増えるとストレージ使用量が増加します。不要なブランチは定期的に `delete_branch()` で削除してください(現在のブランチを消す場合は `force=True`、`main` は削除できません)。ブランチ ID はセッション ID の生存期間中ユニークで、削除やセッションのクリア後も再利用できないため、新しいブランチには別の名前を付けます。また、ブランチ間の切り替え時にコンテキストの混乱が起きないよう、ブランチのラベル管理を適切に行いましょう。 ✨ 会話ブランチングで、エージェントとの対話に「タイムトラベル」の自由を加えましょう。 #OpenAIAgentSDK# #AIAgent#
もっと見る
# OpenAI Agent SDKの便利だけど知られていない機能 🌍 MCPサーバーへのツール一覧取得が毎回ネットワークコールになっていませんか? `list_tools()` のキャッシュを有効にすれば、安定したツール定義の再取得を省略し、レイテンシを大幅に削減できます。 📌 タイトル:list_tools() のキャッシュ 🔗 URL: 🧩 概要 MCPサーバーのツール定義が頻繁に変わらない場合、毎回 `list_tools()` をネットワーク越しに呼ぶのは無駄です。`cache_tools_list=True` を設定するだけで、ツール一覧をメモリにキャッシュし、2回目以降の取得を高速化します。ツール定義を更新した場合は `server.invalidate_tools_cache()` で明示的にキャッシュをクリアできます。 🛠 使い方 ```python from agents.mcp import MCPServerStreamableHttp # ツール一覧のキャッシュを有効化 server = MCPServerStreamableHttp( params={"url": ""}, cache_tools_list=True, ) async with server: # 初回はネットワーク呼び出し、2回目以降はキャッシュから取得 tools = await server.list_tools() # ツール定義が変わった場合にキャッシュをクリア server.invalidate_tools_cache() tools = await server.list_tools() # 再取得される ``` 🏗 本番システムへの組み込み方 ・ツール定義が安定しているMCPサーバーには必ず `cache_tools_list=True` を設定する ・デプロイ時やツール更新時に `invalidate_tools_cache()` を呼んでキャッシュをリフレッシュする ・複数エージェントが同一サーバーを共有する場合、キャッシュにより全体のレイテンシが改善される ・ヘルスチェックのタイミングでキャッシュを定期的にリフレッシュする運用も有効 💡 ユースケース ⚡ 高頻度でエージェントを呼び出すチャットアプリのレスポンス改善 🔄 マルチターン会話でのツール一覧取得のオーバーヘッド削減 🏢 安定したツールセットを持つ社内MCPサーバーの最適化 📉 MCPサーバーへのリクエスト数削減によるコスト最適化 ⚠️ 注意点 キャッシュを有効にすると、MCPサーバー側でツールが追加・削除されても反映されません。ツール定義が動的に変わる環境では、適切なタイミングで `invalidate_tools_cache()` を呼ぶか、キャッシュを無効のままにしてください。 ✨ シンプルなフラグ一つで、MCPツール取得のオーバーヘッドを解消しましょう。 #OpenAIAgentSDK# #AIAgent#
もっと見る
# OpenAI Agent SDKの便利だけど知られていない機能 🌍 MCPサーバーが大量のツールを公開しているとき、エージェントに全部見せていませんか? ツールフィルタリングを使えば、静的・動的にツールの公開範囲を制御し、エージェントの精度とセキュリティを向上できます。 📌 タイトル:ツールフィルタリング (静的 / 動的) 🔗 URL: 🧩 概要 MCPサーバーが多数のツールを提供する場合、すべてをエージェントに公開するとモデルが混乱したり、意図しないツールを呼んでしまうリスクがあります。`tool_filter` パラメータを使えば、静的フィルタ(`create_static_tool_filter`)で許可リスト/ブロックリストを指定するか、動的フィルタ(同期または非同期の関数)で実行時コンテキストに応じてツールの可否を判定できます。`allowed_tool_names` と `blocked_tool_names` を両方指定した場合は、許可リストを適用した後にブロックリストを差し引きます。 🛠 使い方 ```python from agents.mcp import MCPServerStreamableHttp, create_static_tool_filter # 静的フィルタ:許可するツール名を明示 server = MCPServerStreamableHttp( params={"url": ""}, tool_filter=create_static_tool_filter( allowed_tool_names=["search", "summarize"] ), ) # 動的フィルタ:実行時にコンテキストで判定 async def my_filter(context, tool) -> bool: # context.agent, context.server_name が利用可能 if == "admin": return True # 管理者は全ツール利用可 return in ["search", "read"] server_dynamic = MCPServerStreamableHttp( params={"url": ""}, tool_filter=my_filter, ) ``` 🏗 本番システムへの組み込み方 ・ユーザーの権限レベルに応じて利用可能なツールを動的に切り替える ・静的フィルタで不要なツールを除外し、モデルのツール選択精度を高める ・` にテナント情報を渡し、マルチテナント環境でツールを分離する ・動的フィルタのログを残して、アクセス制御の監査証跡とする 💡 ユースケース 🔒 ロールベースのツールアクセス制御 🎯 タスク特化型エージェントへのツール絞り込み 🏢 マルチテナント環境でのツール分離 🛡 セキュリティポリシーに基づくツール制限 ⚠️ 注意点 動的フィルタはツール一覧取得のたびに呼ばれるため、重い処理(DB参照など)を入れるとレイテンシに影響します。フィルタのロジックはシンプルに保ち、必要ならキャッシュを活用してください。また、フィルタで除外したツールがエージェントの動作に必須でないか、事前に確認しましょう。 ✨ ツールフィルタリングで、エージェントに「必要なツールだけ」を渡す洗練された設計を実現しましょう。 #OpenAIAgentSDK# #AIAgent#
もっと見る
# OpenAI Agent SDKの便利だけど知られていない機能 🌍 複数の LLM プロバイダを 1 つのエージェントシステムで混在させたいと思ったことはありませんか? `MultiProvider` を使えば、モデル名のプレフィックスで自動的にプロバイダをルーティングできます。 📌 タイトル:MultiProvider による接頭辞ルーティング 🔗 URL: 🧩 概要 `MultiProvider` は、モデル名のプレフィックス(例:`openai/gpt-4.1`)に基づいてリクエストを適切なプロバイダに自動ルーティングします。`openai_prefix_mode="model_id"` を設定すると `openai/...` をそのままモデル ID として扱い、`unknown_prefix_mode="model_id"` で未知のプレフィックスもモデル ID としてルーティングします。`openai_use_responses_websocket=True` で WebSocket トランスポートも有効化可能です。 🛠 使い方 ```python from agents import Agent, MultiProvider, RunConfig, Runner provider = MultiProvider( openai_base_url="", openai_api_key="...", openai_use_responses_websocket=True, openai_prefix_mode="model_id", unknown_prefix_mode="model_id", ) agent = Agent( name="Assistant", instructions="Be concise.", model="openai/gpt-4.1", ) result = await agent, "Hello", run_config=RunConfig(model_provider=provider), ) ``` 🏗 本番システムへの組み込み方 ・コストやレイテンシに応じて、エージェントごとに異なるプロバイダのモデルを割り当てる ・OpenRouter などの統合ゲートウェイと組み合わせ、`openai_prefix_mode="model_id"` でプレフィックス付きモデル名をそのまま渡す ・`RunConfig(model_provider=provider)` で実行時にプロバイダを切り替え、A/B テストを実施する ・WebSocket を有効にして、対応プロバイダでのストリーミング性能を向上させる 💡 ユースケース 🔀 タスクの難易度に応じた GPT-4.1 / GPT-5.5 の使い分け 🌐 OpenRouter 経由での複数プロバイダへのアクセス統合 💰 高コストモデルと低コストモデルのハイブリッド運用 🧪 異なるモデル間での品質比較テスト ⚠️ 注意点 デフォルトでは `openai/...` は OpenAI プロバイダのエイリアスとして扱われ、未知のプレフィックスは `UserError` を発生させます。OpenRouter など外部ゲートウェイを使う場合は、必ず `openai_prefix_mode` と `unknown_prefix_mode` を `"model_id"` に設定してください。プロバイダごとに対応する機能(ツール呼び出し、構造化出力など)が異なる点にも注意が必要です。 ✨ MultiProvider で、複数のモデルを自在に組み合わせたエージェントシステムを構築しましょう。 #OpenAIAgentSDK# #AIAgent#
もっと見る
# OpenAI Agent SDKの便利だけど知られていない機能 🌍 SDK が直接サポートしていないプロバイダ固有のパラメータを、エージェントに渡したいと思ったことはありませんか? `extra_args` を使えば、`ModelSettings` に任意のプロバイダ固有フィールドを追加できます。 📌 タイトル:extra_args の受け渡し 🔗 URL: 🧩 概要 `ModelSettings` の `extra_args` パラメータに辞書を渡すことで、SDK のトップレベルプロパティとして公開されていないプロバイダ固有のリクエストフィールドをモデルに送信できます。例えば OpenAI Responses API の `service_tier` や `user` などを指定可能です。これにより、SDK のアップデートを待たずに新しい API パラメータを利用できます。 🛠 使い方 ```python from agents import Agent, ModelSettings agent = Agent( name="English agent", instructions="You only speak English", model="gpt-4.1", model_settings=ModelSettings( temperature=0.1, extra_args={ "service_tier": "flex", "user": "user_12345", }, ), ) ``` 🏗 本番システムへの組み込み方 ・`service_tier` でコスト最適化(例:`"flex"` で低優先度バッチ処理を安価に実行) ・`user` フィールドでユーザー単位のトラッキングと不正利用検知を有効化する ・新しい API パラメータが追加された際、SDK の更新を待たずに即座に利用可能 ・環境変数や設定ファイルから `extra_args` を動的に構築し、デプロイ環境ごとに調整する 💡 ユースケース 💰 `service_tier: "flex"` でバッチ処理のコスト削減 👤 `user` フィールドによるユーザー単位の利用量追跡 🔧 プロバイダの新機能をリリース直後から活用 🏢 マルチテナント環境でのテナント別パラメータ注入 ⚠️ 注意点 同じリクエストフィールドを `ModelSettings` の直接プロパティと `extra_args` の両方で設定しないでください。重複設定は予期しない動作を引き起こす可能性があります。また、`extra_args` に渡す値はプロバイダの API 仕様に準拠している必要があり、SDK 側でのバリデーションは行われません。 ✨ extra_args で、SDK の枠を超えたプロバイダ固有の最適化を手軽に適用しましょう。 #OpenAIAgentSDK# #AIAgent#
もっと見る
# OpenAI Agent SDKの便利で実践的な使い方 🌍 エージェントの応答をリアルタイムに届けましょう! Streamingイベントを使い分けることで、タイプライターUIからツール実行通知まで、ユーザー体験を劇的に向上させることができます。 📌 タイトル:Streaming 🔗 URL: 🧩 概要 OpenAI Agent SDKのStreamingは3種類のイベントを提供します。RawResponsesStreamEventはLLMの生トークンをリアルタイムに流し、RunItemStreamEventはメッセージ作成やツール呼び出しなどの粗い粒度のイベントを通知し、AgentUpdatedStreamEventはエージェント切り替えを検知します。cancel()による即時中断やターン単位のキャンセルも可能です。 🛠 使い方 `Agent(name="assistant", instructions="丁寧に回答してください")` を定義し、` "AIの最新動向を教えて")` でストリーミング実行します。`async for event in でイベントをイテレートし、`isinstance(event, RawResponsesStreamEvent)` の場合は ` でトークンをリアルタイム表示します。`isinstance(event, RunItemStreamEvent)` の場合は `event.item.type` が `"tool_called"` でツール呼び出し通知、`"tool_output"` で完了通知、`"message_output_created"` でメッセージ生成開始を表示します。`isinstance(event, AgentUpdatedStreamEvent)` では ` でエージェント切り替えを通知します。最後に `await で最終結果を取得します。 キャンセルは ` "長い分析をして")` で開始した後、ストリームイベントのループ内で `result.cancel()` を呼ぶと即座に中断、`result.cancel(mode="after_turn")` を呼ぶと現在のターン完了後に停止します。キャンセル後は `async for _ in pass` でイテレータを消費してリソースをクリーンアップします。 🏗 実践的な使い方 チャットUIでは、`RawResponsesStreamEvent`の`output_text.delta`を使ったタイプライター表示が基本です。しかし、ツール呼び出し中はトークンが流れないため、`RunItemStreamEvent`の`tool_called`イベントで「検索中...」のようなプログレス表示を挟むのがベストプラクティスです。 マルチエージェント構成では、`AgentUpdatedStreamEvent`で「リサーチャーからライターに切り替わりました」のような表示ができます。これにより、ユーザーは処理の流れを理解しやすくなります。 キャンセルは2モードあります。`cancel()`は即座に中断しますが、`cancel(mode="after_turn")`は現在のLLMターンが完了してからクリーンに停止します。どちらの場合も、キャンセル後にストリームイテレータを最後まで消費してリソースをクリーンアップすることが重要です。 💡 ユースケース ⌨️ チャットアプリでのタイプライター風リアルタイム表示 🔧 ツール実行中の「検索中...」「計算中...」プログレス表示 🔄 マルチエージェント切り替えのリアルタイム通知UI 🛑 ユーザーの「停止」ボタンによる安全なキャンセル処理 ⚠️ 注意点 - `cancel()`後もイテレータを消費しないとリソースリークが発生する可能性があります - `RawResponsesStreamEvent`はトークン単位のため高頻度です。UIの再描画頻度に注意してください - Streaming中のエラーはイベントとして流れてくるため、適切にハンドリングしてください ✨ Streamingイベントを適切に使い分けることで、エージェントが「考えている」「調べている」「書いている」をユーザーに伝える、応答性の高いUIが実現できます! #OpenAIAgentSDK# #AIAgent#
もっと見る