このトピックでは、AI エージェント Studio 内のカスタムモデル定義に対して Microsoft Entra ID(以前の Azure AD)認証を構成する手順を説明し、Automation 360 とのシームレスな統合を可能にします。

Entra IDは、OAuth2 認証を通じてのみサポートされており、この方法はEntraベースのアクセストークンを要求する Microsoft ホストのモデルとの統合時に必要です。
  • ターゲットモデルのベンダーが OAuth2 認証のみをサポートしている場合は、Entra ID を使用してください。
  • API キー認証が OAuth2 と並行して使用できない場合、これはしばしばAzure-hosted servicesに当てはまります。
  • 例えば、Azure OpenAI モデルはデフォルトで API キー認証を使用しますが、セキュリティ要件が Entra ID を介した OAuth2 を強制する場合は、カスタムモデル定義ルート を通じてモデルを構成する必要があります。

Postman コレクション (Entra ID サンプル) をダウンロードして使用するには、このリンクをクリックしてください Postman collection - Entra ID sample

前提条件

  • Entra ID が有効な Azure アカウント。 必要な情報を収集します。
    • クライアント ID
    • クライアント シークレット
    • 認可 URL
    • トークン URL
  • Entra ID を使用して OAuth 接続を構成します。 詳細については、Microsoft Entra ID 構成をご参照ください。

カスタムモデルと Entra ID を使用する理由は何ですか?

Azure OpenAI は UI で API Key 認証をサポートしています。代わりに OAuth2/Entra ID が必要な場合は、カスタムモデル API を介して定義してください。ベンダーは一度に UI で 1 つの認証メカニズムしか公開できません。

手順

  1. OAuth 接続が設定されると、カスタム モデル API を作成を使用してカスタムモデル定義を作成できます。 この API は、ベンダー名、モデル名、認証プロトコル、およびAPIエンドポイントの詳細を含むモデルを説明する JSON ペイロード スキーマを必要とします。
  2. 構成された Entra ID を使用してカスタムモデル接続を作成するには、次の authAction ブロックを使用してください。 主な認証パラメーターにご注意ください:
    "authAction": {
      "authType": "OAUTH2",
      "oAuth": {
        "location": "header",
        "keyName": "Authorization",
        "prefix": "Bearer "
      }
    }
    
    • authType: は OAUTH2 でなければなりません
    • location: header
    • keyName: 認証
    • プレフィックス: Bearer とトークンを含めてください(Bearer の後にスペースを含めてください)
  3. リクエストを送信します。 リクエストの詳細は、以下の例で説明します。 成功すると、カスタムモデルの定義が作成され、AI エージェント Studioモデル接続を作成する際に選択可能になります。

Entra ID を使用したカスタムモデル定義

ここに、Entra OAuth2 を使用したAzure OpenAI GPT-4.1 miniデプロイメントの簡略化された例があります:

