Azure Container Apps の動的セッションでは、コード インタープリターへの高速でスケーラブルなアクセスが提供されます。 各コード インタープリター セッションは、Hyper-V 境界によって完全に分離され、信頼されていないコードを実行するように設計されています。
コード インタープリター セッション用に使用する
コード インタープリター セッションは、悪意のある可能性がある、またはホスト システムや他のユーザーに損害を与える可能性があるコードを実行する必要がある、次のようなシナリオに最適です。
- 大規模言語モデル (LLM) によって生成されたコード。
- エンド ユーザーが Web または SaaS アプリケーションで送信したコード。
LangChain、LlamaIndex、セマンティック カーネルなどの一般的な LLM フレームワークの場合、ツールとプラグインを使用して AI アプリをコード インタープリター セッションと統合できます。
作成中のアプリケーションは、REST API を使用してコード インタープリター セッションと統合することもできます。 API を使用すると、次のことができます。
セッションでコードを実行し、結果を取得する
セッションとの間でファイルをアップロードおよびダウンロードします。
実行可能なコード ファイル、またはコードで処理できるデータ ファイルをアップロードおよびダウンロードできます。
組み込みのコード インタープリター セッションは、インフラストラクチャまたはコンテナーを管理する必要なく、最も一般的なコード実行シナリオをサポートします。
コード実行環境を完全に制御する必要がある場合、または分離されたサンドボックスを必要とする別のシナリオがある場合は、カスタム コード インタープリター セッションを使用できます。
コード インタープリター セッション プール
コード インタープリター セッションを使用するには、コード インタープリター セッションの構成を定義する セッション プール と呼ばれる Azure リソースが必要です。
セッション プールでは、同時セッションの最大数や、セッションが終了するまでのセッションのアイドル時間などの設定を指定できます。
セッション プールは、Azure portal、Azure CLI、または Azure Resource Manager テンプレートを使用して作成できます。 セッション プールを作成したら、プールの管理 API エンドポイントを使用して、セッション内でコードを管理および実行できます。
セッション プールを作成および構成する方法の詳細については、「セッション プールを 使用する」を参照してください。
セッションでのコード実行
セッション プールを作成したら、作成中のアプリケーションは、LLM フレームワークとの統合を使用するか、プールの管理 API エンドポイントを直接使用して、プール内のセッションと対話できます。
セッション識別子
重要
セッション識別子は機密情報であり、セキュリティで保護されたプロセスを使ってその値を管理する必要があります。 このプロセスの一部として、アプリケーションで確実に、各ユーザーまたはテナントがそれ自身のセッションにしかアクセスできないようにする必要があります。
セッションへのアクセスをセキュリティで保護しないと、ユーザーのセッションに格納されているデータへの誤用または未承認のアクセスが発生する可能性があります。 詳細については、「 セッション識別子」を参照してください。
プール内のセッションを操作する場合は、 セッション識別子 を使用して各セッションを参照します。セッション識別子は、セッション プール内で一意である定義した文字列です。 Web アプリケーションを構築している場合は、ユーザーの ID を使用できます。 チャットボットを構築している場合は、会話 ID を使用できます。
識別子を持つ実行中のセッションがある場合は、セッションが再利用されます。 識別子を持つ実行中のセッションがない場合は、新しいセッションが自動的に作成されます。
認証
認証は Microsoft Entra トークンを使用して処理されます。 有効な Microsoft Entra トークンは、セッション プール上の Azure ContainerApps Session Executor および "共同作成者" ロールに属する ID によって生成されます。
LLM フレームワーク統合を使用している場合、フレームワークはトークンの生成と管理を自動的に処理します。 アプリケーションが、セッション プールで必要なロールの割り当てを持つマネージド ID で構成されていることを確認します。
プールの管理 API エンドポイントを直接使用している場合は、トークンを生成し、それを HTTP 要求の Authorization
ヘッダーに含める必要があります。 前述のロールの割り当てに加えて、トークンには、値 aud
を持つ対象者 (https://dynamicsessions.io
) クレームが含まれている必要があります。
詳細については、「認証と権限承認」をご覧ください。
ファイルを操作する
ファイルをアップロードおよびダウンロードし、コード インタープリター セッション内のすべてのファイルを一覧表示できます。
ファイルをアップロードする
ファイルをセッションにアップロードするには、マルチパート フォーム データ要求内で POST
エンドポイントに uploadFile
要求を送信します。 要求本文にファイル データを含めます。 ファイルにはファイル名を含める必要があります。
アップロードされたファイルは、セッションのファイル システムの /mnt/data
ディレクトリに格納されます。
次の例は、セッションにファイルをアップロードする方法を示しています。
要求を送信する前に、<>
角かっこの間のプレースホルダーを、要求に固有の値に置き換えます。
POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/upload?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Bearer <token>
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="<FILE_NAME_AND_EXTENSION>"
Content-Type: application/octet-stream
(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--
ファイルをダウンロードする
セッションの /mnt/data
ディレクトリからファイルをダウンロードするには、GET
エンドポイントに file/content/{filename}
要求を送信します。 応答にファイル データが含まれます。
次の例では、ファイルをダウンロードする GET
要求を書式設定する方法を示します。
要求を送信する前に、<>
角かっこの間のプレースホルダーを、要求に固有の値に置き換えます。
GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/content/<FILE_NAME_AND_EXTENSION>?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>
ファイルを一覧表示する
セッションの /mnt/data
ディレクトリ内のファイルを一覧表示するには、GET
エンドポイントに files
要求を送信します。
次の例は、セッションのディレクトリ内のファイルを一覧表示する方法を示しています。
要求を送信する前に、<>
角かっこの間のプレースホルダーを、要求に固有の値に置き換えます。
GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>
応答にセッション内のファイルの一覧が含まれます。
次の一覧は、セッション コンテンツの要求から予想される応答の種類のサンプルを示しています。
{
"$id": "1",
"value": [
{
"$id": "2",
"properties": {
"$id": "3",
"filename": "test1.txt",
"size": 16,
"lastModifiedTime": "2024-05-02T07:21:07.9922617Z"
}
},
{
"$id": "4",
"properties": {
"$id": "5",
"filename": "test2.txt",
"size": 17,
"lastModifiedTime": "2024-05-02T07:21:08.8802793Z"
}
}
]
}
安全
コード インタープリター セッションは、分離された環境で信頼されていないコードを実行するように設計されており、アプリケーションとデータが確実に保護されます。
LLM フレームワークの統合
次の LLM フレームワークは、セッション プール管理 API を直接使用する代わりに、コード インタープリター セッションとの統合を提供します。
フレームワーク | パッケージ | チュートリアル |
---|---|---|
LangChain | ニシキヘビ: langchain-azure-dynamic-sessions |
チュートリアル |
LlamaIndex(ラマインデックス) | ニシキヘビ: llama-index-tools-azure-code-interpreter |
チュートリアル |
セマンティック カーネル | Python: semantic-kernel (バージョン 0.9.8-b1 以降) |
チュートリアル |
管理 API エンドポイント
LLM フレームワーク統合を使用していない場合は、 管理 API エンドポイントを使用してセッション プールを直接操作できます。
セッションでコードを実行する
セッションでコードを実行するには、要求本文で実行するコードを持つ POST
要求を code/execute
エンドポイントに送信します。
次の例では、Python で Hello, world!
を出力します。
要求を送信する前に、<>
角かっこの間のプレースホルダーを、セッション プールとセッション識別子の適切な値に置き換えます。
POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/code/execute?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: application/json
Authorization: Bearer <token>
{
"properties": {
"codeInputType": "inline",
"executionType": "synchronous",
"code": "print('Hello, world!')"
}
}
セッションを再利用するには、後続の要求で同じセッション識別子を指定します。
セッションにファイルをアップロードする
ファイルをセッションにアップロードするには、マルチパート フォーム データ要求内で POST
エンドポイントに uploadFile
要求を送信します。 要求本文にファイル データを含めます。 ファイルにはファイル名を含める必要があります。
アップロードされたファイルは、セッションのファイル システムの /mnt/data
ディレクトリに格納されます。
要求を送信する前に、<>
角かっこの間のプレースホルダーを、要求に固有の値に置き換えます。
POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/upload?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Bearer <token>
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="<FILE_NAME_AND_EXTENSION>"
Content-Type: application/octet-stream
(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--
注
ファイルのアップロードの上限は 128MB
です。 これを超えた場合、HTTP 413
が返される可能性があります。
セッションからファイルをダウンロードする
セッションの /mnt/data
ディレクトリからファイルをダウンロードするには、GET
エンドポイントに file/content/{filename}
要求を送信します。 応答にファイル データが含まれます。
要求を送信する前に、<>
角かっこの間のプレースホルダーを、要求に固有の値に置き換えます。
GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/content/<FILE_NAME_AND_EXTENSION>?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>
セッション内のファイルを一覧表示する
セッションの /mnt/data
ディレクトリ内のファイルを一覧表示するには、GET
エンドポイントに files
要求を送信します。
要求を送信する前に、<>
角かっこの間のプレースホルダーを、要求に固有の値に置き換えます。
GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>
応答にセッション内のファイルの一覧が含まれます。
次の一覧は、セッション コンテンツの要求から予想される応答の種類のサンプルを示しています。
{
"$id": "1",
"value": [
{
"$id": "2",
"properties": {
"$id": "3",
"filename": "test1.txt",
"size": 16,
"lastModifiedTime": "2024-05-02T07:21:07.9922617Z"
}
},
{
"$id": "4",
"properties": {
"$id": "5",
"filename": "test2.txt",
"size": 17,
"lastModifiedTime": "2024-05-02T07:21:08.8802793Z"
}
}
]
}
プレインストール済みのパッケージ
Python コード インタープリター セッションには、 NumPy、 pandas、 scikit-learn などの一般的な Python パッケージが含まれます。
プレインストール済みのパッケージの一覧を出力するには、次のコードを使用して code/execute
エンドポイントを呼び出します。
要求を送信する前に、<>
角かっこの間のプレースホルダーを、要求に固有の値に置き換えます。
POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/identifier/<SESSION_ID>/code/execute?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: application/json
Authorization: Bearer <TOKEN>
{
"properties": {
"codeInputType": "inline",
"executionType": "synchronous",
"code": "import pkg_resources\n[(d.project_name, d.version) for d in pkg_resources.working_set]"
}
}
ログ記録
コード インタープリター セッションは、ログを直接サポートしていません。 セッションと対話するアプリケーションは、セッション プール管理 API とその応答に対する要求をログできます。
請求
コード インタープリター セッションは、各セッションの期間に基づいて課金されます。 詳細については、「課金」を参照してください。