import { type CodeExecutionMode, type IExecuteFunctions, type INodeExecutionData, type WorkflowExecuteMode, } from 'n8n-workflow'; import { throwExecutionError } from './throw-execution-error'; export class PythonTaskRunnerSandbox { constructor( private readonly pythonCode: string, private readonly nodeMode: CodeExecutionMode, private readonly workflowMode: WorkflowExecuteMode, private readonly executeFunctions: IExecuteFunctions, ) {} /** * Run a script by forwarding it to a Python task runner, together with input items. * * The Python runner receives input items together with the task, whereas the * JavaScript runner does _not_ receive input items together with the task and * instead retrieves them later, only if needed, via an RPC request. */ async runUsingIncomingItems() { const itemIndex = 0; const node = this.executeFunctions.getNode(); const workflow = this.executeFunctions.getWorkflow(); const taskSettings: Record = { code: this.pythonCode, nodeMode: this.nodeMode, workflowMode: this.workflowMode, continueOnFail: this.executeFunctions.continueOnFail(), items: this.executeFunctions.getInputData(), nodeId: node.id, nodeName: node.name, workflowId: workflow.id, workflowName: workflow.name, }; const executionResult = await this.executeFunctions.startJob( 'python', taskSettings, itemIndex, ); return executionResult.ok ? executionResult.result : throwExecutionError('error' in executionResult ? executionResult.error : {}); } }