diff --git a/packages/@n8n/api-types/src/chat-hub.ts b/packages/@n8n/api-types/src/chat-hub.ts index 09998c0aa53..85eae52f065 100644 --- a/packages/@n8n/api-types/src/chat-hub.ts +++ b/packages/@n8n/api-types/src/chat-hub.ts @@ -17,6 +17,7 @@ export const chatHubLLMProviderSchema = z.enum([ 'google', 'azureOpenAi', 'ollama', + 'awsBedrock', ]); export type ChatHubLLMProvider = z.infer; @@ -40,6 +41,7 @@ export const PROVIDER_CREDENTIAL_TYPE_MAP: Record< google: 'googlePalmApi', ollama: 'ollamaApi', azureOpenAi: 'azureOpenAiApi', + awsBedrock: 'aws', }; export type ChatHubAgentTool = typeof JINA_AI_TOOL_NODE_TYPE | typeof SEAR_XNG_TOOL_NODE_TYPE; @@ -72,6 +74,11 @@ const ollamaModelSchema = z.object({ model: z.string(), }); +const awsBedrockModelSchema = z.object({ + provider: z.literal('awsBedrock'), + model: z.string(), +}); + const n8nModelSchema = z.object({ provider: z.literal('n8n'), workflowId: z.string(), @@ -88,6 +95,7 @@ export const chatHubConversationModelSchema = z.discriminatedUnion('provider', [ googleModelSchema, azureOpenAIModelSchema, ollamaModelSchema, + awsBedrockModelSchema, n8nModelSchema, chatAgentSchema, ]); @@ -97,12 +105,14 @@ export type ChatHubAnthropicModel = z.infer; export type ChatHubGoogleModel = z.infer; export type ChatHubAzureOpenAIModel = z.infer; export type ChatHubOllamaModel = z.infer; +export type ChatHubAwsBedrockModel = z.infer; export type ChatHubBaseLLMModel = | ChatHubOpenAIModel | ChatHubAnthropicModel | ChatHubGoogleModel | ChatHubAzureOpenAIModel - | ChatHubOllamaModel; + | ChatHubOllamaModel + | ChatHubAwsBedrockModel; export type ChatHubN8nModel = z.infer; export type ChatHubCustomAgentModel = z.infer; @@ -143,6 +153,7 @@ export const emptyChatModelsResponse: ChatModelsResponse = { google: { models: [] }, azureOpenAi: { models: [] }, ollama: { models: [] }, + awsBedrock: { models: [] }, n8n: { models: [] }, // eslint-disable-next-line @typescript-eslint/naming-convention 'custom-agent': { 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 41a65870f64..feffc3b60a8 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 @@ -452,7 +452,7 @@ export class ChatHubWorkflowService { return { ...common, parameters: { - model: { __rl: true, mode: 'id', value: model }, + model, options: {}, }, }; @@ -465,6 +465,15 @@ export class ChatHubWorkflowService { }, }; } + case 'awsBedrock': { + return { + ...common, + parameters: { + model, + options: {}, + }, + }; + } default: throw new OperationalError('Unsupported model provider'); } 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 51a362d4847..33d02af6611 100644 --- a/packages/cli/src/modules/chat-hub/chat-hub.constants.ts +++ b/packages/cli/src/modules/chat-hub/chat-hub.constants.ts @@ -32,6 +32,10 @@ export const PROVIDER_NODE_TYPE_MAP: Record ({ - name: String(result.value), + name: result.name, description: result.description ?? null, model: { provider: 'google', @@ -331,7 +333,7 @@ export class ChatHubService { return { models: results.map((result) => ({ - name: String(result.value), + name: result.name, description: result.description ?? null, model: { provider: 'ollama', @@ -355,6 +357,111 @@ export class ChatHubService { }; } + private async fetchAwsBedrockModels( + credentials: INodeCredentials, + additionalData: IWorkflowExecuteAdditionalData, + ): Promise { + // From AWS Bedrock node + // https://github.com/n8n-io/n8n/blob/master/packages/%40n8n/nodes-langchain/nodes/llms/LmChatAwsBedrock/LmChatAwsBedrock.node.ts#L100 + // https://github.com/n8n-io/n8n/blob/master/packages/%40n8n/nodes-langchain/nodes/llms/LmChatAwsBedrock/LmChatAwsBedrock.node.ts#L155 + const foundationModelsRequest = this.nodeParametersService.getOptionsViaLoadOptions( + { + routing: { + request: { + method: 'GET', + url: '/foundation-models?&byOutputModality=TEXT&byInferenceType=ON_DEMAND', + }, + output: { + postReceive: [ + { + type: 'rootProperty', + properties: { + property: 'modelSummaries', + }, + }, + { + type: 'setKeyValue', + properties: { + name: '={{$responseItem.modelName}}', + description: '={{$responseItem.modelArn}}', + value: '={{$responseItem.modelId}}', + }, + }, + { + type: 'sort', + properties: { + key: 'name', + }, + }, + ], + }, + }, + }, + additionalData, + PROVIDER_NODE_TYPE_MAP.awsBedrock, + {}, + credentials, + ); + + const inferenceProfileModelsRequest = this.nodeParametersService.getOptionsViaLoadOptions( + { + routing: { + request: { + method: 'GET', + url: '/inference-profiles?maxResults=1000', + }, + output: { + postReceive: [ + { + type: 'rootProperty', + properties: { + property: 'inferenceProfileSummaries', + }, + }, + { + type: 'setKeyValue', + properties: { + name: '={{$responseItem.inferenceProfileName}}', + description: + '={{$responseItem.description || $responseItem.inferenceProfileArn}}', + value: '={{$responseItem.inferenceProfileId}}', + }, + }, + { + type: 'sort', + properties: { + key: 'name', + }, + }, + ], + }, + }, + }, + additionalData, + PROVIDER_NODE_TYPE_MAP.awsBedrock, + {}, + credentials, + ); + + const [foundationModels, inferenceProfileModels] = await Promise.all([ + foundationModelsRequest, + inferenceProfileModelsRequest, + ]); + + return { + models: foundationModels.concat(inferenceProfileModels).map((result) => ({ + name: result.name, + description: result.description ?? String(result.value), + model: { + provider: 'awsBedrock', + model: String(result.value), + }, + createdAt: null, + updatedAt: null, + })), + }; + } + private async fetchAgentWorkflowsAsModels(user: User): Promise { const nodeTypes = [CHAT_TRIGGER_NODE_TYPE]; const workflows = await this.workflowService.getWorkflowsWithNodesIncluded( diff --git a/packages/cli/src/modules/chat-hub/context-limits.ts b/packages/cli/src/modules/chat-hub/context-limits.ts index ca3fde834c4..99b82c46bfa 100644 --- a/packages/cli/src/modules/chat-hub/context-limits.ts +++ b/packages/cli/src/modules/chat-hub/context-limits.ts @@ -139,6 +139,7 @@ export const maxContextWindowTokens: Record = { google: 'Google', azureOpenAi: 'Azure OpenAI', ollama: 'Ollama', + awsBedrock: 'AWS Bedrock', n8n: 'n8n', 'custom-agent': 'Custom Agent', };