jevctl 0.1.0 → 0.2.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/CHANGELOG.md +44 -1
- package/NOTICE +4 -0
- package/README.md +54 -388
- package/SECURITY.md +5 -3
- package/dist/cli.js +105 -16
- package/dist/cli.js.map +1 -1
- package/dist/commands/ask.d.ts +5 -1
- package/dist/commands/ask.js +27 -10
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/auth.d.ts +14 -0
- package/dist/commands/auth.js +134 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/batch.d.ts +28 -0
- package/dist/commands/batch.js +221 -0
- package/dist/commands/batch.js.map +1 -0
- package/dist/commands/classify.d.ts +34 -0
- package/dist/commands/classify.js +187 -0
- package/dist/commands/classify.js.map +1 -0
- package/dist/commands/compact.d.ts +29 -0
- package/dist/commands/compact.js +146 -0
- package/dist/commands/compact.js.map +1 -0
- package/dist/commands/config.d.ts +2 -1
- package/dist/commands/config.js +27 -10
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/extract.d.ts +18 -0
- package/dist/commands/extract.js +108 -0
- package/dist/commands/extract.js.map +1 -0
- package/dist/commands/find.d.ts +5 -1
- package/dist/commands/find.js +30 -15
- package/dist/commands/find.js.map +1 -1
- package/dist/commands/match.d.ts +18 -0
- package/dist/commands/match.js +118 -0
- package/dist/commands/match.js.map +1 -0
- package/dist/commands/models.js +12 -10
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/rerank.d.ts +15 -0
- package/dist/commands/rerank.js +82 -0
- package/dist/commands/rerank.js.map +1 -0
- package/dist/commands/route.d.ts +19 -0
- package/dist/commands/route.js +120 -0
- package/dist/commands/route.js.map +1 -0
- package/dist/commands/screen.d.ts +5 -1
- package/dist/commands/screen.js +27 -10
- package/dist/commands/screen.js.map +1 -1
- package/dist/commands/verify.d.ts +5 -1
- package/dist/commands/verify.js +23 -12
- package/dist/commands/verify.js.map +1 -1
- package/dist/config.d.ts +66 -6
- package/dist/config.js +53 -2
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +4 -0
- package/dist/context.js +11 -5
- package/dist/context.js.map +1 -1
- package/dist/core/ask.js +8 -3
- package/dist/core/ask.js.map +1 -1
- package/dist/core/batch.d.ts +42 -0
- package/dist/core/batch.js +93 -0
- package/dist/core/batch.js.map +1 -0
- package/dist/core/classify.d.ts +103 -0
- package/dist/core/classify.js +216 -0
- package/dist/core/classify.js.map +1 -0
- package/dist/core/compact.d.ts +32 -0
- package/dist/core/compact.js +47 -0
- package/dist/core/compact.js.map +1 -0
- package/dist/core/extract.d.ts +58 -0
- package/dist/core/extract.js +214 -0
- package/dist/core/extract.js.map +1 -0
- package/dist/core/find.js +3 -0
- package/dist/core/find.js.map +1 -1
- package/dist/core/match.d.ts +55 -0
- package/dist/core/match.js +114 -0
- package/dist/core/match.js.map +1 -0
- package/dist/core/rerank.d.ts +47 -0
- package/dist/core/rerank.js +60 -0
- package/dist/core/rerank.js.map +1 -0
- package/dist/core/route.d.ts +74 -0
- package/dist/core/route.js +153 -0
- package/dist/core/route.js.map +1 -0
- package/dist/core/transcript.d.ts +15 -0
- package/dist/core/transcript.js +118 -0
- package/dist/core/transcript.js.map +1 -0
- package/dist/credentials.d.ts +30 -0
- package/dist/credentials.js +161 -0
- package/dist/credentials.js.map +1 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/input.js +1 -1
- package/dist/input.js.map +1 -1
- package/dist/lib.d.ts +2 -0
- package/dist/lib.js +9 -0
- package/dist/lib.js.map +1 -1
- package/dist/output.d.ts +41 -3
- package/dist/output.js +131 -6
- package/dist/output.js.map +1 -1
- package/dist/provider.d.ts +8 -0
- package/dist/provider.js +44 -4
- package/dist/provider.js.map +1 -1
- package/dist/vendor/compaction/compact.d.ts +29 -0
- package/dist/vendor/compaction/compact.js +236 -0
- package/dist/vendor/compaction/compact.js.map +1 -0
- package/dist/vendor/compaction/index.d.ts +4 -0
- package/dist/vendor/compaction/index.js +8 -0
- package/dist/vendor/compaction/index.js.map +1 -0
- package/dist/vendor/compaction/request.d.ts +19 -0
- package/dist/vendor/compaction/request.js +53 -0
- package/dist/vendor/compaction/request.js.map +1 -0
- package/dist/vendor/compaction/state.d.ts +28 -0
- package/dist/vendor/compaction/state.js +258 -0
- package/dist/vendor/compaction/state.js.map +1 -0
- package/dist/vendor/compaction/types.d.ts +177 -0
- package/dist/vendor/compaction/types.js +4 -0
- package/dist/vendor/compaction/types.js.map +1 -0
- package/docs/ask.md +52 -0
- package/docs/auth.md +53 -0
- package/docs/batch.md +48 -0
- package/docs/classify.md +55 -0
- package/docs/compact.md +58 -0
- package/docs/config.md +81 -0
- package/docs/extract.md +59 -0
- package/docs/find.md +49 -0
- package/docs/guidelines.md +19 -0
- package/docs/library.md +41 -0
- package/docs/match.md +52 -0
- package/docs/output.md +65 -0
- package/docs/recipes.md +78 -0
- package/docs/rerank.md +44 -0
- package/docs/route.md +57 -0
- package/docs/screen.md +53 -0
- package/docs/troubleshooting.md +17 -0
- package/docs/verify.md +58 -0
- package/package.json +9 -6
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { createWriteStream, mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { parseRows, runBatch } from "../core/batch.js";
|
|
5
|
+
import { CliError, EXIT } from "../errors.js";
|
|
6
|
+
import { readInput } from "../input.js";
|
|
7
|
+
import { paint, pluck, renderDelimited, renderMarkdown, renderPluck } from "../output.js";
|
|
8
|
+
import { prepareAskBatch, registerAsk } from "./ask.js";
|
|
9
|
+
import { prepareClassifyBatch, registerClassify } from "./classify.js";
|
|
10
|
+
import { prepareExtractBatch, registerExtract } from "./extract.js";
|
|
11
|
+
import { prepareFindBatch, registerFind } from "./find.js";
|
|
12
|
+
import { prepareRerankBatch, registerRerank } from "./rerank.js";
|
|
13
|
+
import { prepareRouteBatch, registerRoute } from "./route.js";
|
|
14
|
+
import { prepareScreenBatch, registerScreen } from "./screen.js";
|
|
15
|
+
import { prepareVerifyBatch, registerVerify } from "./verify.js";
|
|
16
|
+
/** Commands that accept one text input per row. */
|
|
17
|
+
export const BATCHABLE = {
|
|
18
|
+
classify: { register: registerClassify, prepare: prepareClassifyBatch, rowIs: "the text to classify" },
|
|
19
|
+
screen: { register: registerScreen, prepare: prepareScreenBatch, rowIs: "the text to screen" },
|
|
20
|
+
extract: { register: registerExtract, prepare: prepareExtractBatch, rowIs: "the text to extract from" },
|
|
21
|
+
ask: { register: registerAsk, prepare: prepareAskBatch, rowIs: "the state" },
|
|
22
|
+
verify: {
|
|
23
|
+
register: registerVerify,
|
|
24
|
+
prepare: prepareVerifyBatch,
|
|
25
|
+
rowIs: "one claim (evidence is shared via -e)",
|
|
26
|
+
},
|
|
27
|
+
find: {
|
|
28
|
+
register: registerFind,
|
|
29
|
+
prepare: prepareFindBatch,
|
|
30
|
+
rowIs: "one query (candidates are shared via --files etc.)",
|
|
31
|
+
},
|
|
32
|
+
rerank: {
|
|
33
|
+
register: registerRerank,
|
|
34
|
+
prepare: prepareRerankBatch,
|
|
35
|
+
rowIs: "one query (candidates are shared via --files etc.)",
|
|
36
|
+
},
|
|
37
|
+
route: { register: registerRoute, prepare: prepareRouteBatch, rowIs: "the request to route" },
|
|
38
|
+
};
|
|
39
|
+
const PLACEHOLDER = "__jev_batch_row__";
|
|
40
|
+
/**
|
|
41
|
+
* Parse the sub-command's own flags by running its commander definition in capture mode.
|
|
42
|
+
* Commands with a required positional (find, rerank) get a placeholder so parsing succeeds;
|
|
43
|
+
* any other positional means the user passed a text argument that each row should supply.
|
|
44
|
+
*/
|
|
45
|
+
export async function captureSubFlags(command, argv) {
|
|
46
|
+
const entry = BATCHABLE[command];
|
|
47
|
+
if (!entry)
|
|
48
|
+
throw new CliError(`"${command}" cannot be batched. Batchable: ${Object.keys(BATCHABLE).join(", ")}.`);
|
|
49
|
+
let captured;
|
|
50
|
+
let positional = [];
|
|
51
|
+
const tmp = new Command().exitOverride().configureOutput({ writeErr: () => { }, writeOut: () => { } });
|
|
52
|
+
entry.register(tmp, async (_fn, cmd) => {
|
|
53
|
+
captured = cmd.opts();
|
|
54
|
+
positional = cmd.args;
|
|
55
|
+
});
|
|
56
|
+
const parse = (args) => tmp.parseAsync(["node", "jev", command, ...args]);
|
|
57
|
+
try {
|
|
58
|
+
await parse(argv);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
const message = err.message ?? "";
|
|
62
|
+
if (!/missing required argument/i.test(message)) {
|
|
63
|
+
throw new CliError(`Invalid ${command} flags: ${message.replace(/^error: /, "")}`);
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
await parse([...argv, PLACEHOLDER]);
|
|
67
|
+
}
|
|
68
|
+
catch (err2) {
|
|
69
|
+
throw new CliError(`Invalid ${command} flags: ${(err2.message ?? "").replace(/^error: /, "")}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const leaked = positional.filter((p) => p !== PLACEHOLDER);
|
|
73
|
+
if (leaked.length > 0) {
|
|
74
|
+
throw new CliError(`Do not pass positional input to a batched ${command}; each row supplies ${entry.rowIs}.`);
|
|
75
|
+
}
|
|
76
|
+
return captured ?? {};
|
|
77
|
+
}
|
|
78
|
+
export async function batchAction(command, subArgs, flags, ctx) {
|
|
79
|
+
if (!flags.input)
|
|
80
|
+
throw new CliError("Provide --input <@file|-> with one row per line (plain text or JSONL).");
|
|
81
|
+
const subFlags = await captureSubFlags(command, subArgs);
|
|
82
|
+
const entry = BATCHABLE[command];
|
|
83
|
+
const item = entry.prepare(subFlags, ctx);
|
|
84
|
+
const concurrency = flags.concurrency === undefined ? ctx.config.batch.concurrency : Number(flags.concurrency);
|
|
85
|
+
if (!Number.isInteger(concurrency) || concurrency < 1 || concurrency > 64)
|
|
86
|
+
throw new CliError("--concurrency must be an integer from 1 to 64.");
|
|
87
|
+
let rows;
|
|
88
|
+
try {
|
|
89
|
+
rows = parseRows(readInput(flags.input, "batch input"));
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
if (err instanceof CliError)
|
|
93
|
+
throw err;
|
|
94
|
+
throw new CliError(err.message);
|
|
95
|
+
}
|
|
96
|
+
if (ctx.dryRun) {
|
|
97
|
+
process.stdout.write(`${JSON.stringify({ command, rows: rows.length, concurrency, flags: subFlags }, null, 2)}\n`);
|
|
98
|
+
return EXIT.OK;
|
|
99
|
+
}
|
|
100
|
+
const out = flags.output ? openOutput(flags.output) : process.stdout;
|
|
101
|
+
const format = ctx.output.format;
|
|
102
|
+
const streaming = format === "text" || format === "jsonl";
|
|
103
|
+
const collected = [];
|
|
104
|
+
const write = (record) => {
|
|
105
|
+
if (ctx.output.pluck) {
|
|
106
|
+
out.write(`${renderPluck(pluck(record, ctx.output.pluck), format === "json" ? "jsonl" : format)}\n`);
|
|
107
|
+
}
|
|
108
|
+
else if (streaming) {
|
|
109
|
+
out.write(`${JSON.stringify(record)}\n`);
|
|
110
|
+
}
|
|
111
|
+
else
|
|
112
|
+
collected.push(record);
|
|
113
|
+
};
|
|
114
|
+
const stopOnError = Boolean(flags.failFast);
|
|
115
|
+
let aborted = false;
|
|
116
|
+
const guarded = async (row) => {
|
|
117
|
+
if (aborted)
|
|
118
|
+
throw new Error("skipped after earlier failure (--fail-fast)");
|
|
119
|
+
try {
|
|
120
|
+
return await item(row);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
if (stopOnError)
|
|
124
|
+
aborted = true;
|
|
125
|
+
throw err;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
const { summary } = await runBatch(rows, guarded, { concurrency, onRecord: write });
|
|
129
|
+
if (!ctx.output.pluck && !streaming) {
|
|
130
|
+
if (format === "json")
|
|
131
|
+
out.write(`${JSON.stringify(collected, null, 2)}\n`);
|
|
132
|
+
else {
|
|
133
|
+
const view = {
|
|
134
|
+
table: {
|
|
135
|
+
columns: ["id", "ok", "failed", "result"],
|
|
136
|
+
rows: collected.map((r) => [
|
|
137
|
+
r.id,
|
|
138
|
+
String(r.ok),
|
|
139
|
+
String(r.failed),
|
|
140
|
+
r.ok ? summarizeResult(r.result) : `error: ${r.error}`,
|
|
141
|
+
]),
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
out.write(`${format === "md" ? renderMarkdown(view, { quiet: true }) : renderDelimited(view, format === "tsv" ? "\t" : ",")}\n`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (out !== process.stdout)
|
|
148
|
+
await new Promise((resolve) => out.end(resolve));
|
|
149
|
+
const c = ctx.output.color;
|
|
150
|
+
const line = `${summary.total} rows · ${summary.ok} ok · ${summary.errors} errors · ${summary.failed} matched fail-on · ${summary.input_tokens} in / ${summary.output_tokens} out tokens`;
|
|
151
|
+
if (!ctx.output.quiet || out === process.stdout)
|
|
152
|
+
process.stderr.write(`${paint(c, summary.errors ? "yellow" : "dim", line)}\n`);
|
|
153
|
+
if (summary.errors > 0)
|
|
154
|
+
return EXIT.ERROR;
|
|
155
|
+
return summary.failed > 0 ? EXIT.JUDGMENT : EXIT.OK;
|
|
156
|
+
}
|
|
157
|
+
/** One-cell summary of a sub-command result, for csv/tsv/md batch tables. */
|
|
158
|
+
export function summarizeResult(result) {
|
|
159
|
+
// biome-ignore lint/suspicious/noExplicitAny: answer payloads are the SDK's loosely typed union
|
|
160
|
+
const r = (result ?? {});
|
|
161
|
+
if (typeof r.label === "string")
|
|
162
|
+
return r.label;
|
|
163
|
+
if (Array.isArray(r.applied))
|
|
164
|
+
return r.applied.join("; ");
|
|
165
|
+
if (Array.isArray(r.path))
|
|
166
|
+
return r.path.join(" > ");
|
|
167
|
+
if (r.handler !== undefined)
|
|
168
|
+
return r.handler ?? "none";
|
|
169
|
+
if (r.recommendation?.action)
|
|
170
|
+
return r.recommendation.action;
|
|
171
|
+
if (r.exists_verdict)
|
|
172
|
+
return `${r.exists_verdict}: ${(r.top ?? []).map((t) => t.id).join("; ")}`;
|
|
173
|
+
if (Array.isArray(r.kept))
|
|
174
|
+
return r.kept.join("; ");
|
|
175
|
+
if (Array.isArray(r.results) && r.results[0]?.verdict)
|
|
176
|
+
return r.results.map((x) => x.verdict).join("; ");
|
|
177
|
+
if (r.fields)
|
|
178
|
+
return Object.entries(r.fields)
|
|
179
|
+
.map(([k, v]) => `${k}=${v.value ?? ""}`)
|
|
180
|
+
.join("; ");
|
|
181
|
+
if (r.answers)
|
|
182
|
+
return Object.entries(r.answers)
|
|
183
|
+
.map(([k, v]) => {
|
|
184
|
+
const a = v;
|
|
185
|
+
return `${k}=${a.choice ?? a.noul ?? a.score ?? ""}`;
|
|
186
|
+
})
|
|
187
|
+
.join("; ");
|
|
188
|
+
return "";
|
|
189
|
+
}
|
|
190
|
+
function openOutput(ref) {
|
|
191
|
+
const path = ref.startsWith("@") ? ref.slice(1) : ref;
|
|
192
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
193
|
+
return createWriteStream(path, { encoding: "utf8" });
|
|
194
|
+
}
|
|
195
|
+
export function registerBatch(program, run) {
|
|
196
|
+
program
|
|
197
|
+
.command("batch")
|
|
198
|
+
.description("Run classify, screen, extract, ask, verify, or find over many rows with a concurrency pool. Emits JSONL.")
|
|
199
|
+
.argument("<command>", `one of: ${Object.keys(BATCHABLE).join(", ")}`)
|
|
200
|
+
.argument("[args...]", "flags for that command, after --")
|
|
201
|
+
.requiredOption("-i, --input <ref>", "rows: @file or - ; plain lines, or JSONL objects with text (or state) and optional id")
|
|
202
|
+
.option("-o, --output <path>", "write JSONL records here instead of stdout")
|
|
203
|
+
.option("--concurrency <n>", "parallel requests (default 4)")
|
|
204
|
+
.option("--fail-fast", "stop scheduling new rows after the first error")
|
|
205
|
+
.allowUnknownOption()
|
|
206
|
+
.addHelpText("after", `
|
|
207
|
+
Output: one JSON object per row: {index, id, ok, failed, result | error, meta}. Rows keep input order.
|
|
208
|
+
--format json collects rows into one array; --format csv|tsv|md prints a summary table (id, ok,
|
|
209
|
+
failed, result). --pluck <path> prints one value per row, e.g. --pluck result.label.
|
|
210
|
+
Exit: 1 if any row errored, 2 if any row matched the command's --fail-on, else 0.
|
|
211
|
+
|
|
212
|
+
Examples:
|
|
213
|
+
jev batch classify --input @tickets.txt -- --labels billing,technical,sales --other
|
|
214
|
+
jev batch screen -i @pages.jsonl -o results.jsonl --concurrency 8 -- --purpose "extract pricing"
|
|
215
|
+
jev batch extract -i @emails.jsonl -- --want sender=email --want date
|
|
216
|
+
jev batch verify -i @claims.txt -- --evidence @spec.md --fail-on contradicted,unsupported`)
|
|
217
|
+
.action(async (command, args, flags, cmd) => {
|
|
218
|
+
await run((ctx) => batchAction(command, args.filter((a) => a !== "--"), flags, ctx), cmd);
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/commands/batch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { CommandContext } from "../context.js";
|
|
3
|
+
import type { BatchItemRunner } from "../core/batch.js";
|
|
4
|
+
import { type AnyClassifyOutput, CLASSIFY_FAIL_CONDITIONS, type LabelDef, type Taxonomy } from "../core/classify.js";
|
|
5
|
+
import { parseFailOn } from "../lib.js";
|
|
6
|
+
import { type View } from "../output.js";
|
|
7
|
+
export interface ClassifyFlags {
|
|
8
|
+
labels?: string;
|
|
9
|
+
labelsJson?: string;
|
|
10
|
+
taxonomy?: string;
|
|
11
|
+
multi?: boolean;
|
|
12
|
+
other?: boolean;
|
|
13
|
+
instructions?: string;
|
|
14
|
+
minConfidence?: string;
|
|
15
|
+
threshold?: string;
|
|
16
|
+
stateJson?: boolean;
|
|
17
|
+
failOn?: string;
|
|
18
|
+
}
|
|
19
|
+
interface Resolved {
|
|
20
|
+
mode: "single" | "multi" | "taxonomy";
|
|
21
|
+
labels: LabelDef[];
|
|
22
|
+
taxonomy?: Taxonomy;
|
|
23
|
+
minConfidence: number;
|
|
24
|
+
threshold: number;
|
|
25
|
+
failOn: ReturnType<typeof parseFailOn<(typeof CLASSIFY_FAIL_CONDITIONS)[number]>>;
|
|
26
|
+
}
|
|
27
|
+
export declare function resolveClassifyFlags(flags: ClassifyFlags, ctx: CommandContext): Resolved;
|
|
28
|
+
export declare function resolveClassifyText(positional: string | undefined, flags: ClassifyFlags): unknown;
|
|
29
|
+
export declare function classifyAction(positional: string | undefined, flags: ClassifyFlags, ctx: CommandContext): Promise<number>;
|
|
30
|
+
export declare function renderClassify(out: AnyClassifyOutput, ctx: CommandContext): View;
|
|
31
|
+
/** Batch: each row is classified with the shared label set. */
|
|
32
|
+
export declare function prepareClassifyBatch(flags: ClassifyFlags, ctx: CommandContext): BatchItemRunner;
|
|
33
|
+
export declare function registerClassify(program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>): void;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { buildClassifyMultiRequest, buildClassifyRequest, CLASSIFY_FAIL_CONDITIONS, classifyFailed, parseLabelJson, parseLabelList, parseTaxonomy, runClassify, runClassifyMulti, runClassifyTaxonomy, } from "../core/classify.js";
|
|
2
|
+
import { CliError, EXIT } from "../errors.js";
|
|
3
|
+
import { parseJson, readInput, readStdin } from "../input.js";
|
|
4
|
+
import { parseFailOn, parseProbability } from "../lib.js";
|
|
5
|
+
import { emit, formatProbability, paint } from "../output.js";
|
|
6
|
+
export function resolveClassifyFlags(flags, ctx) {
|
|
7
|
+
const sources = [flags.labels, flags.labelsJson, flags.taxonomy].filter(Boolean).length;
|
|
8
|
+
if (sources !== 1)
|
|
9
|
+
throw new CliError("Provide exactly one of --labels, --labels-json, or --taxonomy.");
|
|
10
|
+
if (flags.taxonomy && flags.multi)
|
|
11
|
+
throw new CliError("--multi cannot be combined with --taxonomy.");
|
|
12
|
+
const minConfidence = parseProbability("--min-confidence", flags.minConfidence, ctx.config.classify.minConfidence);
|
|
13
|
+
const threshold = parseProbability("--threshold", flags.threshold, ctx.config.classify.threshold);
|
|
14
|
+
const failOn = parseFailOn(flags.failOn, CLASSIFY_FAIL_CONDITIONS, []);
|
|
15
|
+
try {
|
|
16
|
+
if (flags.taxonomy) {
|
|
17
|
+
const taxonomy = parseTaxonomy(parseJson(readInput(flags.taxonomy, "taxonomy"), "taxonomy"));
|
|
18
|
+
return { mode: "taxonomy", labels: [], taxonomy, minConfidence, threshold, failOn };
|
|
19
|
+
}
|
|
20
|
+
const labels = flags.labels
|
|
21
|
+
? parseLabelList(flags.labels)
|
|
22
|
+
: parseLabelJson(parseJson(readInput(flags.labelsJson, "labels"), "labels"));
|
|
23
|
+
if (labels.length < (flags.multi ? 1 : 2)) {
|
|
24
|
+
throw new CliError(flags.multi ? "Provide at least one label." : "Provide at least two labels (or use --multi).");
|
|
25
|
+
}
|
|
26
|
+
return { mode: flags.multi ? "multi" : "single", labels, minConfidence, threshold, failOn };
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
if (err instanceof CliError)
|
|
30
|
+
throw err;
|
|
31
|
+
throw new CliError(err.message);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function resolveClassifyText(positional, flags) {
|
|
35
|
+
let raw;
|
|
36
|
+
if (positional !== undefined)
|
|
37
|
+
raw = readInput(positional, "text");
|
|
38
|
+
else if (!process.stdin.isTTY)
|
|
39
|
+
raw = readStdin("text");
|
|
40
|
+
else
|
|
41
|
+
throw new CliError("Provide text as an argument, @file, or pipe it on stdin.");
|
|
42
|
+
return flags.stateJson ? parseJson(raw, "text") : raw;
|
|
43
|
+
}
|
|
44
|
+
async function classifyOne(text, r, flags, ctx) {
|
|
45
|
+
const ask = ctx.ask();
|
|
46
|
+
if (r.mode === "taxonomy") {
|
|
47
|
+
return runClassifyTaxonomy(ask, {
|
|
48
|
+
text,
|
|
49
|
+
taxonomy: r.taxonomy,
|
|
50
|
+
instructions: flags.instructions,
|
|
51
|
+
other: Boolean(flags.other),
|
|
52
|
+
minConfidence: r.minConfidence,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
if (r.mode === "multi") {
|
|
56
|
+
return runClassifyMulti(ask, {
|
|
57
|
+
text,
|
|
58
|
+
labels: r.labels,
|
|
59
|
+
instructions: flags.instructions,
|
|
60
|
+
threshold: r.threshold,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return runClassify(ask, {
|
|
64
|
+
text,
|
|
65
|
+
labels: r.labels,
|
|
66
|
+
instructions: flags.instructions,
|
|
67
|
+
other: Boolean(flags.other),
|
|
68
|
+
minConfidence: r.minConfidence,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
export async function classifyAction(positional, flags, ctx) {
|
|
72
|
+
const r = resolveClassifyFlags(flags, ctx);
|
|
73
|
+
const text = resolveClassifyText(positional, flags);
|
|
74
|
+
if (ctx.dryRun) {
|
|
75
|
+
if (r.mode === "taxonomy") {
|
|
76
|
+
emit({ ...ctx.output, format: "json" }, {
|
|
77
|
+
model: ctx.config.model,
|
|
78
|
+
note: "taxonomy runs one request per level; showing the first",
|
|
79
|
+
state: text,
|
|
80
|
+
taxonomy: r.taxonomy,
|
|
81
|
+
}, () => ({}));
|
|
82
|
+
return EXIT.OK;
|
|
83
|
+
}
|
|
84
|
+
const built = r.mode === "multi"
|
|
85
|
+
? buildClassifyMultiRequest({ text, labels: r.labels, instructions: flags.instructions })
|
|
86
|
+
: buildClassifyRequest({
|
|
87
|
+
text,
|
|
88
|
+
labels: r.labels,
|
|
89
|
+
instructions: flags.instructions,
|
|
90
|
+
other: Boolean(flags.other),
|
|
91
|
+
});
|
|
92
|
+
emit({ ...ctx.output, format: "json" }, { model: ctx.config.model, state: built.state, questions: built.questions }, () => ({}));
|
|
93
|
+
return EXIT.OK;
|
|
94
|
+
}
|
|
95
|
+
const output = await classifyOne(text, r, flags, ctx);
|
|
96
|
+
emit(ctx.output, output, () => renderClassify(output, ctx));
|
|
97
|
+
return classifyFailed(output, r.failOn) ? EXIT.JUDGMENT : EXIT.OK;
|
|
98
|
+
}
|
|
99
|
+
export function renderClassify(out, ctx) {
|
|
100
|
+
const c = ctx.output.color;
|
|
101
|
+
const dist = (p) => Object.entries(p)
|
|
102
|
+
.sort(([, a], [, b]) => b - a)
|
|
103
|
+
.map(([k, v]) => `${k} ${formatProbability(v)}`)
|
|
104
|
+
.join(", ");
|
|
105
|
+
const usage = { usage: out.usage, model: out.model, provider: out.provider };
|
|
106
|
+
if (out.mode === "single") {
|
|
107
|
+
const action = out.action === "review" ? paint(c, "yellow", "review") : paint(c, "dim", "auto");
|
|
108
|
+
return {
|
|
109
|
+
head: [
|
|
110
|
+
`${paint(c, ["bold", "green"], out.label ?? "?")} conf ${formatProbability(out.confidence)} ${action}`,
|
|
111
|
+
paint(c, "dim", `[${dist(out.probabilities)}]`),
|
|
112
|
+
],
|
|
113
|
+
kv: [
|
|
114
|
+
["label", out.label ?? ""],
|
|
115
|
+
["confidence", formatProbability(out.confidence)],
|
|
116
|
+
["action", out.action],
|
|
117
|
+
["probabilities", dist(out.probabilities)],
|
|
118
|
+
],
|
|
119
|
+
usage,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (out.mode === "multi") {
|
|
123
|
+
const rows = out.labels.map((l) => [
|
|
124
|
+
l.applies ? paint(c, "green", "yes") : paint(c, "dim", "no"),
|
|
125
|
+
formatProbability(l.probability),
|
|
126
|
+
l.label,
|
|
127
|
+
]);
|
|
128
|
+
return {
|
|
129
|
+
table: { columns: ["Applies", "Prob", "Label"], rows },
|
|
130
|
+
tail: [paint(c, "dim", `threshold ≥ ${out.threshold}`)],
|
|
131
|
+
usage,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const path = out.path.length ? out.path.join(paint(c, "dim", " > ")) : paint(c, "dim", "(none)");
|
|
135
|
+
const action = out.action === "review" ? paint(c, "yellow", "review") : paint(c, "dim", "auto");
|
|
136
|
+
return {
|
|
137
|
+
head: [
|
|
138
|
+
`${paint(c, ["bold", "green"], path)}${out.stopped_at_other ? paint(c, "yellow", " → other") : ""} conf ${formatProbability(out.confidence)} ${action}`,
|
|
139
|
+
...out.steps.map((s) => paint(c, "dim", ` ${s.label} ${formatProbability(s.confidence)} [${dist(s.probabilities)}]`)),
|
|
140
|
+
],
|
|
141
|
+
kv: [
|
|
142
|
+
["path", out.path.join(" > ")],
|
|
143
|
+
["confidence", formatProbability(out.confidence)],
|
|
144
|
+
["action", out.action],
|
|
145
|
+
],
|
|
146
|
+
usage,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/** Batch: each row is classified with the shared label set. */
|
|
150
|
+
export function prepareClassifyBatch(flags, ctx) {
|
|
151
|
+
const r = resolveClassifyFlags(flags, ctx);
|
|
152
|
+
return async (row) => {
|
|
153
|
+
const text = row.state !== undefined && flags.stateJson
|
|
154
|
+
? row.state
|
|
155
|
+
: flags.stateJson
|
|
156
|
+
? parseJson(row.text, `row ${row.id}`)
|
|
157
|
+
: row.text;
|
|
158
|
+
const output = await classifyOne(text, r, flags, ctx);
|
|
159
|
+
return { output, failed: classifyFailed(output, r.failOn) };
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
export function registerClassify(program, run) {
|
|
163
|
+
program
|
|
164
|
+
.command("classify")
|
|
165
|
+
.description("Assign a label from a set (one, several, or down a hierarchy) with probabilities and confidence.")
|
|
166
|
+
.argument("[text]", "text to classify, @file, or - for stdin (default: stdin)")
|
|
167
|
+
.option("-l, --labels <list>", "labels: a,b,c or a:description,b:description (escape commas as \\,)")
|
|
168
|
+
.option("--labels-json <ref>", "labels as JSON: array of strings, array of {label,description}, or {label: description}")
|
|
169
|
+
.option("-t, --taxonomy <ref>", 'hierarchy as JSON, e.g. {"hardware": {"laptop": null, "phone": null}, "software": ["os","app"]}')
|
|
170
|
+
.option("--multi", "one yes/no probability per label instead of picking one")
|
|
171
|
+
.option("--other", "add an 'other' escape option (single and taxonomy modes)")
|
|
172
|
+
.option("-i, --instructions <text>", "the question to ask instead of the default")
|
|
173
|
+
.option("--min-confidence <p>", "confidence below which the result is flagged 'review' (default 0.6)")
|
|
174
|
+
.option("--threshold <p>", "--multi: probability at or above which a label applies (default 0.5)")
|
|
175
|
+
.option("--state-json", "parse the text as JSON")
|
|
176
|
+
.option("--fail-on <list>", `exit 2 when: ${CLASSIFY_FAIL_CONDITIONS.join(", ")} (--multi: nothing applied), or none (default none)`)
|
|
177
|
+
.addHelpText("after", `
|
|
178
|
+
Examples:
|
|
179
|
+
jev classify @ticket.txt --labels billing,technical,sales --other
|
|
180
|
+
jev classify "Login fails after update" -l "bug:defect in existing feature,feature:new capability,question" --fail-on review
|
|
181
|
+
jev classify @post.md --multi --labels security,performance,docs --threshold 0.6
|
|
182
|
+
jev classify @item.txt --taxonomy @catalog.json --other`)
|
|
183
|
+
.action(async (text, flags, cmd) => {
|
|
184
|
+
await run((ctx) => classifyAction(text, flags, ctx), cmd);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/commands/classify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { CommandContext } from "../context.js";
|
|
3
|
+
import { type CompactOutput } from "../core/compact.js";
|
|
4
|
+
import { type View } from "../output.js";
|
|
5
|
+
export interface CompactFlags {
|
|
6
|
+
goal?: string;
|
|
7
|
+
keepThreshold?: string;
|
|
8
|
+
preserveRecent?: string;
|
|
9
|
+
maxStateTokens?: string;
|
|
10
|
+
maxRequestTokens?: string;
|
|
11
|
+
truncateHead?: string;
|
|
12
|
+
minReduction?: string;
|
|
13
|
+
out?: string;
|
|
14
|
+
failOn?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function resolveCompactOptions(flags: CompactFlags, ctx: CommandContext): {
|
|
17
|
+
goal: string | undefined;
|
|
18
|
+
keepThreshold: number;
|
|
19
|
+
preserveRecentMessages: number;
|
|
20
|
+
maxStateTokens: number;
|
|
21
|
+
maxRequestTokens: number;
|
|
22
|
+
truncateHeadChars: number;
|
|
23
|
+
minReduction: number;
|
|
24
|
+
failOn: "low-reduction"[];
|
|
25
|
+
};
|
|
26
|
+
export declare function loadTranscript(positional: string | undefined): import("../core/transcript.js").ParsedTranscript;
|
|
27
|
+
export declare function compactAction(positional: string | undefined, flags: CompactFlags, ctx: CommandContext): Promise<number>;
|
|
28
|
+
export declare function renderCompact(out: CompactOutput, ctx: CommandContext, format: string, wrote?: string): View;
|
|
29
|
+
export declare function registerCompact(program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>): void;
|