feat: Add Ask assistant behind feature flag (#9995)
Co-authored-by: Ricardo Espinoza <ricardo@n8n.io> Co-authored-by: Milorad Filipovic <milorad@n8n.io>
This commit is contained in:
54
packages/cli/src/services/aiAsisstant.service.ts
Normal file
54
packages/cli/src/services/aiAsisstant.service.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
import { Service } from 'typedi';
|
||||
import type { AiAssistantSDK } from '@n8n_io/ai-assistant-sdk';
|
||||
import { AiAssistantClient } from '@n8n_io/ai-assistant-sdk';
|
||||
import { assert, type IUser } from 'n8n-workflow';
|
||||
import { License } from '../License';
|
||||
import { N8N_VERSION } from '../constants';
|
||||
import config from '@/config';
|
||||
import type { AiAssistantRequest } from '@/requests';
|
||||
import type { Response } from 'undici';
|
||||
|
||||
@Service()
|
||||
export class AiAssistantService {
|
||||
private client: AiAssistantClient | undefined;
|
||||
|
||||
constructor(private readonly licenseService: License) {}
|
||||
|
||||
async init() {
|
||||
const aiAssistantEnabled = this.licenseService.isAiAssistantEnabled();
|
||||
if (!aiAssistantEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
const licenseCert = await this.licenseService.loadCertStr();
|
||||
const consumerId = this.licenseService.getConsumerId();
|
||||
const baseUrl = config.get('aiAssistant.baseUrl');
|
||||
const logLevel = config.getEnv('logs.level');
|
||||
|
||||
this.client = new AiAssistantClient({
|
||||
licenseCert,
|
||||
consumerId,
|
||||
n8nVersion: N8N_VERSION,
|
||||
baseUrl,
|
||||
logLevel,
|
||||
});
|
||||
}
|
||||
|
||||
async chat(payload: AiAssistantSDK.ChatRequestPayload, user: IUser): Promise<Response> {
|
||||
if (!this.client) {
|
||||
await this.init();
|
||||
}
|
||||
assert(this.client, 'Assistant client not setup');
|
||||
|
||||
return await this.client.chat(payload, { id: user.id });
|
||||
}
|
||||
|
||||
async applySuggestion(payload: AiAssistantRequest.SuggestionPayload, user: IUser) {
|
||||
if (!this.client) {
|
||||
await this.init();
|
||||
}
|
||||
assert(this.client, 'Assistant client not setup');
|
||||
|
||||
return await this.client.applySuggestion(payload, { id: user.id });
|
||||
}
|
||||
}
|
||||
@@ -160,6 +160,9 @@ export class FrontendService {
|
||||
workflowTagsDisabled: config.getEnv('workflowTagsDisabled'),
|
||||
logLevel: config.getEnv('logs.level'),
|
||||
hiringBannerEnabled: config.getEnv('hiringBanner.enabled'),
|
||||
aiAssistant: {
|
||||
enabled: false,
|
||||
},
|
||||
templates: {
|
||||
enabled: this.globalConfig.templates.enabled,
|
||||
host: this.globalConfig.templates.host,
|
||||
@@ -279,6 +282,7 @@ export class FrontendService {
|
||||
const isS3Selected = config.getEnv('binaryDataManager.mode') === 's3';
|
||||
const isS3Available = config.getEnv('binaryDataManager.availableModes').includes('s3');
|
||||
const isS3Licensed = this.license.isBinaryDataS3Licensed();
|
||||
const isAiAssistantEnabled = this.license.isAiAssistantEnabled();
|
||||
|
||||
this.settings.license.planName = this.license.getPlanName();
|
||||
this.settings.license.consumerId = this.license.getConsumerId();
|
||||
@@ -331,6 +335,10 @@ export class FrontendService {
|
||||
this.settings.missingPackages = this.communityPackagesService.hasMissingPackages;
|
||||
}
|
||||
|
||||
if (isAiAssistantEnabled) {
|
||||
this.settings.aiAssistant.enabled = isAiAssistantEnabled;
|
||||
}
|
||||
|
||||
this.settings.mfa.enabled = config.get('mfa.enabled');
|
||||
|
||||
this.settings.executionMode = config.getEnv('executions.mode');
|
||||
|
||||
Reference in New Issue
Block a user