@nodetool-ai/agents 0.7.0-rc.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-executor.d.ts +62 -0
- package/dist/agent-executor.d.ts.map +1 -0
- package/dist/agent-executor.js +324 -0
- package/dist/agent-executor.js.map +1 -0
- package/dist/agent-step-executor.d.ts +28 -0
- package/dist/agent-step-executor.d.ts.map +1 -0
- package/dist/agent-step-executor.js +99 -0
- package/dist/agent-step-executor.js.map +1 -0
- package/dist/agent-workflow-runner.d.ts +31 -0
- package/dist/agent-workflow-runner.d.ts.map +1 -0
- package/dist/agent-workflow-runner.js +124 -0
- package/dist/agent-workflow-runner.js.map +1 -0
- package/dist/agent.d.ts +115 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +587 -0
- package/dist/agent.js.map +1 -0
- package/dist/base-agent.d.ts +42 -0
- package/dist/base-agent.d.ts.map +1 -0
- package/dist/base-agent.js +29 -0
- package/dist/base-agent.js.map +1 -0
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -0
- package/dist/graph-builder.d.ts +49 -0
- package/dist/graph-builder.d.ts.map +1 -0
- package/dist/graph-builder.js +206 -0
- package/dist/graph-builder.js.map +1 -0
- package/dist/graph-planner.d.ts +56 -0
- package/dist/graph-planner.d.ts.map +1 -0
- package/dist/graph-planner.js +311 -0
- package/dist/graph-planner.js.map +1 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/js-sandbox.d.ts +84 -0
- package/dist/js-sandbox.d.ts.map +1 -0
- package/dist/js-sandbox.js +654 -0
- package/dist/js-sandbox.js.map +1 -0
- package/dist/multi-mode-agent.d.ts +86 -0
- package/dist/multi-mode-agent.d.ts.map +1 -0
- package/dist/multi-mode-agent.js +476 -0
- package/dist/multi-mode-agent.js.map +1 -0
- package/dist/output-format.d.ts +10 -0
- package/dist/output-format.d.ts.map +1 -0
- package/dist/output-format.js +17 -0
- package/dist/output-format.js.map +1 -0
- package/dist/parallel-task-executor.d.ts +87 -0
- package/dist/parallel-task-executor.d.ts.map +1 -0
- package/dist/parallel-task-executor.js +332 -0
- package/dist/parallel-task-executor.js.map +1 -0
- package/dist/prompts/graph-planner-prompt.d.ts +48 -0
- package/dist/prompts/graph-planner-prompt.d.ts.map +1 -0
- package/dist/prompts/graph-planner-prompt.js +180 -0
- package/dist/prompts/graph-planner-prompt.js.map +1 -0
- package/dist/reject-agentic-provider.d.ts +21 -0
- package/dist/reject-agentic-provider.d.ts.map +1 -0
- package/dist/reject-agentic-provider.js +32 -0
- package/dist/reject-agentic-provider.js.map +1 -0
- package/dist/simple-agent.d.ts +29 -0
- package/dist/simple-agent.d.ts.map +1 -0
- package/dist/simple-agent.js +54 -0
- package/dist/simple-agent.js.map +1 -0
- package/dist/step-executor.d.ts +162 -0
- package/dist/step-executor.d.ts.map +1 -0
- package/dist/step-executor.js +1114 -0
- package/dist/step-executor.js.map +1 -0
- package/dist/sub-agent-planner.d.ts +33 -0
- package/dist/sub-agent-planner.d.ts.map +1 -0
- package/dist/sub-agent-planner.js +203 -0
- package/dist/sub-agent-planner.js.map +1 -0
- package/dist/task-executor.d.ts +89 -0
- package/dist/task-executor.d.ts.map +1 -0
- package/dist/task-executor.js +359 -0
- package/dist/task-executor.js.map +1 -0
- package/dist/task-planner.d.ts +44 -0
- package/dist/task-planner.d.ts.map +1 -0
- package/dist/task-planner.js +532 -0
- package/dist/task-planner.js.map +1 -0
- package/dist/team/db-task-board.d.ts +54 -0
- package/dist/team/db-task-board.d.ts.map +1 -0
- package/dist/team/db-task-board.js +361 -0
- package/dist/team/db-task-board.js.map +1 -0
- package/dist/team/edge-message-bus.d.ts +51 -0
- package/dist/team/edge-message-bus.d.ts.map +1 -0
- package/dist/team/edge-message-bus.js +169 -0
- package/dist/team/edge-message-bus.js.map +1 -0
- package/dist/team/edge-task-board.d.ts +77 -0
- package/dist/team/edge-task-board.d.ts.map +1 -0
- package/dist/team/edge-task-board.js +140 -0
- package/dist/team/edge-task-board.js.map +1 -0
- package/dist/team/index.d.ts +16 -0
- package/dist/team/index.d.ts.map +1 -0
- package/dist/team/index.js +17 -0
- package/dist/team/index.js.map +1 -0
- package/dist/team/message-bus.d.ts +58 -0
- package/dist/team/message-bus.d.ts.map +1 -0
- package/dist/team/message-bus.js +151 -0
- package/dist/team/message-bus.js.map +1 -0
- package/dist/team/task-board.d.ts +106 -0
- package/dist/team/task-board.d.ts.map +1 -0
- package/dist/team/task-board.js +370 -0
- package/dist/team/task-board.js.map +1 -0
- package/dist/team/team-executor.d.ts +72 -0
- package/dist/team/team-executor.d.ts.map +1 -0
- package/dist/team/team-executor.js +466 -0
- package/dist/team/team-executor.js.map +1 -0
- package/dist/team/team-tools.d.ts +252 -0
- package/dist/team/team-tools.d.ts.map +1 -0
- package/dist/team/team-tools.js +412 -0
- package/dist/team/team-tools.js.map +1 -0
- package/dist/team/types.d.ts +198 -0
- package/dist/team/types.d.ts.map +1 -0
- package/dist/team/types.js +8 -0
- package/dist/team/types.js.map +1 -0
- package/dist/tools/add-edge-tool.d.ts +18 -0
- package/dist/tools/add-edge-tool.d.ts.map +1 -0
- package/dist/tools/add-edge-tool.js +92 -0
- package/dist/tools/add-edge-tool.js.map +1 -0
- package/dist/tools/add-node-tool.d.ts +22 -0
- package/dist/tools/add-node-tool.d.ts.map +1 -0
- package/dist/tools/add-node-tool.js +128 -0
- package/dist/tools/add-node-tool.js.map +1 -0
- package/dist/tools/asset-tools.d.ts +58 -0
- package/dist/tools/asset-tools.d.ts.map +1 -0
- package/dist/tools/asset-tools.js +191 -0
- package/dist/tools/asset-tools.js.map +1 -0
- package/dist/tools/base-tool.d.ts +25 -0
- package/dist/tools/base-tool.d.ts.map +1 -0
- package/dist/tools/base-tool.js +24 -0
- package/dist/tools/base-tool.js.map +1 -0
- package/dist/tools/browser-tools.d.ts +32 -0
- package/dist/tools/browser-tools.d.ts.map +1 -0
- package/dist/tools/browser-tools.js +208 -0
- package/dist/tools/browser-tools.js.map +1 -0
- package/dist/tools/calculator-tool.d.ts +24 -0
- package/dist/tools/calculator-tool.d.ts.map +1 -0
- package/dist/tools/calculator-tool.js +64 -0
- package/dist/tools/calculator-tool.js.map +1 -0
- package/dist/tools/claude-code-tools.d.ts +96 -0
- package/dist/tools/claude-code-tools.d.ts.map +1 -0
- package/dist/tools/claude-code-tools.js +463 -0
- package/dist/tools/claude-code-tools.js.map +1 -0
- package/dist/tools/code-tools.d.ts +26 -0
- package/dist/tools/code-tools.d.ts.map +1 -0
- package/dist/tools/code-tools.js +82 -0
- package/dist/tools/code-tools.js.map +1 -0
- package/dist/tools/control-tool.d.ts +47 -0
- package/dist/tools/control-tool.d.ts.map +1 -0
- package/dist/tools/control-tool.js +101 -0
- package/dist/tools/control-tool.js.map +1 -0
- package/dist/tools/create-plan-tool.d.ts +29 -0
- package/dist/tools/create-plan-tool.d.ts.map +1 -0
- package/dist/tools/create-plan-tool.js +355 -0
- package/dist/tools/create-plan-tool.js.map +1 -0
- package/dist/tools/create-task-tool.d.ts +28 -0
- package/dist/tools/create-task-tool.d.ts.map +1 -0
- package/dist/tools/create-task-tool.js +254 -0
- package/dist/tools/create-task-tool.js.map +1 -0
- package/dist/tools/dataseo-tools.d.ts +38 -0
- package/dist/tools/dataseo-tools.d.ts.map +1 -0
- package/dist/tools/dataseo-tools.js +329 -0
- package/dist/tools/dataseo-tools.js.map +1 -0
- package/dist/tools/email-tools.d.ts +76 -0
- package/dist/tools/email-tools.d.ts.map +1 -0
- package/dist/tools/email-tools.js +259 -0
- package/dist/tools/email-tools.js.map +1 -0
- package/dist/tools/filesystem-tools.d.ts +77 -0
- package/dist/tools/filesystem-tools.d.ts.map +1 -0
- package/dist/tools/filesystem-tools.js +334 -0
- package/dist/tools/filesystem-tools.js.map +1 -0
- package/dist/tools/find-model-tool.d.ts +25 -0
- package/dist/tools/find-model-tool.d.ts.map +1 -0
- package/dist/tools/find-model-tool.js +236 -0
- package/dist/tools/find-model-tool.js.map +1 -0
- package/dist/tools/finish-graph-tool.d.ts +23 -0
- package/dist/tools/finish-graph-tool.d.ts.map +1 -0
- package/dist/tools/finish-graph-tool.js +46 -0
- package/dist/tools/finish-graph-tool.js.map +1 -0
- package/dist/tools/finish-step-tool.d.ts +16 -0
- package/dist/tools/finish-step-tool.d.ts.map +1 -0
- package/dist/tools/finish-step-tool.js +68 -0
- package/dist/tools/finish-step-tool.js.map +1 -0
- package/dist/tools/google-tools.d.ts +44 -0
- package/dist/tools/google-tools.d.ts.map +1 -0
- package/dist/tools/google-tools.js +176 -0
- package/dist/tools/google-tools.js.map +1 -0
- package/dist/tools/http-tools.d.ts +56 -0
- package/dist/tools/http-tools.d.ts.map +1 -0
- package/dist/tools/http-tools.js +180 -0
- package/dist/tools/http-tools.js.map +1 -0
- package/dist/tools/js-code-tool.d.ts +30 -0
- package/dist/tools/js-code-tool.d.ts.map +1 -0
- package/dist/tools/js-code-tool.js +98 -0
- package/dist/tools/js-code-tool.js.map +1 -0
- package/dist/tools/local-get-node-info-tool.d.ts +19 -0
- package/dist/tools/local-get-node-info-tool.d.ts.map +1 -0
- package/dist/tools/local-get-node-info-tool.js +75 -0
- package/dist/tools/local-get-node-info-tool.js.map +1 -0
- package/dist/tools/local-list-nodes-tool.d.ts +19 -0
- package/dist/tools/local-list-nodes-tool.d.ts.map +1 -0
- package/dist/tools/local-list-nodes-tool.js +69 -0
- package/dist/tools/local-list-nodes-tool.js.map +1 -0
- package/dist/tools/local-search-nodes-tool.d.ts +21 -0
- package/dist/tools/local-search-nodes-tool.d.ts.map +1 -0
- package/dist/tools/local-search-nodes-tool.js +111 -0
- package/dist/tools/local-search-nodes-tool.js.map +1 -0
- package/dist/tools/math-tools.d.ts +156 -0
- package/dist/tools/math-tools.d.ts.map +1 -0
- package/dist/tools/math-tools.js +422 -0
- package/dist/tools/math-tools.js.map +1 -0
- package/dist/tools/mcp-tools.d.ts +413 -0
- package/dist/tools/mcp-tools.d.ts.map +1 -0
- package/dist/tools/mcp-tools.js +618 -0
- package/dist/tools/mcp-tools.js.map +1 -0
- package/dist/tools/media-tools.d.ts +277 -0
- package/dist/tools/media-tools.d.ts.map +1 -0
- package/dist/tools/media-tools.js +682 -0
- package/dist/tools/media-tools.js.map +1 -0
- package/dist/tools/model-tools.d.ts +25 -0
- package/dist/tools/model-tools.d.ts.map +1 -0
- package/dist/tools/model-tools.js +48 -0
- package/dist/tools/model-tools.js.map +1 -0
- package/dist/tools/openai-tools.d.ts +73 -0
- package/dist/tools/openai-tools.d.ts.map +1 -0
- package/dist/tools/openai-tools.js +193 -0
- package/dist/tools/openai-tools.js.map +1 -0
- package/dist/tools/pdf-tools.d.ts +152 -0
- package/dist/tools/pdf-tools.d.ts.map +1 -0
- package/dist/tools/pdf-tools.js +339 -0
- package/dist/tools/pdf-tools.js.map +1 -0
- package/dist/tools/plan-builder-tools.d.ts +72 -0
- package/dist/tools/plan-builder-tools.d.ts.map +1 -0
- package/dist/tools/plan-builder-tools.js +438 -0
- package/dist/tools/plan-builder-tools.js.map +1 -0
- package/dist/tools/search-tools.d.ts +39 -0
- package/dist/tools/search-tools.d.ts.map +1 -0
- package/dist/tools/search-tools.js +218 -0
- package/dist/tools/search-tools.js.map +1 -0
- package/dist/tools/serp-providers/dataforseo-provider.d.ts +14 -0
- package/dist/tools/serp-providers/dataforseo-provider.d.ts.map +1 -0
- package/dist/tools/serp-providers/dataforseo-provider.js +114 -0
- package/dist/tools/serp-providers/dataforseo-provider.js.map +1 -0
- package/dist/tools/serp-providers/index.d.ts +35 -0
- package/dist/tools/serp-providers/index.d.ts.map +1 -0
- package/dist/tools/serp-providers/index.js +14 -0
- package/dist/tools/serp-providers/index.js.map +1 -0
- package/dist/tools/serp-providers/serpapi-provider.d.ts +18 -0
- package/dist/tools/serp-providers/serpapi-provider.d.ts.map +1 -0
- package/dist/tools/serp-providers/serpapi-provider.js +66 -0
- package/dist/tools/serp-providers/serpapi-provider.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +9 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +17 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/vector-tools.d.ts +224 -0
- package/dist/tools/vector-tools.d.ts.map +1 -0
- package/dist/tools/vector-tools.js +582 -0
- package/dist/tools/vector-tools.js.map +1 -0
- package/dist/tools/workspace-tools.d.ts +58 -0
- package/dist/tools/workspace-tools.d.ts.map +1 -0
- package/dist/tools/workspace-tools.js +152 -0
- package/dist/tools/workspace-tools.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/json-parser.d.ts +15 -0
- package/dist/utils/json-parser.d.ts.map +1 -0
- package/dist/utils/json-parser.js +78 -0
- package/dist/utils/json-parser.js.map +1 -0
- package/dist/utils/remove-base64-images.d.ts +12 -0
- package/dist/utils/remove-base64-images.d.ts.map +1 -0
- package/dist/utils/remove-base64-images.js +20 -0
- package/dist/utils/remove-base64-images.js.map +1 -0
- package/dist/utils/wrap-generators-parallel.d.ts +11 -0
- package/dist/utils/wrap-generators-parallel.d.ts.map +1 -0
- package/dist/utils/wrap-generators-parallel.js +38 -0
- package/dist/utils/wrap-generators-parallel.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ParallelTaskExecutor -- orchestrates parallel execution of a multi-task plan.
|
|
3
|
+
*
|
|
4
|
+
* Each task in the plan runs as an independent sub-agent via TaskExecutor.
|
|
5
|
+
* Tasks form a DAG via their `dependsOn` arrays. Independent tasks
|
|
6
|
+
* (those with no unmet dependencies) run concurrently.
|
|
7
|
+
*
|
|
8
|
+
* Flow:
|
|
9
|
+
* TaskPlan (multiple Tasks) → ParallelTaskExecutor
|
|
10
|
+
* → finds tasks with satisfied dependencies
|
|
11
|
+
* → runs them concurrently, each via TaskExecutor
|
|
12
|
+
* → stores results in shared context
|
|
13
|
+
* → repeats until all tasks complete
|
|
14
|
+
*/
|
|
15
|
+
import type { BaseProvider } from "@nodetool-ai/runtime";
|
|
16
|
+
import type { ProcessingContext } from "@nodetool-ai/runtime";
|
|
17
|
+
import type { ProcessingMessage } from "@nodetool-ai/protocol";
|
|
18
|
+
import type { Tool } from "./tools/base-tool.js";
|
|
19
|
+
import type { TaskPlan } from "./types.js";
|
|
20
|
+
export interface ParallelTaskExecutorOptions {
|
|
21
|
+
provider: BaseProvider;
|
|
22
|
+
model: string;
|
|
23
|
+
context: ProcessingContext;
|
|
24
|
+
tools: Tool[];
|
|
25
|
+
taskPlan: TaskPlan;
|
|
26
|
+
systemPrompt?: string;
|
|
27
|
+
inputs?: Record<string, unknown>;
|
|
28
|
+
/** Maximum total iteration count across all tasks. */
|
|
29
|
+
maxIterations?: number;
|
|
30
|
+
/** Maximum iterations per step within a task. */
|
|
31
|
+
maxStepIterations?: number;
|
|
32
|
+
maxTokenLimit?: number;
|
|
33
|
+
}
|
|
34
|
+
export declare class ParallelTaskExecutor {
|
|
35
|
+
private readonly provider;
|
|
36
|
+
private readonly model;
|
|
37
|
+
private readonly tools;
|
|
38
|
+
private readonly taskPlan;
|
|
39
|
+
private readonly context;
|
|
40
|
+
private readonly inputs;
|
|
41
|
+
private readonly systemPrompt;
|
|
42
|
+
private readonly maxIterations;
|
|
43
|
+
private readonly maxStepIterations;
|
|
44
|
+
private readonly maxTokenLimit;
|
|
45
|
+
/** Results collected per task ID. */
|
|
46
|
+
private readonly taskResults;
|
|
47
|
+
constructor(opts: ParallelTaskExecutorOptions);
|
|
48
|
+
/**
|
|
49
|
+
* Execute all tasks in the plan, respecting inter-task dependencies.
|
|
50
|
+
* Independent tasks run concurrently as separate sub-agents.
|
|
51
|
+
*/
|
|
52
|
+
execute(): AsyncGenerator<ProcessingMessage>;
|
|
53
|
+
/**
|
|
54
|
+
* Execute a single task as an independent sub-agent.
|
|
55
|
+
* Injects dependency results into the task's context before execution.
|
|
56
|
+
*/
|
|
57
|
+
private executeTask;
|
|
58
|
+
/**
|
|
59
|
+
* Build a map of dependency results for a task.
|
|
60
|
+
*/
|
|
61
|
+
private buildDependencyContext;
|
|
62
|
+
/**
|
|
63
|
+
* Build system prompt enhanced with dependency results.
|
|
64
|
+
*/
|
|
65
|
+
private buildTaskSystemPrompt;
|
|
66
|
+
/**
|
|
67
|
+
* Check if all tasks have been completed.
|
|
68
|
+
*/
|
|
69
|
+
private allTasksComplete;
|
|
70
|
+
/**
|
|
71
|
+
* Find tasks whose dependencies are all satisfied.
|
|
72
|
+
*/
|
|
73
|
+
private getExecutableTasks;
|
|
74
|
+
/**
|
|
75
|
+
* Get the result of a specific task.
|
|
76
|
+
*/
|
|
77
|
+
getTaskResult(taskId: string): unknown;
|
|
78
|
+
/**
|
|
79
|
+
* Get all task results.
|
|
80
|
+
*/
|
|
81
|
+
getAllResults(): Record<string, unknown>;
|
|
82
|
+
/**
|
|
83
|
+
* Get the result of the final task (last task in the plan, typically the aggregator).
|
|
84
|
+
*/
|
|
85
|
+
getFinalResult(): unknown;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=parallel-task-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-task-executor.d.ts","sourceRoot":"","sources":["../src/parallel-task-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EACV,iBAAiB,EAKlB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQjD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAE9C,IAAI,EAAE,2BAA2B;IAc7C;;;OAGG;IACI,OAAO,IAAI,cAAc,CAAC,iBAAiB,CAAC;IAiFnD;;;OAGG;YACY,WAAW;IAuF1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACH,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQxC;;OAEG;IACH,cAAc,IAAI,OAAO;CAK1B"}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ParallelTaskExecutor -- orchestrates parallel execution of a multi-task plan.
|
|
3
|
+
*
|
|
4
|
+
* Each task in the plan runs as an independent sub-agent via TaskExecutor.
|
|
5
|
+
* Tasks form a DAG via their `dependsOn` arrays. Independent tasks
|
|
6
|
+
* (those with no unmet dependencies) run concurrently.
|
|
7
|
+
*
|
|
8
|
+
* Flow:
|
|
9
|
+
* TaskPlan (multiple Tasks) → ParallelTaskExecutor
|
|
10
|
+
* → finds tasks with satisfied dependencies
|
|
11
|
+
* → runs them concurrently, each via TaskExecutor
|
|
12
|
+
* → stores results in shared context
|
|
13
|
+
* → repeats until all tasks complete
|
|
14
|
+
*/
|
|
15
|
+
import { createLogger } from "@nodetool-ai/config";
|
|
16
|
+
import { TaskUpdateEvent } from "@nodetool-ai/protocol";
|
|
17
|
+
import { TaskExecutor } from "./task-executor.js";
|
|
18
|
+
import { DEFAULT_TOKEN_LIMIT } from "./constants.js";
|
|
19
|
+
const log = createLogger("nodetool.agents.parallel-task-executor");
|
|
20
|
+
const DEFAULT_MAX_TASK_ITERATIONS = 100;
|
|
21
|
+
const DEFAULT_MAX_STEP_ITERATIONS = 10;
|
|
22
|
+
export class ParallelTaskExecutor {
|
|
23
|
+
provider;
|
|
24
|
+
model;
|
|
25
|
+
tools;
|
|
26
|
+
taskPlan;
|
|
27
|
+
context;
|
|
28
|
+
inputs;
|
|
29
|
+
systemPrompt;
|
|
30
|
+
maxIterations;
|
|
31
|
+
maxStepIterations;
|
|
32
|
+
maxTokenLimit;
|
|
33
|
+
/** Results collected per task ID. */
|
|
34
|
+
taskResults = new Map();
|
|
35
|
+
constructor(opts) {
|
|
36
|
+
this.provider = opts.provider;
|
|
37
|
+
this.model = opts.model;
|
|
38
|
+
this.tools = opts.tools;
|
|
39
|
+
this.taskPlan = opts.taskPlan;
|
|
40
|
+
this.context = opts.context;
|
|
41
|
+
this.inputs = opts.inputs ?? {};
|
|
42
|
+
this.systemPrompt = opts.systemPrompt;
|
|
43
|
+
this.maxIterations = opts.maxIterations ?? DEFAULT_MAX_TASK_ITERATIONS;
|
|
44
|
+
this.maxStepIterations =
|
|
45
|
+
opts.maxStepIterations ?? DEFAULT_MAX_STEP_ITERATIONS;
|
|
46
|
+
this.maxTokenLimit = opts.maxTokenLimit ?? DEFAULT_TOKEN_LIMIT;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Execute all tasks in the plan, respecting inter-task dependencies.
|
|
50
|
+
* Independent tasks run concurrently as separate sub-agents.
|
|
51
|
+
*/
|
|
52
|
+
async *execute() {
|
|
53
|
+
// Seed inputs into context
|
|
54
|
+
for (const [key, value] of Object.entries(this.inputs)) {
|
|
55
|
+
this.context.set(key, value);
|
|
56
|
+
}
|
|
57
|
+
const totalTasks = this.taskPlan.tasks.length;
|
|
58
|
+
log.info("Parallel task execution started", {
|
|
59
|
+
title: this.taskPlan.title,
|
|
60
|
+
tasks: totalTasks
|
|
61
|
+
});
|
|
62
|
+
yield {
|
|
63
|
+
type: "log_update",
|
|
64
|
+
node_id: "parallel_task_executor",
|
|
65
|
+
node_name: "ParallelTaskExecutor",
|
|
66
|
+
content: `Starting parallel execution of ${totalTasks} tasks...`,
|
|
67
|
+
severity: "info"
|
|
68
|
+
};
|
|
69
|
+
let iterations = 0;
|
|
70
|
+
while (!this.allTasksComplete() && iterations < this.maxIterations) {
|
|
71
|
+
iterations++;
|
|
72
|
+
const executableTasks = this.getExecutableTasks();
|
|
73
|
+
if (executableTasks.length === 0) {
|
|
74
|
+
if (!this.allTasksComplete()) {
|
|
75
|
+
yield {
|
|
76
|
+
type: "chunk",
|
|
77
|
+
content: "\nNo executable tasks but not all complete. Possible dependency issues.\n",
|
|
78
|
+
done: false
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
const taskIds = executableTasks.map((t) => t.id);
|
|
84
|
+
log.debug("Dispatching parallel tasks", { taskIds });
|
|
85
|
+
yield {
|
|
86
|
+
type: "log_update",
|
|
87
|
+
node_id: "parallel_task_executor",
|
|
88
|
+
node_name: "ParallelTaskExecutor",
|
|
89
|
+
content: `Running ${executableTasks.length} task(s) in parallel: ${taskIds.join(", ")}`,
|
|
90
|
+
severity: "info"
|
|
91
|
+
};
|
|
92
|
+
// Create task executors — each task runs as its own sub-agent
|
|
93
|
+
const taskGenerators = executableTasks.map((task) => {
|
|
94
|
+
return this.executeTask(task);
|
|
95
|
+
});
|
|
96
|
+
if (taskGenerators.length > 1) {
|
|
97
|
+
// Execute all tasks concurrently, merging yielded messages
|
|
98
|
+
yield* mergeAsyncGenerators(taskGenerators);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Single task — no need for merge overhead
|
|
102
|
+
for await (const message of taskGenerators[0]) {
|
|
103
|
+
yield message;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (iterations >= this.maxIterations) {
|
|
108
|
+
log.warn("Max iterations reached", {
|
|
109
|
+
iterations,
|
|
110
|
+
completedTasks: this.taskPlan.tasks.filter((t) => t.completed).length,
|
|
111
|
+
totalTasks
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
log.info("Parallel task execution completed", {
|
|
115
|
+
title: this.taskPlan.title,
|
|
116
|
+
completedTasks: this.taskPlan.tasks.filter((t) => t.completed).length,
|
|
117
|
+
totalTasks
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Execute a single task as an independent sub-agent.
|
|
122
|
+
* Injects dependency results into the task's context before execution.
|
|
123
|
+
*/
|
|
124
|
+
async *executeTask(task) {
|
|
125
|
+
// Mark task as started
|
|
126
|
+
task.completed = false;
|
|
127
|
+
yield {
|
|
128
|
+
type: "task_update",
|
|
129
|
+
event: TaskUpdateEvent.TaskCreated,
|
|
130
|
+
task: {
|
|
131
|
+
id: task.id,
|
|
132
|
+
title: task.title,
|
|
133
|
+
description: task.description,
|
|
134
|
+
steps: task.steps.map((s) => ({
|
|
135
|
+
id: s.id,
|
|
136
|
+
instructions: s.instructions,
|
|
137
|
+
completed: s.completed
|
|
138
|
+
}))
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
// Build context with dependency results
|
|
142
|
+
const depContext = this.buildDependencyContext(task);
|
|
143
|
+
// Build enhanced system prompt with dependency information
|
|
144
|
+
const enhancedPrompt = this.buildTaskSystemPrompt(task, depContext);
|
|
145
|
+
// Create TaskExecutor for this task's steps
|
|
146
|
+
const executor = new TaskExecutor({
|
|
147
|
+
provider: this.provider,
|
|
148
|
+
model: this.model,
|
|
149
|
+
context: this.context,
|
|
150
|
+
tools: [...this.tools],
|
|
151
|
+
task,
|
|
152
|
+
systemPrompt: enhancedPrompt,
|
|
153
|
+
inputs: { ...this.inputs, ...depContext },
|
|
154
|
+
maxSteps: task.steps.length + 5, // Allow some slack
|
|
155
|
+
maxStepIterations: this.maxStepIterations,
|
|
156
|
+
maxTokenLimit: this.maxTokenLimit,
|
|
157
|
+
parallelExecution: true // Enable parallel step execution within each task
|
|
158
|
+
});
|
|
159
|
+
let taskResult = null;
|
|
160
|
+
for await (const item of executor.executeTasks()) {
|
|
161
|
+
if (item.type === "step_result") {
|
|
162
|
+
const stepResult = item;
|
|
163
|
+
if (stepResult.is_task_result) {
|
|
164
|
+
taskResult = stepResult.result;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
yield item;
|
|
168
|
+
}
|
|
169
|
+
// Store task result in shared context and mark complete
|
|
170
|
+
if (taskResult !== null && taskResult !== undefined) {
|
|
171
|
+
this.taskResults.set(task.id, taskResult);
|
|
172
|
+
this.context.set(task.id, taskResult);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
// Use last step result as task result
|
|
176
|
+
const lastStep = task.steps[task.steps.length - 1];
|
|
177
|
+
if (lastStep) {
|
|
178
|
+
const lastResult = this.context.get(lastStep.id);
|
|
179
|
+
if (lastResult !== undefined) {
|
|
180
|
+
this.taskResults.set(task.id, lastResult);
|
|
181
|
+
this.context.set(task.id, lastResult);
|
|
182
|
+
taskResult = lastResult;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
task.completed = true;
|
|
187
|
+
yield {
|
|
188
|
+
type: "task_update",
|
|
189
|
+
event: TaskUpdateEvent.TaskCompleted,
|
|
190
|
+
task: {
|
|
191
|
+
id: task.id,
|
|
192
|
+
title: task.title,
|
|
193
|
+
result: taskResult
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
log.info("Task completed", {
|
|
197
|
+
taskId: task.id,
|
|
198
|
+
title: task.title
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Build a map of dependency results for a task.
|
|
203
|
+
*/
|
|
204
|
+
buildDependencyContext(task) {
|
|
205
|
+
const depContext = {};
|
|
206
|
+
for (const depId of task.dependsOn ?? []) {
|
|
207
|
+
const result = this.taskResults.get(depId);
|
|
208
|
+
if (result !== undefined) {
|
|
209
|
+
depContext[depId] = result;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return depContext;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Build system prompt enhanced with dependency results.
|
|
216
|
+
*/
|
|
217
|
+
buildTaskSystemPrompt(task, depContext) {
|
|
218
|
+
const parts = [];
|
|
219
|
+
if (this.systemPrompt) {
|
|
220
|
+
parts.push(this.systemPrompt);
|
|
221
|
+
}
|
|
222
|
+
if (Object.keys(depContext).length > 0) {
|
|
223
|
+
parts.push("\n# Results from prerequisite tasks:");
|
|
224
|
+
for (const [depId, result] of Object.entries(depContext)) {
|
|
225
|
+
const depTask = this.taskPlan.tasks.find((t) => t.id === depId);
|
|
226
|
+
const depTitle = depTask?.title ?? depId;
|
|
227
|
+
const resultStr = typeof result === "string"
|
|
228
|
+
? result
|
|
229
|
+
: JSON.stringify(result, null, 2);
|
|
230
|
+
parts.push(`\n## ${depTitle} (${depId}):\n${resultStr}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return parts.length > 0 ? parts.join("\n") : undefined;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Check if all tasks have been completed.
|
|
237
|
+
*/
|
|
238
|
+
allTasksComplete() {
|
|
239
|
+
return this.taskPlan.tasks.every((task) => task.completed);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Find tasks whose dependencies are all satisfied.
|
|
243
|
+
*/
|
|
244
|
+
getExecutableTasks() {
|
|
245
|
+
const completedIds = new Set(this.taskPlan.tasks
|
|
246
|
+
.filter((t) => t.completed)
|
|
247
|
+
.map((t) => t.id));
|
|
248
|
+
// Input keys also count as satisfied dependencies
|
|
249
|
+
for (const key of Object.keys(this.inputs)) {
|
|
250
|
+
completedIds.add(key);
|
|
251
|
+
}
|
|
252
|
+
return this.taskPlan.tasks.filter((task) => !task.completed &&
|
|
253
|
+
(task.dependsOn ?? []).every((dep) => completedIds.has(dep)));
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Get the result of a specific task.
|
|
257
|
+
*/
|
|
258
|
+
getTaskResult(taskId) {
|
|
259
|
+
return this.taskResults.get(taskId);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get all task results.
|
|
263
|
+
*/
|
|
264
|
+
getAllResults() {
|
|
265
|
+
const results = {};
|
|
266
|
+
for (const [id, result] of this.taskResults) {
|
|
267
|
+
results[id] = result;
|
|
268
|
+
}
|
|
269
|
+
return results;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Get the result of the final task (last task in the plan, typically the aggregator).
|
|
273
|
+
*/
|
|
274
|
+
getFinalResult() {
|
|
275
|
+
if (this.taskPlan.tasks.length === 0)
|
|
276
|
+
return null;
|
|
277
|
+
const lastTask = this.taskPlan.tasks[this.taskPlan.tasks.length - 1];
|
|
278
|
+
return this.taskResults.get(lastTask.id) ?? null;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// ---------------------------------------------------------------------------
|
|
282
|
+
// Async generator merge utility
|
|
283
|
+
// ---------------------------------------------------------------------------
|
|
284
|
+
async function* mergeAsyncGenerators(generators) {
|
|
285
|
+
const queue = [];
|
|
286
|
+
let activeCount = generators.length;
|
|
287
|
+
let resolve = null;
|
|
288
|
+
let firstError = undefined;
|
|
289
|
+
function notify() {
|
|
290
|
+
if (resolve) {
|
|
291
|
+
const r = resolve;
|
|
292
|
+
resolve = null;
|
|
293
|
+
r();
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
const tasks = generators.map(async (gen) => {
|
|
297
|
+
try {
|
|
298
|
+
for await (const item of gen) {
|
|
299
|
+
queue.push(item);
|
|
300
|
+
notify();
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch (e) {
|
|
304
|
+
if (firstError === undefined)
|
|
305
|
+
firstError = e;
|
|
306
|
+
}
|
|
307
|
+
finally {
|
|
308
|
+
activeCount--;
|
|
309
|
+
notify();
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
while (activeCount > 0 || queue.length > 0) {
|
|
313
|
+
if (queue.length > 0) {
|
|
314
|
+
yield queue.shift();
|
|
315
|
+
}
|
|
316
|
+
else if (activeCount > 0) {
|
|
317
|
+
const waitPromise = new Promise((r) => {
|
|
318
|
+
resolve = r;
|
|
319
|
+
});
|
|
320
|
+
if (queue.length > 0) {
|
|
321
|
+
resolve = null;
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
await waitPromise;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
await Promise.allSettled(tasks);
|
|
328
|
+
if (firstError !== undefined) {
|
|
329
|
+
throw firstError;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=parallel-task-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-task-executor.js","sourceRoot":"","sources":["../src/parallel-task-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphPlanner system prompt and the curated catalog of generic AI nodes
|
|
3
|
+
* that the workflow-building agent must prefer over provider-specific nodes.
|
|
4
|
+
*
|
|
5
|
+
* Centralized here so the prompt's table and the runtime catalog can't drift.
|
|
6
|
+
*/
|
|
7
|
+
import { PROVIDER_NAMESPACES } from "@nodetool-ai/node-sdk";
|
|
8
|
+
export type GenericNodeCapability = "text_to_image" | "image_to_image" | "text_to_video" | "image_to_video" | "text_to_speech" | "automatic_speech_recognition" | "generate_embedding" | "generate_message";
|
|
9
|
+
export interface GenericAINode {
|
|
10
|
+
/** Fully-qualified node_type to pass to add_node. */
|
|
11
|
+
type: string;
|
|
12
|
+
/** Provider capability used to look up models via `find_model`. */
|
|
13
|
+
capability: GenericNodeCapability;
|
|
14
|
+
/** Human-readable task label used in the prompt table. */
|
|
15
|
+
task: string;
|
|
16
|
+
/** One-line description shown to the agent. */
|
|
17
|
+
summary: string;
|
|
18
|
+
/**
|
|
19
|
+
* Whether this node accepts a `model` property of the form `{provider, id}`.
|
|
20
|
+
* `false` for AgentStep, which inherits the workflow's configured model.
|
|
21
|
+
*/
|
|
22
|
+
acceptsModel: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Curated set of provider-agnostic nodes the agent must reach for FIRST when
|
|
26
|
+
* the user asks for AI generation/transform of any kind.
|
|
27
|
+
*
|
|
28
|
+
* Verified to exist in `@nodetool-ai/base-nodes` as of writing.
|
|
29
|
+
*/
|
|
30
|
+
export declare const GENERIC_AI_NODES: readonly GenericAINode[];
|
|
31
|
+
/** Deterministic baseline namespaces — search inside these for non-AI work. */
|
|
32
|
+
export declare const CORE_BASELINE_NAMESPACES: readonly string[];
|
|
33
|
+
export { PROVIDER_NAMESPACES };
|
|
34
|
+
export interface BuildPromptOptions {
|
|
35
|
+
/**
|
|
36
|
+
* Whether `find_model` is available. When false (no providers configured),
|
|
37
|
+
* the prompt drops the "use find_model" instruction and steers the agent
|
|
38
|
+
* toward AgentStep for any AI work.
|
|
39
|
+
*/
|
|
40
|
+
hasFindModel?: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build the GraphPlanner system prompt. Pass `hasFindModel: false` when
|
|
44
|
+
* there are no configured providers — the prompt then omits the model
|
|
45
|
+
* lookup step and tells the agent to fall back to AgentStep.
|
|
46
|
+
*/
|
|
47
|
+
export declare function buildGraphPlannerSystemPrompt(options?: BuildPromptOptions): string;
|
|
48
|
+
//# sourceMappingURL=graph-planner-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-planner-prompt.d.ts","sourceRoot":"","sources":["../../src/prompts/graph-planner-prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,qBAAqB,GAC7B,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,8BAA8B,GAC9B,oBAAoB,GACpB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,UAAU,EAAE,qBAAqB,CAAC;IAClC,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,aAAa,EAiEpD,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAcrD,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAeD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,GAAE,kBAAuB,GAC/B,MAAM,CA+ER"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphPlanner system prompt and the curated catalog of generic AI nodes
|
|
3
|
+
* that the workflow-building agent must prefer over provider-specific nodes.
|
|
4
|
+
*
|
|
5
|
+
* Centralized here so the prompt's table and the runtime catalog can't drift.
|
|
6
|
+
*/
|
|
7
|
+
import { PROVIDER_NAMESPACES } from "@nodetool-ai/node-sdk";
|
|
8
|
+
/**
|
|
9
|
+
* Curated set of provider-agnostic nodes the agent must reach for FIRST when
|
|
10
|
+
* the user asks for AI generation/transform of any kind.
|
|
11
|
+
*
|
|
12
|
+
* Verified to exist in `@nodetool-ai/base-nodes` as of writing.
|
|
13
|
+
*/
|
|
14
|
+
export const GENERIC_AI_NODES = [
|
|
15
|
+
{
|
|
16
|
+
type: "nodetool.image.TextToImage",
|
|
17
|
+
capability: "text_to_image",
|
|
18
|
+
task: "Text → Image",
|
|
19
|
+
summary: "Generate an image from a text prompt. Required: prompt, model.",
|
|
20
|
+
acceptsModel: true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
type: "nodetool.image.ImageToImage",
|
|
24
|
+
capability: "image_to_image",
|
|
25
|
+
task: "Image → Image",
|
|
26
|
+
summary: "Transform a source image with a text prompt. Required: image, prompt, model.",
|
|
27
|
+
acceptsModel: true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
type: "nodetool.video.TextToVideo",
|
|
31
|
+
capability: "text_to_video",
|
|
32
|
+
task: "Text → Video",
|
|
33
|
+
summary: "Generate a video from a text prompt. Required: prompt, model.",
|
|
34
|
+
acceptsModel: true
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
type: "nodetool.video.ImageToVideo",
|
|
38
|
+
capability: "image_to_video",
|
|
39
|
+
task: "Image → Video",
|
|
40
|
+
summary: "Animate a source image into a video. Required: image, prompt, model.",
|
|
41
|
+
acceptsModel: true
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
type: "nodetool.audio.TextToSpeech",
|
|
45
|
+
capability: "text_to_speech",
|
|
46
|
+
task: "Text → Speech",
|
|
47
|
+
summary: "Generate speech audio from text. Required: text, model. Optional: voice.",
|
|
48
|
+
acceptsModel: true
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
type: "nodetool.text.AutomaticSpeechRecognition",
|
|
52
|
+
capability: "automatic_speech_recognition",
|
|
53
|
+
task: "Speech → Text",
|
|
54
|
+
summary: "Transcribe audio to text. Required: audio, model.",
|
|
55
|
+
acceptsModel: true
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
type: "nodetool.text.Embedding",
|
|
59
|
+
capability: "generate_embedding",
|
|
60
|
+
task: "Text → Embedding",
|
|
61
|
+
summary: "Compute a text embedding vector. Required: text, model.",
|
|
62
|
+
acceptsModel: true
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
type: "nodetool.agents.AgentStep",
|
|
66
|
+
capability: "generate_message",
|
|
67
|
+
task: "LLM step (reasoning / generation)",
|
|
68
|
+
summary: "LLM step: pass instructions in, get text out. Inherits the workflow's configured model — do NOT set a model property.",
|
|
69
|
+
acceptsModel: false
|
|
70
|
+
}
|
|
71
|
+
];
|
|
72
|
+
/** Deterministic baseline namespaces — search inside these for non-AI work. */
|
|
73
|
+
export const CORE_BASELINE_NAMESPACES = [
|
|
74
|
+
"nodetool.control",
|
|
75
|
+
"nodetool.text",
|
|
76
|
+
"nodetool.image",
|
|
77
|
+
"nodetool.video",
|
|
78
|
+
"nodetool.audio",
|
|
79
|
+
"nodetool.data",
|
|
80
|
+
"nodetool.constant",
|
|
81
|
+
"nodetool.input",
|
|
82
|
+
"nodetool.output",
|
|
83
|
+
"nodetool.workspace",
|
|
84
|
+
"nodetool.document",
|
|
85
|
+
"nodetool.vector",
|
|
86
|
+
"nodetool.triggers"
|
|
87
|
+
];
|
|
88
|
+
export { PROVIDER_NAMESPACES };
|
|
89
|
+
function renderGenericNodeTable() {
|
|
90
|
+
const header = "| Task | node_type | Capability |";
|
|
91
|
+
const sep = "|---|---|---|";
|
|
92
|
+
const rows = GENERIC_AI_NODES.map((n) => `| ${n.task} | \`${n.type}\` | \`${n.capability}\` |`);
|
|
93
|
+
return [header, sep, ...rows].join("\n");
|
|
94
|
+
}
|
|
95
|
+
function renderProviderList() {
|
|
96
|
+
return PROVIDER_NAMESPACES.map((ns) => `${ns}.*`).join(", ");
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Build the GraphPlanner system prompt. Pass `hasFindModel: false` when
|
|
100
|
+
* there are no configured providers — the prompt then omits the model
|
|
101
|
+
* lookup step and tells the agent to fall back to AgentStep.
|
|
102
|
+
*/
|
|
103
|
+
export function buildGraphPlannerSystemPrompt(options = {}) {
|
|
104
|
+
const hasFindModel = options.hasFindModel ?? true;
|
|
105
|
+
const tools = [
|
|
106
|
+
hasFindModel
|
|
107
|
+
? "- `find_model(capability, [task], [provider_hint], [prefer_local])` — REQUIRED before adding any generic AI node. Returns ranked `{provider, model_id, name, downloaded, recommended}` filtered to providers the user has actually configured. Use the first result unless the user named a specific provider."
|
|
108
|
+
: null,
|
|
109
|
+
"- `search_nodes(query, [namespace], [include_provider_nodes])` — deterministic core nodes only by default. Provider-specific nodes are HIDDEN unless `include_provider_nodes: true`. Optional `namespace` restricts results to a single core namespace.",
|
|
110
|
+
"- `get_node_info(node_type)` — fetch full property/output schema. REQUIRED before `add_node` for non-generic nodes.",
|
|
111
|
+
"- `list_nodes([namespace])` — browse a baseline namespace.",
|
|
112
|
+
"- `add_node`, `add_edge`, `finish_graph` — graph mutation."
|
|
113
|
+
]
|
|
114
|
+
.filter((line) => line !== null)
|
|
115
|
+
.join("\n");
|
|
116
|
+
const aiWorkflow = hasFindModel
|
|
117
|
+
? `2. For each AI node from the table: call \`find_model\` with the node's capability. Pick the first ranked result. Set the node's \`model\` property to \`{ provider: <provider>, id: <model_id> }\`. AgentStep is the exception — it inherits the workflow's configured model, so do NOT set a \`model\` property on it.`
|
|
118
|
+
: `2. No providers are configured for model lookup. Use \`nodetool.agents.AgentStep\` for any AI work — it uses the workflow's configured model. Do NOT pick provider-specific nodes.`;
|
|
119
|
+
return `You are a WorkflowArchitect. Build a workflow graph to achieve the user's objective.
|
|
120
|
+
|
|
121
|
+
# Node-selection policy (READ FIRST)
|
|
122
|
+
|
|
123
|
+
Always start from the CORE catalog below. Do NOT use provider-specific nodes
|
|
124
|
+
(${renderProviderList()})
|
|
125
|
+
unless the user explicitly named that provider (e.g. "use OpenAI's image API").
|
|
126
|
+
Provider-specific nodes are hidden from search results by default; only set
|
|
127
|
+
\`include_provider_nodes: true\` when the user named a provider.
|
|
128
|
+
|
|
129
|
+
## Generic AI nodes — pick one of these for ANY AI generation/transform
|
|
130
|
+
|
|
131
|
+
${renderGenericNodeTable()}
|
|
132
|
+
|
|
133
|
+
These nodes accept a \`model\` property (a \`{provider, id}\` object) — except
|
|
134
|
+
AgentStep, which uses the workflow's configured model. Do NOT guess model IDs;
|
|
135
|
+
${hasFindModel ? "use `find_model` to pick a real model+provider." : "AgentStep is the safe choice when no providers are configured."}
|
|
136
|
+
|
|
137
|
+
## Core baseline namespaces (deterministic, non-AI work)
|
|
138
|
+
|
|
139
|
+
For non-AI operations, use deterministic nodes from these namespaces only:
|
|
140
|
+
${CORE_BASELINE_NAMESPACES.join(", ")}.
|
|
141
|
+
|
|
142
|
+
# Workflow
|
|
143
|
+
|
|
144
|
+
1. CHOOSE: For each step, decide whether it is (a) AI generation/transform →
|
|
145
|
+
pick a generic node from the table above, or (b) deterministic → use
|
|
146
|
+
\`search_nodes\` to find a node in a core baseline namespace.
|
|
147
|
+
${aiWorkflow}
|
|
148
|
+
3. INSPECT non-AI nodes with \`get_node_info\` before adding so handle names
|
|
149
|
+
and types match exactly.
|
|
150
|
+
4. BUILD with \`add_node\` for each node and \`add_edge\` to connect outputs to
|
|
151
|
+
inputs. Every node needs a unique snake_case id.
|
|
152
|
+
5. FINALIZE with \`finish_graph\` when done.
|
|
153
|
+
|
|
154
|
+
# Tools
|
|
155
|
+
|
|
156
|
+
${tools}
|
|
157
|
+
|
|
158
|
+
# Rules
|
|
159
|
+
|
|
160
|
+
- Provider-specific nodes are FORBIDDEN unless the user named the provider.
|
|
161
|
+
- Always pass required properties to \`add_node\`. A constant String node
|
|
162
|
+
needs \`{ "value": "your text here" }\`. Empty defaults break workflows.
|
|
163
|
+
- Maximize parallelism: nodes without data dependencies run concurrently.
|
|
164
|
+
- Use \`nodetool.agents.AgentStep\` ONLY when no deterministic node and no
|
|
165
|
+
generic AI node fits. AgentStep required properties: \`instructions\` (string).
|
|
166
|
+
Optional: \`tools\` (string array), \`output_schema\` (JSON schema string).
|
|
167
|
+
Input handle: \`input\`. Output handle: \`output\`.
|
|
168
|
+
- Do NOT use \`nodetool.agents.Agent\` (the registry node) — it requires a
|
|
169
|
+
complex model property that cannot be set via \`add_node\`.
|
|
170
|
+
|
|
171
|
+
# Persistence
|
|
172
|
+
|
|
173
|
+
- Workflow outputs are persisted by their nodes. For images/audio/video the
|
|
174
|
+
generic AI nodes auto-save assets; you do NOT need a separate save node.
|
|
175
|
+
- For text artifacts an AgentStep produces (reports, summaries, JSON), use
|
|
176
|
+
the \`nodetool.workspace.WriteTextFile\` deterministic node OR have the
|
|
177
|
+
AgentStep call \`save_asset\` with \`name\` + \`content\` from its tool list
|
|
178
|
+
so the artifact shows up in the chat asset browser.`;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=graph-planner-prompt.js.map
|