@barivia/barsom-mcp 0.6.1 → 0.6.3
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/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/shared.d.ts +90 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +439 -0
- package/dist/shared.js.map +1 -0
- package/dist/tools/account.d.ts +3 -0
- package/dist/tools/account.d.ts.map +1 -0
- package/dist/tools/account.js +139 -0
- package/dist/tools/account.js.map +1 -0
- package/dist/tools/datasets.d.ts +11 -0
- package/dist/tools/datasets.d.ts.map +1 -0
- package/dist/tools/datasets.js +323 -0
- package/dist/tools/datasets.js.map +1 -0
- package/dist/tools/explore_map.d.ts +4 -0
- package/dist/tools/explore_map.d.ts.map +1 -0
- package/dist/tools/explore_map.js +39 -0
- package/dist/tools/explore_map.js.map +1 -0
- package/dist/tools/feedback.d.ts +3 -0
- package/dist/tools/feedback.d.ts.map +1 -0
- package/dist/tools/feedback.js +30 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/guide_barsom.d.ts +3 -0
- package/dist/tools/guide_barsom.d.ts.map +1 -0
- package/dist/tools/guide_barsom.js +46 -0
- package/dist/tools/guide_barsom.js.map +1 -0
- package/dist/tools/inference.d.ts +3 -0
- package/dist/tools/inference.d.ts.map +1 -0
- package/dist/tools/inference.js +177 -0
- package/dist/tools/inference.js.map +1 -0
- package/dist/tools/jobs.d.ts +4 -0
- package/dist/tools/jobs.d.ts.map +1 -0
- package/dist/tools/jobs.js +270 -0
- package/dist/tools/jobs.js.map +1 -0
- package/dist/tools/results.d.ts +11 -0
- package/dist/tools/results.d.ts.map +1 -0
- package/dist/tools/results.js +455 -0
- package/dist/tools/results.js.map +1 -0
- package/dist/tools/training_guidance.d.ts +3 -0
- package/dist/tools/training_guidance.d.ts.map +1 -0
- package/dist/tools/training_guidance.js +8 -0
- package/dist/tools/training_guidance.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { apiCall, pollUntilComplete, tryAttachImage } from "../shared.js";
|
|
3
|
+
export function registerInferenceTool(server) {
|
|
4
|
+
server.tool("inference", `Use a trained map as a persistent inference artifact — score new data, enrich the training CSV, compare datasets, or generate a PDF report.
|
|
5
|
+
|
|
6
|
+
| Action | Use when | Timing |
|
|
7
|
+
|--------|----------|--------|
|
|
8
|
+
| predict | Scoring new/unseen observations against the trained map | 5–120s |
|
|
9
|
+
| enrich | Appending BMU coordinates + cluster_id to the original training CSV | 5–60s |
|
|
10
|
+
| compare | Comparing hit distributions of a second dataset against training (drift, A/B) | 30–120s |
|
|
11
|
+
| project_columns | Project one or more dataset columns onto the map (component planes); dataset can be training set or partial-feature set | 10–90s |
|
|
12
|
+
| report | Get a report manifest (artifact keys + URLs) to build your own report in Quarto/Notebook/script | Immediate (sync) |
|
|
13
|
+
|
|
14
|
+
Sync/async: predict, enrich, and compare are all async jobs. The proxy auto-polls and usually returns when the job completes. If it returns a job_id instead (e.g. timeout), poll jobs(action=status, job_id=...) then results(action=download, job_id=...) to retrieve the artifact.
|
|
15
|
+
Artifacts: When complete, use results(action=download, job_id=<returned_job_id>) to get: predict → predictions.csv; enrich → enriched.csv; compare → density-diff figure (e.g. density_diff.png).
|
|
16
|
+
report is the only synchronous inference action — returns manifest immediately; no job to poll.
|
|
17
|
+
NOT FOR: Retraining or changing the map — all actions treat the trained map as frozen.
|
|
18
|
+
ESCALATION: If any action returns "missing column", verify column names with datasets(action=preview). Column names are case-sensitive and must match the training feature set exactly.
|
|
19
|
+
|
|
20
|
+
action=predict: Returns predictions.csv with row_id, bmu_x, bmu_y, bmu_node_index, cluster_id, quantization_error, potential_anomaly (true when QE > 95th percentile; summary includes qe_p95 for the threshold). Use potential_anomaly for downstream anomaly filtering.
|
|
21
|
+
Rows must use the same schema as training (including cyclic-expanded columns, e.g. key_cos, key_sin not raw key). High QE = row is far from its nearest prototype = potential anomaly. Accepts dataset_id OR inline rows (≤500).
|
|
22
|
+
action=enrich: Uses the job's training dataset; do not pass dataset_id. Returns enriched.csv — original training CSV + bmu_x, bmu_y, bmu_node_index, cluster_id. When complete, get enriched.csv via results(action=download, job_id=<returned_enrich_job_id>). Filename: enriched.csv.
|
|
23
|
+
action=compare: dataset_id must refer to a dataset with the same feature set as the training data (same column names and preprocessing, including cyclic expansion). A = training dataset (the map was trained on it). B = cohort to compare (the dataset_id you pass). Density-diff: positive = B gained vs A; negative = A had more. Using the same dataset as A and B yields a flat diff. Returns density-diff heatmap (e.g. density_diff.png).
|
|
24
|
+
action=project_columns: Project one or more columns from a dataset onto the trained map. Pass dataset_id (the dataset containing the columns) and columns (array of column names). Uses cached BMUs when dataset is the training set; supports partial-feature mapping when dataset has only a subset of training features. Returns one component plane image per column. Get files via results(action=download, job_id=<returned_job_id>).
|
|
25
|
+
action=report: Returns a report manifest for the given job_id (job must be completed). Includes figure_manifest (logical names → filenames), download_urls for all artifacts, cluster_summary when available, and summary metrics. Stakeholder report PDF (if generated) is available via results(action=download, job_id=<training_job_id>), filename e.g. report.pdf. Use results(action=get) and this manifest to fetch figures/data and render your own PDF (e.g. Quarto, Jupyter). See docs: BUILD_YOUR_OWN_REPORT.md.`, {
|
|
26
|
+
action: z
|
|
27
|
+
.enum(["predict", "enrich", "compare", "project_columns", "report"])
|
|
28
|
+
.describe("predict: score new data; enrich: annotate training CSV with BMU coords; compare: drift/cohort diff heatmap; project_columns: project dataset columns onto map; report: manifest of primitives for custom report"),
|
|
29
|
+
job_id: z.string().describe("Job ID of a completed map training job"),
|
|
30
|
+
dataset_id: z.string().optional().describe("action=predict/compare/project_columns: Dataset ID. predict=input data to score; compare=dataset B; project_columns=dataset with columns to project."),
|
|
31
|
+
columns: z.array(z.string()).optional().describe("action=project_columns: column names to project onto the map (must exist in the dataset)."),
|
|
32
|
+
rows: z.array(z.record(z.string(), z.number())).optional().describe("action=predict: inline rows to score (max 500). Each object maps feature name → value."),
|
|
33
|
+
colormap: z.string().optional().describe("action=compare: colormap for diff heatmap (default: balance). action=report: n/a."),
|
|
34
|
+
output_format: z.enum(["png", "pdf", "svg"]).optional().default("png").describe("action=compare: output format for heatmap (default: png)"),
|
|
35
|
+
output_dpi: z.number().int().min(1).max(4).optional().default(2).describe("action=compare: DPI scale (default: 2)"),
|
|
36
|
+
top_n: z.number().int().min(1).max(50).optional().default(10).describe("action=compare: number of top gained/lost nodes to report (default: 10)"),
|
|
37
|
+
}, async ({ action, job_id, dataset_id, columns, rows, colormap, output_format, output_dpi, top_n }) => {
|
|
38
|
+
if (action === "predict") {
|
|
39
|
+
if (!dataset_id && !rows)
|
|
40
|
+
throw new Error("inference(predict) requires dataset_id or rows");
|
|
41
|
+
const body = {};
|
|
42
|
+
if (dataset_id)
|
|
43
|
+
body.dataset_id = dataset_id;
|
|
44
|
+
if (rows)
|
|
45
|
+
body.rows = rows;
|
|
46
|
+
const data = (await apiCall("POST", `/v1/results/${job_id}/predict`, body));
|
|
47
|
+
const predictJobId = data.id;
|
|
48
|
+
const poll = await pollUntilComplete(predictJobId, 120_000);
|
|
49
|
+
if (poll.status === "completed") {
|
|
50
|
+
const results = (await apiCall("GET", `/v1/results/${predictJobId}`));
|
|
51
|
+
const summary = (results.summary ?? {});
|
|
52
|
+
const urls = (results.download_urls ?? {});
|
|
53
|
+
return { content: [{ type: "text", text: [
|
|
54
|
+
`Predictions complete — job: ${predictJobId}`,
|
|
55
|
+
`Rows scored: ${summary.n_rows ?? "?"}`,
|
|
56
|
+
`Mean QE: ${summary.mean_qe !== undefined ? Number(summary.mean_qe).toFixed(4) : "N/A"} | Max QE: ${summary.max_qe !== undefined ? Number(summary.max_qe).toFixed(4) : "N/A"}`,
|
|
57
|
+
`Clusters: ${Object.keys(summary.cluster_counts ?? {}).length}`,
|
|
58
|
+
`Output: predictions.csv (row_id, bmu_x, bmu_y, bmu_node_index, cluster_id, quantization_error, potential_anomaly). Summary includes mean_qe, max_qe, qe_p95.`,
|
|
59
|
+
urls["predictions.csv"] ? `Download: ${urls["predictions.csv"]}` : "",
|
|
60
|
+
].filter(Boolean).join("\n") }] };
|
|
61
|
+
}
|
|
62
|
+
if (poll.status === "failed")
|
|
63
|
+
return { content: [{ type: "text", text: `inference(predict) job ${predictJobId} failed: ${poll.error ?? "unknown error"}` }] };
|
|
64
|
+
return { content: [{ type: "text", text: `inference(predict) job ${predictJobId} submitted. Poll with jobs(action=status, job_id="${predictJobId}").` }] };
|
|
65
|
+
}
|
|
66
|
+
if (action === "enrich") {
|
|
67
|
+
const data = (await apiCall("POST", `/v1/results/${job_id}/enrich_dataset`, {}));
|
|
68
|
+
const enrichJobId = data.id;
|
|
69
|
+
const poll = await pollUntilComplete(enrichJobId, 60_000);
|
|
70
|
+
if (poll.status === "completed") {
|
|
71
|
+
const results = (await apiCall("GET", `/v1/results/${enrichJobId}`));
|
|
72
|
+
const summary = (results.summary ?? {});
|
|
73
|
+
const urls = (results.download_urls ?? {});
|
|
74
|
+
return { content: [{ type: "text", text: [
|
|
75
|
+
`Enriched dataset ready — job: ${enrichJobId}`,
|
|
76
|
+
`Rows: ${summary.n_rows ?? "?"} | Clusters: ${summary.n_clusters ?? "?"}`,
|
|
77
|
+
`Appended: bmu_x, bmu_y, bmu_node_index, cluster_id`,
|
|
78
|
+
urls["enriched.csv"] ? `Download: ${urls["enriched.csv"]}` : "",
|
|
79
|
+
].filter(Boolean).join("\n") }] };
|
|
80
|
+
}
|
|
81
|
+
if (poll.status === "failed")
|
|
82
|
+
return { content: [{ type: "text", text: `inference(enrich) job ${enrichJobId} failed: ${poll.error ?? "unknown error"}` }] };
|
|
83
|
+
return { content: [{ type: "text", text: `inference(enrich) job ${enrichJobId} submitted. Poll with jobs(action=status, job_id="${enrichJobId}").` }] };
|
|
84
|
+
}
|
|
85
|
+
if (action === "compare") {
|
|
86
|
+
if (!dataset_id)
|
|
87
|
+
throw new Error("inference(compare) requires dataset_id (dataset B)");
|
|
88
|
+
const body = { dataset_id, output_format, output_dpi, top_n };
|
|
89
|
+
if (colormap)
|
|
90
|
+
body.colormap = colormap;
|
|
91
|
+
const data = (await apiCall("POST", `/v1/results/${job_id}/compare_datasets`, body));
|
|
92
|
+
const compareJobId = data.id;
|
|
93
|
+
const poll = await pollUntilComplete(compareJobId, 120_000);
|
|
94
|
+
if (poll.status === "completed") {
|
|
95
|
+
const results = (await apiCall("GET", `/v1/results/${compareJobId}`));
|
|
96
|
+
const summary = (results.summary ?? {});
|
|
97
|
+
const gained = summary.top_gained_nodes ?? [];
|
|
98
|
+
const lost = summary.top_lost_nodes ?? [];
|
|
99
|
+
const fmtNode = (n) => ` node ${n.bmu_node_index ?? "?"} [${(n.coords ?? [0, 0]).map(v => Number(v).toFixed(1)).join(",")}] Δ=${Number(n.density_diff ?? 0).toFixed(4)}`;
|
|
100
|
+
const content = [{ type: "text", text: [
|
|
101
|
+
`Dataset comparison — job: ${compareJobId}`,
|
|
102
|
+
`Dataset A rows: ${summary.n_rows_a ?? "?"} | Dataset B rows: ${summary.n_rows_b ?? "?"}`,
|
|
103
|
+
`Top gained (B > A):`, ...gained.slice(0, 5).map(fmtNode),
|
|
104
|
+
`Top lost (A > B):`, ...lost.slice(0, 5).map(fmtNode),
|
|
105
|
+
].join("\n") }];
|
|
106
|
+
content.push({ type: "text", text: "Density difference — Positive (red) = Dataset B gained density; Negative (blue) = Dataset A had more density." });
|
|
107
|
+
await tryAttachImage(content, compareJobId, `density_diff.${summary.output_format ?? output_format ?? "png"}`);
|
|
108
|
+
return { content };
|
|
109
|
+
}
|
|
110
|
+
if (poll.status === "failed")
|
|
111
|
+
return { content: [{ type: "text", text: `inference(compare) job ${compareJobId} failed: ${poll.error ?? "unknown error"}` }] };
|
|
112
|
+
return { content: [{ type: "text", text: `inference(compare) job ${compareJobId} submitted. Poll with jobs(action=status, job_id="${compareJobId}").` }] };
|
|
113
|
+
}
|
|
114
|
+
if (action === "project_columns") {
|
|
115
|
+
if (!dataset_id)
|
|
116
|
+
throw new Error("inference(project_columns) requires dataset_id");
|
|
117
|
+
if (!columns || columns.length === 0)
|
|
118
|
+
throw new Error("inference(project_columns) requires columns (non-empty array of column names)");
|
|
119
|
+
const body = { dataset_id, columns, output_format, output_dpi };
|
|
120
|
+
if (colormap)
|
|
121
|
+
body.colormap = colormap;
|
|
122
|
+
const data = (await apiCall("POST", `/v1/results/${job_id}/project_columns`, body));
|
|
123
|
+
const projJobId = data.id;
|
|
124
|
+
const poll = await pollUntilComplete(projJobId, 90_000);
|
|
125
|
+
if (poll.status === "completed") {
|
|
126
|
+
const results = (await apiCall("GET", `/v1/results/${projJobId}`));
|
|
127
|
+
const summary = (results.summary ?? {});
|
|
128
|
+
const columnStats = (summary.column_stats ?? {});
|
|
129
|
+
const files = (summary.files ?? []);
|
|
130
|
+
const lines = [
|
|
131
|
+
`Project columns complete — job: ${projJobId}`,
|
|
132
|
+
`Columns: ${summary.columns?.join(", ") ?? columns.join(", ")} | Samples: ${summary.n_samples ?? "?"}`,
|
|
133
|
+
...Object.entries(columnStats).map(([col, s]) => ` ${col}: nodes with data ${s.n_nodes_with_data ?? "?"}`),
|
|
134
|
+
files.filter((f) => f.endsWith(".png") || f.endsWith(".pdf") || f.endsWith(".svg")).length ? `Output: ${files.filter((f) => f !== "summary.json").join(", ")}` : "",
|
|
135
|
+
];
|
|
136
|
+
return { content: [{ type: "text", text: lines.filter(Boolean).join("\n") }] };
|
|
137
|
+
}
|
|
138
|
+
if (poll.status === "failed")
|
|
139
|
+
return { content: [{ type: "text", text: `inference(project_columns) job ${projJobId} failed: ${poll.error ?? "unknown error"}` }] };
|
|
140
|
+
return { content: [{ type: "text", text: `inference(project_columns) job ${projJobId} submitted. Poll with jobs(action=status, job_id="${projJobId}").` }] };
|
|
141
|
+
}
|
|
142
|
+
// action === "report"
|
|
143
|
+
const results = (await apiCall("GET", `/v1/results/${job_id}`));
|
|
144
|
+
const download_urls = (results.download_urls ?? {});
|
|
145
|
+
const figure_manifest = (results.figure_manifest ?? []);
|
|
146
|
+
const cluster_summary = results.cluster_summary;
|
|
147
|
+
const expires_in = results.expires_in ?? 900;
|
|
148
|
+
const lines = [
|
|
149
|
+
`Report manifest — job: ${job_id}`,
|
|
150
|
+
`Use these artifacts to build your own report (Quarto, Jupyter, script). URLs expire in ${expires_in}s.`,
|
|
151
|
+
"",
|
|
152
|
+
"Figures (figure_manifest → download_urls):",
|
|
153
|
+
...figure_manifest.slice(0, 12).map((e) => ` ${e.logical_name} → ${e.filename}`),
|
|
154
|
+
figure_manifest.length > 12 ? ` ... and ${figure_manifest.length - 12} more` : "",
|
|
155
|
+
"",
|
|
156
|
+
"Key download URLs (use get_result_image or download_urls from results(action=get)):",
|
|
157
|
+
...Object.keys(download_urls)
|
|
158
|
+
.filter((k) => !k.endsWith(".json") || k === "cluster_summary.json")
|
|
159
|
+
.slice(0, 8)
|
|
160
|
+
.map((k) => ` ${k}: ${download_urls[k]?.slice(0, 60)}...`),
|
|
161
|
+
"",
|
|
162
|
+
cluster_summary?.length
|
|
163
|
+
? `Cluster summary: ${cluster_summary.length} clusters (in response or GET .../cluster_summary).`
|
|
164
|
+
: "Cluster summary: not available for this job (train with current worker to get it).",
|
|
165
|
+
"",
|
|
166
|
+
"Metrics: in summary (quantization_error, topographic_error, explained_variance, silhouette, etc.) or GET .../quality-report.",
|
|
167
|
+
];
|
|
168
|
+
const manifestText = lines.filter(Boolean).join("\n");
|
|
169
|
+
return {
|
|
170
|
+
content: [
|
|
171
|
+
{ type: "text", text: manifestText },
|
|
172
|
+
{ type: "text", text: "Structured manifest (for automation): " + JSON.stringify({ job_id, figure_manifest, has_cluster_summary: !!cluster_summary?.length, download_url_keys: Object.keys(download_urls) }) },
|
|
173
|
+
],
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=inference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inference.js","sourceRoot":"","sources":["../../src/tools/inference.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export declare const JOBS_DESCRIPTION_BASE = "Manage and inspect jobs.\n\n| Action | Use when |\n|--------|----------|\n| status | Polling after any async job submission \u2014 call every 10\u201315s |\n| list | Finding job IDs, checking what is pending/completed, reviewing hyperparameters. Response includes job_type (train_map, enrich, report, recolor, project, transition_flow, compare, predict) to filter or display. |\n| compare | Picking the best training run from a set of completed jobs |\n| train_map | Submitting a new map training job \u2014 returns job_id for polling |\n| cancel | Stopping a running or pending job to free the worker |\n| delete | Permanently removing a job and all its S3 result files |\n\nFor parameter hints (grid, epochs, batch, model, periodic), call the **training_guidance** tool or use the **prepare_training** prompt before train_map.\n\nASYNC POLLING PROTOCOL (action=status):\n- Poll every 10-15 seconds. Do NOT poll faster \u2014 it wastes context.\n- Progress increases through phases (ordering then convergence for map training). Other job types may use different phase logic.\n- For large grids (40\u00D740+), do not assume failure before 3 minutes on CPU.\n- Wait for status \"completed\" before calling results(action=get).\n- Map training typical times: 10\u00D710 ~30s | 20\u00D720 ~3\u20135 min | 40\u00D740 ~15\u201330 min.\n\nESCALATION (action=status):\n- completed \u2192 call results(action=get) to retrieve the map and metrics\n- failed \u2192 error message and optional failure_stage (e.g. preprocessing, training, metrics, visualization, upload) indicate which phase broke:\n - memory/allocation error: reduce batch_size or grid size and retrain\n - column missing: verify with datasets(action=preview)\n - NaN error: user must clean the dataset\n\naction=train_map: Submits a training job. Returns job_id \u2014 poll with jobs(action=status, job_id=...).\n Presets: quick | standard | refined | high_res \u2014 use preset=... for grid/epochs/batch defaults; call training_guidance for details.\n Presets refined/high_res may use GPU. On CPU-only hosts pass backend=cpu. API expects strings \"cpu\" | \"gpu\" | \"gpu_graphs\" (no colon). Future backends (e.g. non-CUDA) may be added under the same contract.\n normalize: \"auto\" (default) = scale only non-cyclic features; \"all\" = scale every feature. Use \"auto\" when using cyclic_features.\naction=compare: Returns a metrics table (QE, TE, explained variance, silhouette) for 2+ jobs.\naction=cancel: Not instant \u2014 worker checks between phases. Expect up to 30s delay.\naction=delete: WARNING \u2014 job ID will no longer work with results or any other tool.";
|
|
3
|
+
export declare function registerJobsTool(server: McpServer, description: string): void;
|
|
4
|
+
//# sourceMappingURL=jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/tools/jobs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,eAAO,MAAM,qBAAqB,mlFAiCkD,CAAC;AAErF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAqN7E"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { apiCall, textResult } from "../shared.js";
|
|
3
|
+
export const JOBS_DESCRIPTION_BASE = `Manage and inspect jobs.
|
|
4
|
+
|
|
5
|
+
| Action | Use when |
|
|
6
|
+
|--------|----------|
|
|
7
|
+
| status | Polling after any async job submission — call every 10–15s |
|
|
8
|
+
| list | Finding job IDs, checking what is pending/completed, reviewing hyperparameters. Response includes job_type (train_map, enrich, report, recolor, project, transition_flow, compare, predict) to filter or display. |
|
|
9
|
+
| compare | Picking the best training run from a set of completed jobs |
|
|
10
|
+
| train_map | Submitting a new map training job — returns job_id for polling |
|
|
11
|
+
| cancel | Stopping a running or pending job to free the worker |
|
|
12
|
+
| delete | Permanently removing a job and all its S3 result files |
|
|
13
|
+
|
|
14
|
+
For parameter hints (grid, epochs, batch, model, periodic), call the **training_guidance** tool or use the **prepare_training** prompt before train_map.
|
|
15
|
+
|
|
16
|
+
ASYNC POLLING PROTOCOL (action=status):
|
|
17
|
+
- Poll every 10-15 seconds. Do NOT poll faster — it wastes context.
|
|
18
|
+
- Progress increases through phases (ordering then convergence for map training). Other job types may use different phase logic.
|
|
19
|
+
- For large grids (40×40+), do not assume failure before 3 minutes on CPU.
|
|
20
|
+
- Wait for status "completed" before calling results(action=get).
|
|
21
|
+
- Map training typical times: 10×10 ~30s | 20×20 ~3–5 min | 40×40 ~15–30 min.
|
|
22
|
+
|
|
23
|
+
ESCALATION (action=status):
|
|
24
|
+
- completed → call results(action=get) to retrieve the map and metrics
|
|
25
|
+
- failed → error message and optional failure_stage (e.g. preprocessing, training, metrics, visualization, upload) indicate which phase broke:
|
|
26
|
+
- memory/allocation error: reduce batch_size or grid size and retrain
|
|
27
|
+
- column missing: verify with datasets(action=preview)
|
|
28
|
+
- NaN error: user must clean the dataset
|
|
29
|
+
|
|
30
|
+
action=train_map: Submits a training job. Returns job_id — poll with jobs(action=status, job_id=...).
|
|
31
|
+
Presets: quick | standard | refined | high_res — use preset=... for grid/epochs/batch defaults; call training_guidance for details.
|
|
32
|
+
Presets refined/high_res may use GPU. On CPU-only hosts pass backend=cpu. API expects strings "cpu" | "gpu" | "gpu_graphs" (no colon). Future backends (e.g. non-CUDA) may be added under the same contract.
|
|
33
|
+
normalize: "auto" (default) = scale only non-cyclic features; "all" = scale every feature. Use "auto" when using cyclic_features.
|
|
34
|
+
action=compare: Returns a metrics table (QE, TE, explained variance, silhouette) for 2+ jobs.
|
|
35
|
+
action=cancel: Not instant — worker checks between phases. Expect up to 30s delay.
|
|
36
|
+
action=delete: WARNING — job ID will no longer work with results or any other tool.`;
|
|
37
|
+
export function registerJobsTool(server, description) {
|
|
38
|
+
server.tool("jobs", description, {
|
|
39
|
+
action: z
|
|
40
|
+
.enum(["status", "list", "compare", "cancel", "delete", "train_map", "batch_predict"])
|
|
41
|
+
.describe("status: check progress; list: see all jobs; compare: metrics table; cancel: stop job; delete: remove job + files; train_map: submit new training job; batch_predict: submit multiple predict jobs at once"),
|
|
42
|
+
job_id: z
|
|
43
|
+
.string()
|
|
44
|
+
.optional()
|
|
45
|
+
.describe("Job ID — required for action=status, cancel, delete, batch_predict (parent training job)"),
|
|
46
|
+
inputs: z
|
|
47
|
+
.array(z.object({
|
|
48
|
+
dataset_id: z.string().optional(),
|
|
49
|
+
rows: z.array(z.record(z.string(), z.number())).optional(),
|
|
50
|
+
}))
|
|
51
|
+
.optional()
|
|
52
|
+
.describe("action=batch_predict: array of inputs; each item has dataset_id and/or rows (same as inference predict)."),
|
|
53
|
+
job_ids: z
|
|
54
|
+
.array(z.string())
|
|
55
|
+
.optional()
|
|
56
|
+
.describe("Array of job IDs — required for action=compare (minimum 2)"),
|
|
57
|
+
dataset_id: z
|
|
58
|
+
.string()
|
|
59
|
+
.optional()
|
|
60
|
+
.describe("Required for action=train_map. For action=list, filter jobs by this dataset ID."),
|
|
61
|
+
preset: z.enum(["quick", "standard", "refined", "high_res"]).optional(),
|
|
62
|
+
grid_x: z.number().int().optional(),
|
|
63
|
+
grid_y: z.number().int().optional(),
|
|
64
|
+
epochs: z.preprocess((v) => {
|
|
65
|
+
if (v === undefined || v === null)
|
|
66
|
+
return v;
|
|
67
|
+
if (typeof v === "string") {
|
|
68
|
+
const n = parseInt(v, 10);
|
|
69
|
+
if (!Number.isNaN(n))
|
|
70
|
+
return n;
|
|
71
|
+
const m = v.match(/^\[\s*(\d+)\s*,\s*(\d+)\s*\]$/);
|
|
72
|
+
if (m)
|
|
73
|
+
return [parseInt(m[1], 10), parseInt(m[2], 10)];
|
|
74
|
+
}
|
|
75
|
+
return v;
|
|
76
|
+
}, z.union([z.number().int(), z.array(z.number().int()).length(2)]).optional()),
|
|
77
|
+
model: z.enum(["SOM", "RSOM", "SOM-SOFT", "RSOM-SOFT"]).optional().default("SOM"),
|
|
78
|
+
periodic: z.boolean().optional().default(true),
|
|
79
|
+
columns: z.array(z.string()).optional(),
|
|
80
|
+
cyclic_features: z.array(z.object({
|
|
81
|
+
feature: z.string(),
|
|
82
|
+
period: z.number(),
|
|
83
|
+
})).optional(),
|
|
84
|
+
temporal_features: z.array(z.object({
|
|
85
|
+
columns: z.array(z.string()),
|
|
86
|
+
format: z.string(),
|
|
87
|
+
extract: z.array(z.enum(["hour_of_day", "day_of_year", "month", "day_of_week", "minute_of_hour"])),
|
|
88
|
+
cyclic: z.boolean().default(true),
|
|
89
|
+
separator: z.string().optional(),
|
|
90
|
+
})).optional(),
|
|
91
|
+
feature_weights: z.record(z.number()).optional(),
|
|
92
|
+
transforms: z.record(z.enum(["log", "log1p", "log10", "sqrt", "square", "abs", "invert", "rank", "none"])).optional(),
|
|
93
|
+
normalize: z.union([z.enum(["all", "auto"]), z.array(z.string())]).optional().default("auto"),
|
|
94
|
+
sigma_f: z.preprocess((v) => (v !== undefined && v !== null && typeof v === "string") ? parseFloat(v) : v, z.number().optional()),
|
|
95
|
+
learning_rate: z.preprocess((v) => (v !== undefined && v !== null && typeof v === "string") ? parseFloat(v) : v, z.union([z.number(), z.object({
|
|
96
|
+
ordering: z.tuple([z.number(), z.number()]),
|
|
97
|
+
convergence: z.tuple([z.number(), z.number()]),
|
|
98
|
+
})]).optional()),
|
|
99
|
+
batch_size: z.number().int().optional(),
|
|
100
|
+
quality_metrics: z.union([z.enum(["fast", "standard", "full"]), z.array(z.string())]).optional(),
|
|
101
|
+
backend: z.enum(["auto", "cpu", "gpu", "gpu_graphs"]).optional().default("auto"),
|
|
102
|
+
output_format: z.enum(["png", "pdf", "svg"]).optional().default("png"),
|
|
103
|
+
output_dpi: z.enum(["standard", "retina", "print"]).optional().default("retina"),
|
|
104
|
+
colormap: z.string().optional(),
|
|
105
|
+
row_range: z.tuple([z.number().int().min(1), z.number().int().min(1)]).optional(),
|
|
106
|
+
}, async (args) => {
|
|
107
|
+
const { action, job_id, job_ids, dataset_id } = args;
|
|
108
|
+
if (action === "train_map") {
|
|
109
|
+
const { preset, grid_x, grid_y, epochs, model, periodic, columns, cyclic_features, temporal_features, feature_weights, transforms, normalize, sigma_f, learning_rate, batch_size, quality_metrics, backend, output_format, output_dpi, colormap, row_range, } = args;
|
|
110
|
+
let PRESETS = {};
|
|
111
|
+
try {
|
|
112
|
+
const configData = (await apiCall("GET", "/v1/training/config"));
|
|
113
|
+
PRESETS = configData?.presets || {};
|
|
114
|
+
}
|
|
115
|
+
catch (e) {
|
|
116
|
+
if (e.httpStatus === 401 || e.httpStatus === 403)
|
|
117
|
+
throw e;
|
|
118
|
+
if (preset && grid_x === undefined && epochs === undefined) {
|
|
119
|
+
throw new Error("Could not fetch training config from server, and missing explicit grid/epochs.");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (!dataset_id)
|
|
123
|
+
throw new Error("jobs(train_map) requires dataset_id");
|
|
124
|
+
const p = preset ? PRESETS[preset] : undefined;
|
|
125
|
+
const params = { model, periodic, normalize };
|
|
126
|
+
if (grid_x !== undefined && grid_y !== undefined)
|
|
127
|
+
params.grid = [grid_x, grid_y];
|
|
128
|
+
else if (p)
|
|
129
|
+
params.grid = p.grid;
|
|
130
|
+
if (epochs !== undefined)
|
|
131
|
+
params.epochs = epochs;
|
|
132
|
+
else if (p)
|
|
133
|
+
params.epochs = p.epochs;
|
|
134
|
+
if (cyclic_features?.length)
|
|
135
|
+
params.cyclic_features = cyclic_features;
|
|
136
|
+
if (columns?.length)
|
|
137
|
+
params.columns = columns;
|
|
138
|
+
if (transforms && Object.keys(transforms).length > 0)
|
|
139
|
+
params.transforms = transforms;
|
|
140
|
+
if (temporal_features?.length)
|
|
141
|
+
params.temporal_features = temporal_features;
|
|
142
|
+
if (feature_weights && Object.keys(feature_weights).length > 0)
|
|
143
|
+
params.feature_weights = feature_weights;
|
|
144
|
+
if (sigma_f !== undefined)
|
|
145
|
+
params.sigma_f = sigma_f;
|
|
146
|
+
if (learning_rate !== undefined)
|
|
147
|
+
params.learning_rate = learning_rate;
|
|
148
|
+
if (batch_size !== undefined)
|
|
149
|
+
params.batch_size = batch_size;
|
|
150
|
+
else if (p)
|
|
151
|
+
params.batch_size = p.batch_size;
|
|
152
|
+
if (quality_metrics !== undefined)
|
|
153
|
+
params.quality_metrics = quality_metrics;
|
|
154
|
+
if (backend !== undefined && backend !== "auto")
|
|
155
|
+
params.backend = backend;
|
|
156
|
+
else if (p?.backend)
|
|
157
|
+
params.backend = p.backend;
|
|
158
|
+
params.output_format = output_format ?? "png";
|
|
159
|
+
const dpiMap = { standard: 1, retina: 2, print: 4 };
|
|
160
|
+
if (output_dpi && output_dpi !== "retina")
|
|
161
|
+
params.output_dpi = dpiMap[output_dpi] ?? 2;
|
|
162
|
+
if (colormap)
|
|
163
|
+
params.colormap = colormap;
|
|
164
|
+
if (row_range && row_range.length >= 2 && row_range[0] <= row_range[1])
|
|
165
|
+
params.row_range = row_range;
|
|
166
|
+
const data = (await apiCall("POST", "/v1/jobs", { dataset_id, params }));
|
|
167
|
+
const newJobId = data.id;
|
|
168
|
+
try {
|
|
169
|
+
const sys = (await apiCall("GET", "/v1/system/info"));
|
|
170
|
+
const pending = Number(sys.status?.pending_jobs ?? sys.pending_jobs ?? 0);
|
|
171
|
+
const totalEta = Number(sys.training_time_estimates_seconds?.total ??
|
|
172
|
+
(sys.gpu_available ? 45 : 120));
|
|
173
|
+
const waitMinutes = Math.round((pending * totalEta) / 60);
|
|
174
|
+
if (waitMinutes > 1) {
|
|
175
|
+
data.message = `Job submitted. You are #${pending + 1} in queue. Estimated wait: ~${waitMinutes} min. Poll with jobs(action=status, job_id="${newJobId}"). When status is completed, use results(action=get, job_id="${newJobId}") to view the map and metrics.`;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
data.message = `Job submitted. Poll with jobs(action=status, job_id="${newJobId}"). When status is completed, use results(action=get, job_id="${newJobId}") to view the map and metrics.`;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
data.message = `Job submitted. Poll with jobs(action=status, job_id="${newJobId}"). When status is completed, use results(action=get, job_id="${newJobId}") to view the map and metrics.`;
|
|
183
|
+
}
|
|
184
|
+
return textResult(data);
|
|
185
|
+
}
|
|
186
|
+
if (action === "status") {
|
|
187
|
+
if (!job_id)
|
|
188
|
+
throw new Error("jobs(status) requires job_id");
|
|
189
|
+
const data = (await apiCall("GET", `/v1/jobs/${job_id}`));
|
|
190
|
+
const status = data.status;
|
|
191
|
+
const progress = (data.progress ?? 0) * 100;
|
|
192
|
+
const label = data.label != null && data.label !== "" ? String(data.label) : null;
|
|
193
|
+
const jobDesc = label ? `Job ${label} (id: ${job_id})` : `Job ${job_id}`;
|
|
194
|
+
let text = `${jobDesc}: ${status} (${progress.toFixed(1)}%)`;
|
|
195
|
+
if (status === "completed") {
|
|
196
|
+
text += ` | Results ready. Use results(action=get, job_id="${job_id}") to retrieve.`;
|
|
197
|
+
}
|
|
198
|
+
else if (status === "failed") {
|
|
199
|
+
text += ` | Error: ${data.error ?? "unknown"}`;
|
|
200
|
+
}
|
|
201
|
+
return { content: [{ type: "text", text }] };
|
|
202
|
+
}
|
|
203
|
+
if (action === "list") {
|
|
204
|
+
const listPath = dataset_id ? `/v1/jobs?dataset_id=${dataset_id}` : "/v1/jobs";
|
|
205
|
+
const data = (await apiCall("GET", listPath));
|
|
206
|
+
if (Array.isArray(data)) {
|
|
207
|
+
const lines = data.map((job) => {
|
|
208
|
+
const id = String(job.id ?? "");
|
|
209
|
+
const st = String(job.status ?? "");
|
|
210
|
+
const label = job.label != null && job.label !== "" ? String(job.label) : null;
|
|
211
|
+
return label ? `${label} (id: ${id}) — ${st}` : `id: ${id} — ${st}`;
|
|
212
|
+
});
|
|
213
|
+
return { content: [{ type: "text", text: lines.length > 0 ? lines.join("\n") : "No jobs found." }] };
|
|
214
|
+
}
|
|
215
|
+
return textResult(data);
|
|
216
|
+
}
|
|
217
|
+
if (action === "compare") {
|
|
218
|
+
if (!job_ids || job_ids.length < 2)
|
|
219
|
+
throw new Error("jobs(compare) requires at least 2 job_ids");
|
|
220
|
+
const ids = job_ids.join(",");
|
|
221
|
+
const data = (await apiCall("GET", `/v1/jobs/compare?ids=${ids}`));
|
|
222
|
+
const comparisons = (data.comparisons ?? []);
|
|
223
|
+
const lines = [
|
|
224
|
+
"| Job ID | Grid | Epochs | Model | QE | TE | Expl.Var | Silhouette |",
|
|
225
|
+
"|--------|------|--------|-------|----|----|----------|------------|",
|
|
226
|
+
];
|
|
227
|
+
for (const c of comparisons) {
|
|
228
|
+
if (c.error) {
|
|
229
|
+
lines.push(`| ${c.job_id.slice(0, 8)}... | — | — | — | ${c.error} | — | — | — |`);
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
const g = c.grid;
|
|
233
|
+
const ep = c.epochs;
|
|
234
|
+
const fmt = (v) => v !== null && v !== undefined ? Number(v).toFixed(4) : "—";
|
|
235
|
+
lines.push(`| ${c.job_id.slice(0, 8)}... | ${g ? `${g[0]}×${g[1]}` : "—"} | ${ep ? `${ep[0]}+${ep[1]}` : "—"} | ${c.model ?? "—"} | ${fmt(c.quantization_error)} | ${fmt(c.topographic_error)} | ${fmt(c.explained_variance)} | ${fmt(c.silhouette)} |`);
|
|
236
|
+
}
|
|
237
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
238
|
+
}
|
|
239
|
+
if (action === "cancel") {
|
|
240
|
+
if (!job_id)
|
|
241
|
+
throw new Error("jobs(cancel) requires job_id");
|
|
242
|
+
const data = await apiCall("POST", `/v1/jobs/${job_id}/cancel`);
|
|
243
|
+
return textResult(data);
|
|
244
|
+
}
|
|
245
|
+
if (action === "delete") {
|
|
246
|
+
if (!job_id)
|
|
247
|
+
throw new Error("jobs(delete) requires job_id");
|
|
248
|
+
const data = await apiCall("DELETE", `/v1/jobs/${job_id}`);
|
|
249
|
+
return textResult(data);
|
|
250
|
+
}
|
|
251
|
+
if (action === "batch_predict") {
|
|
252
|
+
if (!job_id)
|
|
253
|
+
throw new Error("jobs(batch_predict) requires job_id (parent training job)");
|
|
254
|
+
if (!args.inputs || !Array.isArray(args.inputs) || args.inputs.length === 0) {
|
|
255
|
+
throw new Error("jobs(batch_predict) requires inputs (non-empty array of { dataset_id? or rows? })");
|
|
256
|
+
}
|
|
257
|
+
const body = { inputs: args.inputs };
|
|
258
|
+
const data = (await apiCall("POST", `/v1/results/${job_id}/batch_predict`, body));
|
|
259
|
+
const ids = (data.ids ?? []);
|
|
260
|
+
return {
|
|
261
|
+
content: [{
|
|
262
|
+
type: "text",
|
|
263
|
+
text: `Batch predict: ${ids.length} job(s) submitted. Parent: ${job_id}. Poll each with jobs(action=status, job_id="<id>"). IDs: ${ids.join(", ")}`,
|
|
264
|
+
}],
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
throw new Error("Invalid action");
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/tools/jobs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export declare function registerResultsTool(server: McpServer & {
|
|
3
|
+
server: {
|
|
4
|
+
listRoots: () => Promise<{
|
|
5
|
+
roots: {
|
|
6
|
+
uri: string;
|
|
7
|
+
}[];
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
10
|
+
}): void;
|
|
11
|
+
//# sourceMappingURL=results.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../src/tools/results.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgBzE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,GAAG;IAAE,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,OAAO,CAAC;YAAE,KAAK,EAAE;gBAAE,GAAG,EAAE,MAAM,CAAA;aAAE,EAAE,CAAA;SAAE,CAAC,CAAA;KAAE,CAAA;CAAE,GACzF,IAAI,CAobN"}
|