From 983b7f4bb5a0920cca5fe2b744b3ef0ea3aef272 Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Mon, 15 Jun 2026 17:18:32 +0100 Subject: [PATCH] feat(ui): collect Azure AI Foundry resource on key add The provider key dialog had no fields for azure-ai-foundry, so keys were saved without options.azure_ai_foundry_resource. The gateway then threw "Azure AI Foundry resource is required" at request/validation time. Add a required Resource Name field (with format validation) and an optional API Version field, mirroring the Azure OpenAI handling. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../create-provider-key-dialog.tsx | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/apps/ui/src/components/provider-keys/create-provider-key-dialog.tsx b/apps/ui/src/components/provider-keys/create-provider-key-dialog.tsx index 183cc78fe2..1cfe6bfb55 100644 --- a/apps/ui/src/components/provider-keys/create-provider-key-dialog.tsx +++ b/apps/ui/src/components/provider-keys/create-provider-key-dialog.tsx @@ -57,6 +57,9 @@ export function CreateProviderKeyDialog({ >("ai-foundry"); const [azureValidationModel, setAzureValidationModel] = useState("gpt-4o-mini"); + const [azureAiFoundryResource, setAzureAiFoundryResource] = useState(""); + const [azureAiFoundryApiVersion, setAzureAiFoundryApiVersion] = + useState("2024-05-01-preview"); const [selectedRegion, setSelectedRegion] = useState(""); const [googleVertexProjectId, setGoogleVertexProjectId] = useState(""); const [isValidating, setIsValidating] = useState(false); @@ -170,6 +173,33 @@ export function CreateProviderKeyDialog({ }; } + if (selectedProvider === "azure-ai-foundry") { + if (!azureAiFoundryResource) { + toast({ + title: "Error", + description: "Azure AI Foundry resource name is required", + variant: "destructive", + }); + return; + } + if (!/^[a-zA-Z0-9-]{1,64}$/.test(azureAiFoundryResource)) { + toast({ + title: "Error", + description: + "Resource name must be 1-64 characters and contain only letters, numbers, and hyphens", + variant: "destructive", + }); + return; + } + payload.options = { + ...payload.options, + azure_ai_foundry_resource: azureAiFoundryResource, + ...(azureAiFoundryApiVersion + ? { azure_ai_foundry_api_version: azureAiFoundryApiVersion } + : {}), + }; + } + if (selectedProvider === "google-vertex" && googleVertexProjectId) { payload.options = { ...payload.options, @@ -233,6 +263,8 @@ export function CreateProviderKeyDialog({ setAzureApiVersion("2024-10-21"); setAzureDeploymentType("ai-foundry"); setAzureValidationModel("gpt-4o-mini"); + setAzureAiFoundryResource(""); + setAzureAiFoundryApiVersion("2024-05-01-preview"); setSelectedRegion(""); setGoogleVertexProjectId(""); }, 300); @@ -397,6 +429,41 @@ export function CreateProviderKeyDialog({ )} + {selectedProvider === "azure-ai-foundry" && ( + <> +
+ + setAzureAiFoundryResource(e.target.value)} + required + /> +

+ Your Azure AI Foundry resource name from the base URL: + https://<resource-name>.services.ai.azure.com +

+
+
+ + setAzureAiFoundryApiVersion(e.target.value)} + /> +

+ Azure AI Foundry API version (default: 2024-05-01-preview) +

+
+ + )} + {selectedProvider === "google-vertex" && (