@halfagiraf/clawx 0.2.8 → 0.2.10
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/README.md +63 -0
- package/dist/cli/forge.d.ts +4 -0
- package/dist/cli/forge.d.ts.map +1 -0
- package/dist/cli/forge.js +205 -0
- package/dist/cli/forge.js.map +1 -0
- package/dist/cli/main.js +3 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -1
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +5 -2
- package/dist/core/agent.js.map +1 -1
- package/dist/forge/community.d.ts +25 -0
- package/dist/forge/community.d.ts.map +1 -0
- package/dist/forge/community.js +126 -0
- package/dist/forge/community.js.map +1 -0
- package/dist/forge/discover.d.ts +14 -0
- package/dist/forge/discover.d.ts.map +1 -0
- package/dist/forge/discover.js +134 -0
- package/dist/forge/discover.js.map +1 -0
- package/dist/forge/forge.test.d.ts +2 -0
- package/dist/forge/forge.test.d.ts.map +1 -0
- package/dist/forge/forge.test.js +202 -0
- package/dist/forge/forge.test.js.map +1 -0
- package/dist/forge/hardware.d.ts +8 -0
- package/dist/forge/hardware.d.ts.map +1 -0
- package/dist/forge/hardware.js +31 -0
- package/dist/forge/hardware.js.map +1 -0
- package/dist/forge/hf-client.d.ts +9 -0
- package/dist/forge/hf-client.d.ts.map +1 -0
- package/dist/forge/hf-client.js +101 -0
- package/dist/forge/hf-client.js.map +1 -0
- package/dist/forge/index.d.ts +13 -0
- package/dist/forge/index.d.ts.map +1 -0
- package/dist/forge/index.js +13 -0
- package/dist/forge/index.js.map +1 -0
- package/dist/forge/loader.d.ts +10 -0
- package/dist/forge/loader.d.ts.map +1 -0
- package/dist/forge/loader.js +385 -0
- package/dist/forge/loader.js.map +1 -0
- package/dist/forge/loader.test.d.ts +5 -0
- package/dist/forge/loader.test.d.ts.map +1 -0
- package/dist/forge/loader.test.js +15 -0
- package/dist/forge/loader.test.js.map +1 -0
- package/dist/forge/pipeline-builder.d.ts +9 -0
- package/dist/forge/pipeline-builder.d.ts.map +1 -0
- package/dist/forge/pipeline-builder.js +125 -0
- package/dist/forge/pipeline-builder.js.map +1 -0
- package/dist/forge/pipeline.d.ts +28 -0
- package/dist/forge/pipeline.d.ts.map +1 -0
- package/dist/forge/pipeline.js +206 -0
- package/dist/forge/pipeline.js.map +1 -0
- package/dist/forge/rank.d.ts +3 -0
- package/dist/forge/rank.d.ts.map +1 -0
- package/dist/forge/rank.js +138 -0
- package/dist/forge/rank.js.map +1 -0
- package/dist/forge/reasoner.d.ts +10 -0
- package/dist/forge/reasoner.d.ts.map +1 -0
- package/dist/forge/reasoner.js +312 -0
- package/dist/forge/reasoner.js.map +1 -0
- package/dist/forge/registry.d.ts +15 -0
- package/dist/forge/registry.d.ts.map +1 -0
- package/dist/forge/registry.js +149 -0
- package/dist/forge/registry.js.map +1 -0
- package/dist/forge/scaffold.d.ts +10 -0
- package/dist/forge/scaffold.d.ts.map +1 -0
- package/dist/forge/scaffold.js +412 -0
- package/dist/forge/scaffold.js.map +1 -0
- package/dist/forge/scaffolder.d.ts +9 -0
- package/dist/forge/scaffolder.d.ts.map +1 -0
- package/dist/forge/scaffolder.js +118 -0
- package/dist/forge/scaffolder.js.map +1 -0
- package/dist/forge/tester.d.ts +9 -0
- package/dist/forge/tester.d.ts.map +1 -0
- package/dist/forge/tester.js +103 -0
- package/dist/forge/tester.js.map +1 -0
- package/dist/forge/types.d.ts +54 -0
- package/dist/forge/types.d.ts.map +1 -0
- package/dist/forge/types.js +3 -0
- package/dist/forge/types.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge pipeline builder.
|
|
3
|
+
*
|
|
4
|
+
* Builds discovered pipelines into working Clawx tools.
|
|
5
|
+
*/
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { generatePipelineCode } from "./pipeline.js";
|
|
9
|
+
import { getForgeToolsDir } from "./registry.js";
|
|
10
|
+
import { log } from "../utils/logger.js";
|
|
11
|
+
// In a full implementation, we would load discovered pipelines from storage
|
|
12
|
+
// For now, we'll simulate with a simple example
|
|
13
|
+
export async function buildPipeline(config, pipelineId, options = {}) {
|
|
14
|
+
console.log(`\n🔨 Building pipeline: ${pipelineId}\n`);
|
|
15
|
+
// For now, create a sample pipeline
|
|
16
|
+
// In a real implementation, we would load the pipeline definition
|
|
17
|
+
const samplePipeline = {
|
|
18
|
+
id: pipelineId,
|
|
19
|
+
name: "Document Intelligence Pipeline",
|
|
20
|
+
description: "Extract, analyze, and summarize documents using multiple AI models",
|
|
21
|
+
stages: [
|
|
22
|
+
{
|
|
23
|
+
id: "stage-1",
|
|
24
|
+
task: "text-generation",
|
|
25
|
+
modelId: "gpt2",
|
|
26
|
+
input: "document",
|
|
27
|
+
output: "extracted text",
|
|
28
|
+
description: "Extract text from document",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: "stage-2",
|
|
32
|
+
task: "text-classification",
|
|
33
|
+
modelId: "distilbert-base-uncased-finetuned-sst-2-english",
|
|
34
|
+
input: "extracted text",
|
|
35
|
+
output: "document type",
|
|
36
|
+
description: "Classify document type",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "stage-3",
|
|
40
|
+
task: "summarization",
|
|
41
|
+
modelId: "facebook/bart-large-cnn",
|
|
42
|
+
input: "extracted text",
|
|
43
|
+
output: "summary",
|
|
44
|
+
description: "Summarize key points",
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
inputType: "document",
|
|
48
|
+
outputType: "analysis",
|
|
49
|
+
complexity: "medium",
|
|
50
|
+
feasibility: "high",
|
|
51
|
+
};
|
|
52
|
+
try {
|
|
53
|
+
// Generate pipeline implementation
|
|
54
|
+
const pipelineCode = generatePipelineCode(samplePipeline);
|
|
55
|
+
const pipelineName = samplePipeline.name.toLowerCase().replace(/[^a-z0-9]+/g, '_');
|
|
56
|
+
const pipelinePath = path.join(getForgeToolsDir(), `${pipelineName}.ts`);
|
|
57
|
+
// Check if pipeline already exists
|
|
58
|
+
if (fs.existsSync(pipelinePath) && !options.force) {
|
|
59
|
+
console.error(` ❌ Pipeline already exists: ${pipelineName}`);
|
|
60
|
+
console.error(` Use --force to overwrite.`);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
// Create directory if needed
|
|
64
|
+
fs.mkdirSync(getForgeToolsDir(), { recursive: true });
|
|
65
|
+
// Write pipeline file
|
|
66
|
+
fs.writeFileSync(pipelinePath, pipelineCode, "utf-8");
|
|
67
|
+
console.log(` ✅ Generated pipeline: ${pipelinePath}`);
|
|
68
|
+
// Generate test file
|
|
69
|
+
const testCode = generatePipelineTestCode(samplePipeline);
|
|
70
|
+
const testPath = path.join(getForgeToolsDir(), `${pipelineName}.test.ts`);
|
|
71
|
+
fs.writeFileSync(testPath, testCode, "utf-8");
|
|
72
|
+
console.log(` ✅ Generated test: ${testPath}`);
|
|
73
|
+
console.log(`\n✨ Pipeline built successfully!`);
|
|
74
|
+
console.log(`\n📋 Pipeline ready to use in Clawx sessions`);
|
|
75
|
+
console.log(` Tool name: ${pipelineName}`);
|
|
76
|
+
console.log(` Stages: ${samplePipeline.stages.map(s => s.task).join(" → ")}`);
|
|
77
|
+
console.log(` Models: ${samplePipeline.stages.map(s => s.modelId).join(", ")}`);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
log.error("Pipeline build failed:", error);
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function generatePipelineTestCode(pipeline) {
|
|
85
|
+
const pipelineName = pipeline.name.toLowerCase().replace(/[^a-z0-9]+/g, '_');
|
|
86
|
+
const className = pipelineName.split('_').map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join('');
|
|
87
|
+
return `/**
|
|
88
|
+
* Tests for ${pipelineName} pipeline
|
|
89
|
+
*/
|
|
90
|
+
|
|
91
|
+
import { describe, it, expect } from "vitest";
|
|
92
|
+
import { create${className}Pipeline } from "./${pipelineName}.js";
|
|
93
|
+
|
|
94
|
+
describe("${pipelineName}", () => {
|
|
95
|
+
const pipeline = create${className}Pipeline();
|
|
96
|
+
|
|
97
|
+
it("should have correct metadata", () => {
|
|
98
|
+
expect(pipeline.name).toBe("${pipelineName}");
|
|
99
|
+
expect(pipeline.label).toBe("${pipeline.name}");
|
|
100
|
+
expect(pipeline.description).toBe("${pipeline.description}");
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("should execute without errors", async () => {
|
|
104
|
+
const result = await pipeline.execute("test-id", {
|
|
105
|
+
input: "Test document content for pipeline processing.",
|
|
106
|
+
verbose: false
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
expect(result.content[0].type).toBe("text");
|
|
110
|
+
expect(typeof result.content[0].text).toBe("string");
|
|
111
|
+
expect(result.content[0].text).toContain("Pipeline Complete");
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it("should handle verbose mode", async () => {
|
|
115
|
+
const result = await pipeline.execute("test-id", {
|
|
116
|
+
input: "Another test document.",
|
|
117
|
+
verbose: true
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
expect(result.content[0].text).toContain("Pipeline Stages");
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
`;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=pipeline-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-builder.js","sourceRoot":"","sources":["../../src/forge/pipeline-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge pipeline discovery.
|
|
3
|
+
*
|
|
4
|
+
* Discovers and scaffolds multi-model pipelines for complex tasks.
|
|
5
|
+
*/
|
|
6
|
+
import type { HfModel, HfDataset } from "./types.js";
|
|
7
|
+
import type { ClawxConfig } from "../types/index.js";
|
|
8
|
+
export interface PipelineStage {
|
|
9
|
+
id: string;
|
|
10
|
+
task: string;
|
|
11
|
+
modelId: string;
|
|
12
|
+
input: string;
|
|
13
|
+
output: string;
|
|
14
|
+
description: string;
|
|
15
|
+
}
|
|
16
|
+
export interface DiscoveredPipeline {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
stages: PipelineStage[];
|
|
21
|
+
inputType: string;
|
|
22
|
+
outputType: string;
|
|
23
|
+
complexity: "simple" | "medium" | "complex";
|
|
24
|
+
feasibility: "high" | "medium" | "low";
|
|
25
|
+
}
|
|
26
|
+
export declare function discoverPipelines(config: ClawxConfig, models: HfModel[], datasets: HfDataset[]): Promise<DiscoveredPipeline[]>;
|
|
27
|
+
export declare function generatePipelineCode(pipeline: DiscoveredPipeline): string;
|
|
28
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/forge/pipeline.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAwB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACxC;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,OAAO,EAAE,EACjB,QAAQ,EAAE,SAAS,EAAE,GACpB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA8G/B;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAsGzE"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge pipeline discovery.
|
|
3
|
+
*
|
|
4
|
+
* Discovers and scaffolds multi-model pipelines for complex tasks.
|
|
5
|
+
*/
|
|
6
|
+
import { log } from "../utils/logger.js";
|
|
7
|
+
export async function discoverPipelines(config, models, datasets) {
|
|
8
|
+
log.info("Discovering potential pipelines...");
|
|
9
|
+
const pipelines = [];
|
|
10
|
+
// Group models by task/capability
|
|
11
|
+
const modelsByTask = new Map();
|
|
12
|
+
for (const model of models) {
|
|
13
|
+
const task = model.pipeline_tag || "unknown";
|
|
14
|
+
if (!modelsByTask.has(task)) {
|
|
15
|
+
modelsByTask.set(task, []);
|
|
16
|
+
}
|
|
17
|
+
modelsByTask.get(task).push(model);
|
|
18
|
+
}
|
|
19
|
+
// Define common pipeline patterns
|
|
20
|
+
const pipelinePatterns = [
|
|
21
|
+
{
|
|
22
|
+
name: "Document Intelligence Pipeline",
|
|
23
|
+
description: "Extract, analyze, and summarize documents",
|
|
24
|
+
stages: [
|
|
25
|
+
{ task: "text-generation", description: "Extract text from document" },
|
|
26
|
+
{ task: "text-classification", description: "Classify document type" },
|
|
27
|
+
{ task: "summarization", description: "Summarize key points" },
|
|
28
|
+
{ task: "question-answering", description: "Answer questions about document" },
|
|
29
|
+
],
|
|
30
|
+
inputType: "document",
|
|
31
|
+
outputType: "analysis",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: "Code Analysis Pipeline",
|
|
35
|
+
description: "Review, test, and improve code",
|
|
36
|
+
stages: [
|
|
37
|
+
{ task: "text-generation", description: "Parse and understand code" },
|
|
38
|
+
{ task: "text-classification", description: "Detect bugs and vulnerabilities" },
|
|
39
|
+
{ task: "text-generation", description: "Suggest improvements" },
|
|
40
|
+
{ task: "text-generation", description: "Generate tests" },
|
|
41
|
+
],
|
|
42
|
+
inputType: "code",
|
|
43
|
+
outputType: "review",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: "Content Creation Pipeline",
|
|
47
|
+
description: "Generate, refine, and optimize content",
|
|
48
|
+
stages: [
|
|
49
|
+
{ task: "text-generation", description: "Generate initial content" },
|
|
50
|
+
{ task: "text-classification", description: "Check tone and style" },
|
|
51
|
+
{ task: "summarization", description: "Create concise version" },
|
|
52
|
+
{ task: "text-generation", description: "Optimize for SEO" },
|
|
53
|
+
],
|
|
54
|
+
inputType: "topic",
|
|
55
|
+
outputType: "content",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: "Data Analysis Pipeline",
|
|
59
|
+
description: "Process, analyze, and visualize data",
|
|
60
|
+
stages: [
|
|
61
|
+
{ task: "text-generation", description: "Extract insights from data" },
|
|
62
|
+
{ task: "text-classification", description: "Categorize findings" },
|
|
63
|
+
{ task: "summarization", description: "Summarize key trends" },
|
|
64
|
+
{ task: "text-generation", description: "Generate reports" },
|
|
65
|
+
],
|
|
66
|
+
inputType: "data",
|
|
67
|
+
outputType: "insights",
|
|
68
|
+
},
|
|
69
|
+
];
|
|
70
|
+
// Find pipelines where we have models for each stage
|
|
71
|
+
for (const pattern of pipelinePatterns) {
|
|
72
|
+
const availableStages = [];
|
|
73
|
+
for (let i = 0; i < pattern.stages.length; i++) {
|
|
74
|
+
const stagePattern = pattern.stages[i];
|
|
75
|
+
const taskModels = modelsByTask.get(stagePattern.task);
|
|
76
|
+
if (taskModels && taskModels.length > 0) {
|
|
77
|
+
// Pick the most downloaded model for this task
|
|
78
|
+
const bestModel = taskModels.sort((a, b) => b.downloads - a.downloads)[0];
|
|
79
|
+
availableStages.push({
|
|
80
|
+
id: `stage-${i + 1}`,
|
|
81
|
+
task: stagePattern.task,
|
|
82
|
+
modelId: bestModel.id,
|
|
83
|
+
input: i === 0 ? pattern.inputType : `output from stage ${i}`,
|
|
84
|
+
output: i === pattern.stages.length - 1 ? pattern.outputType : `input for stage ${i + 2}`,
|
|
85
|
+
description: stagePattern.description,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Only create pipeline if we have at least 2 stages
|
|
90
|
+
if (availableStages.length >= 2) {
|
|
91
|
+
const completeness = availableStages.length / pattern.stages.length;
|
|
92
|
+
const feasibility = completeness >= 0.75 ? "high" : completeness >= 0.5 ? "medium" : "low";
|
|
93
|
+
const complexity = availableStages.length <= 2 ? "simple" : availableStages.length <= 3 ? "medium" : "complex";
|
|
94
|
+
pipelines.push({
|
|
95
|
+
id: `pipeline-${Date.now()}-${pipelines.length}`,
|
|
96
|
+
name: pattern.name,
|
|
97
|
+
description: pattern.description,
|
|
98
|
+
stages: availableStages,
|
|
99
|
+
inputType: pattern.inputType,
|
|
100
|
+
outputType: pattern.outputType,
|
|
101
|
+
complexity,
|
|
102
|
+
feasibility,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return pipelines;
|
|
107
|
+
}
|
|
108
|
+
export function generatePipelineCode(pipeline) {
|
|
109
|
+
const pipelineName = pipeline.name.toLowerCase().replace(/[^a-z0-9]+/g, '_');
|
|
110
|
+
const className = pipelineName.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('');
|
|
111
|
+
const stageCalls = pipeline.stages.map((stage, index) => {
|
|
112
|
+
return ` // Stage ${index + 1}: ${stage.description}
|
|
113
|
+
const stage${index + 1}Input = ${index === 0 ? 'params.input' : `stage${index}Result`};
|
|
114
|
+
const stage${index + 1}Result = await executeStage${index + 1}(stage${index + 1}Input);`;
|
|
115
|
+
}).join('\n\n');
|
|
116
|
+
const stageFunctions = pipeline.stages.map((stage, index) => {
|
|
117
|
+
return ` async function executeStage${index + 1}(input: string): Promise<string> {
|
|
118
|
+
// Execute ${stage.task} using ${stage.modelId}
|
|
119
|
+
// TODO: Implement actual model inference
|
|
120
|
+
|
|
121
|
+
// Simulated execution
|
|
122
|
+
const result = \`Stage ${index + 1} (${stage.task}) processed: "\${input.substring(0, 50)}\${input.length > 50 ? '...' : ''}"\\n\\nModel: ${stage.modelId}\\n\\n[Implement with Hugging Face Inference API]\`;
|
|
123
|
+
|
|
124
|
+
return result;
|
|
125
|
+
}`;
|
|
126
|
+
}).join('\n\n');
|
|
127
|
+
return `/**
|
|
128
|
+
* ${pipeline.name}
|
|
129
|
+
*
|
|
130
|
+
* ${pipeline.description}
|
|
131
|
+
*
|
|
132
|
+
* Generated by Clawx Forge on ${new Date().toISOString()}
|
|
133
|
+
*
|
|
134
|
+
* Pipeline stages:
|
|
135
|
+
${pipeline.stages.map(s => ` * ${s.task} → ${s.modelId}`).join('\n')}
|
|
136
|
+
*/
|
|
137
|
+
|
|
138
|
+
import { Type, type Static } from "@sinclair/typebox";
|
|
139
|
+
import type { AgentTool, AgentToolResult } from "@mariozechner/pi-agent-core";
|
|
140
|
+
|
|
141
|
+
const ${className}Schema = Type.Object({
|
|
142
|
+
input: Type.String({ description: "Input for the pipeline" }),
|
|
143
|
+
verbose: Type.Boolean({ description: "Show detailed stage outputs", default: false }),
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
type ${className}Input = Static<typeof ${className}Schema>;
|
|
147
|
+
|
|
148
|
+
export function create${className}Pipeline(): AgentTool<typeof ${className}Schema> {
|
|
149
|
+
return {
|
|
150
|
+
name: "${pipelineName}",
|
|
151
|
+
label: "${pipeline.name}",
|
|
152
|
+
description: "${pipeline.description}",
|
|
153
|
+
parameters: ${className}Schema,
|
|
154
|
+
async execute(
|
|
155
|
+
_toolCallId: string,
|
|
156
|
+
params: ${className}Input,
|
|
157
|
+
): Promise<AgentToolResult<unknown>> {
|
|
158
|
+
try {
|
|
159
|
+
log.info("Starting pipeline: ${pipeline.name}");
|
|
160
|
+
|
|
161
|
+
${stageCalls}
|
|
162
|
+
|
|
163
|
+
const finalResult = stage${pipeline.stages.length}Result;
|
|
164
|
+
|
|
165
|
+
let output = \`Pipeline Complete: ${pipeline.name}\\n\\n\`;
|
|
166
|
+
output += \`Input: \${params.input.substring(0, 100)}\${params.input.length > 100 ? '...' : ''}\\n\\n\`;
|
|
167
|
+
output += \`Final Output:\\n\${finalResult}\\n\\n\`;
|
|
168
|
+
|
|
169
|
+
if (params.verbose) {
|
|
170
|
+
output += \`Pipeline Stages:\\n\`;
|
|
171
|
+
${pipeline.stages.map((_, index) => `output += \`Stage ${index + 1}: \${stage${index + 1}Result.substring(0, 100)}\\n\\n\`;`).join('\n ')}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
output += \`\\nTo implement fully:\\n\`;
|
|
175
|
+
${pipeline.stages.map((stage, index) => `output += \`Stage ${index + 1}: Implement ${stage.task} with ${stage.modelId}\\n\`;`).join('\n ')}
|
|
176
|
+
output += \`\\nRequired: HUGGINGFACE_TOKEN environment variable\`;
|
|
177
|
+
|
|
178
|
+
return {
|
|
179
|
+
content: [{
|
|
180
|
+
type: "text",
|
|
181
|
+
text: output
|
|
182
|
+
}],
|
|
183
|
+
details: {
|
|
184
|
+
pipeline: "${pipeline.name}",
|
|
185
|
+
stages: ${pipeline.stages.length},
|
|
186
|
+
inputLength: params.input.length,
|
|
187
|
+
timestamp: new Date().toISOString()
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
} catch (error) {
|
|
191
|
+
return {
|
|
192
|
+
content: [{
|
|
193
|
+
type: "text",
|
|
194
|
+
text: \`Pipeline execution failed: \${error instanceof Error ? error.message : String(error)}\`
|
|
195
|
+
}],
|
|
196
|
+
details: { error: String(error) },
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
${stageFunctions}
|
|
203
|
+
}
|
|
204
|
+
`;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/forge/pipeline.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAsBzC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAmB,EACnB,MAAiB,EACjB,QAAqB;IAErB,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAyB,EAAE,CAAC;IAE3C,kCAAkC;IAClC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAqB,CAAC;IAClD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,IAAI,SAAS,CAAC;QAC7C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,YAAY,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,kCAAkC;IAClC,MAAM,gBAAgB,GAAG;QACvB;YACE,IAAI,EAAE,gCAAgC;YACtC,WAAW,EAAE,2CAA2C;YACxD,MAAM,EAAE;gBACN,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,4BAA4B,EAAE;gBACtE,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,wBAAwB,EAAE;gBACtE,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBAC9D,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,iCAAiC,EAAE;aAC/E;YACD,SAAS,EAAE,UAAU;YACrB,UAAU,EAAE,UAAU;SACvB;QACD;YACE,IAAI,EAAE,wBAAwB;YAC9B,WAAW,EAAE,gCAAgC;YAC7C,MAAM,EAAE;gBACN,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,2BAA2B,EAAE;gBACrE,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,iCAAiC,EAAE;gBAC/E,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBAChE,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE;aAC3D;YACD,SAAS,EAAE,MAAM;YACjB,UAAU,EAAE,QAAQ;SACrB;QACD;YACE,IAAI,EAAE,2BAA2B;YACjC,WAAW,EAAE,wCAAwC;YACrD,MAAM,EAAE;gBACN,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,0BAA0B,EAAE;gBACpE,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBACpE,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,wBAAwB,EAAE;gBAChE,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,kBAAkB,EAAE;aAC7D;YACD,SAAS,EAAE,OAAO;YAClB,UAAU,EAAE,SAAS;SACtB;QACD;YACE,IAAI,EAAE,wBAAwB;YAC9B,WAAW,EAAE,sCAAsC;YACnD,MAAM,EAAE;gBACN,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,4BAA4B,EAAE;gBACtE,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,qBAAqB,EAAE;gBACnE,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBAC9D,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,kBAAkB,EAAE;aAC7D;YACD,SAAS,EAAE,MAAM;YACjB,UAAU,EAAE,UAAU;SACvB;KACF,CAAC;IAEF,qDAAqD;IACrD,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,MAAM,eAAe,GAAoB,EAAE,CAAC;QAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAEvD,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,+CAA+C;gBAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE1E,eAAe,CAAC,IAAI,CAAC;oBACnB,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE;oBACpB,IAAI,EAAE,YAAY,CAAC,IAAI;oBACvB,OAAO,EAAE,SAAS,CAAC,EAAE;oBACrB,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,EAAE;oBAC7D,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE;oBACzF,WAAW,EAAE,YAAY,CAAC,WAAW;iBACtC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,oDAAoD;QACpD,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YACpE,MAAM,WAAW,GAAG,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;YAC3F,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;YAE/G,SAAS,CAAC,IAAI,CAAC;gBACb,EAAE,EAAE,YAAY,IAAI,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC,MAAM,EAAE;gBAChD,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,MAAM,EAAE,eAAe;gBACvB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,UAAU;gBACV,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAA4B;IAC/D,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACnD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAC7C,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACtD,OAAO,kBAAkB,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,WAAW;mBACzC,KAAK,GAAG,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ;mBACxE,KAAK,GAAG,CAAC,8BAA8B,KAAK,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,CAAC;IAC7F,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC1D,OAAO,gCAAgC,KAAK,GAAG,CAAC;iBACnC,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,OAAO;;;;6BAIrB,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,2FAA2F,KAAK,CAAC,OAAO;;;IAGzJ,CAAC;IACH,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,OAAO;KACJ,QAAQ,CAAC,IAAI;;KAEb,QAAQ,CAAC,WAAW;;iCAEQ,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;EAGvD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;QAM5D,SAAS;;;;;OAKV,SAAS,yBAAyB,SAAS;;wBAE1B,SAAS,gCAAgC,SAAS;;aAE7D,YAAY;cACX,QAAQ,CAAC,IAAI;oBACP,QAAQ,CAAC,WAAW;kBACtB,SAAS;;;gBAGX,SAAS;;;uCAGc,QAAQ,CAAC,IAAI;;EAElD,UAAU;;mCAEuB,QAAQ,CAAC,MAAM,CAAC,MAAM;;4CAEb,QAAQ,CAAC,IAAI;;;;;;YAM7C,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,qBAAqB,KAAK,GAAG,CAAC,aAAa,KAAK,GAAG,CAAC,oCAAoC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;;;;UAIlJ,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,qBAAqB,KAAK,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;;;;;;;;;yBAShI,QAAQ,CAAC,IAAI;sBAChB,QAAQ,CAAC,MAAM,CAAC,MAAM;;;;;;;;;;;;;;;;;EAiB1C,cAAc;;CAEf,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rank.d.ts","sourceRoot":"","sources":["../../src/forge/rank.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,KAAK,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,GACZ,WAAW,CAoBb"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Forge v1: Simple ranking algorithm
|
|
2
|
+
export function createOpportunity(model, dataset, query) {
|
|
3
|
+
const id = `opp_${generateId()}`;
|
|
4
|
+
const title = generateTitle(model, dataset);
|
|
5
|
+
const description = generateDescription(model, dataset);
|
|
6
|
+
const scores = scoreOpportunity(model, dataset);
|
|
7
|
+
const possibleOutputs = determinePossibleOutputs(model, dataset);
|
|
8
|
+
return {
|
|
9
|
+
id,
|
|
10
|
+
title,
|
|
11
|
+
description,
|
|
12
|
+
primaryModel: model,
|
|
13
|
+
supportingDataset: dataset,
|
|
14
|
+
scores,
|
|
15
|
+
possibleOutputs,
|
|
16
|
+
createdAt: new Date().toISOString(),
|
|
17
|
+
query
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function generateId() {
|
|
21
|
+
return Math.random().toString(36).substring(2, 8);
|
|
22
|
+
}
|
|
23
|
+
function generateTitle(model, dataset) {
|
|
24
|
+
const modelName = model.name.replace(/-/g, ' ');
|
|
25
|
+
const task = model.task || 'processing';
|
|
26
|
+
if (dataset) {
|
|
27
|
+
const datasetName = dataset.name.replace(/-/g, ' ');
|
|
28
|
+
return `${modelName} ${task} for ${datasetName}`;
|
|
29
|
+
}
|
|
30
|
+
return `${modelName} ${task}`;
|
|
31
|
+
}
|
|
32
|
+
function generateDescription(model, dataset) {
|
|
33
|
+
const task = model.task || 'process data';
|
|
34
|
+
const modality = model.modality || 'data';
|
|
35
|
+
if (dataset) {
|
|
36
|
+
return `Use ${model.name} to ${task} on ${dataset.name} ${modality} data`;
|
|
37
|
+
}
|
|
38
|
+
return `Use ${model.name} to ${task} ${modality} data`;
|
|
39
|
+
}
|
|
40
|
+
function scoreOpportunity(model, dataset) {
|
|
41
|
+
const usefulness = scoreUsefulness(model, dataset);
|
|
42
|
+
const novelty = scoreNovelty(model, dataset);
|
|
43
|
+
const feasibility = scoreFeasibility(model);
|
|
44
|
+
const fit = scoreFit(model);
|
|
45
|
+
const overall = (usefulness + novelty + feasibility + fit) / 4;
|
|
46
|
+
return {
|
|
47
|
+
usefulness: round(usefulness),
|
|
48
|
+
novelty: round(novelty),
|
|
49
|
+
feasibility: round(feasibility),
|
|
50
|
+
fit: round(fit),
|
|
51
|
+
overall: round(overall)
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function scoreUsefulness(model, dataset) {
|
|
55
|
+
let score = 0;
|
|
56
|
+
// Model downloads (log scale)
|
|
57
|
+
if (model.downloads > 1000000)
|
|
58
|
+
score += 0.4;
|
|
59
|
+
else if (model.downloads > 100000)
|
|
60
|
+
score += 0.3;
|
|
61
|
+
else if (model.downloads > 10000)
|
|
62
|
+
score += 0.2;
|
|
63
|
+
else if (model.downloads > 1000)
|
|
64
|
+
score += 0.1;
|
|
65
|
+
// Dataset adds usefulness
|
|
66
|
+
if (dataset)
|
|
67
|
+
score += 0.2;
|
|
68
|
+
// Common tasks are more useful
|
|
69
|
+
const usefulTasks = ['text-classification', 'text-generation', 'translation',
|
|
70
|
+
'image-classification', 'object-detection'];
|
|
71
|
+
if (model.task && usefulTasks.includes(model.task))
|
|
72
|
+
score += 0.2;
|
|
73
|
+
return Math.min(score, 1.0);
|
|
74
|
+
}
|
|
75
|
+
function scoreNovelty(model, dataset) {
|
|
76
|
+
let score = 0.5; // Start at middle
|
|
77
|
+
// Less popular models are more novel
|
|
78
|
+
if (model.downloads < 10000)
|
|
79
|
+
score += 0.3;
|
|
80
|
+
else if (model.downloads > 100000)
|
|
81
|
+
score -= 0.2;
|
|
82
|
+
// Combination with dataset adds novelty
|
|
83
|
+
if (dataset)
|
|
84
|
+
score += 0.2;
|
|
85
|
+
// Newer modalities are more novel
|
|
86
|
+
const novelModalities = ['audio', 'video', 'multimodal'];
|
|
87
|
+
if (model.modality && novelModalities.includes(model.modality))
|
|
88
|
+
score += 0.2;
|
|
89
|
+
return Math.max(0, Math.min(score, 1.0));
|
|
90
|
+
}
|
|
91
|
+
function scoreFeasibility(model) {
|
|
92
|
+
let score = 1.0;
|
|
93
|
+
// Hardware requirements reduce feasibility
|
|
94
|
+
if (model.hardware?.gpu)
|
|
95
|
+
score -= 0.3;
|
|
96
|
+
if (model.hardware?.memory === 'high')
|
|
97
|
+
score -= 0.3;
|
|
98
|
+
else if (model.hardware?.memory === 'medium')
|
|
99
|
+
score -= 0.15;
|
|
100
|
+
// Large models are less feasible
|
|
101
|
+
if (model.downloads > 500000)
|
|
102
|
+
score -= 0.1;
|
|
103
|
+
return Math.max(0.1, score);
|
|
104
|
+
}
|
|
105
|
+
function scoreFit(model) {
|
|
106
|
+
let score = 0.5;
|
|
107
|
+
// Text-based tasks fit Clawx well
|
|
108
|
+
if (model.modality === 'text')
|
|
109
|
+
score += 0.3;
|
|
110
|
+
// Classification/generation tasks fit well
|
|
111
|
+
const goodTasks = ['text-classification', 'text-generation', 'translation'];
|
|
112
|
+
if (model.task && goodTasks.includes(model.task))
|
|
113
|
+
score += 0.2;
|
|
114
|
+
// CLI-friendly tasks
|
|
115
|
+
const cliTasks = ['text-classification', 'translation', 'summarization'];
|
|
116
|
+
if (model.task && cliTasks.includes(model.task))
|
|
117
|
+
score += 0.1;
|
|
118
|
+
return Math.min(score, 1.0);
|
|
119
|
+
}
|
|
120
|
+
function determinePossibleOutputs(model, dataset) {
|
|
121
|
+
const outputs = [];
|
|
122
|
+
// Always possible as a tool
|
|
123
|
+
outputs.push({
|
|
124
|
+
type: 'tool',
|
|
125
|
+
complexity: model.hardware?.memory === 'high' ? 'high' :
|
|
126
|
+
model.hardware?.gpu ? 'medium' : 'low'
|
|
127
|
+
});
|
|
128
|
+
// Usually possible as an app
|
|
129
|
+
outputs.push({
|
|
130
|
+
type: 'app',
|
|
131
|
+
complexity: dataset ? 'medium' : 'low'
|
|
132
|
+
});
|
|
133
|
+
return outputs;
|
|
134
|
+
}
|
|
135
|
+
function round(num) {
|
|
136
|
+
return Math.round(num * 100) / 100;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=rank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rank.js","sourceRoot":"","sources":["../../src/forge/rank.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge capability reasoner.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes models and datasets to identify novel capabilities
|
|
5
|
+
* and applications.
|
|
6
|
+
*/
|
|
7
|
+
import type { ClawxConfig } from "../types/index.js";
|
|
8
|
+
import type { ForgeOptions, DiscoveredCapability, HfModel, HfDataset } from "./types.js";
|
|
9
|
+
export declare function analyzeCapabilities(config: ClawxConfig, models: HfModel[], datasets: HfDataset[], options: ForgeOptions): Promise<DiscoveredCapability[]>;
|
|
10
|
+
//# sourceMappingURL=reasoner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoner.d.ts","sourceRoot":"","sources":["../../src/forge/reasoner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAKzF,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,OAAO,EAAE,EACjB,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA4CjC"}
|