n8n
Version:
n8n Workflow Automation Tool
132 lines • 5.68 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SubAgentEvalService = void 0;
const backend_common_1 = require("@n8n/backend-common");
const di_1 = require("@n8n/di");
const instance_ai_1 = require("@n8n/instance-ai");
const node_crypto_1 = require("node:crypto");
const instance_ai_adapter_service_1 = require("../instance-ai.adapter.service");
const instance_ai_service_1 = require("../instance-ai.service");
const sub_agent_roles_1 = require("./sub-agent-roles");
const DEFAULT_TIMEOUT_MS = 120_000;
let SubAgentEvalService = class SubAgentEvalService {
constructor(adapterService, instanceAiService, logger) {
this.adapterService = adapterService;
this.instanceAiService = instanceAiService;
this.logger = logger.scoped('sub-agent-eval');
}
async run(user, request) {
const startMs = Date.now();
const role = (0, sub_agent_roles_1.resolveSubAgentRole)(request.role);
const maxSteps = request.maxSteps ?? role.defaultMaxSteps;
const timeoutMs = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;
const capturedWorkflowIds = [];
const baseContext = this.adapterService.createContext(user);
const context = {
...baseContext,
workflowService: this.wrapWorkflowService(baseContext.workflowService, capturedWorkflowIds),
};
const tools = (0, instance_ai_1.createAllTools)(context);
const modelId = request.modelId ?? (await this.instanceAiService.resolveAgentModelConfig(user));
const agentId = `eval-${role.label}-${(0, node_crypto_1.randomUUID)()}`;
const agent = (0, instance_ai_1.createSubAgent)({
agentId,
role: role.label,
instructions: role.systemPrompt,
tools,
modelId,
});
const abortController = new AbortController();
const timeoutError = new Error(`Sub-agent timed out after ${String(timeoutMs)}ms`);
const timeoutId = setTimeout(() => abortController.abort(timeoutError), timeoutMs);
try {
const result = await agent.generate(request.prompt, {
maxSteps,
abortSignal: abortController.signal,
});
return {
text: result.text ?? '',
toolCalls: serializeToolCalls(result.toolCalls ?? []),
toolResults: serializeToolResults(result.toolResults ?? []),
capturedWorkflowIds,
durationMs: Date.now() - startMs,
...(typeof result.finishReason === 'string' ? { stopReason: result.finishReason } : {}),
};
}
catch (error) {
const message = error instanceof Error ? error.message : String(error);
this.logger.warn('sub-agent eval run failed', { error: message, agentId });
return {
text: '',
toolCalls: [],
toolResults: [],
capturedWorkflowIds,
durationMs: Date.now() - startMs,
error: message,
};
}
finally {
clearTimeout(timeoutId);
}
}
wrapWorkflowService(original, capturedIds) {
const capture = (id) => {
if (!capturedIds.includes(id))
capturedIds.push(id);
};
return {
...original,
createFromWorkflowJSON: async (json) => {
const detail = await original.createFromWorkflowJSON(json);
capture(detail.id);
return detail;
},
updateFromWorkflowJSON: async (workflowId, json) => {
const detail = await original.updateFromWorkflowJSON(workflowId, json);
capture(detail.id);
return detail;
},
};
}
};
exports.SubAgentEvalService = SubAgentEvalService;
exports.SubAgentEvalService = SubAgentEvalService = __decorate([
(0, di_1.Service)(),
__metadata("design:paramtypes", [instance_ai_adapter_service_1.InstanceAiAdapterService,
instance_ai_service_1.InstanceAiService,
backend_common_1.Logger])
], SubAgentEvalService);
function serializeToolCalls(raw) {
return raw.map((tc) => {
const payload = tc.payload;
return {
toolName: payload?.toolName ?? 'unknown',
args: payload?.args,
};
});
}
function serializeToolResults(raw) {
return raw.map((tr) => {
const payload = tr.payload;
const result = payload?.result;
const isError = typeof result === 'object' &&
result !== null &&
'success' in result &&
result.success === false;
return {
toolName: payload?.toolName ?? 'unknown',
result,
isError,
};
});
}
//# sourceMappingURL=sub-agent-eval.service.js.map