From b6124c2712ed17dd663fa95063f251365661048f Mon Sep 17 00:00:00 2001 From: Jaakko Husso Date: Thu, 20 Nov 2025 16:55:39 +0200 Subject: [PATCH] feat(core): Add separate Azure API key and Entra ID providers (no-changelog) --- packages/@n8n/api-types/src/chat-hub.ts | 11 +++++++++++ .../src/modules/chat-hub/chat-hub-workflow.service.ts | 1 + .../cli/src/modules/chat-hub/chat-hub.constants.ts | 6 +++++- packages/cli/src/modules/chat-hub/chat-hub.service.ts | 9 +++++---- .../src/modules/chat-hub/chat-session.repository.ts | 4 ++-- packages/cli/src/modules/chat-hub/context-limits.ts | 1 + .../editor-ui/src/features/ai/chatHub/constants.ts | 3 ++- 7 files changed, 27 insertions(+), 8 deletions(-) diff --git a/packages/@n8n/api-types/src/chat-hub.ts b/packages/@n8n/api-types/src/chat-hub.ts index 486fae50ddc..e6d60afdf6a 100644 --- a/packages/@n8n/api-types/src/chat-hub.ts +++ b/packages/@n8n/api-types/src/chat-hub.ts @@ -16,6 +16,7 @@ export const chatHubLLMProviderSchema = z.enum([ 'anthropic', 'google', 'azureOpenAi', + 'azureEntraId', 'ollama', 'awsBedrock', 'mistralCloud', @@ -42,6 +43,7 @@ export const PROVIDER_CREDENTIAL_TYPE_MAP: Record< google: 'googlePalmApi', ollama: 'ollamaApi', azureOpenAi: 'azureOpenAiApi', + azureEntraId: 'azureEntraCognitiveServicesOAuth2Api', awsBedrock: 'aws', mistralCloud: 'mistralCloudApi', }; @@ -71,6 +73,11 @@ const azureOpenAIModelSchema = z.object({ model: z.string(), }); +const azureEntraIdModelSchema = z.object({ + provider: z.literal('azureEntraId'), + model: z.string(), +}); + const ollamaModelSchema = z.object({ provider: z.literal('ollama'), model: z.string(), @@ -101,6 +108,7 @@ export const chatHubConversationModelSchema = z.discriminatedUnion('provider', [ anthropicModelSchema, googleModelSchema, azureOpenAIModelSchema, + azureEntraIdModelSchema, ollamaModelSchema, awsBedrockModelSchema, mistralCloudModelSchema, @@ -112,6 +120,7 @@ export type ChatHubOpenAIModel = z.infer; export type ChatHubAnthropicModel = z.infer; export type ChatHubGoogleModel = z.infer; export type ChatHubAzureOpenAIModel = z.infer; +export type ChatHubAzureEntraIdModel = z.infer; export type ChatHubOllamaModel = z.infer; export type ChatHubAwsBedrockModel = z.infer; export type ChatHubMistralCloudModel = z.infer; @@ -120,6 +129,7 @@ export type ChatHubBaseLLMModel = | ChatHubAnthropicModel | ChatHubGoogleModel | ChatHubAzureOpenAIModel + | ChatHubAzureEntraIdModel | ChatHubOllamaModel | ChatHubAwsBedrockModel | ChatHubMistralCloudModel; @@ -163,6 +173,7 @@ export const emptyChatModelsResponse: ChatModelsResponse = { anthropic: { models: [] }, google: { models: [] }, azureOpenAi: { models: [] }, + azureEntraId: { models: [] }, ollama: { models: [] }, awsBedrock: { models: [] }, mistralCloud: { models: [] }, diff --git a/packages/cli/src/modules/chat-hub/chat-hub-workflow.service.ts b/packages/cli/src/modules/chat-hub/chat-hub-workflow.service.ts index ab5fb8041ad..f4cfb8f207f 100644 --- a/packages/cli/src/modules/chat-hub/chat-hub-workflow.service.ts +++ b/packages/cli/src/modules/chat-hub/chat-hub-workflow.service.ts @@ -485,6 +485,7 @@ export class ChatHubWorkflowService { }, }; case 'azureOpenAi': + case 'azureEntraId': return { ...common, parameters: { diff --git a/packages/cli/src/modules/chat-hub/chat-hub.constants.ts b/packages/cli/src/modules/chat-hub/chat-hub.constants.ts index b19b647ae0a..6b961ef83bb 100644 --- a/packages/cli/src/modules/chat-hub/chat-hub.constants.ts +++ b/packages/cli/src/modules/chat-hub/chat-hub.constants.ts @@ -14,7 +14,7 @@ Requirements: export const PROVIDER_NODE_TYPE_MAP: Record = { openai: { name: '@n8n/n8n-nodes-langchain.lmChatOpenAi', - version: 1.2, + version: 1.3, }, anthropic: { name: '@n8n/n8n-nodes-langchain.lmChatAnthropic', @@ -32,6 +32,10 @@ export const PROVIDER_NODE_TYPE_MAP: Record { + ): ChatModelsResponse['azureOpenAi'] { // Azure doesn't appear to offer a way to list available models via API. // If we add support for this in the future on the Azure OpenAI node we should copy that // implementation here too. diff --git a/packages/cli/src/modules/chat-hub/chat-session.repository.ts b/packages/cli/src/modules/chat-hub/chat-session.repository.ts index 3fa513cbfe2..84cd1d3e083 100644 --- a/packages/cli/src/modules/chat-hub/chat-session.repository.ts +++ b/packages/cli/src/modules/chat-hub/chat-session.repository.ts @@ -2,10 +2,10 @@ import { withTransaction } from '@n8n/db'; import { Service } from '@n8n/di'; import { DataSource, EntityManager, Repository } from '@n8n/typeorm'; -import { NotFoundError } from '@/errors/response-errors/not-found.error'; - import { ChatHubSession } from './chat-hub-session.entity'; +import { NotFoundError } from '@/errors/response-errors/not-found.error'; + @Service() export class ChatHubSessionRepository extends Repository { constructor(dataSource: DataSource) { diff --git a/packages/cli/src/modules/chat-hub/context-limits.ts b/packages/cli/src/modules/chat-hub/context-limits.ts index 272c08f4381..80ceac38a75 100644 --- a/packages/cli/src/modules/chat-hub/context-limits.ts +++ b/packages/cli/src/modules/chat-hub/context-limits.ts @@ -138,6 +138,7 @@ export const maxContextWindowTokens: Record = { openai: 'OpenAI', anthropic: 'Anthropic', google: 'Google', - azureOpenAi: 'Azure OpenAI', + azureOpenAi: 'Azure (API Key)', + azureEntraId: 'Azure (Entra ID)', ollama: 'Ollama', awsBedrock: 'AWS Bedrock', mistralCloud: 'Mistral Cloud',