@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,101 @@
|
|
|
1
|
+
// Forge v1: HF API client (models + datasets only)
|
|
2
|
+
const HF_API_BASE = 'https://huggingface.co/api';
|
|
3
|
+
export async function searchModels(query, limit = 20) {
|
|
4
|
+
const url = new URL(`${HF_API_BASE}/models`);
|
|
5
|
+
url.searchParams.set('search', query);
|
|
6
|
+
url.searchParams.set('limit', limit.toString());
|
|
7
|
+
url.searchParams.set('sort', 'downloads');
|
|
8
|
+
url.searchParams.set('direction', '-1');
|
|
9
|
+
try {
|
|
10
|
+
const response = await fetch(url.toString());
|
|
11
|
+
if (!response.ok) {
|
|
12
|
+
throw new Error(`HF API error: ${response.status}`);
|
|
13
|
+
}
|
|
14
|
+
const data = await response.json();
|
|
15
|
+
return data.map(convertHFModelToAsset);
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
console.error('Failed to search models:', error);
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function searchDatasets(query, limit = 10) {
|
|
23
|
+
const url = new URL(`${HF_API_BASE}/datasets`);
|
|
24
|
+
url.searchParams.set('search', query);
|
|
25
|
+
url.searchParams.set('limit', limit.toString());
|
|
26
|
+
url.searchParams.set('sort', 'downloads');
|
|
27
|
+
url.searchParams.set('direction', '-1');
|
|
28
|
+
try {
|
|
29
|
+
const response = await fetch(url.toString());
|
|
30
|
+
if (!response.ok) {
|
|
31
|
+
throw new Error(`HF API error: ${response.status}`);
|
|
32
|
+
}
|
|
33
|
+
const data = await response.json();
|
|
34
|
+
return data.map(convertHFDatasetToAsset);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
console.error('Failed to search datasets:', error);
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function convertHFModelToAsset(hfModel) {
|
|
42
|
+
return {
|
|
43
|
+
id: hfModel.id,
|
|
44
|
+
type: 'model',
|
|
45
|
+
name: hfModel.id.split('/').pop() || hfModel.id,
|
|
46
|
+
author: hfModel.id.split('/')[0] || 'unknown',
|
|
47
|
+
downloads: hfModel.downloads || 0,
|
|
48
|
+
tags: hfModel.tags || [],
|
|
49
|
+
task: hfModel.pipeline_tag,
|
|
50
|
+
modality: extractModality(hfModel.tags),
|
|
51
|
+
license: hfModel.license,
|
|
52
|
+
hardware: estimateHardwareRequirements(hfModel)
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function convertHFDatasetToAsset(hfDataset) {
|
|
56
|
+
return {
|
|
57
|
+
id: hfDataset.id,
|
|
58
|
+
type: 'dataset',
|
|
59
|
+
name: hfDataset.id.split('/').pop() || hfDataset.id,
|
|
60
|
+
author: hfDataset.id.split('/')[0] || 'unknown',
|
|
61
|
+
downloads: hfDataset.downloads || 0,
|
|
62
|
+
tags: hfDataset.tags || [],
|
|
63
|
+
task: extractDatasetTask(hfDataset.tags),
|
|
64
|
+
modality: extractModality(hfDataset.tags),
|
|
65
|
+
license: hfDataset.license,
|
|
66
|
+
hardware: { gpu: false, memory: 'low' } // Datasets don't need GPU
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function extractModality(tags) {
|
|
70
|
+
const modalities = ['text', 'image', 'audio', 'video', 'multimodal'];
|
|
71
|
+
for (const modality of modalities) {
|
|
72
|
+
if (tags.includes(modality))
|
|
73
|
+
return modality;
|
|
74
|
+
}
|
|
75
|
+
return 'text'; // Default
|
|
76
|
+
}
|
|
77
|
+
function extractDatasetTask(tags) {
|
|
78
|
+
const tasks = ['text-classification', 'text-generation', 'image-classification',
|
|
79
|
+
'object-detection', 'speech-recognition', 'translation'];
|
|
80
|
+
for (const task of tasks) {
|
|
81
|
+
if (tags.includes(task))
|
|
82
|
+
return task;
|
|
83
|
+
}
|
|
84
|
+
return '';
|
|
85
|
+
}
|
|
86
|
+
function estimateHardwareRequirements(hfModel) {
|
|
87
|
+
const tags = hfModel.tags || [];
|
|
88
|
+
const size = hfModel.safetensors?.total || 0;
|
|
89
|
+
// Check if model likely needs GPU
|
|
90
|
+
let gpu = tags.includes('gpu') ||
|
|
91
|
+
tags.includes('cuda') ||
|
|
92
|
+
size > 500 * 1024 * 1024; // >500MB
|
|
93
|
+
// Estimate memory requirements
|
|
94
|
+
let memory = 'low';
|
|
95
|
+
if (size > 1000 * 1024 * 1024)
|
|
96
|
+
memory = 'high';
|
|
97
|
+
else if (size > 200 * 1024 * 1024)
|
|
98
|
+
memory = 'medium';
|
|
99
|
+
return { gpu, memory };
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=hf-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hf-client.js","sourceRoot":"","sources":["../../src/forge/hf-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge — capability discovery and synthesis engine.
|
|
3
|
+
*
|
|
4
|
+
* Searches Hugging Face for models and datasets, reasons about novel
|
|
5
|
+
* applications, scaffolds working implementations, and preserves them
|
|
6
|
+
* as reusable Clawx tools.
|
|
7
|
+
*/
|
|
8
|
+
export * from "./discover.js";
|
|
9
|
+
export * from "./reasoner.js";
|
|
10
|
+
export * from "./scaffolder.js";
|
|
11
|
+
export * from "./tester.js";
|
|
12
|
+
export * from "./registry.js";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/forge/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge — capability discovery and synthesis engine.
|
|
3
|
+
*
|
|
4
|
+
* Searches Hugging Face for models and datasets, reasons about novel
|
|
5
|
+
* applications, scaffolds working implementations, and preserves them
|
|
6
|
+
* as reusable Clawx tools.
|
|
7
|
+
*/
|
|
8
|
+
export * from "./discover.js";
|
|
9
|
+
export * from "./reasoner.js";
|
|
10
|
+
export * from "./scaffolder.js";
|
|
11
|
+
export * from "./tester.js";
|
|
12
|
+
export * from "./registry.js";
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/forge/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge tool loader.
|
|
3
|
+
*
|
|
4
|
+
* Dynamically loads Forge-built tools into Clawx sessions.
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentTool } from "@mariozechner/pi-agent-core";
|
|
7
|
+
import type { ClawxConfig } from "../types/index.js";
|
|
8
|
+
export declare function setForgeConfig(config: ClawxConfig): void;
|
|
9
|
+
export declare function loadForgeTools(config?: ClawxConfig): Promise<AgentTool<any>[]>;
|
|
10
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/forge/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKrD,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAExD;AAED,wBAAsB,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CA4BpF"}
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge tool loader.
|
|
3
|
+
*
|
|
4
|
+
* Dynamically loads Forge-built tools into Clawx sessions.
|
|
5
|
+
*/
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { getForgeToolsDir } from "./registry.js";
|
|
9
|
+
import { log } from "../utils/logger.js";
|
|
10
|
+
// Global config for HF inference
|
|
11
|
+
let globalConfig = null;
|
|
12
|
+
export function setForgeConfig(config) {
|
|
13
|
+
globalConfig = config;
|
|
14
|
+
}
|
|
15
|
+
export async function loadForgeTools(config) {
|
|
16
|
+
if (config) {
|
|
17
|
+
setForgeConfig(config);
|
|
18
|
+
}
|
|
19
|
+
const toolsDir = getForgeToolsDir();
|
|
20
|
+
if (!fs.existsSync(toolsDir)) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
const toolFiles = fs.readdirSync(toolsDir)
|
|
24
|
+
.filter(f => f.endsWith('.json') && !f.endsWith('.test.json'));
|
|
25
|
+
const tools = [];
|
|
26
|
+
for (const file of toolFiles) {
|
|
27
|
+
try {
|
|
28
|
+
const tool = await loadForgeTool(path.join(toolsDir, file));
|
|
29
|
+
if (tool) {
|
|
30
|
+
tools.push(tool);
|
|
31
|
+
log.debug(`Loaded Forge tool: ${tool.name}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
log.warn(`Failed to load Forge tool ${file}:`, error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return tools;
|
|
39
|
+
}
|
|
40
|
+
async function loadForgeTool(filePath) {
|
|
41
|
+
try {
|
|
42
|
+
// Read JSON tool definition
|
|
43
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
44
|
+
const toolDef = JSON.parse(content);
|
|
45
|
+
// Create AgentTool from JSON definition
|
|
46
|
+
return createToolFromDefinition(toolDef);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
log.error(`Error loading tool ${filePath}:`, error);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function createToolFromDefinition(def) {
|
|
54
|
+
const { name, label, description, parameters, implementation } = def;
|
|
55
|
+
// Convert JSON parameters to TypeBox schema
|
|
56
|
+
const paramSchema = convertParametersToSchema(parameters);
|
|
57
|
+
return {
|
|
58
|
+
name,
|
|
59
|
+
label: label || name,
|
|
60
|
+
description,
|
|
61
|
+
parameters: paramSchema,
|
|
62
|
+
async execute(_toolCallId, params) {
|
|
63
|
+
try {
|
|
64
|
+
// Execute based on implementation type
|
|
65
|
+
const result = await executeImplementation(implementation, params);
|
|
66
|
+
return {
|
|
67
|
+
content: [{
|
|
68
|
+
type: "text",
|
|
69
|
+
text: result.output
|
|
70
|
+
}],
|
|
71
|
+
details: result.details,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
return {
|
|
76
|
+
content: [{
|
|
77
|
+
type: "text",
|
|
78
|
+
text: `Error executing ${name}: ${error instanceof Error ? error.message : String(error)}`
|
|
79
|
+
}],
|
|
80
|
+
details: { error: String(error) },
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function convertParametersToSchema(parameters) {
|
|
87
|
+
// For now, return a simple object schema
|
|
88
|
+
// In a full implementation, this would create proper TypeBox schemas
|
|
89
|
+
return {
|
|
90
|
+
type: "object",
|
|
91
|
+
properties: parameters,
|
|
92
|
+
required: Object.keys(parameters).filter(key => !parameters[key].default),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async function executeImplementation(impl, params) {
|
|
96
|
+
const { type, models = [], config = {} } = impl;
|
|
97
|
+
switch (type) {
|
|
98
|
+
case "echo":
|
|
99
|
+
return {
|
|
100
|
+
output: `Echo: ${JSON.stringify(params, null, 2)}`,
|
|
101
|
+
details: { type: "echo", params }
|
|
102
|
+
};
|
|
103
|
+
case "classification":
|
|
104
|
+
return await executeClassification(impl, params);
|
|
105
|
+
case "generation":
|
|
106
|
+
const prompt = params.prompt || params.text || params.input || "";
|
|
107
|
+
return {
|
|
108
|
+
output: `Generated text for: "${prompt.substring(0, 50)}${prompt.length > 50 ? '...' : ''}"\n\n[This is simulated text generation. To implement real generation:\n1. Set HUGGINGFACE_TOKEN environment variable\n2. Use model: ${models[0] || 'a text generation model'}\n3. Implement actual inference]`,
|
|
109
|
+
details: {
|
|
110
|
+
type: "generation",
|
|
111
|
+
promptLength: prompt.length,
|
|
112
|
+
models
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
case "simulated":
|
|
116
|
+
default:
|
|
117
|
+
return {
|
|
118
|
+
output: `Simulated tool execution with params: ${JSON.stringify(params, null, 2)}\n\nImplementation type: ${type}\nModels: ${models.join(', ') || 'none'}`,
|
|
119
|
+
details: {
|
|
120
|
+
type,
|
|
121
|
+
params,
|
|
122
|
+
models,
|
|
123
|
+
simulated: true
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function executeClassification(impl, params) {
|
|
129
|
+
const { models = [], config = {} } = impl;
|
|
130
|
+
const categories = params.categories || ["positive", "negative", "neutral"];
|
|
131
|
+
const text = params.text || params.input || "";
|
|
132
|
+
// Check if we have a Hugging Face token for real inference
|
|
133
|
+
if (globalConfig?.huggingfaceToken && models.length > 0) {
|
|
134
|
+
try {
|
|
135
|
+
// Get model metadata
|
|
136
|
+
const model = models[0];
|
|
137
|
+
const modelId = typeof model === 'string' ? model : model.id;
|
|
138
|
+
const classificationType = model.classificationType || detectClassificationType(modelId);
|
|
139
|
+
const supportedLabels = model.supportedLabels;
|
|
140
|
+
// Validate model compatibility
|
|
141
|
+
const validation = validateClassificationModel(modelId, classificationType, categories, supportedLabels);
|
|
142
|
+
if (!validation.compatible) {
|
|
143
|
+
log.warn(`Model ${modelId} incompatible: ${validation.reason}`);
|
|
144
|
+
// Try to find a compatible fallback
|
|
145
|
+
const fallbackModel = findCompatibleClassificationModel(categories);
|
|
146
|
+
if (fallbackModel) {
|
|
147
|
+
log.info(`Falling back to compatible model: ${fallbackModel}`);
|
|
148
|
+
return await executeRealClassification(globalConfig.huggingfaceToken, fallbackModel, text, categories, classificationType);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
log.warn("No compatible fallback model found, using simulation");
|
|
152
|
+
// Fall through to simulation with clear explanation
|
|
153
|
+
return await executeSimulatedClassification(text, categories, models, {
|
|
154
|
+
incompatible: true,
|
|
155
|
+
reason: validation.reason,
|
|
156
|
+
attemptedModel: modelId
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return await executeRealClassification(globalConfig.huggingfaceToken, modelId, text, categories, classificationType);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
log.warn("Real classification failed, falling back to simulation:", error);
|
|
164
|
+
// Fall through to simulated
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return await executeSimulatedClassification(text, categories, models);
|
|
168
|
+
}
|
|
169
|
+
async function executeRealClassification(hfToken, modelId, text, categories, classificationType) {
|
|
170
|
+
try {
|
|
171
|
+
// Determine API endpoint and payload based on classification type
|
|
172
|
+
// Use new router API: https://router.huggingface.co
|
|
173
|
+
let apiUrl = `https://router.huggingface.co/models/${modelId}`;
|
|
174
|
+
let payload = { inputs: text };
|
|
175
|
+
if (classificationType === "zero-shot") {
|
|
176
|
+
// Zero-shot classification uses candidate_labels parameter
|
|
177
|
+
apiUrl = `https://router.huggingface.co/models/${modelId}/zero-shot-classification`;
|
|
178
|
+
payload = {
|
|
179
|
+
inputs: text,
|
|
180
|
+
parameters: {
|
|
181
|
+
candidate_labels: categories,
|
|
182
|
+
multi_label: false,
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
else if (classificationType === "text" || classificationType === "sequence") {
|
|
187
|
+
// Text/sequence classification - standard inference
|
|
188
|
+
// Note: categories are ignored for fixed-label models
|
|
189
|
+
apiUrl = `https://router.huggingface.co/models/${modelId}`;
|
|
190
|
+
payload = { inputs: text };
|
|
191
|
+
}
|
|
192
|
+
// Add timeout handling
|
|
193
|
+
const controller = new AbortController();
|
|
194
|
+
const timeoutId = setTimeout(() => controller.abort(), 30000); // 30 second timeout
|
|
195
|
+
const response = await fetch(apiUrl, {
|
|
196
|
+
method: "POST",
|
|
197
|
+
headers: {
|
|
198
|
+
"Authorization": `Bearer ${hfToken}`,
|
|
199
|
+
"Content-Type": "application/json",
|
|
200
|
+
},
|
|
201
|
+
body: JSON.stringify(payload),
|
|
202
|
+
signal: controller.signal,
|
|
203
|
+
});
|
|
204
|
+
clearTimeout(timeoutId);
|
|
205
|
+
if (!response.ok) {
|
|
206
|
+
const errorText = await response.text();
|
|
207
|
+
throw new Error(`HF API error ${response.status}: ${errorText}`);
|
|
208
|
+
}
|
|
209
|
+
const data = await response.json();
|
|
210
|
+
// Parse response based on classification type
|
|
211
|
+
let formattedResults = [];
|
|
212
|
+
let output = `Classification Result (Real Inference):\n\nText: "${text.substring(0, 100)}${text.length > 100 ? '...' : ''}"\n\nModel: ${modelId}\n\n`;
|
|
213
|
+
if (classificationType === "zero-shot") {
|
|
214
|
+
// Zero-shot classification response format
|
|
215
|
+
// Example: {"sequence": "text", "labels": ["label1", "label2"], "scores": [0.9, 0.1]}
|
|
216
|
+
const zeroShotData = data;
|
|
217
|
+
if (zeroShotData.labels && zeroShotData.scores && zeroShotData.labels.length === zeroShotData.scores.length) {
|
|
218
|
+
formattedResults = zeroShotData.labels.map((label, index) => ({
|
|
219
|
+
label,
|
|
220
|
+
score: zeroShotData.scores[index],
|
|
221
|
+
rank: index + 1
|
|
222
|
+
})).sort((a, b) => b.score - a.score);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
// Standard text/sequence classification response format
|
|
227
|
+
// Example: [[{"label": "LABEL_0", "score": 0.99}]]
|
|
228
|
+
if (Array.isArray(data) && data.length > 0) {
|
|
229
|
+
const results = Array.isArray(data[0]) ? data[0] : data;
|
|
230
|
+
const typedResults = results;
|
|
231
|
+
formattedResults = typedResults.map((item, index) => ({
|
|
232
|
+
label: item.label,
|
|
233
|
+
score: item.score,
|
|
234
|
+
rank: index + 1
|
|
235
|
+
})).sort((a, b) => b.score - a.score);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (formattedResults.length > 0) {
|
|
239
|
+
const topResult = formattedResults[0];
|
|
240
|
+
output += `Top category: ${topResult.label} (${(topResult.score * 100).toFixed(1)}%)\n\nAll categories:\n${formattedResults.map((r) => ` ${r.label.padEnd(15)}: ${(r.score * 100).toFixed(1)}%`).join('\n')}`;
|
|
241
|
+
return {
|
|
242
|
+
output,
|
|
243
|
+
details: {
|
|
244
|
+
type: "classification",
|
|
245
|
+
classificationType,
|
|
246
|
+
result: formattedResults,
|
|
247
|
+
topLabel: topResult.label,
|
|
248
|
+
confidence: topResult.score,
|
|
249
|
+
textLength: text.length,
|
|
250
|
+
model: modelId,
|
|
251
|
+
simulated: false,
|
|
252
|
+
apiResponse: data
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
// Unexpected response format
|
|
258
|
+
throw new Error(`Unexpected API response format: ${JSON.stringify(data)}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
log.error("Real classification failed:", error);
|
|
263
|
+
throw error;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Helper functions for classification compatibility
|
|
267
|
+
function detectClassificationType(modelId) {
|
|
268
|
+
// Heuristic detection based on model ID
|
|
269
|
+
const lowerId = modelId.toLowerCase();
|
|
270
|
+
if (lowerId.includes("zero-shot") || lowerId.includes("mnli") ||
|
|
271
|
+
lowerId.includes("bart-large-mnli") || lowerId.includes("distilbert-base-uncased-mnli")) {
|
|
272
|
+
return "zero-shot";
|
|
273
|
+
}
|
|
274
|
+
if (lowerId.includes("sentiment") || lowerId.includes("sst") ||
|
|
275
|
+
lowerId.includes("emotion") || lowerId.includes("topic")) {
|
|
276
|
+
return "text";
|
|
277
|
+
}
|
|
278
|
+
if (lowerId.includes("ner") || lowerId.includes("named-entity") ||
|
|
279
|
+
lowerId.includes("sequence") || lowerId.includes("token")) {
|
|
280
|
+
return "sequence";
|
|
281
|
+
}
|
|
282
|
+
// Default to text classification (most common)
|
|
283
|
+
return "text";
|
|
284
|
+
}
|
|
285
|
+
function validateClassificationModel(modelId, classificationType, requestedCategories, supportedLabels) {
|
|
286
|
+
// Check if model supports zero-shot classification
|
|
287
|
+
if (classificationType === "zero-shot") {
|
|
288
|
+
// Zero-shot models accept any categories
|
|
289
|
+
return { compatible: true };
|
|
290
|
+
}
|
|
291
|
+
// For text/sequence classification with fixed labels
|
|
292
|
+
if (classificationType === "text" || classificationType === "sequence") {
|
|
293
|
+
if (supportedLabels && supportedLabels.length > 0) {
|
|
294
|
+
// Check if requested categories match supported labels
|
|
295
|
+
const normalizedRequested = requestedCategories.map(c => c.toUpperCase());
|
|
296
|
+
const normalizedSupported = supportedLabels.map(l => l.toUpperCase());
|
|
297
|
+
const allMatch = requestedCategories.every(cat => normalizedSupported.includes(cat.toUpperCase()));
|
|
298
|
+
if (!allMatch) {
|
|
299
|
+
return {
|
|
300
|
+
compatible: false,
|
|
301
|
+
reason: `Model ${modelId} supports labels: ${supportedLabels.join(', ')}, but requested: ${requestedCategories.join(', ')}`
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
// No supported labels defined - assume compatible but warn
|
|
307
|
+
log.warn(`Model ${modelId} has no supportedLabels defined for ${classificationType} classification`);
|
|
308
|
+
return { compatible: true };
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return { compatible: true };
|
|
312
|
+
}
|
|
313
|
+
function findCompatibleClassificationModel(requestedCategories) {
|
|
314
|
+
// Known compatible models for fallback
|
|
315
|
+
const knownModels = [
|
|
316
|
+
{
|
|
317
|
+
id: "facebook/bart-large-mnli",
|
|
318
|
+
type: "zero-shot",
|
|
319
|
+
description: "Zero-shot classification model"
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
id: "finiteautomata/beto-sentiment-analysis",
|
|
323
|
+
type: "text",
|
|
324
|
+
supportedLabels: ["POSITIVE", "NEGATIVE", "NEUTRAL"],
|
|
325
|
+
description: "Spanish sentiment analysis"
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
id: "distilbert-base-uncased-finetuned-sst-2-english",
|
|
329
|
+
type: "text",
|
|
330
|
+
supportedLabels: ["POSITIVE", "NEGATIVE"],
|
|
331
|
+
description: "English sentiment analysis"
|
|
332
|
+
}
|
|
333
|
+
];
|
|
334
|
+
// Try to find a zero-shot model first (most flexible)
|
|
335
|
+
const zeroShotModel = knownModels.find(m => m.type === "zero-shot");
|
|
336
|
+
if (zeroShotModel) {
|
|
337
|
+
return zeroShotModel.id;
|
|
338
|
+
}
|
|
339
|
+
// Try to find a text classification model with matching labels
|
|
340
|
+
const normalizedRequested = requestedCategories.map(c => c.toUpperCase());
|
|
341
|
+
for (const model of knownModels) {
|
|
342
|
+
if (model.type === "text" && model.supportedLabels) {
|
|
343
|
+
const allMatch = requestedCategories.every(cat => model.supportedLabels.includes(cat.toUpperCase()));
|
|
344
|
+
if (allMatch) {
|
|
345
|
+
return model.id;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
async function executeSimulatedClassification(text, categories, models, context) {
|
|
352
|
+
// Simulated classification (fallback)
|
|
353
|
+
const scores = categories.map(() => Math.random());
|
|
354
|
+
const total = scores.reduce((a, b) => a + b, 0);
|
|
355
|
+
const normalized = scores.map((s) => (s / total).toFixed(3));
|
|
356
|
+
const result = categories.map((cat, i) => ({
|
|
357
|
+
label: cat,
|
|
358
|
+
score: parseFloat(normalized[i])
|
|
359
|
+
})).sort((a, b) => b.score - a.score);
|
|
360
|
+
const topLabel = result[0].label;
|
|
361
|
+
const confidence = result[0].score;
|
|
362
|
+
const tokenStatus = globalConfig?.huggingfaceToken ? "✅ HF token available" : "❌ No HF token";
|
|
363
|
+
const modelStatus = models.length > 0 ? `Model: ${typeof models[0] === 'string' ? models[0] : models[0].id}` : "No model specified";
|
|
364
|
+
let output = `Classification Result (Simulated):\n\nText: "${text.substring(0, 100)}${text.length > 100 ? '...' : ''}"\n\nTop category: ${topLabel} (${(confidence * 100).toFixed(1)}%)\n\nAll categories:\n${result.map((r) => ` ${r.label.padEnd(15)}: ${(r.score * 100).toFixed(1)}%`).join('\n')}\n\n${tokenStatus}\n${modelStatus}`;
|
|
365
|
+
if (context?.incompatible) {
|
|
366
|
+
output += `\n\n⚠️ Model incompatible: ${context.reason}`;
|
|
367
|
+
output += `\nAttempted model: ${context.attemptedModel}`;
|
|
368
|
+
}
|
|
369
|
+
output += `\n\nTo use real inference:\n1. Set HUGGINGFACE_TOKEN environment variable\n2. Ensure model supports requested classification type`;
|
|
370
|
+
return {
|
|
371
|
+
output,
|
|
372
|
+
details: {
|
|
373
|
+
type: "classification",
|
|
374
|
+
result,
|
|
375
|
+
topLabel,
|
|
376
|
+
confidence,
|
|
377
|
+
textLength: text.length,
|
|
378
|
+
models: models.map(m => typeof m === 'string' ? m : m.id),
|
|
379
|
+
simulated: true,
|
|
380
|
+
realInferenceAttempted: !!globalConfig?.huggingfaceToken,
|
|
381
|
+
...context
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/forge/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.test.d.ts","sourceRoot":"","sources":["../../src/forge/loader.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Forge tool loader
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from "vitest";
|
|
5
|
+
import { loadForgeTools } from "./loader.js";
|
|
6
|
+
describe("Forge loader", () => {
|
|
7
|
+
it("should be a function", () => {
|
|
8
|
+
expect(typeof loadForgeTools).toBe("function");
|
|
9
|
+
});
|
|
10
|
+
it("should return a promise", () => {
|
|
11
|
+
const result = loadForgeTools();
|
|
12
|
+
expect(result).toBeInstanceOf(Promise);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../src/forge/loader.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge pipeline builder.
|
|
3
|
+
*
|
|
4
|
+
* Builds discovered pipelines into working Clawx tools.
|
|
5
|
+
*/
|
|
6
|
+
import type { ClawxConfig } from "../types/index.js";
|
|
7
|
+
import type { BuildOptions } from "./types.js";
|
|
8
|
+
export declare function buildPipeline(config: ClawxConfig, pipelineId: string, options?: BuildOptions): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=pipeline-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-builder.d.ts","sourceRoot":"","sources":["../../src/forge/pipeline-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C,wBAAsB,aAAa,CACjC,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CA6Ef"}
|