diff --git a/packages/@n8n/api-types/src/chat-hub.ts b/packages/@n8n/api-types/src/chat-hub.ts index 31b8e68d5ed..ee754a96db0 100644 --- a/packages/@n8n/api-types/src/chat-hub.ts +++ b/packages/@n8n/api-types/src/chat-hub.ts @@ -18,6 +18,7 @@ export const chatHubLLMProviderSchema = z.enum([ 'azureOpenAi', 'ollama', 'awsBedrock', + 'xAiGrok', 'groq', 'openRouter', 'deepSeek', @@ -47,6 +48,7 @@ export const PROVIDER_CREDENTIAL_TYPE_MAP: Record< ollama: 'ollamaApi', azureOpenAi: 'azureOpenAiApi', awsBedrock: 'aws', + xAiGrok: 'xAiApi', groq: 'groqApi', openRouter: 'openRouterApi', deepSeek: 'deepSeekApi', @@ -89,6 +91,11 @@ const awsBedrockModelSchema = z.object({ model: z.string(), }); +const xAiGrokModelSchema = z.object({ + provider: z.literal('xAiGrok'), + model: z.string(), +}); + const groqModelSchema = z.object({ provider: z.literal('groq'), model: z.string(), @@ -131,6 +138,7 @@ export const chatHubConversationModelSchema = z.discriminatedUnion('provider', [ azureOpenAIModelSchema, ollamaModelSchema, awsBedrockModelSchema, + xAiGrokModelSchema, groqModelSchema, openRouterModelSchema, deepSeekModelSchema, @@ -146,6 +154,7 @@ export type ChatHubGoogleModel = z.infer; export type ChatHubAzureOpenAIModel = z.infer; export type ChatHubOllamaModel = z.infer; export type ChatHubAwsBedrockModel = z.infer; +export type ChatHubXAiGrokModel = z.infer; export type ChatHubGroqModel = z.infer; export type ChatHubOpenRouterModel = z.infer; export type ChatHubDeepSeekModel = z.infer; @@ -158,6 +167,7 @@ export type ChatHubBaseLLMModel = | ChatHubAzureOpenAIModel | ChatHubOllamaModel | ChatHubAwsBedrockModel + | ChatHubXAiGrokModel | ChatHubGroqModel | ChatHubOpenRouterModel | ChatHubDeepSeekModel @@ -205,6 +215,7 @@ export const emptyChatModelsResponse: ChatModelsResponse = { azureOpenAi: { models: [] }, ollama: { models: [] }, awsBedrock: { models: [] }, + xAiGrok: { models: [] }, groq: { models: [] }, openRouter: { models: [] }, deepSeek: { 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 c1af38a1cd8..c6bd0a2f2e0 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 @@ -512,6 +512,15 @@ export class ChatHubWorkflowService { }, }; } + case 'xAiGrok': { + return { + ...common, + parameters: { + model, + options: {}, + }, + }; + } case 'groq': { return { ...common, 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 165803519ed..750be59dbfc 100644 --- a/packages/cli/src/modules/chat-hub/chat-hub.constants.ts +++ b/packages/cli/src/modules/chat-hub/chat-hub.constants.ts @@ -36,6 +36,10 @@ export const PROVIDER_NODE_TYPE_MAP: Record { + const results = await this.nodeParametersService.getOptionsViaLoadOptions( + { + routing: { + request: { + method: 'GET', + url: '/models', + }, + output: { + postReceive: [ + { + type: 'rootProperty', + properties: { + property: 'data', + }, + }, + { + type: 'setKeyValue', + properties: { + name: '={{$responseItem.id}}', + value: '={{$responseItem.id}}', + }, + }, + { + type: 'sort', + properties: { + key: 'name', + }, + }, + ], + }, + }, + }, + additionalData, + PROVIDER_NODE_TYPE_MAP.xAiGrok, + {}, + credentials, + ); + + return { + models: results.map((result) => ({ + name: result.name, + description: result.description ?? null, + model: { + provider: 'xAiGrok', + 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 35762011145..6ae0f869e0c 100644 --- a/packages/cli/src/modules/chat-hub/context-limits.ts +++ b/packages/cli/src/modules/chat-hub/context-limits.ts @@ -140,6 +140,7 @@ export const maxContextWindowTokens: Record = { azureOpenAi: 'Azure OpenAI', ollama: 'Ollama', awsBedrock: 'AWS Bedrock', + xAiGrok: 'xAI Grok', groq: 'Groq', openRouter: 'OpenRouter', deepSeek: 'DeepSeek',