Ce sujet décrit les étapes pour configurer l\'authentification Microsoft Entra ID (anciennement Azure AD) pour les définitions de modèles personnalisés dans AI Agent Studio, permettant une intégration transparente de vos modèles avec Automation 360.

Entra ID n\'est pris en charge que via l\'Authentification OAuth2, et cette méthode est requise lors de l\'intégration avec des modèles hébergés par Microsoft qui exigent des jetons d\'accès basés sur Entra.
  • Utilisez Entra ID lorsque le fournisseur du modèle cible ne prend en charge que l\'authentification OAuth2.
  • C\'est souvent le cas avec les Services hébergés sur Azure lorsque l\'authentification par clé API ne peut pas être utilisée en parallèle avec OAuth2.
  • Par exemple, les modèles Azure OpenAI utilisent par défaut l\'authentification par clé API, mais si vos exigences de sécurité imposent OAuth2 via Entra ID, vous devez configurer le modèle via la route de définition de modèle personnalisée.

Pour télécharger et utiliser la collection Postman (exemple Entra ID), cliquez sur ce lien Collection Postman - Exemple Entra ID.

Prérequis

  • Un compte Azure avec Entra ID activé. Rassemblez les informations requises :
    • ID Client
    • Secret du client
    • URL d\'autorisation
    • URL du jeton
  • Configurer une connexion OAuth en utilisant Entra ID. Pour plus d\'informations, veuillez consulter Configuration de Microsoft Entra ID.

Pourquoi utiliser un modèle personnalisé et Entra ID ?

Azure OpenAI est pris en charge avec l\'authentification par clé API dans l\'interface utilisateur ; si vous avez besoin de OAuth2/Entra ID à la place, configurez-le via l\'API Modèle personnalisé, car un fournisseur ne peut exposer qu\'un seul mécanisme d\'authentification dans l\'interface utilisateur à la fois.

Procédure

  1. Une fois la connexion OAuth établie, vous pouvez créer la définition de modèle personnalisé à l\'aide de Créer une API de modèle personnalisé. Cette API nécessite un schéma de charge utile JSON qui décrit votre modèle, y compris le nom du fournisseur, le nom du modèle, les protocoles d\'authentification et les détails du point de terminaison de l\'API.
  2. Utilisez le bloc authAction suivant pour créer une connexion de modèle personnalisée à l\'aide de l\'Entra ID configuré. Notez les principaux paramètres d\'authentification :
    "authAction": {
      "authType": "OAUTH2",
      "oAuth": {
        "location": "header",
        "keyName": "Authorization",
        "prefix": "Bearer "
      }
    }
    
    • authType : doit être OAUTH2
    • location : en-tête
    • keyName : Autorisation
    • prefix : Porteur et inclure le jeton (inclure un espace après Porteur)
  3. Envoyez la requête. La requête est décrite dans l\'exemple ci-dessous. En cas de succès, la définition de modèle personnalisé est créée et devient sélectionnable lorsque vous créez une Connexion de modèle dans AI Agent Studio.

Définition de modèle personnalisé utilisant Entra ID

Voici un exemple simplifié pour un déploiement Azure OpenAI GPT-4.1 mini, utilisant Entra OAuth2 :

POST https:/{{ControlRoomURL}}/gai/prompttools/v1/custommodel
Corps de la demande :
{
	"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"
						}
					}
				]
			}
		}
	]
}