diff --git a/.github/workflows/update-docs.yml b/.github/workflows/update-docs.yml index 327209110..6dc548fbe 100644 --- a/.github/workflows/update-docs.yml +++ b/.github/workflows/update-docs.yml @@ -13,6 +13,10 @@ on: - 'docs/**' - mkdocs.yml +permissions: + contents: write + pull-requests: write + jobs: update-docs: if: "!contains(github.event.head_commit.message, 'Update all translated document pages')" diff --git a/docs/ja/agents.md b/docs/ja/agents.md index 999a2b49e..42d295e77 100644 --- a/docs/ja/agents.md +++ b/docs/ja/agents.md @@ -4,16 +4,16 @@ search: --- # エージェント -エージェントはアプリの中核となる基本コンポーネントです。エージェントは、instructions とツールで構成された大規模言語モデル( LLM )です。 +エージェント はアプリのコアとなるビルディングブロックです。エージェント は大規模言語モデル( LLM )で、 instructions とツールで構成します。 ## 基本構成 -エージェントで最も一般的に設定するプロパティは次のとおりです。 +エージェント で最も一般的に設定するプロパティは次のとおりです。 -- `name`: エージェントを識別する必須の文字列です。 -- `instructions`: developer メッセージまたは system prompt とも呼ばれます。 -- `model`: 使用する LLM と、temperature、top_p などのモデル調整パラメーターを設定する任意の `model_settings`。 -- `tools`: エージェントがタスク達成のために使用できるツールです。 +- `name`: エージェント を識別する必須の文字列です。 +- `instructions`: developer メッセージ、または system prompt とも呼ばれます。 +- `model`: 使用する LLM と、 temperature、 top_p などのモデル調整パラメーターを設定する任意の `model_settings`。 +- `tools`: エージェント がタスクを達成するために使用できるツール。 ```python from agents import Agent, ModelSettings, function_tool @@ -33,7 +33,7 @@ agent = Agent( ## コンテキスト -エージェントはその `context` 型に対して汎用的です。コンテキストは依存性注入のためのツールです。あなたが作成して `Runner.run()` に渡すオブジェクトで、すべてのエージェント、ツール、ハンドオフなどに引き渡され、エージェント実行のための依存関係と状態の入れ物として機能します。コンテキストには任意の Python オブジェクトを提供できます。 +エージェント はその `context` 型に対してジェネリックです。コンテキストは依存性注入ツールです。あなたが作成して `Runner.run()` に渡すオブジェクトで、すべてのエージェント、ツール、ハンドオフ などに渡され、エージェント の実行に必要な依存関係や状態をまとめて保持します。コンテキストには任意の Python オブジェクトを提供できます。 ```python @dataclass @@ -52,7 +52,7 @@ agent = Agent[UserContext]( ## 出力タイプ -既定では、エージェントはプレーンテキスト(つまり `str`)の出力を生成します。特定のタイプの出力を生成させたい場合は、`output_type` パラメーターを使用できます。一般的な選択肢は [Pydantic](https://docs.pydantic.dev/) オブジェクトを使うことですが、Pydantic の [TypeAdapter](https://docs.pydantic.dev/latest/api/type_adapter/) でラップできる任意の型(dataclasses、lists、TypedDict など)をサポートします。 +デフォルトでは、エージェント はプレーンテキスト(すなわち `str`)を出力します。特定の型の出力を生成させたい場合は、`output_type` パラメーターを使用できます。一般的には [Pydantic](https://docs.pydantic.dev/) オブジェクトを使いますが、Pydantic の [TypeAdapter](https://docs.pydantic.dev/latest/api/type_adapter/) でラップできる任意の型(dataclasses、lists、TypedDict など)をサポートします。 ```python from pydantic import BaseModel @@ -73,20 +73,20 @@ agent = Agent( !!! note - `output_type` を渡すと、モデルは通常のプレーンテキスト応答ではなく [structured outputs](https://platform.openai.com/docs/guides/structured-outputs) を使用するように指示されます。 + `output_type` を渡すと、モデルは通常のプレーンテキスト応答ではなく、[structured outputs](https://platform.openai.com/docs/guides/structured-outputs) を使用するようになります。 -## マルチエージェント システムの設計パターン +## マルチ エージェント システムの設計パターン -マルチエージェント システムの設計方法は多様ですが、一般的に広く適用できるパターンが 2 つあります。 +マルチ エージェント システムの設計方法は多数ありますが、一般的に広く適用できるパターンを 2 つ挙げます。 -1. マネージャー(エージェントをツールとして使用): 中央のマネージャー/オーケストレーターが、ツールとして公開された専門のサブエージェントを呼び出し、会話の制御を保持します。 -2. ハンドオフ: ピアのエージェントが制御を専門のエージェントに引き渡し、そのエージェントが会話を引き継ぎます。これは分散型です。 +1. マネージャー(エージェント をツールとして使用): 中央のマネージャー/オーケストレーターが、専用のサブ エージェント をツールとして呼び出し、会話の制御を保持します。 +2. ハンドオフ: ピア エージェント が制御を、会話を引き継ぐ特化型エージェント にハンドオフします。こちらは分散型です。 -詳細は [エージェント構築の実践ガイド](https://cdn.openai.com/business-guides-and-resources/a-practical-guide-to-building-agents.pdf)をご覧ください。 +詳細は [エージェント 構築の実践ガイド](https://cdn.openai.com/business-guides-and-resources/a-practical-guide-to-building-agents.pdf) をご覧ください。 -### マネージャー(エージェントをツールとして使用) +### マネージャー(エージェント をツールとして使用) -`customer_facing_agent` はすべてのユーザーとの対話を処理し、ツールとして公開された専門のサブエージェントを呼び出します。詳細は [ツール](tools.md#agents-as-tools) ドキュメントをお読みください。 +`customer_facing_agent` がすべてのユーザー とのやり取りを処理し、ツールとして公開された専用のサブ エージェント を呼び出します。詳しくは [ツール](tools.md#agents-as-tools) ドキュメントをご覧ください。 ```python from agents import Agent @@ -115,7 +115,7 @@ customer_facing_agent = Agent( ### ハンドオフ -ハンドオフは、エージェントが委任できるサブエージェントです。ハンドオフが発生すると、委任先のエージェントは会話履歴を受け取り、会話を引き継ぎます。このパターンは、単一のタスクに特化して優れた性能を発揮する、モジュール式で専門的なエージェントを可能にします。詳細は [ハンドオフ](handoffs.md) ドキュメントをお読みください。 +ハンドオフ は、エージェント が委譲できるサブ エージェント です。ハンドオフ が発生すると、委譲先のエージェント は会話履歴を受け取り、会話を引き継ぎます。このパターンにより、単一のタスクに特化して優れた性能を発揮する、モジュール式のエージェント を実現できます。詳しくは [ハンドオフ](handoffs.md) ドキュメントをご覧ください。 ```python from agents import Agent @@ -136,7 +136,7 @@ triage_agent = Agent( ## 動的 instructions -多くの場合、エージェントを作成するときに instructions を指定できますが、関数を介して動的な instructions を提供することもできます。関数はエージェントとコンテキストを受け取り、プロンプトを返す必要があります。通常の関数と `async` 関数の両方が使用できます。 +多くの場合、エージェント を作成する際に instructions を指定します。ただし、関数を介して動的な instructions を提供することもできます。関数はエージェント とコンテキストを受け取り、プロンプトを返す必要があります。通常の関数と `async` 関数の両方を受け付けます。 ```python def dynamic_instructions( @@ -153,15 +153,15 @@ agent = Agent[UserContext]( ## ライフサイクルイベント(フック) -エージェントのライフサイクルを観測したい場合があります。たとえば、イベントをログに記録したり、特定のイベント発生時にデータを事前取得したりできます。`hooks` プロパティでエージェントのライフサイクルにフックできます。[`AgentHooks`][agents.lifecycle.AgentHooks] クラスをサブクラス化し、関心のあるメソッドをオーバーライドしてください。 +場合によっては、エージェント のライフサイクルを観測したいことがあります。例えば、イベントをログに記録したり、特定のイベント発生時にデータを事前取得したりする場合です。`hooks` プロパティでエージェント のライフサイクルにフックできます。[`AgentHooks`][agents.lifecycle.AgentHooks] クラスをサブクラス化し、関心のあるメソッドを override してください。 ## ガードレール -ガードレールにより、エージェントの実行と並行してユーザー入力に対するチェック/検証を行い、さらにエージェントの出力が生成された後のチェック/検証も実行できます。たとえば、ユーザーの入力とエージェントの出力の関連性をスクリーニングできます。詳細は [ガードレール](guardrails.md) ドキュメントをお読みください。 +ガードレール は、エージェント の実行と並行してユーザー 入力に対するチェック/検証を行い、またエージェント の出力が生成された後にも実行できます。例えば、ユーザー の入力やエージェント の出力の関連性をスクリーニングできます。詳しくは [ガードレール](guardrails.md) ドキュメントをご覧ください。 -## エージェントのクローン/コピー +## エージェントのクローン/コピー -エージェントの `clone()` メソッドを使用すると、エージェントを複製し、必要に応じて任意のプロパティを変更できます。 +エージェント の `clone()` メソッドを使うと、エージェント を複製し、任意で好きなプロパティを変更できます。 ```python pirate_agent = Agent( @@ -178,12 +178,12 @@ robot_agent = pirate_agent.clone( ## ツール使用の強制 -ツールの一覧を渡しても、必ずしも LLM がツールを使用するとは限りません。[`ModelSettings.tool_choice`][agents.model_settings.ModelSettings.tool_choice] を設定してツール使用を強制できます。有効な値は次のとおりです。 +ツールのリストを指定しても、LLM が必ずツールを使用するとは限りません。[`ModelSettings.tool_choice`][agents.model_settings.ModelSettings.tool_choice] を設定することで、ツール使用を強制できます。有効な値は次のとおりです。 -1. `auto`: ツールを使用するかどうかを LLM に委ねます。 -2. `required`: LLM にツールの使用を必須にします(どのツールを使うかは賢く判断できます)。 -3. `none`: LLM にツールを使用しないことを必須にします。 -4. 特定の文字列(例: `my_tool`)を設定すると、LLM にその特定のツールの使用を必須にします。 +1. `auto`: LLM にツールを使用するかどうかの判断を任せます。 +2. `required`: LLM にツールの使用を要求します(ただし、どのツールかは賢く判断できます)。 +3. `none`: LLM にツールを _使用しない_ ことを要求します。 +4. 具体的な文字列(例: `my_tool`)を設定すると、LLM にその特定のツールを使用することを要求します。 ```python from agents import Agent, Runner, function_tool, ModelSettings @@ -201,12 +201,12 @@ agent = Agent( ) ``` -## ツール使用時の動作 +## ツール使用時の挙動 -`Agent` 構成の `tool_use_behavior` パラメーターは、ツール出力の扱い方を制御します。 +`Agent` の `tool_use_behavior` パラメーターは、ツール出力の扱い方を制御します。 -- `"run_llm_again"`: 既定。ツールを実行し、その結果を LLM が処理して最終応答を生成します。 -- `"stop_on_first_tool"`: 最初のツール呼び出しの出力を、追加の LLM 処理なしで最終応答として使用します。 +- `"run_llm_again"`: デフォルト。ツールを実行し、その結果を LLM が処理して最終応答を生成します。 +- `"stop_on_first_tool"`: 最初のツール呼び出しの出力を最終応答として使用し、その後の LLM による処理は行いません。 ```python from agents import Agent, Runner, function_tool, ModelSettings @@ -224,7 +224,7 @@ agent = Agent( ) ``` -- `StopAtTools(stop_at_tool_names=[...])`: 指定したいずれかのツールが呼び出された場合に停止し、その出力を最終応答として使用します。 +- `StopAtTools(stop_at_tool_names=[...])`: 指定したいずれかのツールが呼び出された時点で停止し、その出力を最終応答として使用します。 ```python from agents import Agent, Runner, function_tool @@ -248,7 +248,7 @@ agent = Agent( ) ``` -- `ToolsToFinalOutputFunction`: ツール結果を処理し、停止するか LLM を続行するかを判断するカスタム関数です。 +- `ToolsToFinalOutputFunction`: ツール結果を処理し、停止するか LLM を継続するかを決定するカスタム関数です。 ```python from agents import Agent, Runner, function_tool, FunctionToolResult, RunContextWrapper @@ -286,4 +286,4 @@ agent = Agent( !!! note - 無限ループを防ぐため、フレームワークはツール呼び出し後に `tool_choice` を自動的に "auto" にリセットします。この動作は [`agent.reset_tool_choice`][agents.agent.Agent.reset_tool_choice] で設定可能です。無限ループは、ツール結果が LLM に送られ、`tool_choice` のために LLM がさらに別のツール呼び出しを生成し続けることが原因です。 \ No newline at end of file + 無限ループを防ぐため、フレームワークはツール呼び出し後に `tool_choice` を自動的に "auto" にリセットします。この挙動は [`agent.reset_tool_choice`][agents.agent.Agent.reset_tool_choice] で構成できます。無限ループは、ツール結果が LLM に送られ、`tool_choice` により LLM がさらに別のツール呼び出しを生成し続けることで起こります。 \ No newline at end of file diff --git a/docs/ja/config.md b/docs/ja/config.md index f60585fc3..0d64ee986 100644 --- a/docs/ja/config.md +++ b/docs/ja/config.md @@ -6,7 +6,7 @@ search: ## API キーとクライアント -デフォルトでは、SDK はインポート直後から LLM リクエストとトレーシングのために、環境変数 `OPENAI_API_KEY` を探します。アプリ起動前にその環境変数を設定できない場合は、[set_default_openai_key()][agents.set_default_openai_key] 関数でキーを設定できます。 +デフォルトでは、SDK はインポート直後から LLM リクエストとトレーシングのために `OPENAI_API_KEY` 環境変数を探します。アプリ起動前にその環境変数を設定できない場合は、[set_default_openai_key()][agents.set_default_openai_key] 関数でキーを設定できます。 ```python from agents import set_default_openai_key @@ -14,7 +14,7 @@ from agents import set_default_openai_key set_default_openai_key("sk-...") ``` -また、使用する OpenAI クライアントを設定することもできます。デフォルトでは、SDK は環境変数または上記で設定したデフォルトキーを用いて `AsyncOpenAI` インスタンスを作成します。これを変更するには、[set_default_openai_client()][agents.set_default_openai_client] 関数を使用します。 +また、使用する OpenAI クライアントを構成することもできます。デフォルトでは、SDK は環境変数または上記で設定したデフォルトキーを使って `AsyncOpenAI` インスタンスを作成します。これを変更するには、[set_default_openai_client()][agents.set_default_openai_client] 関数を使用します。 ```python from openai import AsyncOpenAI @@ -24,7 +24,7 @@ custom_client = AsyncOpenAI(base_url="...", api_key="...") set_default_openai_client(custom_client) ``` -最後に、使用する OpenAI API をカスタマイズすることも可能です。デフォルトでは OpenAI Responses API を使用します。これを上書きして Chat Completions API を使うには、[set_default_openai_api()][agents.set_default_openai_api] 関数を使用します。 +最後に、使用する OpenAI API をカスタマイズすることもできます。デフォルトでは OpenAI Responses API を使用します。これを上書きして Chat Completions API を使うには、[set_default_openai_api()][agents.set_default_openai_api] 関数を使用します。 ```python from agents import set_default_openai_api @@ -34,7 +34,7 @@ set_default_openai_api("chat_completions") ## トレーシング -トレーシングはデフォルトで有効です。デフォルトでは上記の OpenAI API キー(つまり、環境変数または設定したデフォルトキー)を使用します。トレーシングに使用する API キーを個別に設定するには、[`set_tracing_export_api_key`][agents.set_tracing_export_api_key] 関数を使用します。 +トレーシングはデフォルトで有効です。デフォルトでは、上記セクションの OpenAI API キー(すなわち、環境変数または設定したデフォルトキー)を使用します。トレーシングに使用する API キーを個別に設定するには、[`set_tracing_export_api_key`][agents.set_tracing_export_api_key] 関数を使用します。 ```python from agents import set_tracing_export_api_key @@ -42,7 +42,7 @@ from agents import set_tracing_export_api_key set_tracing_export_api_key("sk-...") ``` -トレーシングを完全に無効化するには、[`set_tracing_disabled()`][agents.set_tracing_disabled] 関数を使用します。 +[`set_tracing_disabled()`][agents.set_tracing_disabled] 関数を使用すると、トレーシングを完全に無効化することもできます。 ```python from agents import set_tracing_disabled @@ -50,11 +50,11 @@ from agents import set_tracing_disabled set_tracing_disabled(True) ``` -## デバッグ ログ +## デバッグログ -SDK にはハンドラー未設定の Python ロガーが 2 つあります。デフォルトでは、警告とエラーは `stdout` に送られますが、その他のログは抑制されます。 +SDK にはハンドラが設定されていない 2 つの Python ロガーがあります。デフォルトでは、警告とエラーは `stdout` に送られ、それ以外のログは抑制されます。 -詳細なログを有効にするには、[`enable_verbose_stdout_logging()`][agents.enable_verbose_stdout_logging] 関数を使用します。 +詳細なログを有効化するには、[`enable_verbose_stdout_logging()`][agents.enable_verbose_stdout_logging] 関数を使用します。 ```python from agents import enable_verbose_stdout_logging @@ -62,7 +62,7 @@ from agents import enable_verbose_stdout_logging enable_verbose_stdout_logging() ``` -また、ハンドラー、フィルター、フォーマッターなどを追加してログをカスタマイズできます。詳細は [Python ロギングガイド](https://docs.python.org/3/howto/logging.html) を参照してください。 +または、ハンドラ、フィルタ、フォーマッタなどを追加してログをカスタマイズできます。詳細は [Python ロギングガイド](https://docs.python.org/3/howto/logging.html)をご覧ください。 ```python import logging @@ -81,17 +81,17 @@ logger.setLevel(logging.WARNING) logger.addHandler(logging.StreamHandler()) ``` -### ログ内の機微なデータ +### ログの機微情報 -一部のログには機微なデータ(例: ユーザー データ)が含まれる場合があります。これらのデータがログに記録されないようにするには、以下の環境変数を設定してください。 +一部のログには機微情報(たとえば ユーザー データ)が含まれる場合があります。これらのデータがログに出力されないようにするには、次の環境変数を設定します。 -LLM の入力と出力のロギングを無効化するには: +LLM の入力と出力のログ出力を無効化するには: ```bash export OPENAI_AGENTS_DONT_LOG_MODEL_DATA=1 ``` -ツールの入力と出力のロギングを無効化するには: +ツールの入力と出力のログ出力を無効化するには: ```bash export OPENAI_AGENTS_DONT_LOG_TOOL_DATA=1 diff --git a/docs/ja/context.md b/docs/ja/context.md index 2de596e96..97b94eed9 100644 --- a/docs/ja/context.md +++ b/docs/ja/context.md @@ -4,30 +4,30 @@ search: --- # コンテキスト管理 -コンテキストという用語は多義的です。重要になるコンテキストには主に 2 つのクラスがあります。 +コンテキストという用語は多義的です。ここでは主に次の 2 つのコンテキストがあります。 -1. コードでローカルに利用できるコンテキスト: ツール関数の実行時、`on_handoff` のようなコールバック、ライフサイクルフックなどで必要になるデータや依存関係です。 -2. LLM に提供されるコンテキスト: 応答を生成する際に LLM が参照できるデータです。 +1. コードからローカルに参照できるコンテキスト: ツール関数の実行時、`on_handoff` のようなコールバック、ライフサイクルフックなどで必要になるデータや依存関係です。 +2. LLM に提供されるコンテキスト: 応答生成時に LLM が参照できるデータです。 ## ローカルコンテキスト これは [`RunContextWrapper`][agents.run_context.RunContextWrapper] クラスと、その中の [`context`][agents.run_context.RunContextWrapper.context] プロパティで表現されます。仕組みは次のとおりです。 -1. 任意の Python オブジェクトを作成します。よくあるパターンとしては dataclass や Pydantic オブジェクトを使います。 -2. そのオブジェクトを各種実行メソッドに渡します(例: `Runner.run(..., **context=whatever**)`)。 -3. すべてのツール呼び出しやライフサイクルフックなどには、ラッパーオブジェクト `RunContextWrapper[T]` が渡されます。ここで `T` はコンテキストオブジェクトの型を表し、`wrapper.context` からアクセスできます。 +1. 任意の Python オブジェクトを作成します。一般的には dataclass や Pydantic オブジェクトを使います。 +2. そのオブジェクトを各種の実行メソッド(例: `Runner.run(..., **context=whatever**)`)に渡します。 +3. すべてのツール呼び出しやライフサイクルフックなどには `RunContextWrapper[T]` というラッパーオブジェクトが渡されます。`T` はあなたのコンテキストオブジェクトの型を表し、`wrapper.context` からアクセスできます。 -最も **重要** な注意点: 特定のエージェント実行において、すべてのエージェント、ツール関数、ライフサイクル等は同じ種類(_type_)のコンテキストを使用しなければなりません。 +**最も重要** な注意点: あるエージェント実行におけるすべてのエージェント、ツール関数、ライフサイクルなどは、同じ型のコンテキストを使用する必要があります。 コンテキストは次のような用途に使えます。 -- 実行のための文脈データ(例: ユーザー名 / uid や、ユーザーに関するその他の情報) -- 依存関係(例: ロガーオブジェクト、データフェッチャーなど) +- 実行用の状況データ(例: ユーザー名/uid やその他のユーザーに関する情報) +- 依存関係(例: ロガーオブジェクト、データ取得クラスなど) - ヘルパー関数 -!!! danger "注意" +!!! danger "Note" - コンテキストオブジェクトは LLM に送信される **わけではありません**。これはあくまでローカルなオブジェクトであり、読み書きやメソッド呼び出しが可能です。 + コンテキストオブジェクトは LLM に **送信されません**。これはあくまでローカルなオブジェクトで、読み書きやメソッド呼び出しが可能です。 ```python import asyncio @@ -66,17 +66,17 @@ if __name__ == "__main__": asyncio.run(main()) ``` -1. これがコンテキストオブジェクトです。ここでは dataclass を使っていますが、任意の型を使用できます。 -2. これはツールです。`RunContextWrapper[UserInfo]` を受け取り、ツールの実装はコンテキストから読み取ります。 -3. 型チェッカーがエラーを検出できるよう、エージェントにジェネリックの `UserInfo` を付与します(例えば、異なるコンテキスト型を受け取るツールを渡そうとした場合など)。 +1. これがコンテキストオブジェクトです。ここでは dataclass を使用していますが、任意の型を使えます。 +2. これはツールです。`RunContextWrapper[UserInfo]` を受け取り、実装はコンテキストから読み取ります。 +3. エージェントにジェネリクス `UserInfo` を付け、型チェッカーがエラーを検出できるようにします(例えば、異なるコンテキスト型を受け取るツールを渡そうとした場合)。 4. `run` 関数にコンテキストを渡します。 5. エージェントはツールを正しく呼び出し、年齢を取得します。 -## エージェント / LLM コンテキスト +## エージェント/LLM コンテキスト -LLM が呼び出されると、LLM が参照できるデータは会話履歴のものに **限られます**。つまり、LLM に新しいデータを利用可能にしたい場合は、その履歴で参照できる形で提供する必要があります。いくつか方法があります。 +LLM が呼び出されると、参照できるデータは会話履歴のみです。したがって、新しいデータを LLM に利用可能にしたい場合は、その履歴で参照できる形にする必要があります。主な方法は次のとおりです。 -1. エージェントの `instructions` に追加します。これは「システムプロンプト」または「開発者メッセージ」とも呼ばれます。システムプロンプトは静的な文字列でも、コンテキストを受け取って文字列を出力する動的な関数でも構いません。常に有用な情報(例: ユーザー名や現在の日付)に適した一般的な戦術です。 -2. `Runner.run` 関数を呼ぶ際の `input` に追加します。これは `instructions` の戦術に似ていますが、[chain of command](https://cdn.openai.com/spec/model-spec-2024-05-08.html#follow-the-chain-of-command) 上でより下位のメッセージとして扱えます。 -3. 関数ツールを通じて公開します。これはオンデマンドのコンテキストに有用です。LLM が必要なときにデータを要求し、ツールを呼び出してそのデータを取得できます。 -4. リトリーバル(retrieval)や Web 検索を使用します。これらは、ファイルやデータベース(リトリーバル)または Web(Web 検索)から関連データを取得できる特別なツールです。関連する文脈データに基づいて応答を「グラウンディング」するのに役立ちます。 \ No newline at end of file +1. Agent の `instructions` に追加します。これは「システムプロンプト」または「開発者メッセージ」とも呼ばれます。システムプロンプトは静的な文字列でも、コンテキストを受け取って文字列を出力する動的関数でも構いません。常に有用な情報(例: ユーザー名や現在の日付)に適した方法です。 +2. `Runner.run` を呼ぶときに `input` に追加します。これは `instructions` と似ていますが、[指揮系統](https://cdn.openai.com/spec/model-spec-2024-05-08.html#follow-the-chain-of-command) の下位に配置できる点が異なります。 +3. 関数ツールで公開します。これはオンデマンドのコンテキストに有用です。LLM が必要なときに判断してツールを呼び出し、そのデータを取得できます。 +4. リトリーバル (retrieval) または Web 検索を使用します。これらは、ファイルやデータベース(リトリーバル)や Web(Web 検索)から関連データを取得できる特別なツールです。関連するコンテキストデータに基づいて応答をグラウンディングするのに有用です。 \ No newline at end of file diff --git a/docs/ja/examples.md b/docs/ja/examples.md index 38105db08..ecdfb9876 100644 --- a/docs/ja/examples.md +++ b/docs/ja/examples.md @@ -4,44 +4,44 @@ search: --- # コード例 -[repo](https://github.com/openai/openai-agents-python/tree/main/examples) の examples セクションで、SDK のさまざまなサンプル実装をご覧ください。コード例は、異なるパターンや機能を示す複数のカテゴリーに整理されています。 +[リポジトリ](https://github.com/openai/openai-agents-python/tree/main/examples) の examples セクションで、SDK の多様なサンプル実装をご確認ください。さまざまなパターンと機能を示す複数のカテゴリーに整理されています。 ## カテゴリー - **[agent_patterns](https://github.com/openai/openai-agents-python/tree/main/examples/agent_patterns):** - このカテゴリーの例では、一般的なエージェント設計パターンを紹介します。例えば + このカテゴリーの例では、一般的なエージェント設計パターンを説明します。たとえば - - 決定的なワークフロー + - 決定論的ワークフロー - ツールとしてのエージェント - エージェントの並列実行 - **[basic](https://github.com/openai/openai-agents-python/tree/main/examples/basic):** - SDK の基礎的な機能を紹介します。例えば + これらの例は、SDK の基礎的な機能を紹介します。たとえば - - 動的な システムプロンプト + - 動的なシステムプロンプト - ストリーミング出力 - ライフサイクルイベント -- **[tool examples](https://github.com/openai/openai-agents-python/tree/main/examples/tools):** - Web 検索 や ファイル検索 などの OpenAI がホストするツールの実装方法と、それらをエージェントに統合する方法を学びます。 +- **[ツールのコード例](https://github.com/openai/openai-agents-python/tree/main/examples/tools):** + Web 検索やファイル検索などの OpenAI がホストするツールの実装方法を学び、エージェントに統合する方法を確認できます。 -- **[model providers](https://github.com/openai/openai-agents-python/tree/main/examples/model_providers):** - SDK で OpenAI 以外のモデルを使う方法を紹介します。 +- **[モデルプロバイダー](https://github.com/openai/openai-agents-python/tree/main/examples/model_providers):** + OpenAI 以外のモデルを SDK と併用する方法を学びます。 - **[handoffs](https://github.com/openai/openai-agents-python/tree/main/examples/handoffs):** - エージェントのハンドオフの実用的な例をご覧ください。 + エージェントのハンドオフの実用的なコード例を確認できます。 - **[mcp](https://github.com/openai/openai-agents-python/tree/main/examples/mcp):** MCP でエージェントを構築する方法を学びます。 - **[customer_service](https://github.com/openai/openai-agents-python/tree/main/examples/customer_service)** と **[research_bot](https://github.com/openai/openai-agents-python/tree/main/examples/research_bot):** - 実運用に近いアプリケーションを示す、より作り込まれたコード例が 2 つあります + 実運用アプリケーションを示す、さらに 2 つの充実したコード例 - **customer_service**: 航空会社向けのカスタマーサービス システムの例。 - - **research_bot**: シンプルな ディープリサーチ のクローン。 + - **research_bot**: シンプルなディープリサーチ クローン。 - **[voice](https://github.com/openai/openai-agents-python/tree/main/examples/voice):** - TTS と STT のモデルを用いた音声エージェントの例をご覧ください。 + TTS と STT モデルを用いた音声エージェントのコード例。 - **[realtime](https://github.com/openai/openai-agents-python/tree/main/examples/realtime):** - SDK を使ってリアルタイム体験を構築する方法の例です。 \ No newline at end of file + SDK を使ってリアルタイムな体験を構築するコード例。 \ No newline at end of file diff --git a/docs/ja/guardrails.md b/docs/ja/guardrails.md index 47ae0c1b3..564c493d6 100644 --- a/docs/ja/guardrails.md +++ b/docs/ja/guardrails.md @@ -4,44 +4,44 @@ search: --- # ガードレール -ガードレールはエージェントと_並行して_動作し、ユーザー入力のチェックや検証を行います。たとえば、顧客からのリクエストに対応するために非常に賢い(そのため遅く/高価な)モデルを使うエージェントがあるとします。悪意のあるユーザーに、そのモデルで数学の宿題を手伝わせるようなリクエストは避けたいはずです。そのために、高速/低コストなモデルでガードレールを実行できます。ガードレールが悪用を検知した場合、即座にエラーを発生させ、高価なモデルの実行を止めて時間やコストを節約できます。 +ガードレールは エージェント と _並行して_ 実行され、ユーザー入力のチェックや検証を行います。例えば、顧客からのリクエスト対応に非常に賢い(ゆえに遅く/高価な)モデルを使うエージェントがあるとします。悪意のある ユーザー がそのモデルに数学の宿題を手伝わせるような指示を出すことは避けたいはずです。そのため、速く/安価なモデルでガードレールを実行できます。ガードレールが悪意ある使用を検知した場合、即座にエラーを送出して高価なモデルの実行を停止し、時間やコストを節約できます。 ガードレールには 2 種類あります: -1. 入力ガードレールは最初のユーザー入力に対して実行されます -2. 出力ガードレールは最終的なエージェントの出力に対して実行されます +1. 入力ガードレールは初期のユーザー入力に対して実行されます +2. 出力ガードレールは最終的なエージェント出力に対して実行されます ## 入力ガードレール -入力ガードレールは次の 3 ステップで動作します: +入力ガードレールは次の 3 ステップで実行されます: 1. まず、ガードレールはエージェントに渡されたものと同じ入力を受け取ります。 -2. 次に、ガードレール関数が実行され、[`GuardrailFunctionOutput`][agents.guardrail.GuardrailFunctionOutput] を生成し、それが [`InputGuardrailResult`][agents.guardrail.InputGuardrailResult] にラップされます。 -3. 最後に、[`.tripwire_triggered`][agents.guardrail.GuardrailFunctionOutput.tripwire_triggered] が true かどうかを確認します。true の場合、[`InputGuardrailTripwireTriggered`][agents.exceptions.InputGuardrailTripwireTriggered] 例外が送出され、ユーザーへの適切な応答や例外処理を行えます。 +2. 次に、ガードレール関数を実行し、[`GuardrailFunctionOutput`][agents.guardrail.GuardrailFunctionOutput] を生成し、これを [`InputGuardrailResult`][agents.guardrail.InputGuardrailResult] にラップします。 +3. 最後に、[`.tripwire_triggered`][agents.guardrail.GuardrailFunctionOutput.tripwire_triggered] が true かどうかを確認します。true の場合、[`InputGuardrailTripwireTriggered`][agents.exceptions.InputGuardrailTripwireTriggered] 例外が送出され、ユーザーへの適切な応答や例外処理が行えます。 !!! Note - 入力ガードレールはユーザー入力に対して実行されることを意図しているため、エージェントのガードレールはそのエージェントが*最初の*エージェントである場合にのみ動作します。なぜ `guardrails` プロパティがエージェント側にあり、`Runner.run` に渡さないのか疑問に思うかもしれません。これは、ガードレールが実際のエージェントに密接に関連する傾向があるためです。エージェントごとに異なるガードレールを実行することになるので、コードを同じ場所に置くほうが読みやすくなります。 + 入力ガードレールはユーザー入力に対して実行されることを想定しているため、あるエージェントのガードレールは、そのエージェントが「最初の」エージェントである場合のみ実行されます。なぜ `guardrails` プロパティがエージェント側にあり、`Runner.run` に渡さないのか疑問に思うかもしれません。これは、ガードレールは実際のエージェントに密接に関係する傾向があるためです。エージェントごとに異なるガードレールを実行するため、コードを同じ場所に置くことが可読性の向上に役立ちます。 ## 出力ガードレール -出力ガードレールは次の 3 ステップで動作します: +出力ガードレールは次の 3 ステップで実行されます: 1. まず、ガードレールはエージェントが生成した出力を受け取ります。 -2. 次に、ガードレール関数が実行され、[`GuardrailFunctionOutput`][agents.guardrail.GuardrailFunctionOutput] を生成し、それが [`OutputGuardrailResult`][agents.guardrail.OutputGuardrailResult] にラップされます。 -3. 最後に、[`.tripwire_triggered`][agents.guardrail.GuardrailFunctionOutput.tripwire_triggered] が true かどうかを確認します。true の場合、[`OutputGuardrailTripwireTriggered`][agents.exceptions.OutputGuardrailTripwireTriggered] 例外が送出され、ユーザーへの適切な応答や例外処理を行えます。 +2. 次に、ガードレール関数を実行し、[`GuardrailFunctionOutput`][agents.guardrail.GuardrailFunctionOutput] を生成し、これを [`OutputGuardrailResult`][agents.guardrail.OutputGuardrailResult] にラップします。 +3. 最後に、[`.tripwire_triggered`][agents.guardrail.GuardrailFunctionOutput.tripwire_triggered] が true かどうかを確認します。true の場合、[`OutputGuardrailTripwireTriggered`][agents.exceptions.OutputGuardrailTripwireTriggered] 例外が送出され、ユーザーへの適切な応答や例外処理が行えます。 !!! Note - 出力ガードレールは最終的なエージェントの出力に対して実行されることを意図しているため、エージェントのガードレールはそのエージェントが*最後の*エージェントである場合にのみ動作します。入力ガードレールと同様に、ガードレールは実際のエージェントに密接に関連する傾向があるため、コードを同じ場所に置くほうが読みやすくなります。 + 出力ガードレールは最終的なエージェント出力に対して実行されることを想定しているため、あるエージェントのガードレールは、そのエージェントが「最後の」エージェントである場合のみ実行されます。入力ガードレールと同様に、ガードレールは実際のエージェントに密接に関係する傾向があるため、コードを同じ場所に置くことが可読性の向上に役立ちます。 ## トリップワイヤー -入力または出力がガードレールに失敗した場合、ガードレールはトリップワイヤーでそれを通知できます。トリップワイヤーが作動したガードレールを検出するとすぐに、`{Input,Output}GuardrailTripwireTriggered` 例外を送出し、エージェントの実行を停止します。 +入力または出力がガードレールに不合格となった場合、ガードレールはトリップワイヤーでそれを通知できます。トリップワイヤーがトリガーされたガードレールを検出したら、直ちに `{Input,Output}GuardrailTripwireTriggered` 例外を送出し、エージェントの実行を停止します。 ## ガードレールの実装 -入力を受け取り、[`GuardrailFunctionOutput`][agents.guardrail.GuardrailFunctionOutput] を返す関数を用意する必要があります。次の例では、水面下でエージェントを実行することでこれを行います。 +入力を受け取り、[`GuardrailFunctionOutput`][agents.guardrail.GuardrailFunctionOutput] を返す関数を用意する必要があります。次の例では、その裏でエージェントを実行することでこれを行います。 ```python from pydantic import BaseModel diff --git a/docs/ja/handoffs.md b/docs/ja/handoffs.md index 196342abf..50089a85c 100644 --- a/docs/ja/handoffs.md +++ b/docs/ja/handoffs.md @@ -4,19 +4,19 @@ search: --- # ハンドオフ -ハンドオフは、あるエージェントが別のエージェントにタスクを委譲できる仕組みです。これは、異なるエージェントがそれぞれ別の分野に特化している状況で特に有用です。例えば、カスタマーサポートアプリでは、注文状況、払い戻し、FAQ などを個別に担当するエージェントが存在し得ます。 +ハンドオフは、あるエージェントが別のエージェントにタスクを委譲するための仕組みです。これは、異なるエージェントがそれぞれ別の分野を専門にしているシナリオで特に有用です。たとえば、カスタマーサポートアプリでは、注文状況、返金、FAQ などのタスクを個別に担当するエージェントが存在するかもしれません。 -ハンドオフは LLM にとってツールとして表現されます。例えば、`Refund Agent` というエージェントへのハンドオフがある場合、ツール名は `transfer_to_refund_agent` になります。 +ハンドオフは LLM からはツールとして表現されます。たとえば `Refund Agent` というエージェントにハンドオフする場合、ツール名は `transfer_to_refund_agent` になります。 ## ハンドオフの作成 -すべてのエージェントは [`handoffs`][agents.agent.Agent.handoffs] パラメーターを持っており、これは `Agent` を直接渡すか、ハンドオフをカスタマイズする `Handoff` オブジェクトを渡すことができます。 +すべてのエージェントは [`handoffs`][agents.agent.Agent.handoffs] パラメーターを持ち、`Agent` を直接渡すことも、ハンドオフをカスタマイズする `Handoff` オブジェクトを渡すこともできます。 -ハンドオフは Agents SDK が提供する [`handoff()`][agents.handoffs.handoff] 関数で作成できます。この関数では、ハンドオフ先のエージェントに加えて、オプションのオーバーライドや入力フィルターを指定できます。 +Agents SDK が提供する [`handoff()`][agents.handoffs.handoff] 関数を使ってハンドオフを作成できます。この関数では、ハンドオフ先のエージェントに加えて、任意のオーバーライドや入力フィルターを指定できます。 -### 基本的な使用方法 +### 基本的な使い方 -以下は、シンプルなハンドオフの作成方法です。 +次のようにシンプルなハンドオフを作成できます。 ```python from agents import Agent, handoff @@ -28,19 +28,19 @@ refund_agent = Agent(name="Refund agent") triage_agent = Agent(name="Triage agent", handoffs=[billing_agent, handoff(refund_agent)]) ``` -1. `billing_agent` のようにエージェントを直接利用することも、`handoff()` 関数を使うこともできます。 +1. エージェントを直接使用しても(`billing_agent` のように)、`handoff()` 関数を使ってもかまいません。 ### `handoff()` 関数によるハンドオフのカスタマイズ -[`handoff()`][agents.handoffs.handoff] 関数を使うと、さまざまなカスタマイズが可能です。 +[`handoff()`][agents.handoffs.handoff] 関数で各種のカスタマイズが可能です。 - `agent`: ハンドオフ先のエージェントです。 -- `tool_name_override`: 既定では `Handoff.default_tool_name()` 関数が使用され、`transfer_to_` に解決されます。これを上書きできます。 +- `tool_name_override`: 既定では `Handoff.default_tool_name()` が使われ、`transfer_to_` に解決されます。これを上書きできます。 - `tool_description_override`: `Handoff.default_tool_description()` による既定のツール説明を上書きします。 -- `on_handoff`: ハンドオフ実行時に呼び出されるコールバック関数です。ハンドオフが呼ばれたタイミングでデータ取得を開始する、といった用途に便利です。この関数はエージェント コンテキストを受け取り、オプションで LLM が生成した入力も受け取れます。入力データは `input_type` パラメーターで制御します。 -- `input_type`: ハンドオフで想定される入力の型(オプション)。 -- `input_filter`: 次のエージェントが受け取る入力をフィルタリングします。詳細は下記を参照してください。 -- `is_enabled`: ハンドオフを有効にするかどうか。真偽値、または真偽値を返す関数を指定でき、実行時に動的に有効・無効を切り替えられます。 +- `on_handoff`: ハンドオフが呼び出されたときに実行されるコールバック関数です。ハンドオフが実行されると分かった時点でデータ取得を開始するなどに便利です。この関数はエージェントのコンテキストを受け取り、オプションで LLM が生成した入力も受け取れます。入力データは `input_type` パラメーターで制御します。 +- `input_type`: ハンドオフで想定される入力の型(任意)。 +- `input_filter`: 次のエージェントが受け取る入力をフィルタリングできます。詳細は後述します。 +- `is_enabled`: ハンドオフを有効にするかどうか。ブール値またはブール値を返す関数を指定でき、実行時に動的に有効・無効を切り替えられます。 ```python from agents import Agent, handoff, RunContextWrapper @@ -58,9 +58,9 @@ handoff_obj = handoff( ) ``` -## ハンドオフの入力 +## ハンドオフ入力 -状況によっては、ハンドオフ呼び出し時に LLM によっていくつかのデータを提供してほしいことがあります。例えば「エスカレーション エージェント」へのハンドオフを想定すると、記録のために理由を受け取りたい場合があります。 +状況によっては、ハンドオフ呼び出し時に LLM にデータを提供してほしい場合があります。たとえば、「 Escalation エージェント」へのハンドオフを考えてみてください。理由を提供してもらい、それを記録したいことがあるかもしれません。 ```python from pydantic import BaseModel @@ -84,9 +84,9 @@ handoff_obj = handoff( ## 入力フィルター -ハンドオフが発生すると、新しいエージェントが会話を引き継ぎ、これまでの会話履歴全体を閲覧できるかのように動作します。これを変更したい場合は、[`input_filter`][agents.handoffs.Handoff.input_filter] を設定できます。入力フィルターは、[`HandoffInputData`][agents.handoffs.HandoffInputData] を介して既存の入力を受け取り、新しい `HandoffInputData` を返す関数です。 +ハンドオフが発生すると、新しいエージェントが会話を引き継ぎ、以前の会話履歴全体を参照できるかのように扱われます。これを変更したい場合は、[`input_filter`][agents.handoffs.Handoff.input_filter] を設定できます。入力フィルターは、既存の入力を [`HandoffInputData`][agents.handoffs.HandoffInputData] 経由で受け取り、新しい `HandoffInputData` を返す関数です。 -いくつかの一般的なパターン(例えば履歴からすべてのツール呼び出しを除去するなど)は、[`agents.extensions.handoff_filters`][] に実装済みです。 +いくつかの一般的なパターン(たとえば履歴からすべてのツール呼び出しを取り除くなど)は、[`agents.extensions.handoff_filters`][] に実装済みです。 ```python from agents import Agent, handoff @@ -100,11 +100,11 @@ handoff_obj = handoff( ) ``` -1. これは、`FAQ agent` が呼び出されたときに履歴からすべてのツールを自動的に除去します。 +1. これは、`FAQ agent` が呼び出されたときに履歴から自動的にすべてのツールを削除します。 ## 推奨プロンプト -LLM にハンドオフを正しく理解させるため、エージェントにハンドオフに関する情報を含めることを推奨します。[`agents.extensions.handoff_prompt.RECOMMENDED_PROMPT_PREFIX`][] の推奨プレフィックスを利用するか、[`agents.extensions.handoff_prompt.prompt_with_handoff_instructions`][] を呼び出して、推奨データをプロンプトに自動追加できます。 +LLM がハンドオフを正しく理解できるようにするため、エージェントにハンドオフに関する情報を含めることをおすすめします。[`agents.extensions.handoff_prompt.RECOMMENDED_PROMPT_PREFIX`][] に推奨のプレフィックスがあり、または [`agents.extensions.handoff_prompt.prompt_with_handoff_instructions`][] を呼び出してプロンプトに推奨情報を自動的に追加できます。 ```python from agents import Agent diff --git a/docs/ja/index.md b/docs/ja/index.md index 4269af102..aeb486026 100644 --- a/docs/ja/index.md +++ b/docs/ja/index.md @@ -4,31 +4,31 @@ search: --- # OpenAI Agents SDK -[OpenAI Agents SDK](https://github.com/openai/openai-agents-python) は、最小限の抽象化で軽量かつ使いやすいパッケージにより、エージェント型 AI アプリを構築できるようにします。これは、以前の エージェント 向け実験である [Swarm](https://github.com/openai/swarm/tree/main) を本番運用向けに強化した後継です。Agents SDK はごく少数の基本コンポーネントで構成されています: +[OpenAI Agents SDK](https://github.com/openai/openai-agents-python) は、最小限の抽象化で軽量かつ使いやすいパッケージにより、エージェント型 AI アプリを構築できるようにします。これは、以前のエージェント実験である [Swarm](https://github.com/openai/swarm/tree/main) の本番運用に耐えるアップグレードです。Agents SDK にはごく少数の基本コンポーネントがあります: -- **Agents**、instructions と tools を備えた LLM -- **Handoffs**、特定のタスクを他の エージェント に委譲できる仕組み -- **Guardrails**、エージェントの入力と出力の検証を可能にする仕組み -- **Sessions**、エージェントの実行間で会話履歴を自動的に維持する仕組み +- **エージェント**: instructions と tools を備えた LLM +- **ハンドオフ**: 特定のタスクを他のエージェントに委譲できる機能 +- **ガードレール**: エージェントの入力と出力の検証を可能にする機能 +- **セッション**: エージェントの実行をまたいで会話履歴を自動的に保持する機能 -Python と組み合わせることで、これらの基本コンポーネントはツールと エージェント 間の複雑な関係を表現でき、急な学習曲線なしに実用的なアプリケーションを構築できます。さらに、SDK には組み込みの **トレーシング** が付属しており、エージェント フローの可視化とデバッグ、評価や、アプリケーションに合わせたモデルの微調整まで行えます。 +これらの基本コンポーネントは、 Python と組み合わせることでツールとエージェント間の複雑な関係性を表現でき、急な学習コストなしに実運用レベルのアプリケーションを構築できます。さらに、 SDK には組み込みの **トレーシング** があり、エージェントフローの可視化とデバッグ、評価や、アプリケーション向けのモデルの微調整まで行えます。 -## Agents SDK の利点 +## Agents SDK を使う理由 -SDK には次の 2 つの設計原則があります: +この SDK には 2 つの設計原則があります: -1. 使う価値があるだけの機能を備えつつ、学習が早いよう基本コンポーネントは少数に保つ。 -2. すぐ使える一方で、挙動を細部までカスタマイズできる。 +1. 使う価値があるだけの機能は備えつつ、学習を素早くするために基本コンポーネントは最小限にする。 +2. すぐに高品質に動作する一方で、挙動を細部までカスタマイズできる。 -SDK の主な機能は次のとおりです: +主な機能は次のとおりです: -- エージェント ループ: ツール呼び出し、結果の LLM への送信、LLM が完了するまでのループ処理を行う組み込みのエージェント ループ。 -- Python ファースト: 新しい抽象を学ぶのではなく、言語の標準機能で エージェント のオーケストレーションや連携を記述可能。 -- ハンドオフ: 複数の エージェント 間での調整と委譲を可能にする強力な機能。 -- ガードレール: 入力の検証とチェックを エージェント と並行実行し、失敗した場合は早期に中断。 -- セッション: エージェント 実行間の会話履歴を自動管理し、手動の状態管理を不要に。 -- 関数ツール: 任意の Python 関数をツール化し、スキーマ自動生成と Pydantic による検証を提供。 -- トレーシング: ワークフローの可視化・デバッグ・監視に加え、OpenAI の評価・ファインチューニング・蒸留ツール群を活用可能にする組み込みのトレーシング。 +- エージェントループ: ツールの呼び出し、実行結果を LLM に渡す処理、 LLM の完了までのループを扱う組み込みのループ。 +- Python ファースト: 新しい抽象を学ぶ必要はなく、言語の標準機能でエージェントのオーケストレーションや連携が可能。 +- ハンドオフ: 複数のエージェント間で調整と委譲を行う強力な機能。 +- ガードレール: 入力の検証やチェックをエージェントと並行して実行し、失敗した場合は早期に中断。 +- セッション: エージェント実行間で会話履歴を自動管理し、手動での状態管理を不要に。 +- 関数ツール: 任意の Python 関数をツール化し、スキーマを自動生成。 Pydantic による検証も備える。 +- トレーシング: ワークフローの可視化・デバッグ・監視ができ、 OpenAI の評価、微調整、蒸留ツールのスイートも活用可能。 ## インストール @@ -36,7 +36,7 @@ SDK の主な機能は次のとおりです: pip install openai-agents ``` -## Hello World の例 +## Hello World 例 ```python from agents import Agent, Runner diff --git a/docs/ja/mcp.md b/docs/ja/mcp.md index bdf6e1d16..ba04d9600 100644 --- a/docs/ja/mcp.md +++ b/docs/ja/mcp.md @@ -10,28 +10,28 @@ search: > applications. Just as USB-C provides a standardized way to connect your devices to various peripherals and accessories, MCP > provides a standardized way to connect AI models to different data sources and tools. -Agents Python SDK は複数の MCP トランスポートに対応しています。これにより、既存の MCP サーバーを再利用したり、独自の MCP サーバーを構築して、ファイルシステム、HTTP、あるいはコネクタをバックエンドに持つツールをエージェントに公開できます。 +Agents Python SDK は複数の MCP トランスポートに対応しています。これにより、既存の MCP サーバーを再利用したり、独自に構築して、ファイルシステム、HTTP、またはコネクタ連携のツールを エージェント に提供できます。 -## MCP 連携の選択 +## Choosing an MCP integration -MCP サーバーをエージェントに組み込む前に、ツール呼び出しをどこで実行するか、どのトランスポートに到達できるかを決めます。以下のマトリクスは Python SDK がサポートするオプションの概要です。 +MCP サーバーを エージェント に組み込む前に、ツール呼び出しをどこで実行するか、どのトランスポートに到達できるかを決めます。以下のマトリクスは、Python SDK がサポートするオプションの概要です。 -| 必要なこと | 推奨オプション | +| 必要なこと | 推奨オプション | | ------------------------------------------------------------------------------------ | ----------------------------------------------------- | -| OpenAI の Responses API に、モデルの代わりにパブリック到達可能な MCP サーバーを呼び出させたい | **Hosted MCP server tools**(ホスト型 MCP サーバー ツール) via [`HostedMCPTool`][agents.tool.HostedMCPTool] | -| ローカルまたはリモートで自分が運用する Streamable HTTP サーバーに接続したい | **Streamable HTTP MCP servers** via [`MCPServerStreamableHttp`][agents.mcp.server.MCPServerStreamableHttp] | -| Server-Sent Events を用いる HTTP を実装するサーバーと通信したい | **HTTP with SSE MCP servers** via [`MCPServerSse`][agents.mcp.server.MCPServerSse] | -| ローカルプロセスを起動して stdin/stdout 経由で通信したい | **stdio MCP servers** via [`MCPServerStdio`][agents.mcp.server.MCPServerStdio] | +| モデルに代わって OpenAI の Responses API がパブリック到達可能な MCP サーバーを呼び出す | **ホスト型 MCP サーバーのツール** を [`HostedMCPTool`][agents.tool.HostedMCPTool] 経由で | +| ローカルまたはリモートで実行する Streamable HTTP サーバーに接続する | **Streamable HTTP MCP サーバー** を [`MCPServerStreamableHttp`][agents.mcp.server.MCPServerStreamableHttp] 経由で | +| Server-Sent Events を実装した HTTP サーバーと通信する | **HTTP with SSE MCP サーバー** を [`MCPServerSse`][agents.mcp.server.MCPServerSse] 経由で | +| ローカル プロセスを起動し stdin/stdout で通信する | **stdio MCP サーバー** を [`MCPServerStdio`][agents.mcp.server.MCPServerStdio] 経由で | -以下では各オプションについて、設定方法や、どのトランスポートを選ぶべきかを説明します。 +以下のセクションでは、それぞれのオプションについて、設定方法と、どのトランスポートを選ぶべきかを説明します。 ## 1. Hosted MCP server tools -Hosted ツールは、ツールの往復処理全体を OpenAI のインフラに委ねます。あなたのコードがツールの列挙と呼び出しを行う代わりに、[`HostedMCPTool`][agents.tool.HostedMCPTool] はサーバーのラベル(および任意のコネクタメタデータ)を Responses API に転送します。モデルはリモートサーバーのツールを列挙し、あなたの Python プロセスへの追加のコールバックなしにそれらを実行します。Hosted ツールは現在、Responses API の hosted MCP 連携に対応した OpenAI モデルで動作します。 +ホスト型ツールでは、ツールの往復処理全体を OpenAI のインフラに委ねます。あなたのコードがツールを列挙・呼び出す代わりに、[`HostedMCPTool`][agents.tool.HostedMCPTool] が サーバー ラベル(および任意のコネクタ メタデータ)を Responses API に転送します。モデルはリモート サーバーのツールを列挙し、あなたの Python プロセスへの追加のコールバックなしにそれらを呼び出します。ホスト型ツールは現在、Responses API の hosted MCP 連携をサポートする OpenAI モデルで動作します。 -### 基本の hosted MCP ツール +### Basic hosted MCP tool -エージェントの `tools` リストに [`HostedMCPTool`][agents.tool.HostedMCPTool] を追加して hosted ツールを作成します。`tool_config` の dict は REST API に送信する JSON を反映します: +エージェント の `tools` リストに [`HostedMCPTool`][agents.tool.HostedMCPTool] を追加してホスト型ツールを作成します。`tool_config` の dict は、REST API に送る JSON をそのまま反映します: ```python import asyncio @@ -59,11 +59,11 @@ async def main() -> None: asyncio.run(main()) ``` -ホストされたサーバーは自動的に自身のツールを公開します。`mcp_servers` に追加する必要はありません。 +ホストされたサーバーはツールを自動的に公開します。`mcp_servers` に追加する必要はありません。 -### ストリーミングによる hosted MCP 結果 +### Streaming hosted MCP results -Hosted ツールは関数ツールとまったく同じ方法で結果のストリーミングに対応します。`Runner.run_streamed` に `stream=True` を渡すと、モデルが処理中でも増分の MCP 出力を消費できます: +ホスト型ツールは、関数ツールとまったく同じ方法で結果の ストリーミング をサポートします。`Runner.run_streamed` に `stream=True` を渡すと、モデルがまだ動作中でも増分の MCP 出力を消費できます: ```python result = Runner.run_streamed(agent, "Summarise this repository's top languages") @@ -73,9 +73,9 @@ async for event in result.stream_events(): print(result.final_output) ``` -### 任意の承認フロー +### Optional approval flows -サーバーが機微な操作を行える場合、各ツール実行前に人間もしくはプログラムによる承認を必須にできます。`tool_config` の `require_approval` を単一のポリシー(`"always"`、`"never"`)またはツール名からポリシーへの dict で設定します。判断を Python 内で行うには、`on_approval_request` コールバックを指定します。 +サーバーが機微な操作を行える場合、各ツール実行の前に人間またはプログラムによる承認を要求できます。`tool_config` の `require_approval` を、単一のポリシー(`"always"`、`"never"`)またはツール名からポリシーへの dict で設定します。Python 内で判断するには、`on_approval_request` コールバックを指定します。 ```python from agents import MCPToolApprovalFunctionResult, MCPToolApprovalRequest @@ -103,11 +103,11 @@ agent = Agent( ) ``` -コールバックは同期・非同期のどちらでもよく、モデルが継続実行に必要な承認データを求めるたびに呼び出されます。 +コールバックは同期・非同期いずれでもよく、モデルが継続実行に必要な承認データを要するたびに呼び出されます。 -### コネクタ連携の hosted サーバー +### Connector-backed hosted servers -Hosted MCP は OpenAI コネクタにも対応します。`server_url` を指定する代わりに、`connector_id` とアクセストークンを指定します。Responses API が認証を処理し、ホストされたサーバーがコネクタのツールを公開します。 +ホスト型 MCP は OpenAI コネクタにも対応しています。`server_url` を指定する代わりに、`connector_id` とアクセストークンを指定します。Responses API が認証を処理し、ホストされたサーバーがコネクタのツールを公開します。 ```python import os @@ -123,13 +123,12 @@ HostedMCPTool( ) ``` -ストリーミング、承認、コネクタを含む完全な Hosted ツールのサンプルは +ストリーミング、承認、コネクタを含む完全なホスト型ツールのサンプルは [`examples/hosted_mcp`](https://github.com/openai/openai-agents-python/tree/main/examples/hosted_mcp) にあります。 ## 2. Streamable HTTP MCP servers -ネットワーク接続を自分で管理したい場合は -[`MCPServerStreamableHttp`][agents.mcp.server.MCPServerStreamableHttp] を使用します。Streamable HTTP サーバーは、トランスポートを自分で制御したい場合や、低レイテンシを保ちながら自前のインフラ内でサーバーを稼働させたい場合に最適です。 +ネットワーク接続を自分で管理したい場合は、[`MCPServerStreamableHttp`][agents.mcp.server.MCPServerStreamableHttp] を使用します。Streamable HTTP サーバーは、トランスポートを自分で制御したい場合や、レイテンシーを低く保ちつつ自分のインフラ内でサーバーを実行したい場合に最適です。 ```python import asyncio @@ -164,19 +163,23 @@ async def main() -> None: asyncio.run(main()) ``` -コンストラクタは追加のオプションを受け取ります: +コンストラクタは追加オプションを受け付けます: - `client_session_timeout_seconds` は HTTP の読み取りタイムアウトを制御します。 - `use_structured_content` は、テキスト出力よりも `tool_result.structured_content` を優先するかどうかを切り替えます。 -- `max_retry_attempts` と `retry_backoff_seconds_base` は `list_tools()` と `call_tool()` に自動リトライを追加します。 -- `tool_filter` により、一部のツールのみを公開できます([ツールのフィルタリング](#tool-filtering) を参照)。 +- `max_retry_attempts` と `retry_backoff_seconds_base` は、`list_tools()` と `call_tool()` に自動リトライを追加します。 +- `tool_filter` により、公開するツールをサブセットに絞り込めます([ツールのフィルタリング](#tool-filtering) を参照)。 ## 3. HTTP with SSE MCP servers -MCP サーバーが HTTP with SSE トランスポートを実装している場合は、 -[`MCPServerSse`][agents.mcp.server.MCPServerSse] をインスタンス化します。トランスポート以外は、API は Streamable HTTP サーバーと同一です。 +MCP サーバーが HTTP with SSE トランスポートを実装している場合は、[`MCPServerSse`][agents.mcp.server.MCPServerSse] をインスタンス化します。トランスポート以外は、API は Streamable HTTP サーバーと同一です。 ```python + +from agents import Agent, Runner +from agents.model_settings import ModelSettings +from mcp import MCPServerSse + workspace_id = "demo-workspace" async with MCPServerSse( @@ -198,10 +201,12 @@ async with MCPServerSse( ## 4. stdio MCP servers -ローカルのサブプロセスとして動作する MCP サーバーには [`MCPServerStdio`][agents.mcp.server.MCPServerStdio] を使用します。SDK はプロセスを起動し、パイプを開いたまま維持し、コンテキストマネージャーの終了時に自動的にクローズします。これは、迅速なプロトタイプや、サーバーがコマンドラインのエントリポイントのみを公開する場合に有用です。 +ローカルのサブプロセスとして動作する MCP サーバーには、[`MCPServerStdio`][agents.mcp.server.MCPServerStdio] を使用します。SDK はプロセスを起動し、パイプを開いたままにし、コンテキスト マネージャの終了時に自動でクローズします。このオプションは、迅速なプロトタイプ作成や、サーバーがコマンドライン エントリ ポイントのみを公開している場合に便利です。 ```python from pathlib import Path +from agents import Agent, Runner +from agents.mcp import MCPServerStdio current_dir = Path(__file__).parent samples_dir = current_dir / "sample_files" @@ -222,13 +227,13 @@ async with MCPServerStdio( print(result.final_output) ``` -## ツールのフィルタリング +## Tool filtering -各 MCP サーバーはツールフィルタをサポートしており、エージェントに必要な機能のみを公開できます。フィルタリングは構築時にも、実行ごとの動的な方法でも可能です。 +各 MCP サーバーはツール フィルターをサポートしており、エージェント に必要な機能だけを公開できます。フィルタリングは、構築時にも、実行ごとに動的にも行えます。 -### 静的なツールフィルタリング +### Static tool filtering -[`create_static_tool_filter`][agents.mcp.create_static_tool_filter] を使用して、許可/ブロックの単純なリストを設定します: +[`create_static_tool_filter`][agents.mcp.create_static_tool_filter] を使用して、簡単な許可/ブロック リストを設定します: ```python from pathlib import Path @@ -246,11 +251,11 @@ filesystem_server = MCPServerStdio( ) ``` -`allowed_tool_names` と `blocked_tool_names` の両方が指定された場合、SDK はまず許可リストを適用し、その後で残りの集合からブロック対象のツールを除外します。 +`allowed_tool_names` と `blocked_tool_names` が両方指定された場合、SDK は最初に許可リストを適用し、その後、残りの集合からブロック対象のツールを除去します。 -### 動的なツールフィルタリング +### Dynamic tool filtering -より高度なロジックには、[`ToolFilterContext`][agents.mcp.ToolFilterContext] を受け取る呼び出し可能オブジェクトを渡します。これは同期・非同期のいずれでもよく、ツールを公開すべき場合に `True` を返します。 +より複雑なロジックには、[`ToolFilterContext`][agents.mcp.ToolFilterContext] を受け取る呼び出し可能オブジェクトを渡します。これは同期・非同期いずれでもよく、ツールを公開すべき場合に `True` を返します。 ```python from pathlib import Path @@ -274,16 +279,18 @@ async with MCPServerStdio( ... ``` -フィルタコンテキストは、アクティブな `run_context`、ツールを要求する `agent`、および `server_name` を公開します。 +フィルター コンテキストは、アクティブな `run_context`、ツールを要求している `agent`、および `server_name` を公開します。 -## プロンプト +## Prompts -MCP サーバーは、エージェントの instructions を動的に生成するプロンプトも提供できます。プロンプトをサポートするサーバーは次の 2 つのメソッドを公開します: +MCP サーバーは、エージェントの instructions を動的に生成するプロンプトも提供できます。プロンプトをサポートするサーバーは、次の 2 つのメソッドを公開します: -- `list_prompts()` は利用可能なプロンプトテンプレートを列挙します。 -- `get_prompt(name, arguments)` は、必要に応じてパラメーター付きで具体的なプロンプトを取得します。 +- `list_prompts()` は利用可能なプロンプト テンプレートを列挙します。 +- `get_prompt(name, arguments)` は、必要に応じて パラメーター 付きで具体的なプロンプトを取得します。 ```python +from agents import Agent + prompt_result = await server.get_prompt( "generate_code_review_instructions", {"focus": "security vulnerabilities", "language": "python"}, @@ -297,21 +304,21 @@ agent = Agent( ) ``` -## キャッシュ +## Caching -すべてのエージェント実行は各 MCP サーバーに対して `list_tools()` を呼び出します。リモートサーバーは無視できないレイテンシをもたらす可能性があるため、すべての MCP サーバークラスは `cache_tools_list` オプションを公開しています。ツール定義が頻繁に変わらないと確信できる場合にのみ `True` に設定してください。後で新しいリストを強制するには、サーバーインスタンスで `invalidate_tools_cache()` を呼び出します。 +各 エージェント 実行時に、すべての MCP サーバーに対して `list_tools()` が呼び出されます。リモート サーバーは顕著なレイテンシーをもたらす可能性があるため、すべての MCP サーバー クラスは `cache_tools_list` オプションを公開しています。ツール定義が頻繁に変わらないと確信できる場合にのみ、これを `True` に設定してください。後で新しいリストを強制するには、サーバー インスタンスで `invalidate_tools_cache()` を呼び出します。 -## トレーシング +## Tracing -[トレーシング](./tracing.md) は MCP のアクティビティを自動的に捕捉します。含まれるもの: +[Tracing](./tracing.md) は MCP のアクティビティを自動的に捕捉します。含まれるもの: 1. ツールを列挙するための MCP サーバーへの呼び出し。 2. ツール呼び出しに関する MCP 関連情報。 ![MCP トレーシングのスクリーンショット](../assets/images/mcp-tracing.jpg) -## 参考資料 +## Further reading -- [Model Context Protocol](https://modelcontextprotocol.io/) – 仕様および設計ガイド。 +- [Model Context Protocol](https://modelcontextprotocol.io/) – 仕様と設計ガイド。 - [examples/mcp](https://github.com/openai/openai-agents-python/tree/main/examples/mcp) – 実行可能な stdio、SSE、Streamable HTTP のサンプル。 -- [examples/hosted_mcp](https://github.com/openai/openai-agents-python/tree/main/examples/hosted_mcp) – 承認やコネクタを含む完全な hosted MCP のデモ。 \ No newline at end of file +- [examples/hosted_mcp](https://github.com/openai/openai-agents-python/tree/main/examples/hosted_mcp) – 承認やコネクタを含む完全なホスト型 MCP のデモ。 \ No newline at end of file diff --git a/docs/ja/models/index.md b/docs/ja/models/index.md index c167032f3..681c6b7b6 100644 --- a/docs/ja/models/index.md +++ b/docs/ja/models/index.md @@ -4,18 +4,18 @@ search: --- # モデル -Agents SDK には、OpenAI モデルのサポートが 2 種類用意されています。 +Agents SDK には、OpenAI モデルを次の 2 つの形でそのまま使えるサポートが付属しています。 -- **推奨**: 新しい [Responses API](https://platform.openai.com/docs/api-reference/responses) を使って OpenAI API を呼び出す [`OpenAIResponsesModel`][agents.models.openai_responses.OpenAIResponsesModel] -- [Chat Completions API](https://platform.openai.com/docs/api-reference/chat) を使って OpenAI API を呼び出す [`OpenAIChatCompletionsModel`][agents.models.openai_chatcompletions.OpenAIChatCompletionsModel] +- **推奨**: [`OpenAIResponsesModel`][agents.models.openai_responses.OpenAIResponsesModel]。新しい [Responses API](https://platform.openai.com/docs/api-reference/responses) を使って OpenAI API を呼び出します。 +- [`OpenAIChatCompletionsModel`][agents.models.openai_chatcompletions.OpenAIChatCompletionsModel]。 [Chat Completions API](https://platform.openai.com/docs/api-reference/chat) を使って OpenAI API を呼び出します。 ## OpenAI モデル -`Agent` を初期化する際にモデルを指定しない場合は、デフォルトのモデルが使用されます。現在のデフォルトは [`gpt-4.1`](https://platform.openai.com/docs/models/gpt-4.1) で、エージェント ワークフローの予測可能性と低レイテンシのバランスに優れています。 +`Agent` を初期化する際にモデルを指定しない場合は、デフォルトのモデルが使用されます。現在のデフォルトは [`gpt-4.1`](https://platform.openai.com/docs/models/gpt-4.1) で、エージェント型ワークフローにおける予測可能性と低レイテンシのバランスに優れています。 -[`gpt-5`](https://platform.openai.com/docs/models/gpt-5) などの他のモデルに切り替えたい場合は、次のセクションの手順に従ってください。 +[`gpt-5`](https://platform.openai.com/docs/models/gpt-5) など別のモデルに切り替えたい場合は、次のセクションの手順に従ってください。 -### デフォルトの OpenAI モデル +### 既定の OpenAI モデル カスタムモデルを設定していないすべての エージェント で特定のモデルを一貫して使用したい場合は、エージェント を実行する前に `OPENAI_DEFAULT_MODEL` 環境変数を設定してください。 @@ -26,9 +26,9 @@ python3 my_awesome_agent.py #### GPT-5 モデル -この方法で GPT-5 のいずれかの推論モデル([`gpt-5`](https://platform.openai.com/docs/models/gpt-5)、[`gpt-5-mini`](https://platform.openai.com/docs/models/gpt-5-mini)、または [`gpt-5-nano`](https://platform.openai.com/docs/models/gpt-5-nano))を使用すると、SDK は既定で適切な `ModelSettings` を適用します。具体的には、`reasoning.effort` と `verbosity` の両方を `"low"` に設定します。これらの設定を自分で構築したい場合は、`agents.models.get_default_model_settings("gpt-5")` を呼び出してください。 +この方法で GPT-5 系の reasoning モデル([`gpt-5`](https://platform.openai.com/docs/models/gpt-5)、[`gpt-5-mini`](https://platform.openai.com/docs/models/gpt-5-mini)、または [`gpt-5-nano`](https://platform.openai.com/docs/models/gpt-5-nano))を使用すると、SDK は既定で妥当な `ModelSettings` を適用します。具体的には、`reasoning.effort` と `verbosity` の両方を `"low"` に設定します。これらの設定を自分で構成したい場合は、`agents.models.get_default_model_settings("gpt-5")` を呼び出してください。 -より低レイテンシや特定の要件がある場合は、別のモデルや設定を選択できます。デフォルトモデルの推論負荷を調整するには、独自の `ModelSettings` を渡します。 +より低レイテンシや特定の要件がある場合は、別のモデルや設定を選択できます。デフォルトモデルの reasoning effort を調整するには、独自の `ModelSettings` を渡します。 ```python from openai.types.shared import Reasoning @@ -44,21 +44,21 @@ my_agent = Agent( ) ``` -特に低レイテンシを重視する場合、[`gpt-5-mini`](https://platform.openai.com/docs/models/gpt-5-mini) または [`gpt-5-nano`](https://platform.openai.com/docs/models/gpt-5-nano) モデルにおいて `reasoning.effort="minimal"` を使用すると、デフォルト設定よりも高速に応答が返ることがよくあります。ただし、Responses API の一部の組み込みツール(ファイル検索 や画像生成など)は `"minimal"` の推論負荷をサポートしていないため、この Agents SDK のデフォルトは `"low"` になっています。 +特に低レイテンシを重視する場合は、[`gpt-5-mini`](https://platform.openai.com/docs/models/gpt-5-mini) または [`gpt-5-nano`](https://platform.openai.com/docs/models/gpt-5-nano) モデルに `reasoning.effort="minimal"` を指定すると、デフォルト設定より高速にレスポンスが返ることがよくあります。ただし、Responses API の一部の組み込みツール(ファイル検索 や画像生成など)は `"minimal"` の reasoning effort をサポートしていないため、この Agents SDK は既定を `"low"` にしています。 #### 非 GPT-5 モデル -カスタムの `model_settings` を指定せずに GPT-5 以外のモデル名を渡した場合、SDK はどのモデルでも互換性のある汎用的な `ModelSettings` にフォールバックします。 +カスタムの `model_settings` なしで GPT-5 以外のモデル名を渡した場合、SDK はあらゆるモデルと互換性のある汎用の `ModelSettings` にフォールバックします。 ## 非 OpenAI モデル -[LiteLLM 連携](./litellm.md) を介して、ほとんどの他社製モデルを使用できます。まず、litellm の依存関係グループをインストールします。 +[LiteLLM 連携](./litellm.md)を通じて、ほとんどの他社製(非 OpenAI)モデルを利用できます。まず、litellm の依存関係グループをインストールします。 ```bash pip install "openai-agents[litellm]" ``` -次に、`litellm/` プレフィックスを付けて [対応モデル](https://docs.litellm.ai/docs/providers) を使用します。 +次に、`litellm/` プレフィックスを付けて、[サポートされているモデル](https://docs.litellm.ai/docs/providers) を使用します。 ```python claude_agent = Agent(model="litellm/anthropic/claude-3-5-sonnet-20240620", ...) @@ -67,29 +67,29 @@ gemini_agent = Agent(model="litellm/gemini/gemini-2.5-flash-preview-04-17", ...) ### 非 OpenAI モデルを使う他の方法 -他の LLM プロバイダーを統合する方法が 3 つあります(code examples は[こちら](https://github.com/openai/openai-agents-python/tree/main/examples/model_providers/))。 +他の LLM プロバイダーを統合する方法はさらに 3 つあります(code examples は[こちら](https://github.com/openai/openai-agents-python/tree/main/examples/model_providers/))。 -1. [`set_default_openai_client`][agents.set_default_openai_client] は、LLM クライアントとして `AsyncOpenAI` のインスタンスをグローバルに使用したい場合に便利です。これは LLM プロバイダーが OpenAI 互換の API エンドポイントを持ち、`base_url` と `api_key` を設定できる場合に使用します。設定可能な例は [examples/model_providers/custom_example_global.py](https://github.com/openai/openai-agents-python/tree/main/examples/model_providers/custom_example_global.py) を参照してください。 -2. [`ModelProvider`][agents.models.interface.ModelProvider] は `Runner.run` レベルで指定します。これにより、「この実行のすべての エージェント にカスタムモデルプロバイダーを使う」と指定できます。設定可能な例は [examples/model_providers/custom_example_provider.py](https://github.com/openai/openai-agents-python/tree/main/examples/model_providers/custom_example_provider.py) を参照してください。 -3. [`Agent.model`][agents.agent.Agent.model] では、特定の Agent インスタンスでモデルを指定できます。これにより、エージェント ごとに異なるプロバイダーを組み合わせて使用できます。設定可能な例は [examples/model_providers/custom_example_agent.py](https://github.com/openai/openai-agents-python/tree/main/examples/model_providers/custom_example_agent.py) を参照してください。利用可能なモデルの多くを簡単に使うには、[LiteLLM 連携](./litellm.md) が便利です。 +1. [`set_default_openai_client`][agents.set_default_openai_client] は、LLM クライアントとして `AsyncOpenAI` のインスタンスをグローバルに使用したい場合に便利です。これは LLM プロバイダーが OpenAI 互換の API エンドポイントを持ち、`base_url` と `api_key` を設定できるケース向けです。設定可能なサンプルは [examples/model_providers/custom_example_global.py](https://github.com/openai/openai-agents-python/tree/main/examples/model_providers/custom_example_global.py) を参照してください。 +2. [`ModelProvider`][agents.models.interface.ModelProvider] は `Runner.run` レベルで指定します。これにより「この実行に含まれるすべての エージェント に対してカスタムのモデルプロバイダーを使う」と指定できます。設定可能なサンプルは [examples/model_providers/custom_example_provider.py](https://github.com/openai/openai-agents-python/tree/main/examples/model_providers/custom_example_provider.py) を参照してください。 +3. [`Agent.model`][agents.agent.Agent.model] は特定の Agent インスタンス上でモデルを指定できます。これにより、エージェント ごとに異なるプロバイダーを組み合わせて使えます。簡単に多くのモデルを利用するには [LiteLLM 連携](./litellm.md)が便利です。 -`platform.openai.com` の API キーがない場合は、`set_tracing_disabled()` でトレーシング を無効化するか、[別のトレーシング プロセッサー](../tracing.md) を設定することを推奨します。 +`platform.openai.com` の API キーを持っていない場合は、`set_tracing_disabled()` で トレーシング を無効化するか、[別の トレーシング プロセッサー](../tracing.md) を設定することをおすすめします。 !!! note - これらの例では、Responses API をまだサポートしていない LLM プロバイダーが多数あるため、Chat Completions API/モデルを使用しています。お使いの LLM プロバイダーが Responses をサポートしている場合は、Responses の使用を推奨します。 + これらの例では、Responses API をサポートしていない LLM プロバイダーが多いため、Chat Completions API/モデルを使用しています。もしお使いの LLM プロバイダーが Responses をサポートしている場合は、Responses の使用をおすすめします。 ## モデルの組み合わせ -1 つのワークフロー内で、エージェント ごとに異なるモデルを使いたい場合があります。例えば、振り分けには小型で高速なモデルを使い、複雑なタスクには大型で高性能なモデルを使う、といった使い分けです。[`Agent`][agents.Agent] を構成する際は、次のいずれかの方法で特定のモデルを選べます。 +1 つのワークフロー内で、エージェント ごとに異なるモデルを使用したい場合があります。例えば、振り分けには小型で高速なモデルを使い、複雑なタスクには大型で高性能なモデルを使うといった形です。[`Agent`][agents.Agent] を構成する際、次のいずれかの方法で特定のモデルを選べます。 1. モデル名を渡す。 -2. 任意のモデル名に加えて、その名前を Model インスタンスにマッピングできる [`ModelProvider`][agents.models.interface.ModelProvider] を渡す。 +2. 任意のモデル名 + その名前を Model インスタンスにマッピングできる [`ModelProvider`][agents.models.interface.ModelProvider] を渡す。 3. [`Model`][agents.models.interface.Model] 実装を直接渡す。 !!!note - SDK は [`OpenAIResponsesModel`][agents.models.openai_responses.OpenAIResponsesModel] と [`OpenAIChatCompletionsModel`][agents.models.openai_chatcompletions.OpenAIChatCompletionsModel] の両方の形をサポートしますが、両者でサポートする機能やツールが異なるため、各ワークフローでは単一のモデル形状を使うことを推奨します。ワークフローでモデル形状を混在させる必要がある場合は、使用しているすべての機能が両方で利用可能であることを確認してください。 + SDK は [`OpenAIResponsesModel`][agents.models.openai_responses.OpenAIResponsesModel] と [`OpenAIChatCompletionsModel`][agents.models.openai_chatcompletions.OpenAIChatCompletionsModel] の両方の形をサポートしていますが、それぞれ対応する機能やツールの集合が異なるため、ワークフローごとに 1 つのモデル形に統一することをおすすめします。ワークフロー上でモデル形を混在させる必要がある場合は、使用するすべての機能が両方で利用可能であることを確認してください。 ```python from agents import Agent, Runner, AsyncOpenAI, OpenAIChatCompletionsModel @@ -122,10 +122,10 @@ async def main(): print(result.final_output) ``` -1. OpenAI モデルの名前を直接設定します。 -2. [`Model`][agents.models.interface.Model] 実装を提供します。 +1. OpenAI のモデル名を直接設定します。 +2. [`Model`][agents.models.interface.Model] 実装を提供します。 -エージェント で使うモデルをさらに構成したい場合は、`temperature` などの任意のモデル構成パラメーターを提供する [`ModelSettings`][agents.models.interface.ModelSettings] を渡せます。 +エージェント で使用するモデルをさらに構成したい場合は、[`ModelSettings`][agents.models.interface.ModelSettings] を渡すことで、temperature などの任意のモデル構成パラメーターを指定できます。 ```python from agents import Agent, ModelSettings @@ -138,7 +138,7 @@ english_agent = Agent( ) ``` -また、OpenAI の Responses API を使用する場合、[他にもいくつかの任意パラメーター](https://platform.openai.com/docs/api-reference/responses/create)(例: `user`、`service_tier` など)があります。トップレベルで指定できない場合は、`extra_args` を使って渡すこともできます。 +また、OpenAI の Responses API を使用する際には、[いくつかの追加の任意パラメーター](https://platform.openai.com/docs/api-reference/responses/create)(例: `user`、`service_tier` など)があります。トップレベルで指定できない場合は、`extra_args` を使って渡すことができます。 ```python from agents import Agent, ModelSettings @@ -154,26 +154,26 @@ english_agent = Agent( ) ``` -## 他社製 LLM プロバイダー利用時の一般的な問題 +## 他社 LLM プロバイダー利用時の一般的な問題 ### トレーシング クライアントのエラー 401 -トレーシング 関連のエラーが発生する場合、トレースは OpenAI の サーバー にアップロードされる一方で、OpenAI の API キーがないことが原因です。解決策は次の 3 つです。 +トレーシング に関連するエラーが発生する場合、トレースは OpenAI の サーバー にアップロードされ、OpenAI の API キーを持っていないことが原因です。解決するには次の 3 つの選択肢があります。 -1. トレーシング を完全に無効化する: [`set_tracing_disabled(True)`][agents.set_tracing_disabled] -2. トレーシング 用の OpenAI キーを設定する: [`set_tracing_export_api_key(...)`][agents.set_tracing_export_api_key]。この API キーはトレースのアップロードのみに使用され、[platform.openai.com](https://platform.openai.com/) のものが必要です。 -3. 非 OpenAI のトレース プロセッサーを使用する。[トレーシングのドキュメント](../tracing.md#custom-tracing-processors) を参照してください。 +1. トレーシング を完全に無効化する: [`set_tracing_disabled(True)`][agents.set_tracing_disabled]。 +2. トレーシング 用に OpenAI のキーを設定する: [`set_tracing_export_api_key(...)`][agents.set_tracing_export_api_key]。この API キーはトレースのアップロードのみに使用され、[platform.openai.com](https://platform.openai.com/) のものが必要です。 +3. OpenAI 以外の trace プロセッサーを使用する。[tracing のドキュメント](../tracing.md#custom-tracing-processors) を参照してください。 ### Responses API のサポート -SDK はデフォルトで Responses API を使用しますが、他社製 LLM プロバイダーの多くはまだ未対応です。その結果、404 などの問題が発生する場合があります。解決するには次のいずれかを行ってください。 +SDK は既定で Responses API を使用しますが、他の多くの LLM プロバイダーはまだ対応していません。その結果、404 などの問題が発生することがあります。解決するには次の 2 つの方法があります。 1. [`set_default_openai_api("chat_completions")`][agents.set_default_openai_api] を呼び出します。これは環境変数で `OPENAI_API_KEY` と `OPENAI_BASE_URL` を設定している場合に機能します。 2. [`OpenAIChatCompletionsModel`][agents.models.openai_chatcompletions.OpenAIChatCompletionsModel] を使用します。code examples は[こちら](https://github.com/openai/openai-agents-python/tree/main/examples/model_providers/)にあります。 -### structured outputs のサポート +### Structured outputs のサポート -一部のモデルプロバイダーは [structured outputs](https://platform.openai.com/docs/guides/structured-outputs) をサポートしていません。これにより、次のようなエラーが発生することがあります。 +一部のモデルプロバイダーは [structured outputs](https://platform.openai.com/docs/guides/structured-outputs) をサポートしていません。このため、次のようなエラーが発生する場合があります。 ``` @@ -181,12 +181,12 @@ BadRequestError: Error code: 400 - {'error': {'message': "'response_format.type' ``` -これは一部のモデルプロバイダー側の制約で、JSON 出力自体には対応していても、出力に使用する `json_schema` を指定できない場合があります。現在この問題の解決に取り組んでいますが、JSON schema 出力をサポートするプロバイダーに依存することを推奨します。そうしないと、JSON が不正(malformed)であることが多く、アプリが頻繁に壊れてしまいます。 +これは一部のモデルプロバイダー側の制約で、JSON 出力はサポートしていても、出力に使用する `json_schema` を指定できないという問題です。現在これに対する修正に取り組んでいますが、アプリが不正な JSON によって壊れることが頻発するため、JSON スキーマ出力をサポートしているプロバイダーを利用することをおすすめします。 -## プロバイダーをまたぐモデルの混在 +## プロバイダーをまたいだモデルの混在 -モデルプロバイダー間の機能差異に注意しないと、エラーに遭遇する可能性があります。例えば、OpenAI は structured outputs、マルチモーダル入力、ホスト型の ファイル検索 および Web 検索 をサポートしますが、他の多くのプロバイダーはこれらの機能をサポートしていません。次の制約に注意してください。 +プロバイダー間で機能差があることに注意しないと、エラーに直面する可能性があります。例えば、OpenAI は structured outputs、マルチモーダル入力、ホスト型の ファイル検索 と Web 検索 をサポートしていますが、他の多くのプロバイダーはこれらの機能をサポートしていません。次の制約に注意してください。 -- サポートされていない `tools` を理解しないプロバイダーに送信しない -- テキスト専用のモデルを呼び出す前に、マルチモーダル入力をフィルタリングする -- structured JSON 出力をサポートしないプロバイダーは、無効な JSON を生成することがある点に注意する \ No newline at end of file +- 非対応のプロバイダーに対して、理解できない `tools` を送らないでください +- テキストのみ対応のモデルを呼び出す前に、マルチモーダル入力をフィルタリングしてください +- structured JSON 出力をサポートしていないプロバイダーでは、無効な JSON が生成されることがあります \ No newline at end of file diff --git a/docs/ja/models/litellm.md b/docs/ja/models/litellm.md index 6806e42ee..cb8e3ee60 100644 --- a/docs/ja/models/litellm.md +++ b/docs/ja/models/litellm.md @@ -2,33 +2,33 @@ search: exclude: true --- -# LiteLLM 経由で任意のモデルの利用 +# LiteLLM を使用した任意モデルの利用 !!! note - LiteLLM 連携はベータ版です。特に小規模なモデルプロバイダーでは問題が発生する場合があります。問題があれば [GitHub issues](https://github.com/openai/openai-agents-python/issues) にご報告ください。迅速に修正します。 + LiteLLM 統合はベータ版です。特に小規模なモデルプロバイダーでは問題が発生する可能性があります。問題があれば [GitHub issues](https://github.com/openai/openai-agents-python/issues) でご報告ください。迅速に対応します。 -[LiteLLM](https://docs.litellm.ai/docs/) は、単一のインターフェースで 100+ のモデルを利用できるライブラリです。Agents SDK で任意の AI モデルを使えるように、LiteLLM 連携を追加しました。 +[LiteLLM](https://docs.litellm.ai/docs/) は、単一のインターフェースで 100 以上のモデルを利用できるライブラリです。Agents SDK に LiteLLM 統合を追加し、任意の AI モデルを使用できるようにしました。 ## セットアップ -`litellm` が利用可能であることを確認する必要があります。オプションの `litellm` 依存関係グループをインストールしてください。 +`litellm` が利用可能である必要があります。オプションの `litellm` 依存関係グループをインストールしてください。 ```bash pip install "openai-agents[litellm]" ``` -完了したら、任意のエージェントで [`LitellmModel`][agents.extensions.models.litellm_model.LitellmModel] を使用できます。 +完了したら、任意の エージェント で [`LitellmModel`][agents.extensions.models.litellm_model.LitellmModel] を使用できます。 -## 例 +## コード例 -これは完全に動作するサンプルです。実行すると、モデル名と API キーの入力を求められます。たとえば次のように入力できます。 +これは完全に動作する例です。実行すると、モデル名と API キーの入力を求められます。例えば、次のように入力できます。 -- `openai/gpt-4.1` をモデルに、OpenAI の API キー -- `anthropic/claude-3-5-sonnet-20240620` をモデルに、Anthropic の API キー +- `openai/gpt-4.1`(モデル)と OpenAI の API キー +- `anthropic/claude-3-5-sonnet-20240620`(モデル)と Anthropic の API キー - など -LiteLLM がサポートするモデルの一覧は、[litellm providers docs](https://docs.litellm.ai/docs/providers) を参照してください。 +LiteLLM でサポートされているモデルの一覧は、[litellm providers docs](https://docs.litellm.ai/docs/providers) を参照してください。 ```python from __future__ import annotations diff --git a/docs/ja/multi_agent.md b/docs/ja/multi_agent.md index fdef525c7..4fa9e63d4 100644 --- a/docs/ja/multi_agent.md +++ b/docs/ja/multi_agent.md @@ -4,38 +4,38 @@ search: --- # 複数のエージェントのオーケストレーション -オーケストレーションとは、アプリ内のエージェントの流れのことです。どのエージェントを、どの順序で実行し、次に何をするかをどのように決めるのか。エージェントをオーケストレーションする主な方法は 2 つあります。 +オーケストレーションとは、アプリ内でのエージェントの流れを指します。どのエージェントを、どの順序で実行し、次に何を行うかをどう決めるか、ということです。エージェントをオーケストレーションする主な方法は 2 つあります。 -1. LLM に意思決定を任せる: LLM の知能を使って計画・推論し、それに基づいて取るべき手順を決定します。 -2. コードによるオーケストレーション: コードでエージェントの流れを決定します。 +1. LLM に意思決定させる: LLM の知性を用いて計画・推論し、それに基づいて実行手順を決定します。 +2. コードでオーケストレーションする: コードでエージェントの流れを決定します。 -これらのパターンは組み合わせて使えます。それぞれにトレードオフがあり、以下で説明します。 +これらのパターンは組み合わせて使えます。各方法には以下のようなトレードオフがあります。 ## LLM によるオーケストレーション -エージェントは、instructions、tools、ハンドオフを備えた LLM です。これは、オープンエンドなタスクに対して、LLM が自律的にタスクの進め方を計画し、ツールでアクションやデータ取得を行い、ハンドオフでサブエージェントにタスクを委譲できることを意味します。たとえば、リサーチ用エージェントには次のようなツールを備えられます。 +エージェントは、instructions、tools、handoffs を備えた LLM です。つまり、オープンエンドなタスクが与えられたとき、LLM は自律的にタスクへの取り組み方を計画し、ツールを用いて行動やデータ取得を行い、handoffs によってサブエージェントへタスクを委譲できます。たとえば、リサーチ用のエージェントには次のようなツールを備えられます。 -- Web 検索 によるオンライン情報の収集 -- ファイル検索 と取得によるプロプライエタリデータや接続先の横断検索 -- コンピュータ操作 によるコンピュータ上でのアクション実行 -- コード実行 によるデータ分析 -- 計画立案、レポート作成などに優れた特化エージェントへのハンドオフ +- Web 検索でオンライン情報を見つける +- ファイル検索と取得で社内データや接続を横断的に検索する +- コンピュータ操作 でコンピュータ上の行動を実行する +- コード実行でデータ分析を行う +- 計画やレポート作成などが得意な専門エージェントへの handoffs -このパターンは、タスクがオープンエンドで LLM の知能に依拠したい場合に有効です。重要なポイントは次のとおりです。 +このパターンは、タスクがオープンエンドで、LLM の知性に依拠したい場合に有効です。重要な戦術は次のとおりです。 -1. 良いプロンプトに投資してください。利用可能なツール、使い方、順守すべきパラメーターを明確にします。 -2. アプリを監視し、反復改善してください。どこで問題が起きたかを把握し、プロンプトを改善します。 -3. エージェントが内省して改善できるようにしてください。たとえばループで実行して自己批評させる、エラーメッセージを与えて改善させる、などです。 -4. 何でもこなす汎用エージェントではなく、単一のタスクに特化して優れたエージェントを用意しましょう。 -5. [evals](https://platform.openai.com/docs/guides/evals) に投資してください。エージェントの学習と性能向上に役立ちます。 +1. 良いプロンプトに投資する。利用可能なツール、その使い方、そして動作すべきパラメーターを明確にします。 +2. アプリを監視し、反復改善する。問題が起きる箇所を把握し、プロンプトを改善します。 +3. エージェントに内省と改善を許可する。たとえばループで実行し、自己批評させる、あるいはエラーメッセージを与えて改善させます。 +4. 何でもこなす汎用エージェントではなく、1 つのタスクに特化して卓越したエージェントを用意する。 +5. [評価 (evals)](https://platform.openai.com/docs/guides/evals) に投資する。これによりエージェントを訓練し、タスク遂行能力を高められます。 ## コードによるオーケストレーション -LLM によるオーケストレーションは強力ですが、コードによるオーケストレーションは、速度・コスト・パフォーマンスの観点で、より決定的で予測しやすくなります。よくあるパターンは次のとおりです。 +LLM によるオーケストレーションは強力ですが、コードによるオーケストレーションは、速度・コスト・性能の面でより決定論的かつ予測可能になります。一般的なパターンは次のとおりです。 -- [structured outputs](https://platform.openai.com/docs/guides/structured-outputs) を使って、コードで検査できる 適切な形式のデータ を生成します。たとえば、エージェントにタスクをいくつかの カテゴリー に分類させ、そのカテゴリーに基づいて次のエージェントを選ぶことができます。 -- あるエージェントの出力を次のエージェントの入力に変換して、複数のエージェントを連鎖させます。ブログ記事執筆のようなタスクを、調査をする - アウトラインを書く - 本文を書く - 批評する - 改善する、という一連のステップに分解できます。 -- 評価とフィードバックを行うエージェントと組み合わせて、タスクを実行するエージェントを `while` ループで回し、評価者が所定の基準を満たしたと判断するまで続けます。 -- 複数のエージェントを並列実行します。たとえば、Python の基本コンポーネント (primitives) である `asyncio.gather` などを使います。相互に依存しない複数のタスクがある場合の高速化に有効です。 +- [structured outputs](https://platform.openai.com/docs/guides/structured-outputs) を用いて、コードで検査できる 適切な形式のデータ を生成する。たとえば、エージェントにタスクをいくつかの カテゴリー に分類させ、そのカテゴリーに基づいて次のエージェントを選ぶ、といった使い方です。 +- 複数のエージェントを連結し、あるエージェントの出力を次のエージェントの入力に変換する。ブログ記事の執筆タスクを分解し、リサーチ→アウトライン作成→本文執筆→批評→改善という一連の手順にする、といった方法です。 +- タスクを実行するエージェントと、それを評価してフィードバックを返すエージェントを `while` ループで回し、評価者が出力が一定の基準を満たしたと判断するまで繰り返す。 +- 複数のエージェントを並列実行する。例: `asyncio.gather` のような Python の基本コンポーネント を用いる。相互に依存しない複数のタスクがある場合、速度向上に有効です。 -[`examples/agent_patterns`](https://github.com/openai/openai-agents-python/tree/main/examples/agent_patterns) にサンプルコードを多数用意しています。 \ No newline at end of file +[`examples/agent_patterns`](https://github.com/openai/openai-agents-python/tree/main/examples/agent_patterns) に多数の例があります。 \ No newline at end of file diff --git a/docs/ja/quickstart.md b/docs/ja/quickstart.md index 459621594..aee9fa457 100644 --- a/docs/ja/quickstart.md +++ b/docs/ja/quickstart.md @@ -6,7 +6,7 @@ search: ## プロジェクトと仮想環境の作成 -これは一度だけ行えば大丈夫です。 +これは 1 回だけ実施すれば十分です。 ```bash mkdir my_project @@ -16,21 +16,21 @@ python -m venv .venv ### 仮想環境の有効化 -新しいターミナル セッションを開始するたびに実行してください。 +新しいターミナル セッションを開始するたびに実行します。 ```bash source .venv/bin/activate ``` -### Agents SDK のインストール +### Agents SDK のインストール ```bash pip install openai-agents # or `uv add openai-agents`, etc ``` -### OpenAI API キーの設定 +### OpenAI API キーの設定 -お持ちでない場合は、OpenAI API キーを作成するために[こちらの手順](https://platform.openai.com/docs/quickstart#create-and-export-an-api-key)に従ってください。 +まだお持ちでない場合は、[次の手順](https://platform.openai.com/docs/quickstart#create-and-export-an-api-key) に従って OpenAI API キーを作成してエクスポートしてください。 ```bash export OPENAI_API_KEY=sk-... @@ -38,7 +38,7 @@ export OPENAI_API_KEY=sk-... ## 最初のエージェントの作成 -エージェントは instructions、名前、任意の config(例えば `model_config`)で定義します。 +エージェントは instructions、名前、任意の設定(例: `model_config`)で定義します。 ```python from agents import Agent @@ -49,9 +49,9 @@ agent = Agent( ) ``` -## いくつかのエージェントを追加 +## エージェントの追加 -追加のエージェントも同様に定義できます。`handoff_descriptions` はハンドオフのルーティングを判断するための追加コンテキストを提供します。 +追加のエージェントも同様に定義できます。`handoff_descriptions` は、ハンドオフのルーティングを判断するための追加コンテキストを提供します。 ```python from agents import Agent @@ -71,7 +71,7 @@ math_tutor_agent = Agent( ## ハンドオフの定義 -各エージェントで、タスクを前進させるために選択できる送信側ハンドオフの選択肢の一覧を定義できます。 +各エージェントで、タスクを前進させる方法を決めるために選択できる発信側ハンドオフ オプションの一覧を定義できます。 ```python triage_agent = Agent( @@ -81,9 +81,9 @@ triage_agent = Agent( ) ``` -## エージェント オーケストレーションの実行 +## エージェントのオーケストレーションの実行 -ワークフローが実行され、トリアージ エージェントが 2 つの専門エージェントの間で正しくルーティングすることを確認しましょう。 +ワークフローが実行され、トリアージ エージェントが 2 つの専門エージェント間を正しくルーティングすることを確認しましょう。 ```python from agents import Runner @@ -95,7 +95,7 @@ async def main(): ## ガードレールの追加 -入力または出力で実行するカスタム ガードレールを定義できます。 +入力または出力に対してカスタム ガードレールを定義できます。 ```python from agents import GuardrailFunctionOutput, Agent, Runner @@ -121,9 +121,9 @@ async def homework_guardrail(ctx, agent, input_data): ) ``` -## すべてをまとめる +## 全体の統合 -ハンドオフと入力ガードレールを使用して、すべてを組み合わせてワークフロー全体を実行しましょう。 +ハンドオフと入力ガードレールを使って、すべてを組み合わせたワークフロー全体を実行しましょう。 ```python from agents import Agent, InputGuardrail, GuardrailFunctionOutput, Runner @@ -192,12 +192,12 @@ if __name__ == "__main__": ## トレースの表示 -エージェント実行中に何が起きたかを確認するには、OpenAI ダッシュボードの Trace viewer に移動し、エージェント実行のトレースを表示してください。 +エージェント実行で何が起きたかを確認するには、[OpenAI ダッシュボードの Trace viewer](https://platform.openai.com/traces) に移動して実行のトレースを表示してください。 ## 次のステップ -より複雑なエージェント フローの作り方を学びましょう: +より複雑なエージェント フローの構築方法を学びましょう: -- [エージェント](agents.md)の設定について学ぶ。 -- [エージェントの実行](running_agents.md)について学ぶ。 -- [ツール](tools.md)、[ガードレール](guardrails.md)、[モデル](models/index.md)について学ぶ。 \ No newline at end of file +- [エージェント](agents.md) の設定について学ぶ。 +- [エージェントの実行](running_agents.md) について学ぶ。 +- [ツール](tools.md)、[ガードレール](guardrails.md)、[モデル](models/index.md) について学ぶ。 \ No newline at end of file diff --git a/docs/ja/realtime/guide.md b/docs/ja/realtime/guide.md index 4eb34548d..e60f60622 100644 --- a/docs/ja/realtime/guide.md +++ b/docs/ja/realtime/guide.md @@ -4,59 +4,59 @@ search: --- # ガイド -このガイドでは、OpenAI Agents SDK の realtime 機能を用いて音声対応の AI エージェントを構築する方法を詳しく説明します。 +このガイドでは、OpenAI Agents SDK の realtime 機能を用いた音声対応 AI エージェントの構築について詳しく説明します。 -!!! warning "ベータ機能" -Realtime エージェントはベータ版です。実装の改善に伴い、破壊的変更が発生する可能性があります。 +!!! warning "Beta feature" +Realtime エージェントはベータ版です。実装改善に伴い、互換性に影響する変更が発生する可能性があります。 ## 概要 -Realtime エージェントは、会話フローを可能にし、音声およびテキスト入力をリアルタイムに処理し、リアルタイム音声で応答します。OpenAI の Realtime API と永続的な接続を維持し、低レイテンシで自然な音声対話や割り込みへのスムーズな対応ができます。 +Realtime エージェントは、会話のフローを可能にし、音声およびテキスト入力をリアルタイムに処理して、リアルタイム音声で応答します。OpenAI の Realtime API への永続接続を維持し、低遅延で自然な音声対話と、割り込みへの適切な対応を実現します。 ## アーキテクチャ ### コアコンポーネント -realtime システムは複数の主要コンポーネントで構成されます。 +realtime システムは、いくつかの主要なコンポーネントで構成されます。 -- **RealtimeAgent**: instructions、tools、handoffs で構成されたエージェントです。 -- **RealtimeRunner**: 設定を管理します。`runner.run()` を呼び出してセッションを取得できます。 -- **RealtimeSession**: 単一の対話セッションです。通常は ユーザー が会話を開始するたびに 1 つ作成し、会話が終了するまで維持します。 -- **RealtimeModel**: 基盤のモデルインターフェース(通常は OpenAI の WebSocket 実装)です。 +- **RealtimeAgent**: instructions、tools、ハンドオフで構成されたエージェントです。 +- **RealtimeRunner**: 設定を管理します。`runner.run()` を呼び出すとセッションを取得できます。 +- **RealtimeSession**: 単一の対話セッションです。通常、ユーザーが会話を開始するたびに 1 つ作成し、会話が終了するまで維持します。 +- **RealtimeModel**: 基盤となるモデルインターフェース(一般的には OpenAI の WebSocket 実装) ### セッションフロー -一般的な realtime セッションは次のフローに従います。 +一般的な realtime セッションの流れは次のとおりです。 -1. instructions、tools、handoffs を指定して **RealtimeAgent を作成** します。 -2. エージェントと設定オプションで **RealtimeRunner をセットアップ** します。 -3. `await runner.run()` を使って **セッションを開始** し、RealtimeSession を受け取ります。 -4. `send_audio()` または `send_message()` を使って **音声またはテキストメッセージを送信** します。 -5. セッションを反復処理して **イベントを受信** します。イベントには音声出力、文字起こし、ツール呼び出し、ハンドオフ、エラーが含まれます。 -6. ユーザー がエージェントにかぶせて話した場合の **割り込みを処理** します。現在の音声生成は自動的に停止します。 +1. instructions、tools、ハンドオフを指定して **RealtimeAgent を作成** します。 +2. エージェントと設定オプションを使って **RealtimeRunner を設定** します。 +3. `await runner.run()` を使って **セッションを開始** します。これにより RealtimeSession が返されます。 +4. `send_audio()` または `send_message()` を使用して **音声またはテキストメッセージを送信** します。 +5. セッションを反復処理して **イベントを監視** します。イベントには音声出力、文字起こし、ツール呼び出し、ハンドオフ、エラーが含まれます。 +6. ユーザーがエージェントの発話にかぶせて話した場合の **割り込みを処理** します。現在の音声生成は自動的に停止します。 セッションは会話履歴を保持し、realtime モデルとの永続接続を管理します。 ## エージェント設定 -RealtimeAgent は通常の Agent クラスと同様に動作しますが、いくつか重要な違いがあります。API の詳細は [`RealtimeAgent`][agents.realtime.agent.RealtimeAgent] の API リファレンスをご覧ください。 +RealtimeAgent は、通常の Agent クラスと同様に動作しますが、いくつか重要な違いがあります。API の詳細は、[`RealtimeAgent`][agents.realtime.agent.RealtimeAgent] の API リファレンスを参照してください。 通常のエージェントとの主な違い: -- モデルの選択はエージェントレベルではなくセッションレベルで設定します。 -- structured outputs はサポートされません(`outputType` は未対応)。 -- 音声はエージェントごとに設定できますが、最初のエージェントが話し始めた後は変更できません。 -- その他の機能(tools、handoffs、instructions)は同様に動作します。 +- モデル選択はエージェントではなくセッションレベルで設定します。 +- structured output はサポートされません(`outputType` は非対応)。 +- 声質はエージェントごとに設定できますが、最初のエージェントが話し始めた後は変更できません。 +- それ以外の機能(tools、ハンドオフ、instructions)は同様に動作します。 ## セッション設定 ### モデル設定 -セッション設定では、基盤となる realtime モデルの動作を制御できます。モデル名(例: `gpt-4o-realtime-preview`)、音声の選択(alloy、echo、fable、onyx、nova、shimmer)、対応するモダリティ(テキストや音声)を設定できます。音声フォーマットは入力と出力の両方で設定可能で、デフォルトは PCM16 です。 +セッション設定では、基盤となる realtime モデルの挙動を制御できます。モデル名(`gpt-realtime` など)、声質の選択(alloy、echo、fable、onyx、nova、shimmer)、対応モダリティ(テキストおよび/または音声)を設定できます。音声フォーマットは入力・出力の両方で設定でき、デフォルトは PCM16 です。 ### 音声設定 -音声設定では、セッションが音声入力と出力をどのように扱うかを制御します。Whisper などのモデルを使った入力音声の文字起こし、言語設定、ドメイン固有用語の精度向上のための文字起こしプロンプトを指定できます。ターン検出設定では、音声活動検出のしきい値、無音時間、検出された音声の前後のパディングなどを調整して、エージェントがいつ応答を開始・終了するかを制御します。 +音声設定は、セッションが音声入力と出力をどのように処理するかを制御します。Whisper のようなモデルを用いた入力音声の文字起こし、言語設定、ドメイン固有用語の精度を高めるための文字起こしプロンプトを指定できます。発話区間検出(turn detection)の設定により、エージェントがいつ応答を開始・停止するかを制御でき、音声アクティビティ検出のしきい値、無音時間、検出された発話の前後パディングなどのオプションがあります。 ## ツールと関数 @@ -90,7 +90,7 @@ agent = RealtimeAgent( ### ハンドオフの作成 -ハンドオフにより、専門特化したエージェント間で会話を引き継げます。 +ハンドオフを使用すると、専門化されたエージェント間で会話を引き継げます。 ```python from agents.realtime import realtime_handoff @@ -119,22 +119,22 @@ main_agent = RealtimeAgent( ## イベント処理 -セッションはイベントをストリーミングし、セッションオブジェクトを反復処理することでリッスンできます。イベントには、音声出力チャンク、文字起こし結果、ツール実行の開始と終了、エージェントのハンドオフ、エラーが含まれます。主に処理すべきイベントは次のとおりです。 +セッションはイベントをストリーミング出力し、セッションオブジェクトを反復処理することでそれらを監視できます。イベントには、音声出力チャンク、文字起こしの結果、ツール実行の開始と終了、エージェントのハンドオフ、エラーが含まれます。主に処理すべきイベントは次のとおりです。 -- **audio**: エージェントの応答からの raw 音声データ -- **audio_end**: エージェントの発話終了 -- **audio_interrupted**: ユーザー によるエージェントの割り込み -- **tool_start/tool_end**: ツール実行のライフサイクル -- **handoff**: エージェントのハンドオフが発生 -- **error**: 処理中にエラーが発生 +- **audio**: エージェントの応答からの raw 音声データ +- **audio_end**: エージェントの発話が完了 +- **audio_interrupted**: ユーザーがエージェントを割り込み +- **tool_start/tool_end**: ツール実行のライフサイクル +- **handoff**: エージェントのハンドオフが発生 +- **error**: 処理中にエラーが発生 -完全なイベントの詳細は [`RealtimeSessionEvent`][agents.realtime.events.RealtimeSessionEvent] を参照してください。 +イベントの詳細は [`RealtimeSessionEvent`][agents.realtime.events.RealtimeSessionEvent] を参照してください。 ## ガードレール -Realtime エージェントでは出力用の ガードレール のみがサポートされます。これらのガードレールはデバウンスされ、リアルタイム生成時のパフォーマンス問題を避けるために(すべての単語ごとではなく)定期的に実行されます。デフォルトのデバウンス長は 100 文字ですが、設定可能です。 +realtime エージェントでサポートされるのは出力ガードレールのみです。性能問題を避けるため、これらのガードレールはデバウンスされ、リアルタイム生成中に毎語ではなく定期的に実行されます。デフォルトのデバウンス長は 100 文字ですが、設定可能です。 -ガードレールは `RealtimeAgent` に直接アタッチするか、セッションの `run_config` を通じて指定できます。両方のソースからのガードレールは併用されます。 +ガードレールは `RealtimeAgent` に直接アタッチするか、セッションの `run_config` を通じて提供できます。両方のソースからのガードレールは併用されます。 ```python from agents.guardrail import GuardrailFunctionOutput, OutputGuardrail @@ -152,17 +152,17 @@ agent = RealtimeAgent( ) ``` -ガードレールがトリガーされると、`guardrail_tripped` イベントが生成され、エージェントの現在の応答を中断できます。デバウンス動作により、安全性とリアルタイムのパフォーマンス要件のバランスをとります。テキストエージェントと異なり、realtime エージェントはガードレールが発動しても **Exception** をスローしません。 +ガードレールが発動すると、`guardrail_tripped` イベントが生成され、エージェントの現在の応答を割り込むことがあります。デバウンス動作により、安全性とリアルタイム性能要件のバランスを取ります。テキストエージェントと異なり、realtime エージェントはガードレール発動時に Exception を送出しません。 ## 音声処理 [`session.send_audio(audio_bytes)`][agents.realtime.session.RealtimeSession.send_audio] を使って音声をセッションに送信するか、[`session.send_message()`][agents.realtime.session.RealtimeSession.send_message] を使ってテキストを送信します。 -音声出力については、`audio` イベントをリッスンし、任意の音声ライブラリで再生します。ユーザー がエージェントを割り込んだ際に即時に再生を停止し、キューにある音声をクリアするため、`audio_interrupted` イベントを必ずリッスンしてください。 +音声出力については、`audio` イベントを監視し、任意の音声ライブラリで音声データを再生してください。ユーザーがエージェントを割り込んだ際に即座に再生を停止し、キューされている音声をクリアできるよう、`audio_interrupted` イベントを必ず監視してください。 -## 直接モデルアクセス +## 直接的なモデルアクセス -基盤となるモデルにアクセスして、カスタムリスナーを追加したり、高度な操作を実行したりできます。 +基盤となるモデルにアクセスして、カスタムリスナーを追加したり高度な操作を実行できます。 ```python # Add a custom listener to the model @@ -171,6 +171,6 @@ session.model.add_listener(my_custom_listener) これにより、接続を低レベルで制御する必要がある高度なユースケースに向けて、[`RealtimeModel`][agents.realtime.model.RealtimeModel] インターフェースへ直接アクセスできます。 -## 例 +## コード例 -完全な動作する code examples は、[examples/realtime ディレクトリ](https://github.com/openai/openai-agents-python/tree/main/examples/realtime) を参照してください。UI コンポーネントの有無それぞれのデモが含まれます。 \ No newline at end of file +完全な動作サンプルは、UI コンポーネントあり・なしのデモを含む [examples/realtime ディレクトリ](https://github.com/openai/openai-agents-python/tree/main/examples/realtime) をご覧ください。 \ No newline at end of file diff --git a/docs/ja/realtime/quickstart.md b/docs/ja/realtime/quickstart.md index 73ed8570f..dd3777dea 100644 --- a/docs/ja/realtime/quickstart.md +++ b/docs/ja/realtime/quickstart.md @@ -4,26 +4,26 @@ search: --- # クイックスタート -Realtime エージェントは、 OpenAI の Realtime API を使用して AI 音声会話を実現します。このガイドでは、最初の Realtime 音声エージェントの作成手順を説明します。 +リアルタイム エージェントは、OpenAI の Realtime API を使って AI エージェントとの音声会話を可能にします。本ガイドでは、最初のリアルタイム音声エージェントの作成手順を説明します。 !!! warning "ベータ機能" -Realtime エージェントはベータ版です。実装の改良に伴い、互換性のない変更が入る可能性があります。 +リアルタイム エージェントはベータ版です。実装の改善に伴い、破壊的変更が発生する可能性があります。 ## 前提条件 -- Python 3.9 以上 -- OpenAI API キー -- OpenAI Agents SDK の基本的な知識 +- Python 3.9 以上 +- OpenAI API キー +- OpenAI Agents SDK の基本的な知識 ## インストール -まだの場合は、 OpenAI Agents SDK をインストールします: +まだの場合は、OpenAI Agents SDK をインストールします: ```bash pip install openai-agents ``` -## はじめての Realtime エージェントの作成 +## 最初のリアルタイム エージェントの作成 ### 1. 必要なコンポーネントのインポート @@ -32,7 +32,7 @@ import asyncio from agents.realtime import RealtimeAgent, RealtimeRunner ``` -### 2. Realtime エージェントの作成 +### 2. リアルタイム エージェントの作成 ```python agent = RealtimeAgent( @@ -41,16 +41,20 @@ agent = RealtimeAgent( ) ``` -### 3. Runner のセットアップ +### 3. ランナーのセットアップ ```python runner = RealtimeRunner( starting_agent=agent, config={ "model_settings": { - "model_name": "gpt-4o-realtime-preview", - "voice": "alloy", - "modalities": ["text", "audio"], + "model_name": "gpt-realtime", + "voice": "ash", + "modalities": ["audio"], + "input_audio_format": "pcm16", + "output_audio_format": "pcm16", + "input_audio_transcription": {"model": "gpt-4o-mini-transcribe"}, + "turn_detection": {"type": "semantic_vad", "interrupt_response": True}, } } ) @@ -59,29 +63,55 @@ runner = RealtimeRunner( ### 4. セッションの開始 ```python -async def main(): - # Start the realtime session - session = await runner.run() - - async with session: - # Send a text message to start the conversation - await session.send_message("Hello! How are you today?") - - # The agent will stream back audio in real-time (not shown in this example) - # Listen for events from the session - async for event in session: - if event.type == "response.audio_transcript.done": - print(f"Assistant: {event.transcript}") - elif event.type == "conversation.item.input_audio_transcription.completed": - print(f"User: {event.transcript}") - -# Run the session -asyncio.run(main()) +# Start the session +session = await runner.run() + +async with session: + print("Session started! The agent will stream audio responses in real-time.") + # Process events + async for event in session: + try: + if event.type == "agent_start": + print(f"Agent started: {event.agent.name}") + elif event.type == "agent_end": + print(f"Agent ended: {event.agent.name}") + elif event.type == "handoff": + print(f"Handoff from {event.from_agent.name} to {event.to_agent.name}") + elif event.type == "tool_start": + print(f"Tool started: {event.tool.name}") + elif event.type == "tool_end": + print(f"Tool ended: {event.tool.name}; output: {event.output}") + elif event.type == "audio_end": + print("Audio ended") + elif event.type == "audio": + # Enqueue audio for callback-based playback with metadata + # Non-blocking put; queue is unbounded, so drops won’t occur. + pass + elif event.type == "audio_interrupted": + print("Audio interrupted") + # Begin graceful fade + flush in the audio callback and rebuild jitter buffer. + elif event.type == "error": + print(f"Error: {event.error}") + elif event.type == "history_updated": + pass # Skip these frequent events + elif event.type == "history_added": + pass # Skip these frequent events + elif event.type == "raw_model_event": + print(f"Raw model event: {_truncate_str(str(event.data), 200)}") + else: + print(f"Unknown event type: {event.type}") + except Exception as e: + print(f"Error processing event: {_truncate_str(str(e), 200)}") + +def _truncate_str(s: str, max_length: int) -> str: + if len(s) > max_length: + return s[:max_length] + "..." + return s ``` -## 完全なコード例 +## 完全なサンプル -動作する完全なコード例は次のとおりです: +以下は完全に動作する例です: ```python import asyncio @@ -93,45 +123,68 @@ async def main(): name="Assistant", instructions="You are a helpful voice assistant. Keep responses brief and conversational.", ) - # Set up the runner with configuration runner = RealtimeRunner( starting_agent=agent, config={ "model_settings": { - "model_name": "gpt-4o-realtime-preview", - "voice": "alloy", - "modalities": ["text", "audio"], - "input_audio_transcription": { - "model": "whisper-1" - }, - "turn_detection": { - "type": "server_vad", - "threshold": 0.5, - "prefix_padding_ms": 300, - "silence_duration_ms": 200 - } + "model_name": "gpt-realtime", + "voice": "ash", + "modalities": ["audio"], + "input_audio_format": "pcm16", + "output_audio_format": "pcm16", + "input_audio_transcription": {"model": "gpt-4o-mini-transcribe"}, + "turn_detection": {"type": "semantic_vad", "interrupt_response": True}, } - } + }, ) - # Start the session session = await runner.run() async with session: print("Session started! The agent will stream audio responses in real-time.") - # Process events async for event in session: - if event.type == "response.audio_transcript.done": - print(f"Assistant: {event.transcript}") - elif event.type == "conversation.item.input_audio_transcription.completed": - print(f"User: {event.transcript}") - elif event.type == "error": - print(f"Error: {event.error}") - break + try: + if event.type == "agent_start": + print(f"Agent started: {event.agent.name}") + elif event.type == "agent_end": + print(f"Agent ended: {event.agent.name}") + elif event.type == "handoff": + print(f"Handoff from {event.from_agent.name} to {event.to_agent.name}") + elif event.type == "tool_start": + print(f"Tool started: {event.tool.name}") + elif event.type == "tool_end": + print(f"Tool ended: {event.tool.name}; output: {event.output}") + elif event.type == "audio_end": + print("Audio ended") + elif event.type == "audio": + # Enqueue audio for callback-based playback with metadata + # Non-blocking put; queue is unbounded, so drops won’t occur. + pass + elif event.type == "audio_interrupted": + print("Audio interrupted") + # Begin graceful fade + flush in the audio callback and rebuild jitter buffer. + elif event.type == "error": + print(f"Error: {event.error}") + elif event.type == "history_updated": + pass # Skip these frequent events + elif event.type == "history_added": + pass # Skip these frequent events + elif event.type == "raw_model_event": + print(f"Raw model event: {_truncate_str(str(event.data), 200)}") + else: + print(f"Unknown event type: {event.type}") + except Exception as e: + print(f"Error processing event: {_truncate_str(str(e), 200)}") + +def _truncate_str(s: str, max_length: int) -> str: + if len(s) > max_length: + return s[:max_length] + "..." + return s if __name__ == "__main__": + # Run the session asyncio.run(main()) ``` @@ -139,30 +192,30 @@ if __name__ == "__main__": ### モデル設定 -- `model_name`: 利用可能な Realtime モデルから選択 (例: `gpt-4o-realtime-preview`) -- `voice`: 音声の選択 (`alloy`, `echo`, `fable`, `onyx`, `nova`, `shimmer`) -- `modalities`: テキストや音声の有効化 (`["text", "audio"]`) +- `model_name`: 利用可能なリアルタイムモデルから選択 (例: `gpt-realtime`) +- `voice`: 音声を選択 (`alloy`, `echo`, `fable`, `onyx`, `nova`, `shimmer`) +- `modalities`: テキストまたは音声を有効化 (`["text"]` または `["audio"]`) -### オーディオ設定 +### 音声設定 -- `input_audio_format`: 入力音声の形式 (`pcm16`, `g711_ulaw`, `g711_alaw`) -- `output_audio_format`: 出力音声の形式 -- `input_audio_transcription`: 書き起こしの設定 +- `input_audio_format`: 入力音声の形式 (`pcm16`, `g711_ulaw`, `g711_alaw`) +- `output_audio_format`: 出力音声の形式 +- `input_audio_transcription`: 文字起こしの設定 ### ターン検出 -- `type`: 検出方法 (`server_vad`, `semantic_vad`) -- `threshold`: 音声活動の閾値 (0.0–1.0) -- `silence_duration_ms`: ターン終了を検出する無音時間 -- `prefix_padding_ms`: 発話前の音声パディング +- `type`: 検出方式 (`server_vad`, `semantic_vad`) +- `threshold`: 音声活動のしきい値 (0.0–1.0) +- `silence_duration_ms`: ターン終了を検出する無音時間 +- `prefix_padding_ms`: 発話前の音声パディング ## 次のステップ -- [Realtime エージェントについて詳しく学ぶ](guide.md) -- [examples/realtime](https://github.com/openai/openai-agents-python/tree/main/examples/realtime) フォルダの動作するコード例を参照 -- エージェントにツールを追加 -- エージェント間のハンドオフを実装 -- 安全性のためのガードレールを設定 +- [リアルタイム エージェントの詳細](guide.md) +- [examples/realtime](https://github.com/openai/openai-agents-python/tree/main/examples/realtime) フォルダの動作する例を確認 +- エージェントにツールを追加 +- エージェント間のハンドオフを実装 +- 安全のためのガードレールを設定 ## 認証 @@ -172,7 +225,7 @@ if __name__ == "__main__": export OPENAI_API_KEY="your-api-key-here" ``` -また、セッション作成時に直接渡すこともできます: +またはセッション作成時に直接渡します: ```python session = await runner.run(model_config={"api_key": "your-api-key"}) diff --git a/docs/ja/release.md b/docs/ja/release.md index 4cbaf6485..e7c6b3cbc 100644 --- a/docs/ja/release.md +++ b/docs/ja/release.md @@ -2,31 +2,31 @@ search: exclude: true --- -# リリースプロセス/変更履歴 +# リリースプロセス/変更履歴 -本プロジェクトは、`0.Y.Z` という形式の、やや変更したセマンティック バージョニングに従います。先頭の `0` は、この SDK が依然として急速に進化していることを示します。各コンポーネントの増分は次のとおりです。 +本プロジェクトは、`0.Y.Z` 形式のセマンティック バージョニングのやや修正版に従います。先頭の `0` は、 SDK が依然として急速に進化していることを示します。各コンポーネントの更新規則は次のとおりです。 -## マイナー(`Y`)バージョン +## マイナー (`Y`) バージョン -ベータではない公開インターフェースに対する **breaking changes** がある場合、マイナー バージョン `Y` を上げます。たとえば、`0.0.x` から `0.1.x` への移行には breaking changes が含まれる可能性があります。 +ベータ指定されていない公開インターフェースに対する**互換性のない変更**がある場合、マイナー バージョン `Y` を増やします。たとえば、`0.0.x` から `0.1.x` への更新には互換性のない変更が含まれる場合があります。 -breaking changes を避けたい場合は、プロジェクトで `0.0.x` に固定することをおすすめします。 +互換性のない変更を望まない場合は、プロジェクトで `0.0.x` バージョンに固定することをおすすめします。 -## パッチ(`Z`)バージョン +## パッチ (`Z`) バージョン -後方互換のある変更については `Z` を増やします。 +互換性を壊さない変更では `Z` を増やします: - バグ修正 - 新機能 -- 非公開インターフェースの変更 +- プライベートインターフェースの変更 - ベータ機能の更新 -## 互換性を壊す変更の変更履歴 +## 互換性のない変更の変更履歴 ### 0.2.0 -このバージョンでは、以前は引数として `Agent` を受け取っていたいくつかの箇所が、代わりに `AgentBase` を引数として受け取るようになりました。たとえば、MCP サーバーでの `list_tools()` 呼び出しです。これは純粋に型に関する変更であり、引き続き `Agent` オブジェクトを受け取ります。更新するには、`Agent` を `AgentBase` に置き換えて型エラーを解消してください。 +このバージョンでは、これまで引数として `Agent` を受け取っていた箇所の一部が、代わりに `AgentBase` を受け取るようになりました。たとえば、 MCP サーバーでの `list_tools()` 呼び出しが該当します。これは型に関する純粋な変更であり、引き続き `Agent` オブジェクトを受け取ります。更新するには、`Agent` を `AgentBase` に置き換えて型エラーを解消してください。 ### 0.1.0 -このバージョンでは、[`MCPServer.list_tools()`][agents.mcp.server.MCPServer] に新しいパラメーター `run_context` と `agent` が追加されました。`MCPServer` を継承するクラスには、これらのパラメーターを追加する必要があります。 \ No newline at end of file +このバージョンでは、[`MCPServer.list_tools()`][agents.mcp.server.MCPServer] に新しいパラメーターが 2 つ追加されました: `run_context` と `agent` です。`MCPServer` を継承するすべてのクラスに、これらのパラメーターを追加する必要があります。 \ No newline at end of file diff --git a/docs/ja/repl.md b/docs/ja/repl.md index 7b30edc6f..cfd776cbf 100644 --- a/docs/ja/repl.md +++ b/docs/ja/repl.md @@ -18,6 +18,6 @@ if __name__ == "__main__": asyncio.run(main()) ``` -`run_demo_loop` はループでユーザー入力を促し、ターン間で会話履歴を保持します。デフォルトでは、生成と同時にモデル出力をストリーミングします。上記の例を実行すると、`run_demo_loop` は対話型チャットセッションを開始します。継続的に入力を求め、ターン間の会話全体の履歴を記憶するため(エージェントは何が議論されたかを把握できます)、生成されると同時にエージェントの応答をリアルタイムで自動的にストリーミングします。 +`run_demo_loop` は、ループで ユーザー 入力を促し、ターン間で会話履歴を保持します。既定で、生成と同時にモデル出力を ストリーミング します。上の例を実行すると、run_demo_loop は対話型のチャットセッションを開始します。継続的に入力を求め、ターン間で会話履歴全体を保持します(そのため、エージェントは何が議論されたかを把握できます)、そして生成され次第、エージェントの応答をリアルタイムに自動で ストリーミング します。 -このチャットセッションを終了するには、`quit` または `exit` と入力して(Enter を押す)か、`Ctrl-D` キーボードショートカットを使用します。 \ No newline at end of file +このチャットセッションを終了するには、`quit` または `exit` と入力(Enter を押下)するか、`Ctrl-D` のキーボードショートカットを使用してください。 \ No newline at end of file diff --git a/docs/ja/results.md b/docs/ja/results.md index e88e9b68a..d764b4a83 100644 --- a/docs/ja/results.md +++ b/docs/ja/results.md @@ -4,53 +4,53 @@ search: --- # 結果 -`Runner.run` メソッドを呼び出すと、次のいずれかが返ります。 +`Runner.run` メソッドを呼び出すと、次のいずれかが返ります: - [`RunResult`][agents.result.RunResult](`run` または `run_sync` を呼び出した場合) - [`RunResultStreaming`][agents.result.RunResultStreaming](`run_streamed` を呼び出した場合) -これらはいずれも [`RunResultBase`][agents.result.RunResultBase] を継承しており、最も有用な情報の多くはそこに含まれます。 +これらはいずれも [`RunResultBase`][agents.result.RunResultBase] を継承しており、有用な情報の多くはここに含まれます。 ## 最終出力 -[`final_output`][agents.result.RunResultBase.final_output] プロパティには、最後に実行されたエージェントの最終出力が含まれます。これは次のいずれかです。 +[`final_output`][agents.result.RunResultBase.final_output] プロパティには、最後に実行されたエージェントの最終出力が含まれます。これは次のいずれかです: - 最後のエージェントに `output_type` が定義されていない場合は `str` -- エージェントに出力タイプが定義されている場合は、`last_agent.output_type` 型のオブジェクト +- エージェントに出力タイプが定義されている場合は `last_agent.output_type` 型のオブジェクト !!! note - `final_output` の型は `Any` です。ハンドオフがあるため、静的な型付けはできません。ハンドオフが発生する場合、どのエージェントが最後になるか分からないため、可能な出力タイプの集合を静的に特定できないためです。 + `final_output` は型 Any です。ハンドオフの可能性があるため、静的な型付けはできません。ハンドオフが発生する場合、最後のエージェントになり得るのは任意のエージェントであり、取り得る出力タイプの集合を静的には特定できないためです。 -## 次ターンの入力 +## 次のターンへの入力 -[`result.to_input_list()`][agents.result.RunResultBase.to_input_list] を使うと、提供した元の入力に、エージェントの実行中に生成されたアイテムを連結した入力リストに変換できます。これにより、あるエージェント実行の出力を別の実行に渡したり、ループで実行して毎回新しい ユーザー 入力を追加したりするのが簡単になります。 +[`result.to_input_list()`][agents.result.RunResultBase.to_input_list] を使うと、実行時に生成された項目を、元の入力に連結した入力リストへ変換できます。これにより、あるエージェント実行の出力を別の実行へ渡したり、ループで実行して毎回新しい ユーザー 入力を追加したりするのが容易になります。 ## 最後のエージェント -[`last_agent`][agents.result.RunResultBase.last_agent] プロパティには、最後に実行されたエージェントが含まれます。アプリケーションによっては、これは次回 ユーザー が入力する際に役立つことがよくあります。たとえば、フロントラインのトリアージ用エージェントが言語別のエージェントにハンドオフする場合、最後のエージェントを保存しておき、次回 ユーザー がエージェントにメッセージを送る際に再利用できます。 +[`last_agent`][agents.result.RunResultBase.last_agent] プロパティには、最後に実行されたエージェントが含まれます。アプリケーションによっては、次回 ユーザー が入力する際に役立つことが多いです。例えば、一次振り分けのエージェントが言語別のエージェントへハンドオフする場合、最後のエージェントを保存しておき、次回 ユーザー がメッセージを送るときに再利用できます。 ## 新規アイテム -[`new_items`][agents.result.RunResultBase.new_items] プロパティには、実行中に生成された新しいアイテムが含まれます。アイテムは [`RunItem`][agents.items.RunItem] です。実行アイテムは、LLM が生成した生のアイテムをラップします。 +[`new_items`][agents.result.RunResultBase.new_items] プロパティには、実行中に生成された新しいアイテムが含まれます。アイテムは [`RunItem`][agents.items.RunItem] です。RunItem は、LLM が生成した raw アイテムをラップします。 -- [`MessageOutputItem`][agents.items.MessageOutputItem] は LLM からのメッセージを示します。生のアイテムは生成されたメッセージです。 -- [`HandoffCallItem`][agents.items.HandoffCallItem] は LLM がハンドオフ ツールを呼び出したことを示します。生のアイテムは LLM からのツール呼び出しアイテムです。 -- [`HandoffOutputItem`][agents.items.HandoffOutputItem] はハンドオフが発生したことを示します。生のアイテムはハンドオフ ツール呼び出しに対するツール応答です。アイテムから送信元/宛先のエージェントにもアクセスできます。 -- [`ToolCallItem`][agents.items.ToolCallItem] は LLM がツールを呼び出したことを示します。 -- [`ToolCallOutputItem`][agents.items.ToolCallOutputItem] はツールが呼び出されたことを示します。生のアイテムはツールの応答です。アイテムからツール出力にもアクセスできます。 -- [`ReasoningItem`][agents.items.ReasoningItem] は LLM からの推論アイテムを示します。生のアイテムは生成された推論です。 +- [`MessageOutputItem`][agents.items.MessageOutputItem]: LLM からのメッセージを示します。raw アイテムは生成されたメッセージです。 +- [`HandoffCallItem`][agents.items.HandoffCallItem]: LLM がハンドオフ ツールを呼び出したことを示します。raw アイテムは LLM からのツール呼び出しアイテムです。 +- [`HandoffOutputItem`][agents.items.HandoffOutputItem]: ハンドオフが行われたことを示します。raw アイテムはハンドオフ ツール呼び出しに対するツール応答です。アイテムからソース/ターゲットのエージェントにもアクセスできます。 +- [`ToolCallItem`][agents.items.ToolCallItem]: LLM がツールを起動したことを示します。 +- [`ToolCallOutputItem`][agents.items.ToolCallOutputItem]: ツールが呼び出されたことを示します。raw アイテムはツールの応答です。アイテムからツールの出力にもアクセスできます。 +- [`ReasoningItem`][agents.items.ReasoningItem]: LLM からの推論アイテムを示します。raw アイテムは生成された推論です。 ## その他の情報 -### ガードレール結果 +### ガードレールの結果 -[`input_guardrail_results`][agents.result.RunResultBase.input_guardrail_results] と [`output_guardrail_results`][agents.result.RunResultBase.output_guardrail_results] プロパティには、ガードレールの結果(ある場合)が含まれます。ガードレール結果には、ログや保存に役立つ情報が含まれることがあるため、参照できるようにしています。 +[`input_guardrail_results`][agents.result.RunResultBase.input_guardrail_results] と [`output_guardrail_results`][agents.result.RunResultBase.output_guardrail_results] プロパティには、ガードレールの結果(存在する場合)が含まれます。ガードレールの結果には、ログや保存に役立つ情報が含まれることがあるため、これらを利用できるようにしています。 -### 生の応答 +### Raw レスポンス -[`raw_responses`][agents.result.RunResultBase.raw_responses] プロパティには、LLM によって生成された [`ModelResponse`][agents.items.ModelResponse] が含まれます。 +[`raw_responses`][agents.result.RunResultBase.raw_responses] プロパティには、LLM が生成した [`ModelResponse`][agents.items.ModelResponse] が含まれます。 ### 元の入力 -[`input`][agents.result.RunResultBase.input] プロパティには、`run` メソッドに提供した元の入力が含まれます。ほとんどの場合は不要ですが、必要に応じて参照できます。 \ No newline at end of file +[`input`][agents.result.RunResultBase.input] プロパティには、`run` メソッドへ渡した元の入力が含まれます。ほとんどの場合は不要ですが、必要に応じて参照できます。 \ No newline at end of file diff --git a/docs/ja/running_agents.md b/docs/ja/running_agents.md index 4c78483fe..e88f07cc6 100644 --- a/docs/ja/running_agents.md +++ b/docs/ja/running_agents.md @@ -4,11 +4,11 @@ search: --- # エージェントの実行 -エージェントは [`Runner`][agents.run.Runner] クラスで実行できます。方法は 3 つあります。 +エージェントは [`Runner`][agents.run.Runner] クラスで実行できます。方法は 3 つあります: 1. [`Runner.run()`][agents.run.Runner.run]: 非同期で実行し、[`RunResult`][agents.result.RunResult] を返します。 -2. [`Runner.run_sync()`][agents.run.Runner.run_sync]: 同期メソッドで、内部的には `.run()` を実行します。 -3. [`Runner.run_streamed()`][agents.run.Runner.run_streamed]: 非同期で実行し、[`RunResultStreaming`][agents.result.RunResultStreaming] を返します。LLM をストリーミング モードで呼び出し、受信したイベントを順次ストリーミングします。 +2. [`Runner.run_sync()`][agents.run.Runner.run_sync]: 同期メソッドで、内部的に `.run()` を実行します。 +3. [`Runner.run_streamed()`][agents.run.Runner.run_streamed]: 非同期で実行し、[`RunResultStreaming`][agents.result.RunResultStreaming] を返します。LLM をストリーミング モードで呼び出し、受信したイベントを逐次ストリーミングします。 ```python from agents import Agent, Runner @@ -23,55 +23,55 @@ async def main(): # Infinite loop's dance ``` -詳しくは [実行結果ガイド](results.md) を参照してください。 +詳しくは [結果ガイド](results.md) をご覧ください。 -## エージェントループ +## エージェント ループ -`Runner` の run メソッドを使うときは、開始するエージェントと入力を渡します。入力は文字列(ユーザー メッセージとして扱われます)または入力アイテムのリスト(OpenAI Responses API のアイテム)です。 +`Runner` の run メソッドを使うとき、開始エージェントと入力を渡します。入力は文字列(ユーザー メッセージとして扱われます)か、OpenAI Responses API の入力アイテムのリストのいずれかです。 -runner は次のループを実行します。 +runner は次のループを実行します: -1. 現在のエージェントと現在の入力で LLM を呼び出します。 +1. 現在のエージェントに対して、現在の入力で LLM を呼び出します。 2. LLM が出力を生成します。 1. LLM が `final_output` を返した場合、ループを終了し結果を返します。 - 2. LLM がハンドオフを行った場合、現在のエージェントと入力を更新してループを再実行します。 + 2. LLM がハンドオフを行った場合、現在のエージェントと入力を更新し、ループを再実行します。 3. LLM がツール呼び出しを生成した場合、それらを実行して結果を追加し、ループを再実行します。 3. 渡された `max_turns` を超えた場合、[`MaxTurnsExceeded`][agents.exceptions.MaxTurnsExceeded] 例外を送出します。 !!! note - LLM の出力が「最終出力」と見なされる規則は、望ましい型のテキスト出力を生成し、ツール呼び出しがない場合です。 + LLM の出力が「最終出力」と見なされるルールは、望ましい型のテキスト出力を生成し、ツール呼び出しが無いことです。 ## ストリーミング -ストリーミングを使用すると、LLM の実行に伴うストリーミング イベントを追加で受け取れます。ストリームが完了すると、[`RunResultStreaming`][agents.result.RunResultStreaming] には、生成されたすべての新しい出力を含む、実行に関する完全な情報が含まれます。ストリーミング イベントは `.stream_events()` を呼び出して取得できます。詳しくは [ストリーミング ガイド](streaming.md) を参照してください。 +ストリーミングを使うと、LLM の実行中にストリーミング イベントを受け取れます。ストリーム完了後、[`RunResultStreaming`][agents.result.RunResultStreaming] には、生成されたすべての新規出力を含む実行の完全な情報が含まれます。ストリーミング イベントは `.stream_events()` を呼び出して取得できます。詳しくは [ストリーミング ガイド](streaming.md) を参照してください。 ## 実行設定 -`run_config` パラメーターでは、エージェント実行のグローバル設定を構成できます。 +`run_config` パラメーターは、エージェント実行のグローバル設定を構成できます: - [`model`][agents.run.RunConfig.model]: 各 Agent の `model` に関係なく、使用するグローバルな LLM モデルを設定できます。 -- [`model_provider`][agents.run.RunConfig.model_provider]: モデル名を解決するためのモデルプロバイダーで、デフォルトは OpenAI です。 -- [`model_settings`][agents.run.RunConfig.model_settings]: エージェント固有の設定を上書きします。たとえば、グローバルな `temperature` や `top_p` を設定できます。 -- [`input_guardrails`][agents.run.RunConfig.input_guardrails], [`output_guardrails`][agents.run.RunConfig.output_guardrails]: すべての実行に含める入力/出力のガードレールのリストです。 -- [`handoff_input_filter`][agents.run.RunConfig.handoff_input_filter]: ハンドオフに入力フィルターが未設定の場合に適用する、すべてのハンドオフに対するグローバルな入力フィルターです。入力フィルターを使うと、新しいエージェントに送る入力を編集できます。詳細は [`Handoff.input_filter`][agents.handoffs.Handoff.input_filter] のドキュメントを参照してください。 +- [`model_provider`][agents.run.RunConfig.model_provider]: モデル名を解決するモデル プロバイダー。デフォルトは OpenAI です。 +- [`model_settings`][agents.run.RunConfig.model_settings]: エージェント固有の設定を上書きします。例えば、グローバルな `temperature` や `top_p` を設定できます。 +- [`input_guardrails`][agents.run.RunConfig.input_guardrails], [`output_guardrails`][agents.run.RunConfig.output_guardrails]: すべての実行に含める入力/出力のガードレールのリスト。 +- [`handoff_input_filter`][agents.run.RunConfig.handoff_input_filter]: ハンドオフに既に設定がない場合に適用されるグローバルな入力フィルター。入力フィルターにより、新しいエージェントへ送る入力を編集できます。詳細は [`Handoff.input_filter`][agents.handoffs.Handoff.input_filter] のドキュメントを参照してください。 - [`tracing_disabled`][agents.run.RunConfig.tracing_disabled]: 実行全体の [トレーシング](tracing.md) を無効化できます。 -- [`trace_include_sensitive_data`][agents.run.RunConfig.trace_include_sensitive_data]: LLM やツール呼び出しの入出力など、機微なデータをトレースに含めるかどうかを設定します。 -- [`workflow_name`][agents.run.RunConfig.workflow_name], [`trace_id`][agents.run.RunConfig.trace_id], [`group_id`][agents.run.RunConfig.group_id]: 実行のトレーシングにおけるワークフロー名、トレース ID、トレース グループ ID を設定します。少なくとも `workflow_name` を設定することを推奨します。グループ ID は任意で、複数の実行にまたがるトレースを関連付けるのに使えます。 -- [`trace_metadata`][agents.run.RunConfig.trace_metadata]: すべてのトレースに含めるメタデータです。 +- [`trace_include_sensitive_data`][agents.run.RunConfig.trace_include_sensitive_data]: LLM やツール呼び出しの入出力など、機微なデータをトレースに含めるかを設定します。 +- [`workflow_name`][agents.run.RunConfig.workflow_name], [`trace_id`][agents.run.RunConfig.trace_id], [`group_id`][agents.run.RunConfig.group_id]: 実行のトレーシング ワークフロー名、トレース ID、トレース グループ ID を設定します。少なくとも `workflow_name` の設定を推奨します。グループ ID は任意で、複数の実行にまたがるトレースを関連付けられます。 +- [`trace_metadata`][agents.run.RunConfig.trace_metadata]: すべてのトレースに含めるメタデータ。 -## 会話/チャットスレッド +## 会話/チャットスレッド -任意の run メソッドの呼び出しは、1 つ以上のエージェント(したがって 1 回以上の LLM 呼び出し)の実行につながる場合がありますが、チャット会話における 1 回の論理的なターンを表します。例: +いずれかの run メソッドを呼び出すと 1 つ以上のエージェント(したがって 1 回以上の LLM 呼び出し)が実行される可能性がありますが、チャット会話の 1 つの論理ターンを表します。例: -1. ユーザー ターン: ユーザーがテキストを入力 -2. Runner の実行: 最初のエージェントが LLM を呼び出し、ツールを実行し、2 番目のエージェントにハンドオフし、2 番目のエージェントがさらにツールを実行してから出力を生成します。 +1. ユーザーのターン: ユーザーがテキストを入力 +2. Runner の実行: 最初のエージェントが LLM を呼び出し、ツールを実行し、2 番目のエージェントへハンドオフ、2 番目のエージェントがさらにツールを実行し、最終的に出力を生成。 -エージェント実行の最後に、ユーザーに何を表示するかを選べます。たとえば、エージェントが生成したすべての新しいアイテムをユーザーに表示する、または最終出力のみを表示する、などです。いずれにせよ、ユーザーがフォローアップの質問をするかもしれないので、その場合は再度 run メソッドを呼び出せます。 +エージェント実行の最後に、ユーザーに何を見せるかを選べます。例えば、エージェントが生成したすべての新規アイテムを見せることも、最終出力だけを見せることもできます。いずれにせよ、ユーザーが追質問をするかもしれないので、その場合は再度 run メソッドを呼び出します。 ### 手動の会話管理 -次のターンの入力を取得するために、[`RunResultBase.to_input_list()`][agents.result.RunResultBase.to_input_list] メソッドを使って会話履歴を手動で管理できます。 +[`RunResultBase.to_input_list()`][agents.result.RunResultBase.to_input_list] メソッドで次のターンの入力を取得し、会話履歴を手動で管理できます: ```python async def main(): @@ -93,7 +93,7 @@ async def main(): ### Sessions による自動会話管理 -より簡単な方法として、[Sessions](sessions.md) を使うと、`.to_input_list()` を手動で呼び出すことなく会話履歴を自動で扱えます。 +より簡単な方法として、[Sessions](sessions.md) を使えば、`.to_input_list()` を手動で呼び出さずに会話履歴を自動処理できます: ```python from agents import Agent, Runner, SQLiteSession @@ -117,26 +117,26 @@ async def main(): # California ``` -Sessions は自動で次を行います。 +Sessions は自動で次を行います: -- 各実行の前に会話履歴を取得 -- 各実行の後に新しいメッセージを保存 -- セッション ID ごとに別々の会話を維持 +- 各実行前に会話履歴を取得 +- 各実行後に新しいメッセージを保存 +- 異なるセッション ID ごとに個別の会話を維持 詳細は [Sessions のドキュメント](sessions.md) を参照してください。 -## 長時間実行エージェントとヒューマン・イン・ザ・ループ +## 長時間実行のエージェントと human-in-the-loop -Agents SDK の [Temporal](https://temporal.io/) 連携を使用すると、ヒューマン・イン・ザ・ループのタスクを含む、永続的で長時間実行のワークフローを実行できます。長時間実行タスクを完了するために Temporal と Agents SDK が連携して動作するデモは[この動画](https://www.youtube.com/watch?v=fFBZqzT4DD8)で確認でき、[こちらのドキュメント](https://github.com/temporalio/sdk-python/tree/main/temporalio/contrib/openai_agents)も参照してください。 +Agents SDK の [Temporal](https://temporal.io/) 連携を使うと、human-in-the-loop タスクを含む永続的で長時間実行のワークフローを動かせます。Temporal と Agents SDK が協調して長時間タスクを完了するデモは [この動画](https://www.youtube.com/watch?v=fFBZqzT4DD8) を参照し、[こちらのドキュメント](https://github.com/temporalio/sdk-python/tree/main/temporalio/contrib/openai_agents) もご覧ください。 ## 例外 -この SDK は、特定のケースで例外を送出します。完全な一覧は [`agents.exceptions`][] にあります。概要は次のとおりです。 +SDK は特定の場合に例外を送出します。完全な一覧は [`agents.exceptions`][] にあります。概要: -- [`AgentsException`][agents.exceptions.AgentsException]: SDK 内で送出されるすべての例外の基底クラスです。その他の特定の例外はすべて、この型から派生します。 -- [`MaxTurnsExceeded`][agents.exceptions.MaxTurnsExceeded]: `Runner.run`、`Runner.run_sync`、`Runner.run_streamed` メソッドに渡した `max_turns` の上限をエージェントの実行が超えたときに送出されます。これは、指定された対話ターン数内にエージェントがタスクを完了できなかったことを示します。 -- [`ModelBehaviorError`][agents.exceptions.ModelBehaviorError]: 基盤のモデル(LLM)が予期しない、または無効な出力を生成した場合に発生します。次を含みます。 - - 不正な JSON: 特定の `output_type` が定義されている場合に特に、ツール呼び出しや直接の出力でモデルが不正な JSON 構造を返したとき。 - - 予期しないツール関連の失敗: モデルが期待どおりの方法でツールを使用できなかったとき。 -- [`UserError`][agents.exceptions.UserError]: SDK を使用するあなた(この SDK を使ってコードを書く人)がエラーを起こしたときに送出されます。これは通常、誤ったコード実装、無効な設定、または SDK の API の誤用に起因します。 -- [`InputGuardrailTripwireTriggered`][agents.exceptions.InputGuardrailTripwireTriggered], [`OutputGuardrailTripwireTriggered`][agents.exceptions.OutputGuardrailTripwireTriggered]: それぞれ、入力ガードレールまたは出力ガードレールの条件が満たされたときに送出されます。入力ガードレールは処理前に受信メッセージを検査し、出力ガードレールは配信前にエージェントの最終応答を検査します。 \ No newline at end of file +- [`AgentsException`][agents.exceptions.AgentsException]: SDK 内で送出されるすべての例外の基底クラスです。他の特定の例外はここから派生します。 +- [`MaxTurnsExceeded`][agents.exceptions.MaxTurnsExceeded]: エージェントの実行が `Runner.run`、`Runner.run_sync`、`Runner.run_streamed` に渡した `max_turns` 上限を超えたときに送出されます。指定されたやり取り回数内にタスクを完了できなかったことを示します。 +- [`ModelBehaviorError`][agents.exceptions.ModelBehaviorError]: 基盤となるモデル (LLM) が予期しない、または無効な出力を生成した場合に発生します。例: + - 不正な JSON: 特定の `output_type` が定義されている場合に、ツール呼び出しや直接出力で不正な JSON 構造を返す。 + - 予期しないツール関連の失敗: モデルが期待どおりにツールを使用できない。 +- [`UserError`][agents.exceptions.UserError]: SDK を使用するあなた(SDK を使ってコードを書く人)が、誤った使い方をした場合に送出されます。誤ったコード実装、無効な設定、SDK の API の誤用が原因です。 +- [`InputGuardrailTripwireTriggered`][agents.exceptions.InputGuardrailTripwireTriggered], [`OutputGuardrailTripwireTriggered`][agents.exceptions.OutputGuardrailTripwireTriggered]: それぞれ入力ガードレールまたは出力ガードレールの条件に合致した際に送出されます。入力ガードレールは処理前の受信メッセージを、出力ガードレールはエージェントの最終応答を配信前にチェックします。 \ No newline at end of file diff --git a/docs/ja/sessions.md b/docs/ja/sessions.md index 16b6466fd..832709c67 100644 --- a/docs/ja/sessions.md +++ b/docs/ja/sessions.md @@ -4,9 +4,9 @@ search: --- # セッション -Agents SDK には、複数のエージェント実行にまたがって会話履歴を自動で維持するための組み込みセッションメモリがあり、ターン間で手動で `.to_input_list()` を扱う必要がなくなります。 +Agents SDK は、複数回のエージェント実行にわたって会話履歴を自動的に保持する組み込みのセッションメモリを提供し、ターン間で手動で `.to_input_list()` を扱う必要をなくします。 -セッションは特定のセッションの会話履歴を保存し、明示的な手動メモリ管理なしにエージェントがコンテキストを維持できるようにします。これは、エージェントに以前のやり取りを覚えさせたいチャットアプリケーションやマルチターンの会話の構築に特に有用です。 +Sessions は特定のセッションの会話履歴を保存し、明示的な手動メモリ管理なしにエージェントがコンテキストを保持できるようにします。これは、エージェントに過去のやり取りを記憶させたいチャットアプリケーションやマルチターンの会話を構築するのに特に有用です。 ## クイックスタート @@ -49,19 +49,19 @@ print(result.final_output) # "Approximately 39 million" ## 仕組み -セッションメモリが有効な場合: +セッションメモリを有効にすると: -1. **各実行の前**: ランナーが自動的にそのセッションの会話履歴を取得し、入力アイテムの先頭に追加します。 -2. **各実行の後**: 実行中に生成された新規アイテム(ユーザー入力、アシスタントの応答、ツール呼び出しなど)は、すべて自動的にセッションに保存されます。 -3. **コンテキストの保持**: 同じセッションでの以降の実行には完全な会話履歴が含まれ、エージェントはコンテキストを維持できます。 +1. **各実行の前**: ランナーがセッションの会話履歴を自動で取得し、入力アイテムの前に付加します。 +2. **各実行の後**: 実行中に生成されたすべての新しいアイテム(ユーザー入力、アシスタントの応答、ツール呼び出しなど)が自動的にセッションへ保存されます。 +3. **コンテキストの保持**: 同じセッションでの後続の実行には完全な会話履歴が含まれ、エージェントはコンテキストを維持できます。 -これにより、ターン間で `.to_input_list()` を手動で呼び出し、会話状態を管理する必要がなくなります。 +これにより、`.to_input_list()` を手動で呼び出したり、実行間で会話状態を管理したりする必要がなくなります。 ## メモリ操作 ### 基本操作 -セッションは会話履歴を管理するためにいくつかの操作をサポートします: +Sessions は、会話履歴を管理するためにいくつかの操作をサポートします: ```python from agents import SQLiteSession @@ -88,7 +88,7 @@ await session.clear_session() ### 修正のための pop_item の使用 -`pop_item` メソッドは、会話の最後のアイテムを取り消したり変更したりしたい場合に特に役立ちます: +`pop_item` メソッドは、会話の最後のアイテムを取り消したり、修正したりしたい場合に特に有用です: ```python from agents import Agent, Runner, SQLiteSession @@ -129,7 +129,7 @@ result = await Runner.run(agent, "Hello") ### OpenAI Conversations API メモリ [OpenAI Conversations API](https://platform.openai.com/docs/guides/conversational-agents/conversations-api) を使用して、 -独自のデータベースを管理せずに会話状態を永続化します。これは、会話履歴の保存にすでに OpenAI がホストするインフラストラクチャに依存している場合に便利です。 +独自のデータベースを管理せずに会話状態を永続化します。これは、会話履歴の保存に OpenAI がホストするインフラストラクチャにすでに依存している場合に役立ちます。 ```python from agents import OpenAIConversationsSession @@ -190,11 +190,11 @@ result2 = await Runner.run( ### SQLAlchemy ベースのセッション -より高度なユースケース向けに、SQLAlchemy ベースのセッションバックエンドを使用できます。これにより、セッションストレージに SQLAlchemy がサポートする任意のデータベース(PostgreSQL、MySQL、SQLite など)を使用できます。 +より高度なユースケースでは、SQLAlchemy ベースのセッションバックエンドを使用できます。これにより、セッションの保存に SQLAlchemy がサポートする任意のデータベース(PostgreSQL、MySQL、SQLite など)を使用できます。 -**例 1: インメモリ SQLite で `from_url` を使用** + **例 1: `from_url` を用いたインメモリ SQLite** -これは最も簡単な方法で、開発とテストに最適です。 +これは最も簡単な入門方法で、開発やテストに最適です。 ```python import asyncio @@ -215,9 +215,9 @@ if __name__ == "__main__": asyncio.run(main()) ``` -**例 2: 既存の SQLAlchemy エンジンを使用** + **例 2: 既存の SQLAlchemy エンジンを使用する** -本番アプリケーションでは、すでに SQLAlchemy の `AsyncEngine` インスタンスを持っていることが多いでしょう。これをそのままセッションに渡せます。 +本番アプリケーションでは、すでに SQLAlchemy の `AsyncEngine` インスタンスを持っていることが多いでしょう。これをセッションに直接渡せます。 ```python import asyncio @@ -248,7 +248,7 @@ if __name__ == "__main__": ## カスタムメモリ実装 -[`Session`][agents.memory.session.Session] プロトコルに準拠するクラスを作成して、独自のセッションメモリを実装できます: +[`Session`][agents.memory.session.Session] プロトコルに従うクラスを作成することで、独自のセッションメモリを実装できます: ```python from agents.memory.session import SessionABC @@ -295,19 +295,19 @@ result = await Runner.run( ### セッション ID の命名 -会話を整理しやすい、意味のあるセッション ID を使用します: +会話を整理しやすい意味のあるセッション ID を使用します: -- User ベース: `"user_12345"` -- スレッドベース: `"thread_abc123"` -- コンテキストベース: `"support_ticket_456"` +- ユーザー単位: `"user_12345"` +- スレッド単位: `"thread_abc123"` +- コンテキスト単位: `"support_ticket_456"` ### メモリの永続化 - 一時的な会話にはインメモリ SQLite(`SQLiteSession("session_id")`)を使用 - 永続的な会話にはファイルベースの SQLite(`SQLiteSession("session_id", "path/to/db.sqlite")`)を使用 -- 既存のデータベースを利用する本番システムには SQLAlchemy ベースのセッション(`SQLAlchemySession("session_id", engine=engine, create_tables=True)`)を使用 -- OpenAI がホストするストレージ(`OpenAIConversationsSession()`)を使用して、会話履歴を OpenAI Conversations API に保存することも可能 -- さらに高度なユースケース向けに、他の本番システム(Redis、Django など)用のカスタムセッションバックエンドの実装を検討 +- 既存のデータベースを SQLAlchemy がサポートする本番システムには SQLAlchemy ベースのセッション(`SQLAlchemySession("session_id", engine=engine, create_tables=True)`)を使用 +- OpenAI Conversations API に履歴を保存したい場合は OpenAI がホストするストレージ(`OpenAIConversationsSession()`)を使用 +- より高度なユースケースでは、他の本番システム(Redis、Django など)向けにカスタムセッションバックエンドの実装を検討 ### セッション管理 @@ -333,9 +333,9 @@ result2 = await Runner.run( ) ``` -## 完全なコード例 +## 完全な例 -セッションメモリの動作を示す完全なコード例です: +セッションメモリの動作を示す完全な例です: ```python import asyncio diff --git a/docs/ja/streaming.md b/docs/ja/streaming.md index 47f853667..fb92229b9 100644 --- a/docs/ja/streaming.md +++ b/docs/ja/streaming.md @@ -4,15 +4,15 @@ search: --- # ストリーミング -ストリーミングを使うと、エージェントの実行が進む間、その更新を購読できます。これはエンドユーザーに進行状況や部分的な応答を表示するのに役立ちます。 +ストリーミングを使うと、エージェントの実行の進行に応じた更新を購読できます。これは、エンドユーザーに進捗更新や部分的な返答を表示するのに役立ちます。 -ストリーミングするには、[`Runner.run_streamed()`][agents.run.Runner.run_streamed] を呼び出します。これは [`RunResultStreaming`][agents.result.RunResultStreaming] を返します。`result.stream_events()` を呼び出すと、以下で説明する [`StreamEvent`][agents.stream_events.StreamEvent] オブジェクトの非同期ストリームを取得できます。 +ストリーミングするには、[`Runner.run_streamed()`][agents.run.Runner.run_streamed] を呼び出すと、[`RunResultStreaming`][agents.result.RunResultStreaming] が得られます。`result.stream_events()` を呼ぶと、以下で説明する [`StreamEvent`][agents.stream_events.StreamEvent] オブジェクトの非同期ストリームが得られます。 ## raw レスポンスイベント -[`RawResponsesStreamEvent`][agents.stream_events.RawResponsesStreamEvent] は、LLM から直接渡される raw イベントです。これは OpenAI Responses API 形式であり、各イベントにはタイプ(`response.created`、`response.output_text.delta` など)とデータがあります。これらのイベントは、生成され次第、応答メッセージをユーザーにストリーミングしたい場合に便利です。 +[`RawResponsesStreamEvent`][agents.stream_events.RawResponsesStreamEvent] は、LLM から直接渡される raw なイベントです。OpenAI Responses API 形式であり、各イベントには種類(`response.created`、`response.output_text.delta` など)とデータがあります。これらのイベントは、生成され次第すぐにレスポンスメッセージをユーザーへストリーミングしたい場合に有用です。 -たとえば、次は LLM が生成したテキストをトークンごとに出力します。 +例えば、これは LLM が生成したテキストをトークンごとに出力します。 ```python import asyncio @@ -35,11 +35,11 @@ if __name__ == "__main__": asyncio.run(main()) ``` -## 実行アイテムイベントとエージェントイベント +## Run アイテムイベントと エージェントイベント -[`RunItemStreamEvent`][agents.stream_events.RunItemStreamEvent] は、より高レベルのイベントです。アイテムが完全に生成されたタイミングを通知します。これにより、各トークン単位ではなく、「メッセージが生成された」「ツールが実行された」といったレベルで進捗更新をプッシュできます。同様に、[`AgentUpdatedStreamEvent`][agents.stream_events.AgentUpdatedStreamEvent] は、現在のエージェントが変更されたとき(たとえばハンドオフの結果として)の更新を提供します。 +[`RunItemStreamEvent`][agents.stream_events.RunItemStreamEvent] は、より高レベルのイベントです。アイテムが完全に生成されたタイミングを通知します。これにより、各トークン単位ではなく、「メッセージが生成された」「ツールが実行された」といったレベルで進捗更新をプッシュできます。同様に、[`AgentUpdatedStreamEvent`][agents.stream_events.AgentUpdatedStreamEvent] は、現在のエージェントが変更されたとき(例: ハンドオフの結果として)の更新を提供します。 -たとえば、次は raw イベントを無視し、ユーザーに更新をストリーミングします。 +例えば、これは raw イベントを無視して、更新をユーザーにストリーミングします。 ```python import asyncio diff --git a/docs/ja/tools.md b/docs/ja/tools.md index 7eaaac171..b76059a7f 100644 --- a/docs/ja/tools.md +++ b/docs/ja/tools.md @@ -4,23 +4,23 @@ search: --- # ツール -ツールは エージェント にアクションを実行させます。たとえばデータの取得、コードの実行、外部 API の呼び出し、さらにはコンピュータの使用などです。Agent SDK には 3 つのツールのクラスがあります: +ツールは エージェント がアクションを実行できるようにします。データ取得、コード実行、外部 API 呼び出し、さらにはコンピュータ操作 まで行えます。Agents SDK には 3 つのツールクラスがあります: -- ホスト型ツール: これらは AI モデルと同じ LLM サーバー 上で動作します。OpenAI は リトリーバル、Web 検索、コンピュータ操作 をホスト型ツールとして提供します。 +- Hosted tools: これらは AI モデルと同じ LLM サーバー上で動作します。OpenAI は retrieval、Web 検索、コンピュータ操作 を hosted tools として提供しています。 - Function calling: 任意の Python 関数をツールとして使用できます。 -- ツールとしてのエージェント: エージェント をツールとして使用でき、ハンドオフ せずに他の エージェント を呼び出せます。 +- ツールとしての エージェント: エージェント をツールとして使用でき、ハンドオフ せずに他の エージェント を呼び出せます。 -## ホスト型ツール +## Hosted tools -OpenAI は [`OpenAIResponsesModel`][agents.models.openai_responses.OpenAIResponsesModel] を使用する場合に、いくつかの組み込みツールを提供します: +OpenAI は [`OpenAIResponsesModel`][agents.models.openai_responses.OpenAIResponsesModel] を使用する場合に、いくつかの組み込みツールを提供しています: - [`WebSearchTool`][agents.tool.WebSearchTool] は エージェント に Web を検索させます。 -- [`FileSearchTool`][agents.tool.FileSearchTool] は OpenAI の ベクトルストア から情報を取得できます。 -- [`ComputerTool`][agents.tool.ComputerTool] は コンピュータ操作 の自動化を可能にします。 -- [`CodeInterpreterTool`][agents.tool.CodeInterpreterTool] は LLM がサンドボックス環境でコードを実行できるようにします。 -- [`HostedMCPTool`][agents.tool.HostedMCPTool] はリモートの MCP サーバー のツールをモデルに公開します。 +- [`FileSearchTool`][agents.tool.FileSearchTool] は OpenAI の ベクトルストア から情報を検索できます。 +- [`ComputerTool`][agents.tool.ComputerTool] は コンピュータ操作 タスクを自動化します。 +- [`CodeInterpreterTool`][agents.tool.CodeInterpreterTool] は サンドボックス環境でコードを実行します。 +- [`HostedMCPTool`][agents.tool.HostedMCPTool] はリモートの MCP サーバーのツールをモデルに公開します。 - [`ImageGenerationTool`][agents.tool.ImageGenerationTool] はプロンプトから画像を生成します。 -- [`LocalShellTool`][agents.tool.LocalShellTool] はローカルマシン上でシェルコマンドを実行します。 +- [`LocalShellTool`][agents.tool.LocalShellTool] はローカルマシンでシェルコマンドを実行します。 ```python from agents import Agent, FileSearchTool, Runner, WebSearchTool @@ -43,14 +43,14 @@ async def main(): ## 関数ツール -任意の Python 関数をツールとして使用できます。Agents SDK が自動的にツールを設定します: +任意の Python 関数をツールとして使用できます。Agents SDK が自動でツールをセットアップします: -- ツール名は Python 関数名になります(または任意の名前を指定できます) -- ツールの説明は関数の docstring から取得します(または説明を指定できます) -- 関数入力のスキーマは、関数の引数から自動生成されます -- 各入力の説明は、無効化しない限り、関数の docstring から取得されます +- ツール名は Python 関数名になります(任意で名前を指定可能) +- ツールの説明は関数の docstring から取得します(任意で説明を指定可能) +- 関数入力のスキーマは関数の引数から自動生成されます +- 各入力の説明は、無効化しない限り、関数の docstring から取得します -Python の `inspect` モジュールで関数シグネチャを抽出し、[`griffe`](https://mkdocstrings.github.io/griffe/) で docstring を解析し、スキーマ作成には `pydantic` を使用します。 +Python の `inspect` モジュールで関数シグネチャを抽出し、[`griffe`](https://mkdocstrings.github.io/griffe/) で docstring を解析、スキーマ作成には `pydantic` を使用します。 ```python import json @@ -102,12 +102,12 @@ for tool in agent.tools: ``` -1. 関数の引数には任意の Python 型を使用でき、関数は同期・非同期どちらでも構いません。 -2. Docstring がある場合、説明および引数の説明の取得に使用します。 -3. 関数は任意で `context` を取れます(最初の引数である必要があります)。ツール名や説明、docstring スタイルなどのオーバーライドも設定できます。 -4. デコレートした関数をツールのリストに渡せます。 +1. 関数の引数には任意の Python 型を使用でき、同期/非同期のいずれでも構いません。 +2. docstring があれば、説明や引数の説明に使用します。 +3. 関数は任意で `context` を受け取れます(最初の引数である必要があります)。ツール名、説明、docstring スタイルなどの上書き設定も可能です。 +4. デコレートした関数をツールの一覧に渡せます。 -??? note "展開して出力を見る" +??? note "出力を表示" ``` fetch_weather @@ -179,7 +179,7 @@ for tool in agent.tools: ### カスタム関数ツール -Python 関数をツールとして使いたくない場合もあります。その場合は、直接 [`FunctionTool`][agents.tool.FunctionTool] を作成できます。以下を指定する必要があります: +Python 関数をツールとして使いたくない場合もあります。必要であれば直接 [`FunctionTool`][agents.tool.FunctionTool] を作成できます。以下を指定する必要があります: - `name` - `description` @@ -219,16 +219,16 @@ tool = FunctionTool( ### 引数と docstring の自動解析 -前述のとおり、ツールのスキーマを抽出するために関数シグネチャを自動解析し、ツールおよび個別の引数の説明を抽出するために docstring を解析します。注意点: +前述のとおり、ツールのスキーマ抽出のために関数シグネチャを自動解析し、ツールおよび各引数の説明抽出のために docstring を解析します。注意点: -1. シグネチャの解析は `inspect` モジュールで行います。型アノテーションから引数の型を理解し、全体のスキーマを表す Pydantic モデルを動的に構築します。Python の基本型、Pydantic モデル、TypedDicts など、ほとんどの型をサポートします。 -2. docstring の解析には `griffe` を使用します。サポートされている docstring 形式は `google`、`sphinx`、`numpy` です。docstring 形式は自動検出を試みますがベストエフォートであり、`function_tool` を呼び出す際に明示的に設定できます。`use_docstring_info` を `False` に設定して docstring 解析を無効化することも可能です。 +1. シグネチャ解析は `inspect` モジュールで行います。型アノテーションから引数の型を理解し、全体のスキーマを表す Pydantic モデルを動的に構築します。Python の基本型、Pydantic モデル、TypedDict などほとんどの型をサポートします。 +2. docstring の解析には `griffe` を使用します。サポートする docstring 形式は `google`、`sphinx`、`numpy` です。docstring 形式は自動検出を試みますがベストエフォートのため、`function_tool` 呼び出し時に明示指定できます。`use_docstring_info` を `False` にすると docstring 解析を無効化できます。 スキーマ抽出のコードは [`agents.function_schema`][] にあります。 ## ツールとしてのエージェント -一部のワークフローでは、制御をハンドオフ するのではなく、中央の エージェント が専門特化した エージェント 群のオーケストレーションを行いたい場合があります。エージェント をツールとしてモデリングすることで実現できます。 +一部のワークフローでは、ハンドオフ する代わりに、中央の エージェント が専門 エージェント 群のオーケストレーションを行いたい場合があります。これは エージェント をツールとしてモデル化することで実現できます。 ```python from agents import Agent, Runner @@ -269,7 +269,7 @@ async def main(): ### ツール化エージェントのカスタマイズ -`agent.as_tool` 関数は、エージェント を簡単にツール化するためのユーティリティです。ただし、すべての設定をサポートするわけではありません。たとえば `max_turns` は設定できません。高度なユースケースでは、ツール実装内で直接 `Runner.run` を使用してください: +`agent.as_tool` は エージェント をツールに変換するための簡便メソッドです。ただし、すべての設定をサポートするわけではありません。例えば `max_turns` は設定できません。高度なユースケースでは、ツール実装内で直接 `Runner.run` を使用してください: ```python @function_tool @@ -288,15 +288,15 @@ async def run_my_agent() -> str: return str(result.final_output) ``` -### カスタム出力抽出 +### 出力のカスタム抽出 -場合によっては、中央の エージェント に返す前に、ツール化した エージェント の出力を加工したいことがあります。たとえば次のような場合に有用です: +場合によっては、中央の エージェント に返す前にツール化した エージェント の出力を加工したいことがあります。例えば以下の用途に有用です: - サブエージェントのチャット履歴から特定の情報(例: JSON ペイロード)を抽出する。 -- エージェント の最終回答を変換または再整形する(例: Markdown をプレーンテキストや CSV に変換)。 -- 出力を検証したり、エージェント の応答が欠落・不正な場合にフォールバック値を提供する。 +- エージェントの最終回答を変換または再整形する(例: Markdown をプレーンテキストや CSV に変換)。 +- 出力を検証し、エージェントの応答が欠落または不正な場合にフォールバック値を提供する。 -これは `as_tool` メソッドに `custom_output_extractor` 引数を渡すことで実現できます: +これは、`as_tool` メソッドに `custom_output_extractor` 引数を渡すことで実現できます: ```python async def extract_json_payload(run_result: RunResult) -> str: @@ -315,9 +315,9 @@ json_tool = data_agent.as_tool( ) ``` -### 条件付きツール有効化 +### 条件付きのツール有効化 -実行時に `is_enabled` パラメーター を使用して エージェント ツールを条件付きで有効化または無効化できます。これにより、コンテキスト、ユーザー の設定、実行時条件に基づいて LLM に提供するツールを動的にフィルタリングできます。 +`is_enabled` パラメーターを使って、実行時に エージェント ツールを条件付きで有効化/無効化できます。これにより、コンテキスト、ユーザー の嗜好、実行時の条件に基づいて、LLM に提供するツールを動的にフィルタリングできます。 ```python import asyncio @@ -372,24 +372,24 @@ async def main(): asyncio.run(main()) ``` -`is_enabled` パラメーター は次を受け付けます: -- **Boolean 値**: `True`(常に有効)または `False`(常に無効) -- **Callable 関数**: `(context, agent)` を受け取り boolean を返す関数 -- **Async 関数**: 複雑な条件ロジック向けの非同期関数 +`is_enabled` パラメーターは次を受け付けます: +- **ブール値**: `True`(常に有効)または `False`(常に無効) +- **呼び出し可能関数**: `(context, agent)` を取り、真偽値を返す関数 +- **非同期関数**: 複雑な条件ロジック向けの async 関数 -無効化されたツールは実行時に LLM から完全に隠されるため、次の用途に有用です: +無効化されたツールは実行時に LLM から完全に隠されるため、次の用途に便利です: - ユーザー 権限に基づく機能ゲーティング -- 環境別のツール可用性(開発 vs 本番) +- 環境別のツール可用性(dev と prod) - 異なるツール構成の A/B テスト - 実行時状態に基づく動的ツールフィルタリング -## 関数ツールにおけるエラー処理 +## 関数ツールでのエラー処理 -`@function_tool` で関数ツールを作成する際、`failure_error_function` を渡せます。これは、ツール呼び出しがクラッシュした場合に LLM へエラーレスポンスを提供する関数です。 +`@function_tool` で関数ツールを作成する際、`failure_error_function` を渡せます。これは、ツール呼び出しがクラッシュした場合に LLM へ返すエラー応答を提供する関数です。 -- 既定(何も渡さない)では、エラー発生を LLM に伝える `default_tool_error_function` が実行されます。 -- 独自のエラー関数を渡した場合はそれが実行され、そのレスポンスが LLM に送信されます。 -- 明示的に `None` を渡すと、ツール呼び出しのエラーは再スローされ、呼び出し側で処理できます。モデルが不正な JSON を生成した場合の `ModelBehaviorError` や、コードがクラッシュした場合の `UserError` などが該当します。 +- 既定では(何も渡さない場合)、エラーが発生したことを LLM に伝える `default_tool_error_function` が実行されます。 +- 独自のエラー関数を渡した場合は、それが実行され、その応答が LLM に送信されます。 +- 明示的に `None` を渡すと、ツール呼び出しのエラーは再スローされ、呼び出し元で処理できます。モデルが不正な JSON を生成した場合は `ModelBehaviorError`、コードがクラッシュした場合は `UserError` などになり得ます。 ```python from agents import function_tool, RunContextWrapper diff --git a/docs/ja/tracing.md b/docs/ja/tracing.md index 17fb42f30..a876a5c1c 100644 --- a/docs/ja/tracing.md +++ b/docs/ja/tracing.md @@ -4,52 +4,52 @@ search: --- # トレーシング -Agents SDK にはトレーシングが組み込まれており、エージェントの実行中に発生するイベントの包括的な記録( LLM の生成、ツール呼び出し、ハンドオフ、ガードレール、カスタムイベントまで)を収集します。 [Traces ダッシュボード](https://platform.openai.com/traces) を使うと、開発中や本番環境でワークフローをデバッグ、可視化、監視できます。 +Agents SDK にはトレーシングが組み込まれており、エージェントの実行中に発生するイベントの包括的な記録( LLM の生成、ツール呼び出し、ハンドオフ、ガードレール、さらにはカスタム イベント)を収集します。[Traces ダッシュボード](https://platform.openai.com/traces)を使って、開発中および本番環境でワークフローをデバッグ、可視化、監視できます。 !!!note - トレーシングは既定で有効です。トレーシングを無効化する方法は 2 つあります。 + トレーシングはデフォルトで有効です。無効化する方法は 2 つあります: - 1. 環境変数 `OPENAI_AGENTS_DISABLE_TRACING=1` を設定して、グローバルにトレーシングを無効化できます - 2. 1 回の実行のみ無効化するには、[`agents.run.RunConfig.tracing_disabled`][] を `True` に設定します + 1. 環境変数 `OPENAI_AGENTS_DISABLE_TRACING=1` を設定して、トレーシングをグローバルに無効化できます + 2. 単一の実行でトレーシングを無効化するには、[`agents.run.RunConfig.tracing_disabled`][] を `True` に設定します -***OpenAI の APIs を使用し Zero Data Retention (ZDR) ポリシーで運用している組織では、トレーシングは利用できません。*** +***OpenAI の API を使用し Zero Data Retention (ZDR) ポリシーの下で運用している組織では、トレーシングは利用できません。*** ## トレースとスパン -- **トレース (Traces)** は「ワークフロー」の単一のエンドツーエンドの処理を表します。スパンで構成されます。トレースには次のプロパティがあります: - - `workflow_name`: 論理的なワークフローまたはアプリです。例: "Code generation" や "Customer service" - - `trace_id`: トレースの一意の ID。指定しない場合は自動生成されます。形式は `trace_<32_alphanumeric>` である必要があります。 - - `group_id`: 省略可能なグループ ID。同じ会話からの複数のトレースを関連付けます。たとえばチャットスレッド ID などが使えます。 - - `disabled`: True の場合、このトレースは記録されません。 - - `metadata`: トレースの任意のメタデータ。 -- **スパン (Spans)** は開始時刻と終了時刻を持つ処理を表します。スパンには次が含まれます: - - `started_at` と `ended_at` のタイムスタンプ - - 所属するトレースを示す `trace_id` - - このスパンの親スパン(ある場合)を指す `parent_id` - - スパンに関する情報である `span_data`。たとえば、`AgentSpanData` はエージェントに関する情報を、`GenerationSpanData` は LLM 生成に関する情報を含みます。 +- **トレース** は「ワークフロー」の単一のエンドツーエンド操作を表します。スパンで構成されます。トレースには次のプロパティがあります: + - `workflow_name`: 論理的なワークフローまたはアプリです。例: "Code generation" や "Customer service" + - `trace_id`: トレースの一意の ID。指定しない場合は自動生成されます。形式は `trace_<32_alphanumeric>` である必要があります。 + - `group_id`: 同じ会話からの複数のトレースを関連付けるための任意のグループ ID。たとえばチャット スレッド ID など。 + - `disabled`: True の場合、このトレースは記録されません。 + - `metadata`: トレースの任意のメタデータ。 +- **スパン** は開始時刻と終了時刻を持つ操作を表します。スパンには次の情報があります: + - `started_at` と `ended_at` のタイムスタンプ + - 所属するトレースを表す `trace_id` + - このスパンの親スパン(ある場合)を指す `parent_id` + - スパンに関する情報である `span_data`。たとえば、`AgentSpanData` はエージェントに関する情報、`GenerationSpanData` は LLM 生成に関する情報などを含みます。 -## 既定のトレーシング +## デフォルトのトレーシング -既定では、 SDK は次をトレースします: +デフォルトでは、 SDK は次をトレースします: -- `Runner.{run, run_sync, run_streamed}()` 全体は `trace()` でラップされます -- エージェントが実行されるたびに `agent_span()` でラップされます -- LLM の生成は `generation_span()` でラップされます -- 関数ツールの呼び出しはそれぞれ `function_span()` でラップされます -- ガードレールは `guardrail_span()` でラップされます -- ハンドオフは `handoff_span()` でラップされます -- 音声入力(音声認識)は `transcription_span()` でラップされます -- 音声出力(音声合成)は `speech_span()` でラップされます -- 関連する音声スパンは `speech_group_span()` の子になる場合があります +- 全体の `Runner.{run, run_sync, run_streamed}()` は `trace()` でラップされます。 +- エージェントが実行されるたびに、`agent_span()` でラップされます +- LLM の生成は `generation_span()` でラップされます +- 関数ツールの呼び出しはそれぞれ `function_span()` でラップされます +- ガードレールは `guardrail_span()` でラップされます +- ハンドオフは `handoff_span()` でラップされます +- 音声入力(音声認識)は `transcription_span()` でラップされます +- 音声出力(音声合成)は `speech_span()` でラップされます +- 関連する音声スパンは `speech_group_span()` の下に親子付けされる場合があります -既定では、トレース名は "Agent workflow" です。`trace` を使う場合はこの名前を設定できますし、[`RunConfig`][agents.run.RunConfig] で名前やその他のプロパティを設定することもできます。 +デフォルトでは、トレース名は "Agent workflow" です。`trace` を使用する場合はこの名前を設定できますし、[`RunConfig`][agents.run.RunConfig] で名前やその他のプロパティを構成することもできます。 -さらに、[カスタムトレース プロセッサー](#custom-tracing-processors) をセットアップして、他の宛先へトレースを送信できます(置き換え、またはセカンダリ宛先として)。 +加えて、[カスタム トレース プロセッサー](#custom-tracing-processors) を設定して、トレースを他の送信先に送る(置き換え、または副次的な送信先として)ことができます。 ## より高レベルのトレース -`run()` への複数回の呼び出しを 1 つのトレースにまとめたい場合があります。これには、コード全体を `trace()` でラップします。 +複数回の `run()` 呼び出しを単一のトレースの一部にしたい場合があります。その場合は、コード全体を `trace()` でラップします。 ```python from agents import Agent, Runner, trace @@ -64,46 +64,46 @@ async def main(): print(f"Rating: {second_result.final_output}") ``` -1. `with trace()` 内に 2 回の `Runner.run` 呼び出しを入れているため、個々の実行は 2 つのトレースを作成するのではなく、全体のトレースの一部になります。 +1. `Runner.run` の 2 回の呼び出しが `with trace()` でラップされているため、個々の実行は 2 つのトレースを作成するのではなく、全体のトレースの一部になります。 ## トレースの作成 -[`trace()`][agents.tracing.trace] 関数でトレースを作成できます。トレースは開始と終了が必要です。方法は 2 つあります: +[`trace()`][agents.tracing.trace] 関数を使ってトレースを作成できます。トレースは開始と終了が必要です。方法は 2 つあります: -1. 推奨: トレースをコンテキストマネージャとして使用します(例: `with trace(...) as my_trace`)。これにより適切なタイミングで自動的に開始・終了します。 +1. 推奨: トレースをコンテキストマネージャとして使用します(例: `with trace(...) as my_trace`)。これにより、適切なタイミングで自動的にトレースが開始・終了します。 2. [`trace.start()`][agents.tracing.Trace.start] と [`trace.finish()`][agents.tracing.Trace.finish] を手動で呼び出すこともできます。 -現在のトレースは Python の [`contextvar`](https://docs.python.org/3/library/contextvars.html) を通じて追跡されます。これは自動的に並行処理で機能することを意味します。トレースを手動で開始/終了する場合は、現在のトレースを更新するために `start()`/`finish()` に `mark_as_current` と `reset_current` を渡す必要があります。 +現在のトレースは Python の [`contextvar`](https://docs.python.org/3/library/contextvars.html) によって追跡されます。これにより、自動的に並行処理で機能します。トレースを手動で開始/終了する場合、現在のトレースを更新するために `start()`/`finish()` に `mark_as_current` および `reset_current` を渡す必要があります。 ## スパンの作成 -さまざまな [`*_span()`][agents.tracing.create] メソッドでスパンを作成できます。一般には、スパンを手動で作成する必要はありません。カスタムのスパン情報を追跡するために [`custom_span()`][agents.tracing.custom_span] 関数も利用できます。 +さまざまな [`*_span()`][agents.tracing.create] メソッドでスパンを作成できます。一般に、スパンを手動で作成する必要はありません。カスタムのスパン情報を追跡するために [`custom_span()`][agents.tracing.custom_span] 関数を使用できます。 -スパンは自動的に現在のトレースの一部になり、最も近い現在のスパンの下にネストされます。これは Python の [`contextvar`](https://docs.python.org/3/library/contextvars.html) によって追跡されます。 +スパンは自動的に現在のトレースの一部になり、Python の [`contextvar`](https://docs.python.org/3/library/contextvars.html) で追跡される直近の現在スパンの下にネストされます。 ## 機微なデータ -一部のスパンは機微なデータを取得する可能性があります。 +一部のスパンは、機微なデータを取得する可能性があります。 -`generation_span()` は LLM 生成の入力/出力を保存し、`function_span()` は関数呼び出しの入力/出力を保存します。これらに機微なデータが含まれる可能性があるため、[`RunConfig.trace_include_sensitive_data`][agents.run.RunConfig.trace_include_sensitive_data] によって、そのデータの取得を無効化できます。 +`generation_span()` は LLM 生成の入力/出力を保存し、`function_span()` は関数呼び出しの入力/出力を保存します。これらには機微なデータが含まれる場合があるため、[`RunConfig.trace_include_sensitive_data`][agents.run.RunConfig.trace_include_sensitive_data] でそのデータの取得を無効化できます。 -同様に、音声スパンは既定で入力および出力音声の base64 エンコードの PCM データを含みます。[`VoicePipelineConfig.trace_include_sensitive_audio_data`][agents.voice.pipeline_config.VoicePipelineConfig.trace_include_sensitive_audio_data] を設定して、この音声データの取得を無効化できます。 +同様に、音声スパンには既定で入出力音声の base64 エンコードされた PCM データが含まれます。[`VoicePipelineConfig.trace_include_sensitive_audio_data`][agents.voice.pipeline_config.VoicePipelineConfig.trace_include_sensitive_audio_data] を構成して、この音声データの取得を無効化できます。 -## カスタムトレーシング プロセッサー +## カスタム トレーシング プロセッサー -トレーシングの高レベルなアーキテクチャは次のとおりです: +トレーシングの高レベル アーキテクチャは次のとおりです: -- 初期化時に、トレース作成を担うグローバルな [`TraceProvider`][agents.tracing.setup.TraceProvider] を作成します。 -- `TraceProvider` は [`BatchTraceProcessor`][agents.tracing.processors.BatchTraceProcessor] で構成され、トレース/スパンをバッチで [`BackendSpanExporter`][agents.tracing.processors.BackendSpanExporter] に送信します。エクスポーターはスパンとトレースを OpenAI バックエンドへバッチでエクスポートします。 +- 初期化時に、トレースの作成を担うグローバルな [`TraceProvider`][agents.tracing.setup.TraceProvider] を作成します。 +- `TraceProvider` に、トレース/スパンをバッチで [`BackendSpanExporter`][agents.tracing.processors.BackendSpanExporter] に送信する [`BatchTraceProcessor`][agents.tracing.processors.BatchTraceProcessor] を構成します。`BackendSpanExporter` は OpenAI のバックエンドへスパンとトレースをバッチでエクスポートします。 -既定のセットアップをカスタマイズして、代替または追加のバックエンドにトレースを送る、あるいはエクスポーターの動作を変更するには、次の 2 つの方法があります: +このデフォルト構成をカスタマイズして、別のバックエンドへの送信や追加のバックエンドへの送信、エクスポーターの動作変更を行うには、次の 2 つの方法があります: -1. [`add_trace_processor()`][agents.tracing.add_trace_processor] は、トレースやスパンが用意でき次第それらを受け取る「追加の」トレースプロセッサーを追加できます。これにより、 OpenAI のバックエンドへ送信するのに加えて独自の処理も実行できます。 -2. [`set_trace_processors()`][agents.tracing.set_trace_processors] は、既定のプロセッサーを独自のトレースプロセッサーで「置き換え」られます。OpenAI バックエンドへトレースを送信するには、その役割を果たす `TracingProcessor` を含める必要があります。 +1. [`add_trace_processor()`][agents.tracing.add_trace_processor] は、トレースやスパンが準備でき次第受け取る「追加の」トレース プロセッサーを追加できます。これにより、OpenAI のバックエンドへの送信に加えて独自の処理を実行できます。 +2. [`set_trace_processors()`][agents.tracing.set_trace_processors] は、デフォルトのプロセッサーを独自のトレース プロセッサーに「置き換える」ことができます。OpenAI のバックエンドにトレースが送信されるのは、その役割を担う `TracingProcessor` を含めた場合に限られます。 -## 非 OpenAI モデルでのトレーシング +## OpenAI 以外のモデルでのトレーシング -OpenAI の API キーを非 OpenAI モデルで使用して、トレーシングを無効化することなく OpenAI Traces ダッシュボードで無料のトレーシングを有効にできます。 +OpenAI の API キーを、OpenAI 以外のモデルと一緒に使用して、トレーシングを無効化することなく OpenAI Traces ダッシュボードで無料のトレーシングを有効化できます。 ```python import os @@ -124,28 +124,28 @@ agent = Agent( ) ``` -## メモ -- 無料のトレースは Openai Traces ダッシュボードで閲覧できます。 +## 注意 +- 無料のトレースは Openai Traces ダッシュボードで表示できます。 ## 外部トレーシング プロセッサー一覧 -- [Weights & Biases](https://weave-docs.wandb.ai/guides/integrations/openai_agents) -- [Arize-Phoenix](https://docs.arize.com/phoenix/tracing/integrations-tracing/openai-agents-sdk) -- [Future AGI](https://docs.futureagi.com/future-agi/products/observability/auto-instrumentation/openai_agents) -- [MLflow (self-hosted/OSS](https://mlflow.org/docs/latest/tracing/integrations/openai-agent) -- [MLflow (Databricks hosted](https://docs.databricks.com/aws/en/mlflow/mlflow-tracing#-automatic-tracing) -- [Braintrust](https://braintrust.dev/docs/guides/traces/integrations#openai-agents-sdk) -- [Pydantic Logfire](https://logfire.pydantic.dev/docs/integrations/llms/openai/#openai-agents) -- [AgentOps](https://docs.agentops.ai/v1/integrations/agentssdk) -- [Scorecard](https://docs.scorecard.io/docs/documentation/features/tracing#openai-agents-sdk-integration) -- [Keywords AI](https://docs.keywordsai.co/integration/development-frameworks/openai-agent) -- [LangSmith](https://docs.smith.langchain.com/observability/how_to_guides/trace_with_openai_agents_sdk) -- [Maxim AI](https://www.getmaxim.ai/docs/observe/integrations/openai-agents-sdk) -- [Comet Opik](https://www.comet.com/docs/opik/tracing/integrations/openai_agents) -- [Langfuse](https://langfuse.com/docs/integrations/openaiagentssdk/openai-agents) -- [Langtrace](https://docs.langtrace.ai/supported-integrations/llm-frameworks/openai-agents-sdk) -- [Okahu-Monocle](https://github.com/monocle2ai/monocle) -- [Galileo](https://v2docs.galileo.ai/integrations/openai-agent-integration#openai-agent-integration) -- [Portkey AI](https://portkey.ai/docs/integrations/agents/openai-agents) -- [LangDB AI](https://docs.langdb.ai/getting-started/working-with-agent-frameworks/working-with-openai-agents-sdk) -- [Agenta](https://docs.agenta.ai/observability/integrations/openai-agents) \ No newline at end of file +- [Weights & Biases](https://weave-docs.wandb.ai/guides/integrations/openai_agents) +- [Arize-Phoenix](https://docs.arize.com/phoenix/tracing/integrations-tracing/openai-agents-sdk) +- [Future AGI](https://docs.futureagi.com/future-agi/products/observability/auto-instrumentation/openai_agents) +- [MLflow (self-hosted/OSS](https://mlflow.org/docs/latest/tracing/integrations/openai-agent) +- [MLflow (Databricks hosted](https://docs.databricks.com/aws/en/mlflow/mlflow-tracing#-automatic-tracing) +- [Braintrust](https://braintrust.dev/docs/guides/traces/integrations#openai-agents-sdk) +- [Pydantic Logfire](https://logfire.pydantic.dev/docs/integrations/llms/openai/#openai-agents) +- [AgentOps](https://docs.agentops.ai/v1/integrations/agentssdk) +- [Scorecard](https://docs.scorecard.io/docs/documentation/features/tracing#openai-agents-sdk-integration) +- [Keywords AI](https://docs.keywordsai.co/integration/development-frameworks/openai-agent) +- [LangSmith](https://docs.smith.langchain.com/observability/how_to_guides/trace_with_openai_agents_sdk) +- [Maxim AI](https://www.getmaxim.ai/docs/observe/integrations/openai-agents-sdk) +- [Comet Opik](https://www.comet.com/docs/opik/tracing/integrations/openai_agents) +- [Langfuse](https://langfuse.com/docs/integrations/openaiagentssdk/openai-agents) +- [Langtrace](https://docs.langtrace.ai/supported-integrations/llm-frameworks/openai-agents-sdk) +- [Okahu-Monocle](https://github.com/monocle2ai/monocle) +- [Galileo](https://v2docs.galileo.ai/integrations/openai-agent-integration#openai-agent-integration) +- [Portkey AI](https://portkey.ai/docs/integrations/agents/openai-agents) +- [LangDB AI](https://docs.langdb.ai/getting-started/working-with-agent-frameworks/working-with-openai-agents-sdk) +- [Agenta](https://docs.agenta.ai/observability/integrations/openai-agents) \ No newline at end of file diff --git a/docs/ja/usage.md b/docs/ja/usage.md index 509ae2f1b..67fce12e8 100644 --- a/docs/ja/usage.md +++ b/docs/ja/usage.md @@ -2,23 +2,23 @@ search: exclude: true --- -# 使用状況 +# 使用量 -Agents SDK は各実行ごとにトークン使用状況を自動追跡します。実行コンテキストから参照でき、コストの監視、制限の適用、分析の記録に利用できます。 +Agents SDK は各実行ごとにトークン使用量を自動で追跡します。実行コンテキストから参照でき、コストの監視、制限の適用、アナリティクスの記録に利用できます。 ## 追跡対象 -- **requests** : 実行された LLM API 呼び出し数 -- **input_tokens** : 送信された入力トークン総数 -- **output_tokens** : 受信した出力トークン総数 -- **total_tokens** : 入力 + 出力 -- **details** : +- **requests**: 実行した LLM API コール数 +- **input_tokens**: 送信した入力トークン合計 +- **output_tokens**: 受信した出力トークン合計 +- **total_tokens**: 入力 + 出力 +- **details**: - `input_tokens_details.cached_tokens` - `output_tokens_details.reasoning_tokens` -## 実行からの使用状況へのアクセス +## 実行からの使用量の取得 -`Runner.run(...)` の後、`result.context_wrapper.usage` から使用状況を参照します。 +`Runner.run(...)` 実行後、`result.context_wrapper.usage` から使用量にアクセスできます。 ```python result = await Runner.run(agent, "What's the weather in Tokyo?") @@ -30,11 +30,11 @@ print("Output tokens:", usage.output_tokens) print("Total tokens:", usage.total_tokens) ``` -使用状況は実行中のすべてのモデル呼び出し(ツール呼び出しやハンドオフを含む)にわたって集計されます。 +使用量は実行中のすべてのモデル呼び出し(ツール呼び出しやハンドオフを含む)にわたって集計されます。 -## セッションでの使用状況へのアクセス +## セッションでの使用量の取得 -`Session`(例: `SQLiteSession`)を使用する場合、`Runner.run(...)` の各呼び出しは、その特定の実行に対する使用状況を返します。セッションはコンテキスト用に会話履歴を保持しますが、各実行の使用状況は独立しています。 +`Session`(例: `SQLiteSession`)を使用する場合、`Runner.run(...)` への各呼び出しは、その特定の実行の使用量を返します。セッションはコンテキスト用に会話履歴を保持しますが、各実行の使用量は独立しています。 ```python session = SQLiteSession("my_conversation") @@ -46,11 +46,11 @@ second = await Runner.run(agent, "Can you elaborate?", session=session) print(second.context_wrapper.usage.total_tokens) # Usage for second run ``` -セッションは実行間で会話コンテキストを保持しますが、各 `Runner.run()` 呼び出しで返される使用状況の指標は、その実行に限られます。セッションでは、前のメッセージが各実行の入力として再投入される場合があり、その結果、後続ターンの入力トークン数に影響します。 +セッションは実行間で会話コンテキストを保持しますが、各 `Runner.run()` 呼び出しで返される使用量メトリクスは、その実行の結果のみを表します。セッションでは、以前のメッセージが各実行の入力として再投入される場合があり、その後のターンの入力トークン数に影響します。 -## フックでの使用状況の利用 +## フックでの使用量の活用 -`RunHooks` を使用している場合、各フックに渡される `context` オブジェクトに `usage` が含まれます。これにより、重要なライフサイクル時点で使用状況を記録できます。 +`RunHooks` を使用している場合、各フックに渡される `context` オブジェクトには `usage` が含まれます。これにより、重要なライフサイクル時点で使用量を記録できます。 ```python class MyHooks(RunHooks): @@ -61,8 +61,8 @@ class MyHooks(RunHooks): ## API リファレンス -詳細な API ドキュメントは以下を参照してください。 +詳細な API ドキュメントは次を参照してください: -- [`Usage`][agents.usage.Usage] - 使用状況の追跡データ構造 -- [`RunContextWrapper`][agents.run.RunContextWrapper] - 実行コンテキストから使用状況にアクセス -- [`RunHooks`][agents.run.RunHooks] - 使用状況トラッキングのライフサイクルにフック \ No newline at end of file +- [`Usage`][agents.usage.Usage] - 使用量追跡のデータ構造 +- [`RunContextWrapper`][agents.run.RunContextWrapper] - 実行コンテキストから使用量へアクセス +- [`RunHooks`][agents.run.RunHooks] - 使用量追跡ライフサイクルへのフック \ No newline at end of file diff --git a/docs/ja/visualization.md b/docs/ja/visualization.md index 76ec80429..2ada782a3 100644 --- a/docs/ja/visualization.md +++ b/docs/ja/visualization.md @@ -4,7 +4,7 @@ search: --- # エージェントの可視化 -エージェントの可視化では、 **Graphviz** を使用してエージェントとその関係を構造化したグラフィカル表現として生成できます。これは、アプリケーション内でエージェント、ツール、ハンドオフがどのように相互作用するかを理解するのに役立ちます。 +エージェントの可視化では、 **Graphviz** を使用して、エージェントとその関係の構造化されたグラフィカル表現を生成できます。これは、アプリケーション内でエージェント、ツール、ハンドオフがどのように相互作用するかを理解するのに役立ちます。 ## インストール @@ -18,10 +18,10 @@ pip install "openai-agents[viz]" `draw_graph` 関数を使用してエージェントの可視化を生成できます。この関数は次のような有向グラフを作成します: -- **エージェント** は黄色のボックスで表されます。 -- **MCP サーバー** は灰色のボックスで表されます。 -- **ツール** は緑の楕円で表されます。 -- **ハンドオフ** は、あるエージェントから別のエージェントへの有向エッジで表されます。 +- **エージェント** は黄色のボックスとして表されます。 +- **MCP サーバー** は灰色のボックスとして表されます。 +- **ツール** は緑色の楕円として表されます。 +- **ハンドオフ** は、あるエージェントから別のエージェントへの有向エッジです。 ### 使用例 @@ -69,37 +69,36 @@ draw_graph(triage_agent) ![Agent Graph](../assets/images/graph.png) -これは、 **triage エージェント** と、そのサブエージェントやツールへの接続の構造を視覚的に表すグラフを生成します。 +これは、 **トリアージ エージェント** と、そのサブエージェントやツールへの接続の構造を視覚的に表すグラフを生成します。 ## 可視化の理解 -生成されたグラフには以下が含まれます: +生成されるグラフには次が含まれます: -- エントリーポイントを示す **開始ノード** (`__start__`) -- 黄色で塗りつぶされた **長方形** で表されるエージェント -- 緑で塗りつぶされた **楕円** で表されるツール -- 灰色で塗りつぶされた **長方形** で表される MCP サーバー -- 相互作用を示す有向エッジ: - - エージェント間のハンドオフには **実線の矢印** - - ツール呼び出しには **点線の矢印** - - MCP サーバー呼び出しには **破線の矢印** -- 実行が終了する場所を示す **終了ノード** (`__end__`) +- エントリーポイントを示す **開始ノード** (`__start__`)。 +- 黄色で塗りつぶされた **長方形** として表されるエージェント。 +- 緑色で塗りつぶされた **楕円** として表されるツール。 +- 灰色で塗りつぶされた **長方形** として表される MCP サーバー。 +- 相互作用を示す有向エッジ: + - エージェント間のハンドオフには **実線の矢印**。 + - ツール呼び出しには **点線の矢印**。 + - MCP サーバー呼び出しには **破線の矢印**。 +- 実行が終了する場所を示す **終了ノード** (`__end__`)。 -**注:** MCP サーバーは、最近のバージョンの -`agents` パッケージ( **v0.2.8** で検証済み)でレンダリングされます。可視化に MCP のボックスが表示されない場合は、最新リリースにアップグレードしてください。 +**注:** MCP サーバーは、最近の `agents` パッケージのバージョンで描画されます( **v0.2.8** で確認済み)。可視化に MCP のボックスが表示されない場合は、最新リリースにアップグレードしてください。 ## グラフのカスタマイズ ### グラフの表示 -デフォルトでは、`draw_graph` はグラフをインライン表示します。別ウィンドウで表示するには、次のように記述します: +既定では、`draw_graph` はグラフをインライン表示します。別ウィンドウで表示するには、次のように記述します: ```python draw_graph(triage_agent).view() ``` ### グラフの保存 -デフォルトでは、`draw_graph` はグラフをインライン表示します。ファイルとして保存するには、ファイル名を指定します: +既定では、`draw_graph` はグラフをインライン表示します。ファイルとして保存するには、ファイル名を指定します: ```python draw_graph(triage_agent, filename="agent_graph") diff --git a/docs/ja/voice/pipeline.md b/docs/ja/voice/pipeline.md index b9aacd9a9..44c91d018 100644 --- a/docs/ja/voice/pipeline.md +++ b/docs/ja/voice/pipeline.md @@ -4,7 +4,7 @@ search: --- # パイプラインとワークフロー -[`VoicePipeline`][agents.voice.pipeline.VoicePipeline] は、エージェント ワークフローを音声アプリに簡単に変換できるクラスです。実行するワークフローを渡すと、パイプラインが入力音声の文字起こし、音声の終了検出、適切なタイミングでのワークフロー呼び出し、そしてワークフロー出力を音声へ戻す処理まで面倒を見ます。 +[`VoicePipeline`][agents.voice.pipeline.VoicePipeline] は、エージェント型ワークフローを音声アプリに簡単に変換できるクラスです。ワークフローを渡すと、パイプラインが入力音声の文字起こし、音声終了の検出、適切なタイミングでのワークフロー呼び出し、ワークフロー出力の音声化までを担います。 ```mermaid graph LR @@ -34,29 +34,29 @@ graph LR ## パイプラインの設定 -パイプラインを作成するとき、次の項目を設定できます: +パイプラインを作成する際に、次の項目を設定できます。 -1. 新しい音声が文字起こしされるたびに実行されるコードである [`workflow`][agents.voice.workflow.VoiceWorkflowBase] -2. 使用する [`speech-to-text`][agents.voice.model.STTModel] と [`text-to-speech`][agents.voice.model.TTSModel] のモデル -3. 次のような項目を設定できる [`config`][agents.voice.pipeline_config.VoicePipelineConfig] - - モデル名をモデルにマッピングできるモデルプロバイダー - - トレーシング(トレーシングの無効化、音声ファイルのアップロード有無、ワークフロー名、トレース ID など) - - プロンプト、言語、使用するデータ型など、TTS と STT モデルの設定 +1. [`workflow`][agents.voice.workflow.VoiceWorkflowBase]: 新しい音声が文字起こしされるたびに実行されるコード +2. 使用する [`speech-to-text`][agents.voice.model.STTModel] および [`text-to-speech`][agents.voice.model.TTSModel] モデル +3. [`config`][agents.voice.pipeline_config.VoicePipelineConfig]: 次のような設定が可能です + - モデルプロバイダー(モデル名をモデルにマッピングできます) + - トレーシング(トレーシングの無効化、音声ファイルのアップロード可否、ワークフロー名、トレース ID など) + - TTS および STT モデルの設定(プロンプト、言語、使用するデータ型など) ## パイプラインの実行 -パイプラインは [`run()`][agents.voice.pipeline.VoicePipeline.run] メソッドで実行でき、音声入力を次の 2 つの形式で渡せます: +パイプラインは [`run()`][agents.voice.pipeline.VoicePipeline.run] メソッドで実行でき、音声入力を次の 2 つの形式で渡せます。 -1. [`AudioInput`][agents.voice.input.AudioInput] は、完全な音声書き起こしがあり、その結果だけを生成したい場合に使用します。話者が話し終えたタイミングの検出が不要なケース、たとえば事前録音された音声や、ユーザーが話し終えるタイミングが明確なプッシュ・トゥ・トークのアプリで便利です。 -2. [`StreamedAudioInput`][agents.voice.input.StreamedAudioInput] は、ユーザーが話し終えたタイミングの検出が必要な場合に使用します。検出された音声チャンクを逐次プッシュでき、パイプラインは「アクティビティ検出」と呼ばれるプロセスを通じて、適切なタイミングでエージェント ワークフローを自動的に実行します。 +1. [`AudioInput`][agents.voice.input.AudioInput]: 音声の全文字起こしがあり、その結果だけを生成したい場合に使用します。発話終了の検出が不要なケース(例: 事前録音の音声、話者の終了が明確なプッシュ・トゥ・トーク (push-to-talk) アプリ)に役立ちます。 +2. [`StreamedAudioInput`][agents.voice.input.StreamedAudioInput]: ユーザーの発話終了を検出する必要がある場合に使用します。検出された音声チャンクを逐次プッシュでき、パイプラインは「アクティビティ検出」により適切なタイミングでエージェントのワークフローを自動実行します。 ## 結果 -音声パイプライン実行の結果は [`StreamedAudioResult`][agents.voice.result.StreamedAudioResult] です。これは、発生したイベントをストリーミングできるオブジェクトです。いくつかの種類の [`VoiceStreamEvent`][agents.voice.events.VoiceStreamEvent] があり、次を含みます: +音声パイプライン実行の結果は [`StreamedAudioResult`][agents.voice.result.StreamedAudioResult] です。これは、発生したイベントを逐次ストリーミングできるオブジェクトです。いくつかの種類の [`VoiceStreamEvent`][agents.voice.events.VoiceStreamEvent] があり、次を含みます。 -1. 音声チャンクを含む [`VoiceStreamEventAudio`][agents.voice.events.VoiceStreamEventAudio] -2. ターンの開始や終了などのライフサイクルイベントを通知する [`VoiceStreamEventLifecycle`][agents.voice.events.VoiceStreamEventLifecycle] -3. エラーイベントである [`VoiceStreamEventError`][agents.voice.events.VoiceStreamEventError] +1. [`VoiceStreamEventAudio`][agents.voice.events.VoiceStreamEventAudio]: 音声チャンクを含みます。 +2. [`VoiceStreamEventLifecycle`][agents.voice.events.VoiceStreamEventLifecycle]: ターンの開始や終了などのライフサイクルイベントを通知します。 +3. [`VoiceStreamEventError`][agents.voice.events.VoiceStreamEventError]: エラーイベントです。 ```python @@ -76,4 +76,4 @@ async for event in result.stream(): ### 割り込み -Agents SDK は現在、[`StreamedAudioInput`][agents.voice.input.StreamedAudioInput] に対する組み込みの割り込みサポートを提供していません。代わりに、検出された各ターンごとに、ワークフローの個別の実行がトリガーされます。アプリケーション内で割り込みを扱いたい場合は、[`VoiceStreamEventLifecycle`][agents.voice.events.VoiceStreamEventLifecycle] イベントを監視できます。`turn_started` は新しいターンが文字起こしされ処理が開始されたことを示します。`turn_ended` は該当ターンのすべての音声がディスパッチされた後にトリガーされます。これらのイベントを利用して、モデルがターンを開始したときに話者のマイクをミュートし、そのターンに関連する音声をすべてフラッシュした後にミュート解除するといった制御が可能です。 \ No newline at end of file +Agents SDK は現在、[`StreamedAudioInput`][agents.voice.input.StreamedAudioInput] に対する組み込みの割り込みサポートを提供していません。代わりに、検出された各ターンごとにワークフローの個別の実行がトリガーされます。アプリケーション内で割り込みを扱いたい場合は、[`VoiceStreamEventLifecycle`][agents.voice.events.VoiceStreamEventLifecycle] イベントを監視してください。`turn_started` は新しいターンが文字起こしされ処理が始まったことを示します。`turn_ended` は該当ターンの音声がすべて送出された後に発火します。これらのイベントを使って、モデルがターンを開始したときに話者のマイクをミュートし、ターンに関連する音声の送出が完了した後にミュート解除するといった制御が可能です。 \ No newline at end of file diff --git a/docs/ja/voice/quickstart.md b/docs/ja/voice/quickstart.md index d855916ed..0d24e90e2 100644 --- a/docs/ja/voice/quickstart.md +++ b/docs/ja/voice/quickstart.md @@ -14,11 +14,11 @@ pip install 'openai-agents[voice]' ## 概念 -主な概念は [`VoicePipeline`][agents.voice.pipeline.VoicePipeline] で、これは 3 ステップのプロセスです。 +知っておくべき主な概念は、[`VoicePipeline`][agents.voice.pipeline.VoicePipeline] です。これは 3 段階のプロセスです。 -1. 音声認識モデルを実行して、音声をテキストに変換します。 -2. 通常は エージェント によるワークフローであるあなたのコードを実行し、結果を生成します。 -3. 音声合成モデルを実行して、結果のテキストを音声に戻します。 +1. 音声をテキストに変換するために音声認識モデルを実行します。 +2. 結果を生成するために、通常はエージェントのワークフローであるあなたのコードを実行します。 +3. 結果のテキストを音声に戻すために音声合成モデルを実行します。 ```mermaid graph LR @@ -48,7 +48,7 @@ graph LR ## エージェント -まず エージェント をいくつか設定します。これは、この SDK で エージェント を作成したことがあれば馴染みがあるはずです。ここでは、複数の エージェント、ハンドオフ、そして 1 つのツールを用意します。 +まず、いくつかのエージェントをセットアップしましょう。この SDK でエージェントを作成したことがあれば、見覚えがあるはずです。ここでは、複数のエージェント、ハンドオフ、そしてツールを用意します。 ```python import asyncio @@ -92,7 +92,7 @@ agent = Agent( ## 音声パイプライン -ワークフローとして [`SingleAgentVoiceWorkflow`][agents.voice.workflow.SingleAgentVoiceWorkflow] を使用し、シンプルな音声パイプラインを設定します。 +ワークフローとして [`SingleAgentVoiceWorkflow`][agents.voice.workflow.SingleAgentVoiceWorkflow] を使用して、シンプルな音声パイプラインをセットアップします。 ```python from agents.voice import SingleAgentVoiceWorkflow, VoicePipeline @@ -124,7 +124,7 @@ async for event in result.stream(): ``` -## 統合 +## すべてを組み合わせる ```python import asyncio @@ -195,4 +195,4 @@ if __name__ == "__main__": asyncio.run(main()) ``` -このサンプルを実行すると、エージェントがあなたに話しかけます。自分で エージェント に話しかけられるデモは、[examples/voice/static](https://github.com/openai/openai-agents-python/tree/main/examples/voice/static) の code examples をご覧ください。 \ No newline at end of file +このサンプルを実行すると、エージェントが話しかけてきます。自分でエージェントに話しかけられるデモは、[examples/voice/static](https://github.com/openai/openai-agents-python/tree/main/examples/voice/static) を参照してください。 \ No newline at end of file diff --git a/docs/ja/voice/tracing.md b/docs/ja/voice/tracing.md index a0596aaef..4f0053177 100644 --- a/docs/ja/voice/tracing.md +++ b/docs/ja/voice/tracing.md @@ -4,15 +4,15 @@ search: --- # トレーシング -[エージェントのトレーシング](../tracing.md) と同様に、音声パイプラインも自動でトレースされます。 +[エージェントがトレーシングされる方法](../tracing.md) と同様に、音声パイプラインも自動的にトレーシングされます。 -基本的なトレーシングの情報は上記のドキュメントをご覧ください。加えて、[`VoicePipelineConfig`][agents.voice.pipeline_config.VoicePipelineConfig] を使ってパイプラインのトレーシングを設定できます。 +基本的なトレーシング情報については上記のドキュメントをご覧ください。加えて、[`VoicePipelineConfig`][agents.voice.pipeline_config.VoicePipelineConfig] を通じてパイプラインのトレーシングを構成できます。 -主なトレーシング関連フィールド: +主要なトレーシング関連フィールドは次のとおりです: -- [`tracing_disabled`][agents.voice.pipeline_config.VoicePipelineConfig.tracing_disabled]: トレーシングを無効にするかどうかを制御します。デフォルトでは有効です。 -- [`trace_include_sensitive_data`][agents.voice.pipeline_config.VoicePipelineConfig.trace_include_sensitive_data]: 音声の書き起こしなど、機微なデータをトレースに含めるかどうかを制御します。これは音声パイプラインに特有の設定で、ワークフロー内部で行われることには適用されません。 -- [`trace_include_sensitive_audio_data`][agents.voice.pipeline_config.VoicePipelineConfig.trace_include_sensitive_audio_data]: 音声データをトレースに含めるかどうかを制御します。 -- [`workflow_name`][agents.voice.pipeline_config.VoicePipelineConfig.workflow_name]: トレースのワークフロー名です。 -- [`group_id`][agents.voice.pipeline_config.VoicePipelineConfig.group_id]: 複数のトレースを関連付けるためのトレースの `group_id` です。 -- [`trace_metadata`][agents.voice.pipeline_config.VoicePipelineConfig.tracing_disabled]: トレースに含める追加のメタデータです。 \ No newline at end of file +- [`tracing_disabled`][agents.voice.pipeline_config.VoicePipelineConfig.tracing_disabled]: トレーシングを無効化するかどうかを制御します。既定ではトレーシングは有効です。 +- [`trace_include_sensitive_data`][agents.voice.pipeline_config.VoicePipelineConfig.trace_include_sensitive_data]: 音声の書き起こしのような機微情報をトレースに含めるかどうかを制御します。これは音声パイプライン専用であり、あなたの Workflow 内で起こる処理には適用されません。 +- [`trace_include_sensitive_audio_data`][agents.voice.pipeline_config.VoicePipelineConfig.trace_include_sensitive_audio_data]: トレースに音声データを含めるかどうかを制御します。 +- [`workflow_name`][agents.voice.pipeline_config.VoicePipelineConfig.workflow_name]: トレースのワークフロー名。 +- [`group_id`][agents.voice.pipeline_config.VoicePipelineConfig.group_id]: 複数のトレースを関連付けるためのトレースの `group_id`。 +- [`trace_metadata`][agents.voice.pipeline_config.VoicePipelineConfig.tracing_disabled]: トレースに含める追加のメタデータ。 \ No newline at end of file diff --git a/docs/mcp.md b/docs/mcp.md index 4d120b484..e06bbf873 100644 --- a/docs/mcp.md +++ b/docs/mcp.md @@ -185,6 +185,11 @@ If the MCP server implements the HTTP with SSE transport, instantiate [`MCPServerSse`][agents.mcp.server.MCPServerSse]. Apart from the transport, the API is identical to the Streamable HTTP server. ```python + +from agents import Agent, Runner +from agents.model_settings import ModelSettings +from mcp import MCPServerSse + workspace_id = "demo-workspace" async with MCPServerSse( @@ -212,6 +217,8 @@ proofs of concept or when the server only exposes a command line entry point. ```python from pathlib import Path +from agents import Agent, Runner +from agents.mcp import MCPServerStdio current_dir = Path(__file__).parent samples_dir = current_dir / "sample_files" @@ -298,6 +305,8 @@ methods: - `get_prompt(name, arguments)` fetches a concrete prompt, optionally with parameters. ```python +from agents import Agent + prompt_result = await server.get_prompt( "generate_code_review_instructions", {"focus": "security vulnerabilities", "language": "python"}, diff --git a/docs/realtime/quickstart.md b/docs/realtime/quickstart.md index bb50b0642..a88cdbf22 100644 --- a/docs/realtime/quickstart.md +++ b/docs/realtime/quickstart.md @@ -45,8 +45,12 @@ runner = RealtimeRunner( config={ "model_settings": { "model_name": "gpt-realtime", - "voice": "alloy", - "modalities": ["text", "audio"], + "voice": "ash", + "modalities": ["audio"], + "input_audio_format": "pcm16", + "output_audio_format": "pcm16", + "input_audio_transcription": {"model": "gpt-4o-mini-transcribe"}, + "turn_detection": {"type": "semantic_vad", "interrupt_response": True}, } } ) @@ -55,24 +59,50 @@ runner = RealtimeRunner( ### 4. Start a session ```python -async def main(): - # Start the realtime session - session = await runner.run() - - async with session: - # Send a text message to start the conversation - await session.send_message("Hello! How are you today?") - - # The agent will stream back audio in real-time (not shown in this example) - # Listen for events from the session - async for event in session: - if event.type == "response.audio_transcript.done": - print(f"Assistant: {event.transcript}") - elif event.type == "conversation.item.input_audio_transcription.completed": - print(f"User: {event.transcript}") - -# Run the session -asyncio.run(main()) +# Start the session +session = await runner.run() + +async with session: + print("Session started! The agent will stream audio responses in real-time.") + # Process events + async for event in session: + try: + if event.type == "agent_start": + print(f"Agent started: {event.agent.name}") + elif event.type == "agent_end": + print(f"Agent ended: {event.agent.name}") + elif event.type == "handoff": + print(f"Handoff from {event.from_agent.name} to {event.to_agent.name}") + elif event.type == "tool_start": + print(f"Tool started: {event.tool.name}") + elif event.type == "tool_end": + print(f"Tool ended: {event.tool.name}; output: {event.output}") + elif event.type == "audio_end": + print("Audio ended") + elif event.type == "audio": + # Enqueue audio for callback-based playback with metadata + # Non-blocking put; queue is unbounded, so drops won’t occur. + pass + elif event.type == "audio_interrupted": + print("Audio interrupted") + # Begin graceful fade + flush in the audio callback and rebuild jitter buffer. + elif event.type == "error": + print(f"Error: {event.error}") + elif event.type == "history_updated": + pass # Skip these frequent events + elif event.type == "history_added": + pass # Skip these frequent events + elif event.type == "raw_model_event": + print(f"Raw model event: {_truncate_str(str(event.data), 200)}") + else: + print(f"Unknown event type: {event.type}") + except Exception as e: + print(f"Error processing event: {_truncate_str(str(e), 200)}") + +def _truncate_str(s: str, max_length: int) -> str: + if len(s) > max_length: + return s[:max_length] + "..." + return s ``` ## Complete example @@ -89,45 +119,68 @@ async def main(): name="Assistant", instructions="You are a helpful voice assistant. Keep responses brief and conversational.", ) - # Set up the runner with configuration runner = RealtimeRunner( starting_agent=agent, config={ "model_settings": { "model_name": "gpt-realtime", - "voice": "alloy", - "modalities": ["text", "audio"], - "input_audio_transcription": { - "model": "whisper-1" - }, - "turn_detection": { - "type": "server_vad", - "threshold": 0.5, - "prefix_padding_ms": 300, - "silence_duration_ms": 200 - } + "voice": "ash", + "modalities": ["audio"], + "input_audio_format": "pcm16", + "output_audio_format": "pcm16", + "input_audio_transcription": {"model": "gpt-4o-mini-transcribe"}, + "turn_detection": {"type": "semantic_vad", "interrupt_response": True}, } - } + }, ) - # Start the session session = await runner.run() async with session: print("Session started! The agent will stream audio responses in real-time.") - # Process events async for event in session: - if event.type == "response.audio_transcript.done": - print(f"Assistant: {event.transcript}") - elif event.type == "conversation.item.input_audio_transcription.completed": - print(f"User: {event.transcript}") - elif event.type == "error": - print(f"Error: {event.error}") - break + try: + if event.type == "agent_start": + print(f"Agent started: {event.agent.name}") + elif event.type == "agent_end": + print(f"Agent ended: {event.agent.name}") + elif event.type == "handoff": + print(f"Handoff from {event.from_agent.name} to {event.to_agent.name}") + elif event.type == "tool_start": + print(f"Tool started: {event.tool.name}") + elif event.type == "tool_end": + print(f"Tool ended: {event.tool.name}; output: {event.output}") + elif event.type == "audio_end": + print("Audio ended") + elif event.type == "audio": + # Enqueue audio for callback-based playback with metadata + # Non-blocking put; queue is unbounded, so drops won’t occur. + pass + elif event.type == "audio_interrupted": + print("Audio interrupted") + # Begin graceful fade + flush in the audio callback and rebuild jitter buffer. + elif event.type == "error": + print(f"Error: {event.error}") + elif event.type == "history_updated": + pass # Skip these frequent events + elif event.type == "history_added": + pass # Skip these frequent events + elif event.type == "raw_model_event": + print(f"Raw model event: {_truncate_str(str(event.data), 200)}") + else: + print(f"Unknown event type: {event.type}") + except Exception as e: + print(f"Error processing event: {_truncate_str(str(e), 200)}") + +def _truncate_str(s: str, max_length: int) -> str: + if len(s) > max_length: + return s[:max_length] + "..." + return s if __name__ == "__main__": + # Run the session asyncio.run(main()) ``` @@ -137,7 +190,7 @@ if __name__ == "__main__": - `model_name`: Choose from available realtime models (e.g., `gpt-realtime`) - `voice`: Select voice (`alloy`, `echo`, `fable`, `onyx`, `nova`, `shimmer`) -- `modalities`: Enable text and/or audio (`["text", "audio"]`) +- `modalities`: Enable text or audio (`["text"]` or `["audio"]`) ### Audio settings diff --git a/examples/realtime/cli/demo.py b/examples/realtime/cli/demo.py index 4a7172e30..63bbd2099 100644 --- a/examples/realtime/cli/demo.py +++ b/examples/realtime/cli/demo.py @@ -347,7 +347,7 @@ async def _on_event(self, event: RealtimeSessionEvent) -> None: else: print(f"Unknown event type: {event.type}") except Exception as e: - print(f"Error processing event: {_truncate_str(str(e), 50)}") + print(f"Error processing event: {_truncate_str(str(e), 200)}") if __name__ == "__main__":