POST https:/{{ControlRoomURL}}/gai/prompttools/v1/custommodel
リクエスト本文:
{
	"name": "AAI Docs Example - Entra",
	"version": "0",
	"authAction": {
		"authType": "OAUTH2",
		"oAuth": {
			"location": "header",
			"keyName": "Authorization",
			"prefix": "Bearer "
		}
	},
	"apiType": "REST",
	"actions": [
		{
			"name": "gpt-4.1-mini",
			"displayName": "GPT-4.1 mini",
			"description": "GPT-4.1 mini provides a balance between intelligence, speed, and cost that makes it an attractive model for many use cases.",
			"method": "POST",
			"uri": "https://{resourceName}.openai.azure.com/openai/deployments/{deployment}/chat/completions?api-version={apiVersion}",
			"params": [
				{
					"type": "PATH_PARAM",
					"attribute": [
						{
							"name": "resourceName",
							"label": "Resource Name",
							"value": {
								"type": "TEXT",
								"string": "genaitemplateplatformeastca"
							}
						}
					]
				},
				{
					"type": "PATH_PARAM",
					"attribute": [
						{
							"name": "deployment",
							"label": "Deployment",
							"value": {
								"type": "TEXT",
								"string": "deploy-gpt-4.1"
							}
						}
					]
				},
				{
					"type": "PATH_PARAM",
					"attribute": [
						{
							"name": "apiVersion",
							"label": "API Version",
							"value": {
								"type": "TEXT",
								"string": "2025-01-01-preview"
							}
						}
					]
				}
			],
			"request": {
				"raw": {
					"body": "{\"model\": \"gpt-4.1\",\"messages\":[{\"role\":\"system\",\"content\":\"system prompt\"},{\"role\":\"user\",\"content\":\"some prompt query\"}],\"max_completion_tokens\":500}",
					"variables": [
						{
							"path": "$.max_completion_tokens",
							"attribute": {
								"name": "max_completion_tokens",
								"label": "Max tokens",
								"value": {
									"type": "INTEGER",
									"number": "2048"
								},
								"annotations": [
									"MODEL_PARAMETER"
								],
								"canonicalName": "choices[0].completionTokens"
							}
						},
						{
							"path": "$.messages[1].content",
							"attribute": {
								"name": "prompt",
								"label": "prompt",
								"value": {
									"type": "TEXT"
								},
								"annotations": [
									"PROMPT_QUERY"
								]
							}
						},
						{
							"path": "$.messages[0].content",
							"attribute": {
								"name": "systemPrompt",
								"label": "System Prompt",
								"value": {
									"type": "TEXT"
								},
								"annotations": [
									"SYSTEM_PROMPT_MESSAGE"
								]
							}
						}
					]
				}
			},
			"response": {
				"body": "{\n    \"id\": \"chatcmpl-APwQdLa9WCQAdZg0dO5OjGr2ER4sX\",\n    \"object\": \"chat.completion\",\n    \"created\": 1730746163,\n    \"model\": \"o3-mini-2025-01-31\",\n    \"choices\": [\n        {\n            \"index\": 0,\n            \"message\": {\n                \"role\": \"assistant\",\n                \"content\": \"Sure! They are one of the most mysterious and exciting objects in space.\",\n                \"refusal\": null\n            },\n            \"finish_reason\": \"stop\"\n        }\n    ],\n    \"usage\": {\n        \"prompt_tokens\": 17,\n        \"completion_tokens\": 959,\n        \"total_tokens\": 976,\n        \"prompt_tokens_details\": {\n            \"cached_tokens\": 0\n        },\n        \"completion_tokens_details\": {\n            \"reasoning_tokens\": 64\n        }\n    },\n    \"system_fingerprint\": \"fp_35c19d48ca\"\n}",
				"variables": [
					{
						"path": "$.usage.completion_tokens",
						"attribute": {
							"name": "completion_tokens",
							"label": "completion_tokens",
							"value": {
								"type": "INTEGER"
							},
							"annotations": [
								"RESPONSE_PARAMETER"
							],
							"canonicalName": "choices[0].completionTokens"
						}
					},
					{
						"path": "$.choices[0].message.content",
						"attribute": {
							"name": "content",
							"label": "content",
							"value": {
								"type": "TEXT",
								"string": "Some response from LLM"
							},
							"annotations": [
								"RESPONSE_PARAMETER"
							],
							"canonicalName": "choices[0].value"
						}
					},
					{
						"path": "$.model",
						"attribute": {
							"name": "model",
							"label": "model",
							"value": {
								"type": "TEXT"
							},
							"annotations": [
								"RESPONSE_PARAMETER"
							],
							"canonicalName": "model_name"
						}
					},
					{
						"path": "$.usage.prompt_tokens",
						"attribute": {
							"name": "prompt_tokens",
							"label": "prompt_tokens",
							"value": {
								"type": "INTEGER"
							},
							"annotations": [
								"RESPONSE_PARAMETER"
							],
							"canonicalName": "choices[0].promptTokens"
						}
					},
					{
						"path": "$.usage.total_tokens",
						"attribute": {
							"name": "total_tokens",
							"label": "total_tokens",
							"value": {
								"type": "INTEGER"
							},
							"annotations": [
								"RESPONSE_PARAMETER"
							],
							"canonicalName": "choices[0].totalTokens"
						}
					}
				]
			}
		}
	]
}