@agentmark-ai/cli 0.1.0
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 +1 -0
- package/dist/.next/BUILD_ID +1 -0
- package/dist/.next/app-build-manifest.json +66 -0
- package/dist/.next/app-path-routes-manifest.json +7 -0
- package/dist/.next/build-manifest.json +33 -0
- package/dist/.next/cache/.previewinfo +1 -0
- package/dist/.next/cache/.rscinfo +1 -0
- package/dist/.next/cache/.tsbuildinfo +1 -0
- package/dist/.next/cache/config.json +7 -0
- package/dist/.next/cache/webpack/client-production/0.pack +0 -0
- package/dist/.next/cache/webpack/client-production/index.pack +0 -0
- package/dist/.next/cache/webpack/edge-server-production/0.pack +0 -0
- package/dist/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/dist/.next/cache/webpack/server-production/0.pack +0 -0
- package/dist/.next/cache/webpack/server-production/index.pack +0 -0
- package/dist/.next/diagnostics/build-diagnostics.json +6 -0
- package/dist/.next/diagnostics/framework.json +1 -0
- package/dist/.next/export-marker.json +6 -0
- package/dist/.next/images-manifest.json +57 -0
- package/dist/.next/next-minimal-server.js.nft.json +1 -0
- package/dist/.next/next-server.js.nft.json +1 -0
- package/dist/.next/package.json +1 -0
- package/dist/.next/prerender-manifest.json +133 -0
- package/dist/.next/react-loadable-manifest.json +1 -0
- package/dist/.next/required-server-files.json +325 -0
- package/dist/.next/routes-manifest.json +77 -0
- package/dist/.next/server/app/_not-found/page.js +2 -0
- package/dist/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/dist/.next/server/app/_not-found.html +1 -0
- package/dist/.next/server/app/_not-found.meta +8 -0
- package/dist/.next/server/app/_not-found.rsc +19 -0
- package/dist/.next/server/app/index.html +1 -0
- package/dist/.next/server/app/index.meta +7 -0
- package/dist/.next/server/app/index.rsc +20 -0
- package/dist/.next/server/app/page.js +2 -0
- package/dist/.next/server/app/page.js.nft.json +1 -0
- package/dist/.next/server/app/page_client-reference-manifest.js +1 -0
- package/dist/.next/server/app/requests/page.js +2 -0
- package/dist/.next/server/app/requests/page.js.nft.json +1 -0
- package/dist/.next/server/app/requests/page_client-reference-manifest.js +1 -0
- package/dist/.next/server/app/requests.html +1 -0
- package/dist/.next/server/app/requests.meta +7 -0
- package/dist/.next/server/app/requests.rsc +25 -0
- package/dist/.next/server/app/sessions/page.js +2 -0
- package/dist/.next/server/app/sessions/page.js.nft.json +1 -0
- package/dist/.next/server/app/sessions/page_client-reference-manifest.js +1 -0
- package/dist/.next/server/app/sessions.html +1 -0
- package/dist/.next/server/app/sessions.meta +7 -0
- package/dist/.next/server/app/sessions.rsc +25 -0
- package/dist/.next/server/app/traces/page.js +2 -0
- package/dist/.next/server/app/traces/page.js.nft.json +1 -0
- package/dist/.next/server/app/traces/page_client-reference-manifest.js +1 -0
- package/dist/.next/server/app/traces.html +1 -0
- package/dist/.next/server/app/traces.meta +7 -0
- package/dist/.next/server/app/traces.rsc +25 -0
- package/dist/.next/server/app-paths-manifest.json +7 -0
- package/dist/.next/server/chunks/18.js +198 -0
- package/dist/.next/server/chunks/383.js +6 -0
- package/dist/.next/server/chunks/478.js +22 -0
- package/dist/.next/server/chunks/547.js +1 -0
- package/dist/.next/server/chunks/84.js +138 -0
- package/dist/.next/server/functions-config-manifest.json +4 -0
- package/dist/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/dist/.next/server/middleware-build-manifest.js +1 -0
- package/dist/.next/server/middleware-manifest.json +6 -0
- package/dist/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/dist/.next/server/next-font-manifest.js +1 -0
- package/dist/.next/server/next-font-manifest.json +1 -0
- package/dist/.next/server/pages/404.html +1 -0
- package/dist/.next/server/pages/500.html +1 -0
- package/dist/.next/server/pages/_app.js +1 -0
- package/dist/.next/server/pages/_app.js.nft.json +1 -0
- package/dist/.next/server/pages/_document.js +1 -0
- package/dist/.next/server/pages/_document.js.nft.json +1 -0
- package/dist/.next/server/pages/_error.js +19 -0
- package/dist/.next/server/pages/_error.js.nft.json +1 -0
- package/dist/.next/server/pages-manifest.json +6 -0
- package/dist/.next/server/server-reference-manifest.js +1 -0
- package/dist/.next/server/server-reference-manifest.json +1 -0
- package/dist/.next/server/webpack-runtime.js +1 -0
- package/dist/.next/static/WXGM4V1PBw_hLKICZoZaB/_buildManifest.js +1 -0
- package/dist/.next/static/WXGM4V1PBw_hLKICZoZaB/_ssgManifest.js +1 -0
- package/dist/.next/static/chunks/18-57c2d8d3aff89bcb.js +1 -0
- package/dist/.next/static/chunks/248-9028c24b6529c0c7.js +77 -0
- package/dist/.next/static/chunks/41-1291c1f5f295280d.js +1 -0
- package/dist/.next/static/chunks/602-7e76e1ee986e97d5.js +28 -0
- package/dist/.next/static/chunks/6b3bb038-67c653ff0a93a5bd.js +1 -0
- package/dist/.next/static/chunks/87c73c54-09e1ba5c70e60a51.js +1 -0
- package/dist/.next/static/chunks/902-50df3a419e9a9cef.js +1 -0
- package/dist/.next/static/chunks/app/_not-found/page-6711055aaf38bfb8.js +1 -0
- package/dist/.next/static/chunks/app/layout-eaddb6da201ab019.js +1 -0
- package/dist/.next/static/chunks/app/page-93d2401dc395548b.js +1 -0
- package/dist/.next/static/chunks/app/requests/page-20818b6519923653.js +1 -0
- package/dist/.next/static/chunks/app/sessions/page-cff6cd4b8819d0e5.js +1 -0
- package/dist/.next/static/chunks/app/traces/page-e556a466332fc75b.js +1 -0
- package/dist/.next/static/chunks/baeaa4ff-0a317ff4d32584cd.js +1 -0
- package/dist/.next/static/chunks/framework-3c3dfe0642f415ba.js +1 -0
- package/dist/.next/static/chunks/main-314a36b6249f35e5.js +1 -0
- package/dist/.next/static/chunks/main-app-0b5725cb98f081b4.js +1 -0
- package/dist/.next/static/chunks/pages/_app-d6f6b3bbc3d81ee1.js +1 -0
- package/dist/.next/static/chunks/pages/_error-75a96cf1997cc3b9.js +1 -0
- package/dist/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/.next/static/chunks/webpack-f10b0ea54196b48e.js +1 -0
- package/dist/.next/static/css/a00826fc162bd22d.css +31 -0
- package/dist/.next/trace +51 -0
- package/dist/.next/types/app/layout.ts +84 -0
- package/dist/.next/types/app/page.ts +84 -0
- package/dist/.next/types/app/requests/page.ts +84 -0
- package/dist/.next/types/app/sessions/page.ts +84 -0
- package/dist/.next/types/app/traces/page.ts +84 -0
- package/dist/.next/types/cache-life.d.ts +141 -0
- package/dist/.next/types/package.json +1 -0
- package/dist/.next/types/routes.d.ts +60 -0
- package/dist/.next/types/validator.ts +88 -0
- package/dist/api-server.d.ts +1 -0
- package/dist/api-server.js +545 -0
- package/dist/api-server.js.map +1 -0
- package/dist/commands/build.d.ts +9 -0
- package/dist/commands/build.js +206 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/dev.d.ts +7 -0
- package/dist/commands/dev.js +406 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/generate-types.d.ts +7 -0
- package/dist/commands/generate-types.js +31 -0
- package/dist/commands/generate-types.js.map +1 -0
- package/dist/commands/pull-models.d.ts +2 -0
- package/dist/commands/pull-models.js +105 -0
- package/dist/commands/pull-models.js.map +1 -0
- package/dist/commands/run-experiment.d.ts +7 -0
- package/dist/commands/run-experiment.js +579 -0
- package/dist/commands/run-experiment.js.map +1 -0
- package/dist/commands/run-prompt.d.ts +8 -0
- package/dist/commands/run-prompt.js +397 -0
- package/dist/commands/run-prompt.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.js +170 -0
- package/dist/config.js.map +1 -0
- package/dist/cost-mapping/cost-mapping.d.ts +7 -0
- package/dist/cost-mapping/cost-mapping.js +36 -0
- package/dist/cost-mapping/cost-mapping.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +127 -0
- package/dist/index.js.map +1 -0
- package/dist/runner-server/core.d.ts +15 -0
- package/dist/runner-server/core.js +180 -0
- package/dist/runner-server/core.js.map +1 -0
- package/dist/runner-server/middleware/signature-verification.d.ts +37 -0
- package/dist/runner-server/middleware/signature-verification.js +55 -0
- package/dist/runner-server/middleware/signature-verification.js.map +1 -0
- package/dist/runner-server/types.d.ts +67 -0
- package/dist/runner-server/types.js +7 -0
- package/dist/runner-server/types.js.map +1 -0
- package/dist/runner-server.d.ts +32 -0
- package/dist/runner-server.js +376 -0
- package/dist/runner-server.js.map +1 -0
- package/dist/server/database/index.d.ts +3 -0
- package/dist/server/database/index.js +97 -0
- package/dist/server/database/index.js.map +1 -0
- package/dist/server/routes/scores/index.d.ts +14 -0
- package/dist/server/routes/scores/index.js +60 -0
- package/dist/server/routes/scores/index.js.map +1 -0
- package/dist/server/routes/traces/index.d.ts +50 -0
- package/dist/server/routes/traces/index.js +614 -0
- package/dist/server/routes/traces/index.js.map +1 -0
- package/dist/tunnel.d.ts +19 -0
- package/dist/tunnel.js +134 -0
- package/dist/tunnel.js.map +1 -0
- package/dist/utils/prompt-detection.d.ts +8 -0
- package/dist/utils/prompt-detection.js +24 -0
- package/dist/utils/prompt-detection.js.map +1 -0
- package/dist/utils/providers.d.ts +38 -0
- package/dist/utils/providers.js +82 -0
- package/dist/utils/providers.js.map +1 -0
- package/next.config.ts +18 -0
- package/package.json +90 -0
- package/public/favicon.ico +0 -0
- package/public/file.svg +1 -0
- package/public/logo.svg +1 -0
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.default = runExperiment;
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const fs_1 = __importDefault(require("fs"));
|
|
18
|
+
const url_1 = require("url");
|
|
19
|
+
const prompt_detection_js_1 = require("../utils/prompt-detection.js");
|
|
20
|
+
/**
|
|
21
|
+
* Loads an AST from either a pre-built JSON file or an MDX file.
|
|
22
|
+
* @param resolvedFilepath - Absolute path to the file
|
|
23
|
+
* @returns The AST, prompt name, and dataset path (if available)
|
|
24
|
+
*/
|
|
25
|
+
function loadAst(resolvedFilepath) {
|
|
26
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
27
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
28
|
+
if (resolvedFilepath.endsWith('.json')) {
|
|
29
|
+
// Load pre-built AST from JSON file
|
|
30
|
+
const content = fs_1.default.readFileSync(resolvedFilepath, 'utf-8');
|
|
31
|
+
const built = JSON.parse(content);
|
|
32
|
+
if (!built.ast) {
|
|
33
|
+
throw new Error('Invalid pre-built prompt file: missing "ast" field');
|
|
34
|
+
}
|
|
35
|
+
// Extract dataset path from the AST's frontmatter
|
|
36
|
+
let datasetPath;
|
|
37
|
+
try {
|
|
38
|
+
const yamlNode = (_b = (_a = built.ast) === null || _a === void 0 ? void 0 : _a.children) === null || _b === void 0 ? void 0 : _b.find((n) => (n === null || n === void 0 ? void 0 : n.type) === 'yaml');
|
|
39
|
+
if (yamlNode) {
|
|
40
|
+
const { parse: parseYaml } = yield import('yaml');
|
|
41
|
+
datasetPath = (_d = (_c = parseYaml(yamlNode.value)) === null || _c === void 0 ? void 0 : _c.test_settings) === null || _d === void 0 ? void 0 : _d.dataset;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (_j) {
|
|
45
|
+
// Ignore errors when parsing dataset path
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
ast: built.ast,
|
|
49
|
+
promptName: (_e = built.metadata) === null || _e === void 0 ? void 0 : _e.name,
|
|
50
|
+
datasetPath
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
else if (resolvedFilepath.endsWith('.mdx')) {
|
|
54
|
+
// Parse MDX file using prompt-core's TemplateDX instances (which have tags registered)
|
|
55
|
+
const { getTemplateDXInstance } = yield import("@agentmark-ai/prompt-core");
|
|
56
|
+
// Read content to detect prompt type
|
|
57
|
+
const content = fs_1.default.readFileSync(resolvedFilepath, 'utf-8');
|
|
58
|
+
const parserType = (0, prompt_detection_js_1.detectPromptTypeFromContent)(content);
|
|
59
|
+
// Get the appropriate TemplateDX instance with AgentMark tags registered
|
|
60
|
+
const templateDX = getTemplateDXInstance(parserType);
|
|
61
|
+
// Create content loader for resolving imports
|
|
62
|
+
const baseDir = path_1.default.dirname(resolvedFilepath);
|
|
63
|
+
const contentLoader = (filePath) => __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
const { readFile } = yield import('fs/promises');
|
|
65
|
+
const resolvedPath = path_1.default.resolve(baseDir, filePath);
|
|
66
|
+
return readFile(resolvedPath, 'utf-8');
|
|
67
|
+
});
|
|
68
|
+
// Parse the MDX content
|
|
69
|
+
const ast = yield templateDX.parse(content, baseDir, contentLoader);
|
|
70
|
+
const frontmatter = templateDX.getFrontMatter(ast);
|
|
71
|
+
// Extract dataset path from frontmatter
|
|
72
|
+
let datasetPath;
|
|
73
|
+
try {
|
|
74
|
+
const yamlNode = (_f = ast === null || ast === void 0 ? void 0 : ast.children) === null || _f === void 0 ? void 0 : _f.find((n) => (n === null || n === void 0 ? void 0 : n.type) === 'yaml');
|
|
75
|
+
if (yamlNode) {
|
|
76
|
+
const { parse: parseYaml } = yield import('yaml');
|
|
77
|
+
datasetPath = (_h = (_g = parseYaml(yamlNode.value)) === null || _g === void 0 ? void 0 : _g.test_settings) === null || _h === void 0 ? void 0 : _h.dataset;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (_k) {
|
|
81
|
+
// Ignore errors when parsing dataset path
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
ast,
|
|
85
|
+
promptName: frontmatter.name,
|
|
86
|
+
datasetPath
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
throw new Error('File must be an .mdx or .json file');
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// Lazy-load cli-table3 so other commands (e.g., serve) don't pull ESM deps
|
|
95
|
+
let _Table;
|
|
96
|
+
function getTable() {
|
|
97
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
98
|
+
if (_Table)
|
|
99
|
+
return _Table;
|
|
100
|
+
const mod = yield import('cli-table3');
|
|
101
|
+
_Table = mod.default || mod;
|
|
102
|
+
return _Table;
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
const getTerminalWidth = () => {
|
|
106
|
+
const cols = process.stdout.columns;
|
|
107
|
+
return typeof cols === 'number' && cols > 0 ? cols : 120;
|
|
108
|
+
};
|
|
109
|
+
const computeLayout = (baseHead, evalNames = [], _sampleRows = []) => {
|
|
110
|
+
const head = [...baseHead, ...evalNames];
|
|
111
|
+
const terminalWidth = getTerminalWidth();
|
|
112
|
+
const overhead = (head.length + 1) * 3;
|
|
113
|
+
const available = terminalWidth - overhead;
|
|
114
|
+
// Set absolute minimums based on column type (bare minimum for readability)
|
|
115
|
+
const absoluteMins = head.map((h, idx) => {
|
|
116
|
+
if (idx === 0)
|
|
117
|
+
return 3; // # column
|
|
118
|
+
if (h === 'Input' || h === 'AI Result' || h === 'Expected Output')
|
|
119
|
+
return 20; // Data columns
|
|
120
|
+
return 15; // Eval columns
|
|
121
|
+
});
|
|
122
|
+
// Define weights for space distribution
|
|
123
|
+
const weights = head.map((h, idx) => {
|
|
124
|
+
if (idx === 0)
|
|
125
|
+
return 1;
|
|
126
|
+
if (h === 'AI Result')
|
|
127
|
+
return 8;
|
|
128
|
+
if (h === 'Input' || h === 'Expected Output')
|
|
129
|
+
return 6;
|
|
130
|
+
return 2; // Eval columns
|
|
131
|
+
});
|
|
132
|
+
// Calculate total weight and minimum space needed
|
|
133
|
+
const sumAbsoluteMins = absoluteMins.reduce((a, b) => a + b, 0);
|
|
134
|
+
// If we don't have enough space for even the minimums, scale everything down proportionally
|
|
135
|
+
if (available <= sumAbsoluteMins) {
|
|
136
|
+
const scaleFactor = available / sumAbsoluteMins;
|
|
137
|
+
return {
|
|
138
|
+
head,
|
|
139
|
+
colWidths: absoluteMins.map((min, idx) => Math.max(idx === 0 ? 3 : 10, // Never go below 3 for #, 10 for others
|
|
140
|
+
Math.floor(min * scaleFactor)))
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
// We have space - distribute it proportionally based on weights
|
|
144
|
+
const weightSum = weights.reduce((a, b) => a + b, 0);
|
|
145
|
+
const widths = weights.map((weight, idx) => {
|
|
146
|
+
const proportionalWidth = Math.floor((available * weight) / weightSum);
|
|
147
|
+
return Math.max(absoluteMins[idx], proportionalWidth);
|
|
148
|
+
});
|
|
149
|
+
// Adjust for rounding errors
|
|
150
|
+
const diff = available - widths.reduce((a, b) => a + b, 0);
|
|
151
|
+
if (diff !== 0) {
|
|
152
|
+
widths[widths.length - 1] += diff;
|
|
153
|
+
}
|
|
154
|
+
return { head, colWidths: widths };
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* Resolves a path against the current working directory or PWD environment variable.
|
|
158
|
+
* @param inputPath - The path to resolve
|
|
159
|
+
* @returns Resolved absolute path
|
|
160
|
+
* @throws Error if the working directory is invalid and the path is relative
|
|
161
|
+
*/
|
|
162
|
+
function resolveAgainstCwdOrEnv(inputPath) {
|
|
163
|
+
if (path_1.default.isAbsolute(inputPath))
|
|
164
|
+
return inputPath;
|
|
165
|
+
let base;
|
|
166
|
+
try {
|
|
167
|
+
base = process.cwd();
|
|
168
|
+
}
|
|
169
|
+
catch (_a) {
|
|
170
|
+
base = process.env.PWD;
|
|
171
|
+
}
|
|
172
|
+
if (!base) {
|
|
173
|
+
throw new Error('Invalid working directory. Unable to resolve relative path.\n' +
|
|
174
|
+
'Please provide an absolute path or ensure PWD environment variable is set.');
|
|
175
|
+
}
|
|
176
|
+
return path_1.default.resolve(base, inputPath);
|
|
177
|
+
}
|
|
178
|
+
// Format helper functions
|
|
179
|
+
function escapeCSV(value) {
|
|
180
|
+
// Escape double quotes and wrap in quotes if contains comma, newline, or quote
|
|
181
|
+
if (value.includes(',') || value.includes('\n') || value.includes('"')) {
|
|
182
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
183
|
+
}
|
|
184
|
+
return value;
|
|
185
|
+
}
|
|
186
|
+
function getExperimentConfig() {
|
|
187
|
+
return {
|
|
188
|
+
outputDir: '.agentmark-outputs',
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function runExperiment(filepath, options) {
|
|
192
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
193
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
194
|
+
const evalEnabled = !options.skipEval;
|
|
195
|
+
const format = options.format || 'table';
|
|
196
|
+
const config = getExperimentConfig();
|
|
197
|
+
const resolvedFilepath = resolveAgainstCwdOrEnv(filepath);
|
|
198
|
+
if (!fs_1.default.existsSync(resolvedFilepath)) {
|
|
199
|
+
throw new Error(`Prompt file not found: ${resolvedFilepath}\n` +
|
|
200
|
+
`Please check that the file exists and the path is correct.`);
|
|
201
|
+
}
|
|
202
|
+
if (!resolvedFilepath.endsWith('.mdx') && !resolvedFilepath.endsWith('.json')) {
|
|
203
|
+
throw new Error('File must be an .mdx or .json file');
|
|
204
|
+
}
|
|
205
|
+
// Load webhook secret BEFORE changing directory
|
|
206
|
+
// (so we get it from the project root, not the prompt directory)
|
|
207
|
+
let webhookSecret = process.env.AGENTMARK_WEBHOOK_SECRET;
|
|
208
|
+
if (!webhookSecret) {
|
|
209
|
+
try {
|
|
210
|
+
const { loadLocalConfig } = yield import('../config.js');
|
|
211
|
+
const config = loadLocalConfig();
|
|
212
|
+
if (config && config.webhookSecret) {
|
|
213
|
+
webhookSecret = config.webhookSecret;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch (_l) {
|
|
217
|
+
// No config file, continue without signature
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Ensure runner client resolves prompt-relative resources (datasets, etc.)
|
|
221
|
+
try {
|
|
222
|
+
process.env.AGENTMARK_ROOT = path_1.default.dirname(resolvedFilepath);
|
|
223
|
+
}
|
|
224
|
+
catch (_m) {
|
|
225
|
+
// Ignore errors when setting environment variable
|
|
226
|
+
}
|
|
227
|
+
// If current cwd is invalid, switch to the prompt's directory to stabilize deps that use process.cwd()
|
|
228
|
+
try {
|
|
229
|
+
process.chdir(path_1.default.dirname(resolvedFilepath));
|
|
230
|
+
}
|
|
231
|
+
catch (_o) {
|
|
232
|
+
// Ignore errors when changing directory
|
|
233
|
+
}
|
|
234
|
+
// Load AST from MDX or pre-built JSON file
|
|
235
|
+
const { ast, promptName, datasetPath } = yield loadAst(resolvedFilepath);
|
|
236
|
+
// Determine prompt type from frontmatter (Text/Object/Image/Speech)
|
|
237
|
+
let promptType = 'Text';
|
|
238
|
+
try {
|
|
239
|
+
const yamlNode = (_a = ast === null || ast === void 0 ? void 0 : ast.children) === null || _a === void 0 ? void 0 : _a.find((n) => (n === null || n === void 0 ? void 0 : n.type) === 'yaml');
|
|
240
|
+
if (yamlNode && typeof yamlNode.value === 'string') {
|
|
241
|
+
const { parse: parseYaml } = yield import('yaml');
|
|
242
|
+
const fm = parseYaml(yamlNode.value) || {};
|
|
243
|
+
// Determine prompt type
|
|
244
|
+
if (fm.object_config)
|
|
245
|
+
promptType = 'Object';
|
|
246
|
+
else if (fm.image_config)
|
|
247
|
+
promptType = 'Image';
|
|
248
|
+
else if (fm.speech_config)
|
|
249
|
+
promptType = 'Speech';
|
|
250
|
+
else
|
|
251
|
+
promptType = 'Text';
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch (_p) {
|
|
255
|
+
// Ignore errors when parsing prompt type
|
|
256
|
+
}
|
|
257
|
+
const server = options.server || process.env.AGENTMARK_WEBHOOK_URL || 'http://localhost:9417';
|
|
258
|
+
if (!server || !/^https?:\/\//i.test(server)) {
|
|
259
|
+
throw new Error('Invalid or missing server URL.\n' +
|
|
260
|
+
'Please ensure the AgentMark dev server is running with: agentmark dev\n' +
|
|
261
|
+
`Expected format: http://localhost:9417 (got: ${server || 'undefined'})`);
|
|
262
|
+
}
|
|
263
|
+
// Only show status messages for table format
|
|
264
|
+
if (format === 'table') {
|
|
265
|
+
console.log("Running prompt with dataset...");
|
|
266
|
+
if (evalEnabled)
|
|
267
|
+
console.log("š§Ŗ Evaluations enabled");
|
|
268
|
+
}
|
|
269
|
+
const body = JSON.stringify({ type: 'dataset-run', data: { ast, promptPath: promptName, datasetPath, experimentId: promptName } });
|
|
270
|
+
// Add webhook signature if secret is available
|
|
271
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
272
|
+
if (webhookSecret) {
|
|
273
|
+
const { createSignature } = yield import('@agentmark-ai/shared-utils');
|
|
274
|
+
const signature = yield createSignature(webhookSecret, body);
|
|
275
|
+
headers['x-agentmark-signature-256'] = signature;
|
|
276
|
+
}
|
|
277
|
+
let res;
|
|
278
|
+
try {
|
|
279
|
+
res = yield fetch(server, {
|
|
280
|
+
method: 'POST',
|
|
281
|
+
headers,
|
|
282
|
+
body
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
catch (fetchError) {
|
|
286
|
+
// Network-level errors (server not running, connection refused, etc.)
|
|
287
|
+
const isConnectionError = ((_b = fetchError.message) === null || _b === void 0 ? void 0 : _b.includes('ECONNREFUSED')) ||
|
|
288
|
+
((_c = fetchError.message) === null || _c === void 0 ? void 0 : _c.includes('fetch failed')) ||
|
|
289
|
+
((_d = fetchError.cause) === null || _d === void 0 ? void 0 : _d.code) === 'ECONNREFUSED';
|
|
290
|
+
if (isConnectionError) {
|
|
291
|
+
throw new Error(`ā Could not connect to AgentMark server at ${server}\n\n` +
|
|
292
|
+
`The server is not running or not reachable.\n\n` +
|
|
293
|
+
`To start the server, run:\n` +
|
|
294
|
+
` agentmark dev\n\n` +
|
|
295
|
+
`Or specify a different server URL with:\n` +
|
|
296
|
+
` agentmark run-experiment <filepath> --server <url>`);
|
|
297
|
+
}
|
|
298
|
+
// Re-throw other network errors with context
|
|
299
|
+
throw new Error(`Network error connecting to ${server}: ${fetchError.message}`);
|
|
300
|
+
}
|
|
301
|
+
if (!res.ok) {
|
|
302
|
+
let raw = '';
|
|
303
|
+
try {
|
|
304
|
+
raw = yield res.text();
|
|
305
|
+
}
|
|
306
|
+
catch (_q) {
|
|
307
|
+
// Ignore errors when reading response text
|
|
308
|
+
}
|
|
309
|
+
let parsed = null;
|
|
310
|
+
try {
|
|
311
|
+
parsed = JSON.parse(raw);
|
|
312
|
+
}
|
|
313
|
+
catch (_r) {
|
|
314
|
+
// Ignore errors when parsing JSON
|
|
315
|
+
}
|
|
316
|
+
const ct = res.headers.get('content-type') || '';
|
|
317
|
+
const statusLine = `${res.status}${res.statusText ? ' ' + res.statusText : ''}`;
|
|
318
|
+
const errMsg = (parsed === null || parsed === void 0 ? void 0 : parsed.error) || (parsed === null || parsed === void 0 ? void 0 : parsed.message) || ((_e = raw === null || raw === void 0 ? void 0 : raw.slice) === null || _e === void 0 ? void 0 : _e.call(raw, 0, 2000)) || 'Unknown error';
|
|
319
|
+
// Provide more helpful error messages based on status code
|
|
320
|
+
let helpText = '';
|
|
321
|
+
if (res.status === 404) {
|
|
322
|
+
helpText = '\n\nTip: The dev server endpoint was not found. Make sure you are running the latest version.';
|
|
323
|
+
}
|
|
324
|
+
else if (res.status === 400) {
|
|
325
|
+
helpText = '\n\nTip: The request was malformed. Check that your prompt file and dataset are valid.';
|
|
326
|
+
}
|
|
327
|
+
else if (res.status === 500) {
|
|
328
|
+
helpText = '\n\nTip: The server encountered an error. Check the dev server logs for more details.';
|
|
329
|
+
}
|
|
330
|
+
else if (res.status === 503 || res.status === 502) {
|
|
331
|
+
helpText = '\n\nTip: The server is unavailable. Make sure the dev server is running with: agentmark dev';
|
|
332
|
+
}
|
|
333
|
+
const details = `HTTP ${statusLine} ā Content-Type: ${ct}`;
|
|
334
|
+
const msg = `Runner request failed. ${details}\nURL: ${server}\nError: ${errMsg}${helpText}`;
|
|
335
|
+
console.error(msg);
|
|
336
|
+
throw new Error(msg);
|
|
337
|
+
}
|
|
338
|
+
const stream = res.body;
|
|
339
|
+
let index = 1;
|
|
340
|
+
let totalEvals = 0;
|
|
341
|
+
let passedEvals = 0;
|
|
342
|
+
let evalNames = [];
|
|
343
|
+
let tableInitialized = false;
|
|
344
|
+
let Table;
|
|
345
|
+
let table;
|
|
346
|
+
const jsonRows = []; // For buffering JSON format output
|
|
347
|
+
let experimentRunId; // Capture run ID for linking to all traces
|
|
348
|
+
const reader = stream.getReader();
|
|
349
|
+
const decoder = new TextDecoder();
|
|
350
|
+
let buffered = '';
|
|
351
|
+
// Stream and render rows as they arrive
|
|
352
|
+
try {
|
|
353
|
+
while (true) {
|
|
354
|
+
const { done, value } = yield reader.read();
|
|
355
|
+
if (done)
|
|
356
|
+
break;
|
|
357
|
+
if (typeof value === 'string')
|
|
358
|
+
buffered += value;
|
|
359
|
+
else
|
|
360
|
+
buffered += decoder.decode(value, { stream: true });
|
|
361
|
+
let idx;
|
|
362
|
+
while ((idx = buffered.indexOf('\n')) !== -1) {
|
|
363
|
+
const line = buffered.slice(0, idx);
|
|
364
|
+
buffered = buffered.slice(idx + 1);
|
|
365
|
+
if (!line.trim())
|
|
366
|
+
continue;
|
|
367
|
+
try {
|
|
368
|
+
const evt = JSON.parse(line);
|
|
369
|
+
if (evt.type === 'error' && evt.error) {
|
|
370
|
+
const errorMsg = typeof evt.error === 'string'
|
|
371
|
+
? evt.error
|
|
372
|
+
: (evt.error.message || JSON.stringify(evt.error, null, 2));
|
|
373
|
+
console.error(`ā ${errorMsg}`);
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
if (evt.type !== 'dataset')
|
|
377
|
+
continue;
|
|
378
|
+
const r = evt.result || {};
|
|
379
|
+
if (evt.runId && !experimentRunId)
|
|
380
|
+
experimentRunId = evt.runId;
|
|
381
|
+
const input = JSON.stringify((_f = r.input) !== null && _f !== void 0 ? _f : {}, null, 0);
|
|
382
|
+
const expected = (_g = r.expectedOutput) !== null && _g !== void 0 ? _g : 'N/A';
|
|
383
|
+
// Coerce AI result column, saving media to files and printing IDE-clickable paths
|
|
384
|
+
let actual;
|
|
385
|
+
const extraPaths = [];
|
|
386
|
+
const hyperlink = (label, url) => `\u001B]8;;${url}\u0007${label}\u001B]8;;\u0007`;
|
|
387
|
+
const outDir = path_1.default.join(process.cwd(), config.outputDir);
|
|
388
|
+
const ensureOutDir = () => {
|
|
389
|
+
try {
|
|
390
|
+
fs_1.default.mkdirSync(outDir, { recursive: true });
|
|
391
|
+
}
|
|
392
|
+
catch (_a) {
|
|
393
|
+
// Ignore errors when creating output directory
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
const ao = r.actualOutput;
|
|
397
|
+
if (Array.isArray(ao) && ao.length > 0 && ao.every((x) => x && typeof x.base64 === 'string')) {
|
|
398
|
+
// Image array output
|
|
399
|
+
ensureOutDir();
|
|
400
|
+
const timestamp = Date.now();
|
|
401
|
+
const linkLabels = [];
|
|
402
|
+
ao.forEach((img, idx) => {
|
|
403
|
+
var _a, _b, _c;
|
|
404
|
+
const ext = ((_c = (_b = (_a = img.mimeType) === null || _a === void 0 ? void 0 : _a.split) === null || _b === void 0 ? void 0 : _b.call(_a, '/')) === null || _c === void 0 ? void 0 : _c[1]) || 'png';
|
|
405
|
+
const filePath = path_1.default.join(outDir, `image-${index}-${idx + 1}-${timestamp}.${ext}`);
|
|
406
|
+
try {
|
|
407
|
+
fs_1.default.writeFileSync(filePath, Buffer.from(img.base64, 'base64'));
|
|
408
|
+
}
|
|
409
|
+
catch (_d) {
|
|
410
|
+
// Ignore errors when writing image file
|
|
411
|
+
}
|
|
412
|
+
extraPaths.push({ rel: filePath, kind: 'image' });
|
|
413
|
+
const url = (0, url_1.pathToFileURL)(filePath).href;
|
|
414
|
+
linkLabels.push(hyperlink(`View Image ${idx + 1}`, url));
|
|
415
|
+
});
|
|
416
|
+
if (linkLabels.length) {
|
|
417
|
+
actual = linkLabels.join(', ');
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
actual = '(no content)';
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
else if (ao && typeof ao === 'object' && typeof ao.base64 === 'string') {
|
|
424
|
+
// Audio object output
|
|
425
|
+
ensureOutDir();
|
|
426
|
+
const timestamp = Date.now();
|
|
427
|
+
const ext = ao.format || (((_k = (_j = (_h = ao.mimeType) === null || _h === void 0 ? void 0 : _h.split) === null || _j === void 0 ? void 0 : _j.call(_h, '/')) === null || _k === void 0 ? void 0 : _k[1]) || 'mp3');
|
|
428
|
+
const filePath = path_1.default.join(outDir, `audio-${index}-${timestamp}.${ext}`);
|
|
429
|
+
try {
|
|
430
|
+
fs_1.default.writeFileSync(filePath, Buffer.from(ao.base64, 'base64'));
|
|
431
|
+
}
|
|
432
|
+
catch (_s) {
|
|
433
|
+
// Ignore errors when writing audio file
|
|
434
|
+
}
|
|
435
|
+
const url = (0, url_1.pathToFileURL)(filePath).href;
|
|
436
|
+
actual = hyperlink('Play Audio', url);
|
|
437
|
+
extraPaths.push({ rel: filePath, kind: 'audio' });
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
actual = typeof ao === 'string' ? ao : JSON.stringify(ao !== null && ao !== void 0 ? ao : '');
|
|
441
|
+
}
|
|
442
|
+
const evals = Array.isArray(r.evals) ? r.evals : [];
|
|
443
|
+
// Initialize table on first row
|
|
444
|
+
if (!tableInitialized) {
|
|
445
|
+
evalNames = evalEnabled ? evals.map((e) => e.name).filter(Boolean) : [];
|
|
446
|
+
const layout = computeLayout(['#', 'Input', 'AI Result', 'Expected Output'], evalNames, []);
|
|
447
|
+
Table = yield getTable();
|
|
448
|
+
table = new Table({
|
|
449
|
+
head: layout.head,
|
|
450
|
+
colWidths: layout.colWidths,
|
|
451
|
+
wordWrap: true
|
|
452
|
+
});
|
|
453
|
+
tableInitialized = true;
|
|
454
|
+
}
|
|
455
|
+
// Build and render row immediately
|
|
456
|
+
const row = [String(index), input, actual, expected];
|
|
457
|
+
// Add eval columns
|
|
458
|
+
for (const name of evalNames) {
|
|
459
|
+
const e = evals.find((ev) => ev.name === name);
|
|
460
|
+
if (e) {
|
|
461
|
+
if (typeof e.passed === 'boolean') {
|
|
462
|
+
const isPass = e.passed;
|
|
463
|
+
const verdictText = isPass ? 'PASS' : 'FAIL';
|
|
464
|
+
const scorePart = typeof e.score === 'number' ? e.score.toFixed(2) : '';
|
|
465
|
+
const reasonPart = typeof e.reason === 'string' && e.reason ? ` - ${e.reason}` : '';
|
|
466
|
+
const suffix = scorePart || reasonPart ? ` (${scorePart}${reasonPart})` : '';
|
|
467
|
+
row.push(`${verdictText}${suffix}`);
|
|
468
|
+
totalEvals += 1;
|
|
469
|
+
if (isPass)
|
|
470
|
+
passedEvals += 1;
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
const parts = [];
|
|
474
|
+
if (typeof e.score === 'number')
|
|
475
|
+
parts.push(`score: ${e.score.toFixed(2)}`);
|
|
476
|
+
if (typeof e.label === 'string' && e.label)
|
|
477
|
+
parts.push(`label: ${e.label}`);
|
|
478
|
+
if (typeof e.reason === 'string' && e.reason)
|
|
479
|
+
parts.push(`reason: ${e.reason}`);
|
|
480
|
+
row.push(parts.length > 0 ? parts.join(', ') : 'N/A');
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
row.push('N/A');
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
// Print row immediately
|
|
488
|
+
if (format === 'table') {
|
|
489
|
+
table.push(row);
|
|
490
|
+
// Print just the header + current row (first time) or just the new row
|
|
491
|
+
if (index === 1) {
|
|
492
|
+
console.log(table.toString());
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
// For subsequent rows, print the row content with bottom border (separator line)
|
|
496
|
+
const tempTable = new Table({
|
|
497
|
+
head: [],
|
|
498
|
+
colWidths: table.options.colWidths,
|
|
499
|
+
wordWrap: true,
|
|
500
|
+
style: { head: [], border: table.options.style.border }
|
|
501
|
+
});
|
|
502
|
+
tempTable.push(row);
|
|
503
|
+
const lines = tempTable.toString().split('\n');
|
|
504
|
+
// Skip only the top border (line 0), keep row content and bottom border
|
|
505
|
+
console.log(lines.slice(1).join('\n'));
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
else if (format === 'csv') {
|
|
509
|
+
const headers = ['#', 'Input', 'AI Result', 'Expected Output', ...evalNames];
|
|
510
|
+
if (index === 1) {
|
|
511
|
+
console.log(headers.map(h => escapeCSV(h)).join(','));
|
|
512
|
+
}
|
|
513
|
+
console.log(row.map(cell => escapeCSV(cell)).join(','));
|
|
514
|
+
}
|
|
515
|
+
else if (format === 'json') {
|
|
516
|
+
// Buffer for JSON format since it needs to be a valid array
|
|
517
|
+
const headers = ['#', 'Input', 'AI Result', 'Expected Output', ...evalNames];
|
|
518
|
+
const obj = {};
|
|
519
|
+
headers.forEach((header, idx) => {
|
|
520
|
+
obj[header] = row[idx] || '';
|
|
521
|
+
});
|
|
522
|
+
jsonRows.push(obj);
|
|
523
|
+
}
|
|
524
|
+
else if (format === 'jsonl') {
|
|
525
|
+
// Output each row as a JSON line immediately
|
|
526
|
+
const headers = ['#', 'Input', 'AI Result', 'Expected Output', ...evalNames];
|
|
527
|
+
const obj = {};
|
|
528
|
+
headers.forEach((header, idx) => {
|
|
529
|
+
obj[header] = row[idx] || '';
|
|
530
|
+
});
|
|
531
|
+
console.log(JSON.stringify(obj));
|
|
532
|
+
}
|
|
533
|
+
// Print media paths immediately
|
|
534
|
+
if (extraPaths.length) {
|
|
535
|
+
for (const p of extraPaths) {
|
|
536
|
+
const label = p.kind === 'image' ? 'Image path' : 'Audio path';
|
|
537
|
+
console.log(`${label}: ${p.rel}`);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
index += 1;
|
|
541
|
+
}
|
|
542
|
+
catch (_t) {
|
|
543
|
+
// Ignore errors when processing dataset events
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
finally {
|
|
549
|
+
reader.releaseLock();
|
|
550
|
+
}
|
|
551
|
+
// Output JSON format after streaming is complete
|
|
552
|
+
if (format === 'json' && jsonRows.length > 0) {
|
|
553
|
+
console.log(JSON.stringify(jsonRows, null, 2));
|
|
554
|
+
}
|
|
555
|
+
// Display link to view all experiment traces (only for text or object prompts)
|
|
556
|
+
if (experimentRunId && format === 'table' && (promptType === 'Text' || promptType === 'Object')) {
|
|
557
|
+
console.log(`\nš View traces: http://localhost:3000/traces?runId=${experimentRunId}`);
|
|
558
|
+
}
|
|
559
|
+
if (evalEnabled && totalEvals > 0 && options.thresholdPercent !== undefined) {
|
|
560
|
+
const t = options.thresholdPercent;
|
|
561
|
+
if (!Number.isFinite(t) || t < 0 || t > 100) {
|
|
562
|
+
throw new Error(`Invalid threshold value: ${t}\n` +
|
|
563
|
+
'Threshold must be a number between 0 and 100 (representing percentage).');
|
|
564
|
+
}
|
|
565
|
+
const passPct = Math.floor((passedEvals / totalEvals) * 100);
|
|
566
|
+
if (passPct < t) {
|
|
567
|
+
console.error(`ā Experiment failed threshold check\n` +
|
|
568
|
+
` Pass rate: ${passPct}% (${passedEvals}/${totalEvals} evaluations passed)\n` +
|
|
569
|
+
` Threshold: ${t}%\n` +
|
|
570
|
+
` Difference: ${passPct - t}%`);
|
|
571
|
+
throw new Error(`Experiment failed: pass rate ${passPct}% is below threshold ${t}%`);
|
|
572
|
+
}
|
|
573
|
+
console.log(`ā
Experiment passed threshold check\n` +
|
|
574
|
+
` Pass rate: ${passPct}% (${passedEvals}/${totalEvals} evaluations passed)\n` +
|
|
575
|
+
` Threshold: ${t}%`);
|
|
576
|
+
}
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=run-experiment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-experiment.js","sourceRoot":"","sources":["../../cli-src/commands/run-experiment.ts"],"names":[],"mappings":"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"}
|