@calliopelabs/cli 3.2.0 → 3.3.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 +15 -0
- package/dist/acp.d.ts +11 -3
- package/dist/acp.d.ts.map +1 -1
- package/dist/acp.js +114 -27
- package/dist/acp.js.map +1 -1
- package/dist/attach.d.ts +95 -0
- package/dist/attach.d.ts.map +1 -0
- package/dist/attach.js +306 -0
- package/dist/attach.js.map +1 -0
- package/dist/bin.js +27 -5
- package/dist/bin.js.map +1 -1
- package/dist/brain/actions.d.ts +1 -1
- package/dist/brain/actions.d.ts.map +1 -1
- package/dist/brain/actions.js.map +1 -1
- package/dist/brain/cli.d.ts +1 -1
- package/dist/brain/cli.d.ts.map +1 -1
- package/dist/brain/cli.js +47 -5
- package/dist/brain/cli.js.map +1 -1
- package/dist/brain/exchange-json.d.ts +4 -0
- package/dist/brain/exchange-json.d.ts.map +1 -0
- package/dist/brain/exchange-json.js +77 -0
- package/dist/brain/exchange-json.js.map +1 -0
- package/dist/brain/exchange.d.ts +26 -0
- package/dist/brain/exchange.d.ts.map +1 -0
- package/dist/brain/exchange.js +86 -0
- package/dist/brain/exchange.js.map +1 -0
- package/dist/brain/index.d.ts +3 -0
- package/dist/brain/index.d.ts.map +1 -1
- package/dist/brain/index.js +3 -0
- package/dist/brain/index.js.map +1 -1
- package/dist/brain/journal.js +3 -3
- package/dist/brain/journal.js.map +1 -1
- package/dist/brain/kg-claims.d.ts +13 -0
- package/dist/brain/kg-claims.d.ts.map +1 -0
- package/dist/brain/kg-claims.js +156 -0
- package/dist/brain/kg-claims.js.map +1 -0
- package/dist/brain/kg-export.d.ts +13 -0
- package/dist/brain/kg-export.d.ts.map +1 -0
- package/dist/brain/kg-export.js +116 -0
- package/dist/brain/kg-export.js.map +1 -0
- package/dist/brain/kg-transfer.d.ts +29 -0
- package/dist/brain/kg-transfer.d.ts.map +1 -0
- package/dist/brain/kg-transfer.js +156 -0
- package/dist/brain/kg-transfer.js.map +1 -0
- package/dist/brain/kg.d.ts.map +1 -1
- package/dist/brain/kg.js +89 -16
- package/dist/brain/kg.js.map +1 -1
- package/dist/brain/presentation.d.ts.map +1 -1
- package/dist/brain/presentation.js +10 -0
- package/dist/brain/presentation.js.map +1 -1
- package/dist/brain/store.d.ts +1 -1
- package/dist/brain/store.d.ts.map +1 -1
- package/dist/brain/store.js +8 -2
- package/dist/brain/store.js.map +1 -1
- package/dist/brain/transfer-report.d.ts +38 -0
- package/dist/brain/transfer-report.d.ts.map +1 -0
- package/dist/brain/transfer-report.js +10 -0
- package/dist/brain/transfer-report.js.map +1 -0
- package/dist/brain/transfer.d.ts +29 -21
- package/dist/brain/transfer.d.ts.map +1 -1
- package/dist/brain/transfer.js +120 -89
- package/dist/brain/transfer.js.map +1 -1
- package/dist/brain/validation.d.ts +1 -0
- package/dist/brain/validation.d.ts.map +1 -1
- package/dist/brain/validation.js +7 -6
- package/dist/brain/validation.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/execution/authority.d.ts.map +1 -1
- package/dist/execution/authority.js +4 -2
- package/dist/execution/authority.js.map +1 -1
- package/dist/execution/files.d.ts.map +1 -1
- package/dist/execution/files.js +9 -6
- package/dist/execution/files.js.map +1 -1
- package/dist/execution/ledger.d.ts.map +1 -1
- package/dist/execution/ledger.js +3 -1
- package/dist/execution/ledger.js.map +1 -1
- package/dist/execution/project-spend.d.ts.map +1 -1
- package/dist/execution/project-spend.js +9 -6
- package/dist/execution/project-spend.js.map +1 -1
- package/dist/execution/writer-recovery.d.ts.map +1 -1
- package/dist/execution/writer-recovery.js +14 -10
- package/dist/execution/writer-recovery.js.map +1 -1
- package/dist/goals/store.d.ts.map +1 -1
- package/dist/goals/store.js +3 -1
- package/dist/goals/store.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/judgment/cli.d.ts +20 -0
- package/dist/judgment/cli.d.ts.map +1 -0
- package/dist/judgment/cli.js +141 -0
- package/dist/judgment/cli.js.map +1 -0
- package/dist/judgment/evaluate.d.ts +47 -0
- package/dist/judgment/evaluate.d.ts.map +1 -0
- package/dist/judgment/evaluate.js +369 -0
- package/dist/judgment/evaluate.js.map +1 -0
- package/dist/judgment/index.d.ts +8 -0
- package/dist/judgment/index.d.ts.map +1 -0
- package/dist/judgment/index.js +5 -0
- package/dist/judgment/index.js.map +1 -0
- package/dist/judgment/policy.d.ts +61 -0
- package/dist/judgment/policy.d.ts.map +1 -0
- package/dist/judgment/policy.js +143 -0
- package/dist/judgment/policy.js.map +1 -0
- package/dist/judgment/types.d.ts +73 -0
- package/dist/judgment/types.d.ts.map +1 -0
- package/dist/judgment/types.js +9 -0
- package/dist/judgment/types.js.map +1 -0
- package/dist/model-detection.d.ts.map +1 -1
- package/dist/model-detection.js +40 -7
- package/dist/model-detection.js.map +1 -1
- package/dist/models/metadata.d.ts +2 -0
- package/dist/models/metadata.d.ts.map +1 -1
- package/dist/models/metadata.js +2 -2
- package/dist/models/metadata.js.map +1 -1
- package/dist/orchestration/execution-store.d.ts.map +1 -1
- package/dist/orchestration/execution-store.js +14 -3
- package/dist/orchestration/execution-store.js.map +1 -1
- package/dist/orchestration/store.d.ts.map +1 -1
- package/dist/orchestration/store.js +3 -1
- package/dist/orchestration/store.js.map +1 -1
- package/dist/policy.d.ts +8 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +74 -5
- package/dist/policy.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +10 -5
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +3 -2
- package/dist/providers/openai.js.map +1 -1
- package/dist/routing/select.d.ts +7 -0
- package/dist/routing/select.d.ts.map +1 -1
- package/dist/routing/select.js +18 -1
- package/dist/routing/select.js.map +1 -1
- package/dist/session-management/files.d.ts.map +1 -1
- package/dist/session-management/files.js +9 -6
- package/dist/session-management/files.js.map +1 -1
- package/dist/sessions/history.d.ts.map +1 -1
- package/dist/sessions/history.js +12 -6
- package/dist/sessions/history.js.map +1 -1
- package/dist/spawning/store.d.ts.map +1 -1
- package/dist/spawning/store.js +10 -8
- package/dist/spawning/store.js.map +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +5 -2
- package/dist/tools.js.map +1 -1
- package/dist/types.js +1 -1
- package/dist/ui/agent.d.ts.map +1 -1
- package/dist/ui/agent.js +3 -2
- package/dist/ui/agent.js.map +1 -1
- package/dist/ui/commands.d.ts.map +1 -1
- package/dist/ui/commands.js +20 -12
- package/dist/ui/commands.js.map +1 -1
- package/dist/ui/model-commands.d.ts.map +1 -1
- package/dist/ui/model-commands.js +3 -2
- package/dist/ui/model-commands.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/** `calliope judge`: typed judgments from the terminal, for scripts and CI. */
|
|
2
|
+
import { parseArgs } from 'node:util';
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
|
+
import { parseModelFlags } from '../preferences/flags.js';
|
|
5
|
+
import { resolvePreferences } from '../preferences/resolve.js';
|
|
6
|
+
import { evaluate } from './evaluate.js';
|
|
7
|
+
import { runJudgePolicy } from './policy.js';
|
|
8
|
+
import { JudgmentError } from './types.js';
|
|
9
|
+
export const JUDGE_USAGE = `calliope judge --request <file|-> [--provider <name>|typesafe] [--model <id>] [--json]
|
|
10
|
+
calliope judge --questions <file> (--state <text> | --state-file <file|->) [--provider <name>] [--model <id>] [--json]
|
|
11
|
+
calliope judge --policy <rules.json> [--provider <name>] [--model <id>] [--json] pre-tool policy engine, tool call on stdin`;
|
|
12
|
+
/** Remove `--provider typesafe` / `--provider=typesafe` before chat-provider parsing. */
|
|
13
|
+
function stripTypesafeFlag(args) {
|
|
14
|
+
const kept = [];
|
|
15
|
+
let typesafe = false;
|
|
16
|
+
for (let index = 0; index < args.length; index++) {
|
|
17
|
+
const arg = args[index];
|
|
18
|
+
if (arg === '--') {
|
|
19
|
+
kept.push(...args.slice(index));
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
if (arg === '--provider=typesafe' || (arg === '--provider' && args[index + 1] === 'typesafe')) {
|
|
23
|
+
if (typesafe)
|
|
24
|
+
throw new Error('Duplicate --provider option');
|
|
25
|
+
typesafe = true;
|
|
26
|
+
if (arg === '--provider')
|
|
27
|
+
index++;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
kept.push(arg);
|
|
31
|
+
}
|
|
32
|
+
return { typesafe, args: kept };
|
|
33
|
+
}
|
|
34
|
+
function readSource(path, stdin) {
|
|
35
|
+
return path === '-' ? stdin() : fs.readFileSync(path, 'utf8');
|
|
36
|
+
}
|
|
37
|
+
function parseJson(label, text) {
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(text);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new JudgmentError('invalid-request', `${label} is not valid JSON.`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Build the request from flags; the state may be raw text or a JSON document. */
|
|
46
|
+
export function loadRequest(values, stdin) {
|
|
47
|
+
const sources = [values.request, values.questions].filter(Boolean).length;
|
|
48
|
+
if (sources !== 1)
|
|
49
|
+
throw new JudgmentError('invalid-request', 'Pass exactly one of --request or --questions.');
|
|
50
|
+
if (values.request) {
|
|
51
|
+
if (values.state !== undefined || values['state-file'] !== undefined)
|
|
52
|
+
throw new JudgmentError('invalid-request', '--request already carries the state.');
|
|
53
|
+
return parseJson('Request', readSource(values.request, stdin));
|
|
54
|
+
}
|
|
55
|
+
const stateFlags = [values.state, values['state-file']].filter(v => v !== undefined).length;
|
|
56
|
+
if (stateFlags !== 1)
|
|
57
|
+
throw new JudgmentError('invalid-request', 'Pass exactly one of --state or --state-file with --questions.');
|
|
58
|
+
const raw = values.state !== undefined ? values.state : readSource(values['state-file'], stdin);
|
|
59
|
+
let state = raw;
|
|
60
|
+
if (values['state-file'] !== undefined && /\.json$/i.test(values['state-file']))
|
|
61
|
+
state = parseJson('State file', raw);
|
|
62
|
+
return { state, questions: parseJson('Questions', readSource(values.questions, stdin)) };
|
|
63
|
+
}
|
|
64
|
+
function formatAnswer(id, answer) {
|
|
65
|
+
const dist = (p, legend) => Object.entries(p).map(([key, value]) => `${legend?.[key] ?? key} ${value.toFixed(2)}`).join(' · ');
|
|
66
|
+
if (answer.type === 'noul')
|
|
67
|
+
return `${id}\tnoul\t${answer.noul.toFixed(2)}`;
|
|
68
|
+
if (answer.type === 'choice')
|
|
69
|
+
return `${id}\tchoice\t${answer.choice}\t(confidence ${answer.confidence.toFixed(2)})\t${dist(answer.probabilities)}`;
|
|
70
|
+
return `${id}\tscore\t${answer.score.toFixed(2)}\t(confidence ${answer.confidence.toFixed(2)})\t${dist(answer.probabilities, answer.legend)}`;
|
|
71
|
+
}
|
|
72
|
+
export function formatJudgment(response) {
|
|
73
|
+
const lines = [`${response.provider}/${response.model} in ${response.usage.input_tokens} out ${response.usage.output_tokens}`];
|
|
74
|
+
for (const [id, answer] of Object.entries(response.answers))
|
|
75
|
+
lines.push(formatAnswer(id, answer));
|
|
76
|
+
return lines.join('\n') + '\n';
|
|
77
|
+
}
|
|
78
|
+
export async function runJudge(rawArgs, options = {}) {
|
|
79
|
+
const write = options.write ?? ((text) => { process.stdout.write(text); });
|
|
80
|
+
const stdin = options.stdin ?? (() => fs.readFileSync(0, 'utf8'));
|
|
81
|
+
let json = false;
|
|
82
|
+
const fail = (failure, exitCode) => {
|
|
83
|
+
if (json)
|
|
84
|
+
write(JSON.stringify({ version: 1, type: 'judgment', ...failure }) + '\n');
|
|
85
|
+
else
|
|
86
|
+
write(`${failure.message}\n${failure.error === 'invalid-arguments' ? `\n${JUDGE_USAGE}\n` : ''}`);
|
|
87
|
+
return exitCode;
|
|
88
|
+
};
|
|
89
|
+
// `typesafe` is a judgment engine, not a chat provider, so it never reaches
|
|
90
|
+
// preference validation; every other --provider/--model flag resolves normally.
|
|
91
|
+
let native, preference, rest;
|
|
92
|
+
try {
|
|
93
|
+
native = stripTypesafeFlag(rawArgs);
|
|
94
|
+
({ preference, args: rest } = parseModelFlags(native.args));
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
return fail({ error: 'invalid-arguments', message: error instanceof Error ? error.message : String(error) }, 2);
|
|
98
|
+
}
|
|
99
|
+
if (native.typesafe && preference.provider !== undefined)
|
|
100
|
+
return fail({ error: 'invalid-arguments', message: 'Duplicate --provider option' }, 2);
|
|
101
|
+
let parsed;
|
|
102
|
+
try {
|
|
103
|
+
parsed = parseArgs({ args: rest, allowPositionals: false, options: {
|
|
104
|
+
json: { type: 'boolean' }, request: { type: 'string' }, questions: { type: 'string' }, state: { type: 'string' }, 'state-file': { type: 'string' }, policy: { type: 'string' },
|
|
105
|
+
} });
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
return fail({ error: 'invalid-arguments', message: error instanceof Error ? error.message : String(error) }, 2);
|
|
109
|
+
}
|
|
110
|
+
json = !!parsed.values.json;
|
|
111
|
+
let provider, model;
|
|
112
|
+
if (native.typesafe) {
|
|
113
|
+
provider = 'typesafe';
|
|
114
|
+
model = preference.model ?? undefined;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
const resolved = resolvePreferences(options.cwd ?? process.cwd(), { turn: preference });
|
|
118
|
+
provider = resolved.provider;
|
|
119
|
+
model = resolved.model;
|
|
120
|
+
}
|
|
121
|
+
// The policy engine owns its own exit codes and fails closed on every error.
|
|
122
|
+
if (parsed.values.policy !== undefined) {
|
|
123
|
+
if (['request', 'questions', 'state', 'state-file'].some(flag => parsed.values[flag] !== undefined))
|
|
124
|
+
return fail({ error: 'invalid-arguments', message: '--policy takes the pending tool call on stdin and its questions from the rules file.' }, 2);
|
|
125
|
+
return runJudgePolicy(String(parsed.values.policy), { provider, model, signal: options.signal, json, stdin, write, ...(options.writeErr ? { writeErr: options.writeErr } : {}) });
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
const request = loadRequest(parsed.values, stdin);
|
|
129
|
+
const response = await evaluate(request, { provider, model, signal: options.signal });
|
|
130
|
+
write(json ? JSON.stringify({ version: 1, type: 'judgment', ...response }) + '\n' : formatJudgment(response));
|
|
131
|
+
return 0;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (options.signal?.aborted)
|
|
135
|
+
return fail({ error: 'cancelled', message: 'Judgment cancelled.' }, 130);
|
|
136
|
+
if (error instanceof JudgmentError)
|
|
137
|
+
return fail({ error: error.code, message: error.message }, error.code === 'invalid-request' ? 2 : 1);
|
|
138
|
+
return fail({ error: 'unavailable', message: error instanceof Error ? error.message : String(error) }, 1);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/judgment/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type ChatOptions } from '../providers/index.js';
|
|
2
|
+
import { type Message } from '../types.js';
|
|
3
|
+
import { type Answer, type JudgmentEngine, type JudgmentRequest, type JudgmentResponse, type Question } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* The prompted engine's `chat()` call admits the same bounded-execution
|
|
6
|
+
* controls any other in-runtime caller uses: a reviewed output limit and,
|
|
7
|
+
* when the caller supplies one, an `attemptBudget` that reserves and settles
|
|
8
|
+
* the request against its ledger. Neither has an effect on the native
|
|
9
|
+
* TypeSafe engine, which never calls `chat()`; `evaluate()` rejects them for
|
|
10
|
+
* `provider: 'typesafe'` rather than silently admitting an unaccounted call.
|
|
11
|
+
*/
|
|
12
|
+
export interface EvaluateOptions extends Pick<ChatOptions, 'maxOutputTokens' | 'bounded' | 'attemptBudget'> {
|
|
13
|
+
provider?: JudgmentEngine;
|
|
14
|
+
model?: string;
|
|
15
|
+
signal?: AbortSignal;
|
|
16
|
+
/** Injected for tests; defaults to global fetch. */
|
|
17
|
+
fetch?: typeof fetch;
|
|
18
|
+
}
|
|
19
|
+
export declare const TYPESAFE_DEFAULT_MODEL = "jev-latest";
|
|
20
|
+
/** Reject malformed input before any network call; returns a typed copy. */
|
|
21
|
+
export declare function validateRequest(input: unknown): JudgmentRequest;
|
|
22
|
+
export declare function buildMessages(request: JudgmentRequest): {
|
|
23
|
+
messages: Message[];
|
|
24
|
+
ids: string[];
|
|
25
|
+
};
|
|
26
|
+
/** Grammar schema for backends that constrain output (Ollama `format`); others ignore it. */
|
|
27
|
+
export declare function buildOutputSchema(request: JudgmentRequest): Record<string, unknown>;
|
|
28
|
+
/** Accept a bare object, or one wrapped in fences/prose; reject anything else. */
|
|
29
|
+
export declare function parseModelOutput(text: string): Record<string, unknown>;
|
|
30
|
+
/** Clamp, fill missing outcomes with 0 and renormalize; all-zero is a model failure. */
|
|
31
|
+
export declare function normalizeDistribution(id: string, keys: string[], raw: unknown): Record<string, number>;
|
|
32
|
+
/**
|
|
33
|
+
* How far the leading outcome sits above chance: (max - 1/n) / (1 - 1/n).
|
|
34
|
+
* 1 when one outcome holds all mass, 0 when the distribution is uniform. This
|
|
35
|
+
* tracks the confidence TypeSafe reports for the same distributions closely,
|
|
36
|
+
* though their exact statistic is unpublished.
|
|
37
|
+
*/
|
|
38
|
+
export declare function confidenceOf(probabilities: Record<string, number>): number;
|
|
39
|
+
/** Derive the typed answer from a normalized distribution. */
|
|
40
|
+
export declare function toAnswer(question: Question, probabilities: Record<string, number>): Answer;
|
|
41
|
+
export declare function typesafeCredentials(): {
|
|
42
|
+
apiKey?: string;
|
|
43
|
+
baseUrl: string;
|
|
44
|
+
};
|
|
45
|
+
/** Evaluate every question in one request; answers come back under the caller's ids. */
|
|
46
|
+
export declare function evaluate(input: unknown, options?: EvaluateOptions): Promise<JudgmentResponse>;
|
|
47
|
+
//# sourceMappingURL=evaluate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/judgment/evaluate.ts"],"names":[],"mappings":"AASA,OAAO,EAAwB,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE/E,OAAO,EAAoC,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAiB,KAAK,MAAM,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,QAAQ,EAAsB,MAAM,YAAY,CAAC;AAE7J;;;;;;;GAOG;AACH,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,WAAW,EAAE,iBAAiB,GAAG,SAAS,GAAG,eAAe,CAAC;IACzG,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,eAAO,MAAM,sBAAsB,eAAe,CAAC;AA6DnD,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAc/D;AAmCD,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAK9F;AAED,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYnF;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQtE;AAED,wFAAwF;AACxF,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAStG;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAK1E;AAQD,8DAA8D;AAC9D,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAU1F;AAiCD,wBAAgB,mBAAmB,IAAI;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAM1E;AAuFD,wFAAwF;AACxF,wBAAsB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAUvG"}
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Judgment evaluation over two engines:
|
|
3
|
+
* - any chat backend: the model is prompted for a probability distribution per
|
|
4
|
+
* question and the answer types are derived here (prompted engine);
|
|
5
|
+
* - `typesafe`: the native TypeSafe endpoint, whose System One models return
|
|
6
|
+
* calibrated distributions directly.
|
|
7
|
+
* Both return the same JudgmentResponse contract.
|
|
8
|
+
*/
|
|
9
|
+
import * as config from '../config.js';
|
|
10
|
+
import { chat, selectProvider } from '../providers/index.js';
|
|
11
|
+
import { throwIfCancelled } from '../cancellation.js';
|
|
12
|
+
import { DEFAULT_MODELS } from '../types.js';
|
|
13
|
+
import { JudgmentError } from './types.js';
|
|
14
|
+
export const TYPESAFE_DEFAULT_MODEL = 'jev-latest';
|
|
15
|
+
const TYPESAFE_DEFAULT_BASE_URL = 'https://api.typesafe.ai/v1';
|
|
16
|
+
const MAX_QUESTIONS = 64;
|
|
17
|
+
const MAX_OPTIONS = 32;
|
|
18
|
+
const ID_PATTERN = /^[A-Za-z0-9_.-]{1,64}$/;
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Validation
|
|
21
|
+
function invalid(message) { throw new JudgmentError('invalid-request', message); }
|
|
22
|
+
function isRecord(value) {
|
|
23
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
24
|
+
}
|
|
25
|
+
function validateInstructions(id, value) {
|
|
26
|
+
if (typeof value === 'string') {
|
|
27
|
+
if (!value.trim())
|
|
28
|
+
invalid(`Question "${id}" has empty instructions.`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (isRecord(value) || Array.isArray(value))
|
|
32
|
+
return;
|
|
33
|
+
invalid(`Question "${id}" needs string, object or array instructions.`);
|
|
34
|
+
}
|
|
35
|
+
function validateQuestion(id, value) {
|
|
36
|
+
if (!isRecord(value))
|
|
37
|
+
invalid(`Question "${id}" must be an object.`);
|
|
38
|
+
validateInstructions(id, value.instructions);
|
|
39
|
+
switch (value.type) {
|
|
40
|
+
case 'noul': {
|
|
41
|
+
const criteria = value.criteria;
|
|
42
|
+
if (criteria !== undefined) {
|
|
43
|
+
if (!isRecord(criteria))
|
|
44
|
+
invalid(`Question "${id}": noul criteria must be an object with optional "true"/"false" strings.`);
|
|
45
|
+
for (const key of Object.keys(criteria)) {
|
|
46
|
+
if (key !== 'true' && key !== 'false')
|
|
47
|
+
invalid(`Question "${id}": noul criteria only accept "true" and "false" keys.`);
|
|
48
|
+
if (typeof criteria[key] !== 'string')
|
|
49
|
+
invalid(`Question "${id}": noul criteria "${key}" must be a string.`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
case 'choice': {
|
|
55
|
+
const criteria = value.criteria;
|
|
56
|
+
if (!isRecord(criteria))
|
|
57
|
+
invalid(`Question "${id}": choice criteria must map each option to a description or null.`);
|
|
58
|
+
const options = Object.keys(criteria);
|
|
59
|
+
if (options.length < 2)
|
|
60
|
+
invalid(`Question "${id}": choice needs at least two options.`);
|
|
61
|
+
if (options.length > MAX_OPTIONS)
|
|
62
|
+
invalid(`Question "${id}": choice allows at most ${MAX_OPTIONS} options.`);
|
|
63
|
+
for (const option of options) {
|
|
64
|
+
if (!option.trim())
|
|
65
|
+
invalid(`Question "${id}": choice options must be non-empty strings.`);
|
|
66
|
+
const description = criteria[option];
|
|
67
|
+
if (description !== null && typeof description !== 'string')
|
|
68
|
+
invalid(`Question "${id}": option "${option}" must describe with a string or null.`);
|
|
69
|
+
}
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
case 'score': {
|
|
73
|
+
const criteria = value.criteria;
|
|
74
|
+
if (!Array.isArray(criteria) || criteria.length < 2)
|
|
75
|
+
invalid(`Question "${id}": score criteria must be an ordered array of at least two level descriptions.`);
|
|
76
|
+
if (criteria.length > MAX_OPTIONS)
|
|
77
|
+
invalid(`Question "${id}": score allows at most ${MAX_OPTIONS} levels.`);
|
|
78
|
+
for (const level of criteria)
|
|
79
|
+
if (typeof level !== 'string' || !level.trim())
|
|
80
|
+
invalid(`Question "${id}": every score level must be a non-empty string.`);
|
|
81
|
+
return value;
|
|
82
|
+
}
|
|
83
|
+
default:
|
|
84
|
+
invalid(`Question "${id}" has unknown type ${JSON.stringify(value.type)}; expected noul, choice or score.`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Reject malformed input before any network call; returns a typed copy. */
|
|
88
|
+
export function validateRequest(input) {
|
|
89
|
+
if (!isRecord(input))
|
|
90
|
+
invalid('Request must be an object with "state" and "questions".');
|
|
91
|
+
if (input.state === undefined || input.state === null)
|
|
92
|
+
invalid('Request "state" is required.');
|
|
93
|
+
if (typeof input.state === 'string' && !input.state.trim())
|
|
94
|
+
invalid('Request "state" must not be empty.');
|
|
95
|
+
if (!isRecord(input.questions))
|
|
96
|
+
invalid('Request "questions" must be a map of question id to question.');
|
|
97
|
+
const ids = Object.keys(input.questions);
|
|
98
|
+
if (!ids.length)
|
|
99
|
+
invalid('Request needs at least one question.');
|
|
100
|
+
if (ids.length > MAX_QUESTIONS)
|
|
101
|
+
invalid(`Request allows at most ${MAX_QUESTIONS} questions.`);
|
|
102
|
+
const questions = {};
|
|
103
|
+
for (const id of ids) {
|
|
104
|
+
if (!ID_PATTERN.test(id))
|
|
105
|
+
invalid(`Question id ${JSON.stringify(id)} must match ${ID_PATTERN}.`);
|
|
106
|
+
questions[id] = validateQuestion(id, input.questions[id]);
|
|
107
|
+
}
|
|
108
|
+
return { state: input.state, questions };
|
|
109
|
+
}
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// Prompted engine
|
|
112
|
+
/** The keys the model must assign probability to, in order. */
|
|
113
|
+
function outcomeKeys(question) {
|
|
114
|
+
if (question.type === 'noul')
|
|
115
|
+
return ['yes', 'no'];
|
|
116
|
+
if (question.type === 'choice')
|
|
117
|
+
return Object.keys(question.criteria);
|
|
118
|
+
return question.criteria.map((_, index) => String(index));
|
|
119
|
+
}
|
|
120
|
+
/** Question ids are replaced by positional ids so they never reach the model. */
|
|
121
|
+
function positionalQuestions(questions) {
|
|
122
|
+
const ids = Object.keys(questions), prompt = {};
|
|
123
|
+
ids.forEach((id, index) => {
|
|
124
|
+
const question = questions[id];
|
|
125
|
+
const entry = { type: question.type, instructions: question.instructions };
|
|
126
|
+
if (question.type === 'noul') {
|
|
127
|
+
entry.outcomes = { yes: question.criteria?.true ?? 'The answer is yes', no: question.criteria?.false ?? 'The answer is no' };
|
|
128
|
+
}
|
|
129
|
+
else if (question.type === 'choice') {
|
|
130
|
+
entry.outcomes = Object.fromEntries(Object.entries(question.criteria).map(([option, description]) => [option, description ?? option]));
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
entry.outcomes = Object.fromEntries(question.criteria.map((level, i) => [String(i), level]));
|
|
134
|
+
entry.note = 'Outcomes are ordered levels from lowest to highest.';
|
|
135
|
+
}
|
|
136
|
+
prompt[`q${index + 1}`] = entry;
|
|
137
|
+
});
|
|
138
|
+
return { ids, prompt };
|
|
139
|
+
}
|
|
140
|
+
const SYSTEM_PROMPT = `You are a calibrated judgment engine. You do not converse, explain or reason aloud.
|
|
141
|
+
You receive STATE (text or JSON) and QUESTIONS. For each question, assign a probability to every listed outcome key, reflecting how likely that outcome is the correct judgment given only the STATE. Probabilities for one question must sum to 1. Use the full range: near-certain judgments get near 0 or 1, genuinely ambiguous ones spread probability.
|
|
142
|
+
Reply with exactly one JSON object and nothing else: {"q1": {"<outcome>": <probability>, ...}, "q2": {...}}. Include every question id and every outcome key. No prose, no code fences.`;
|
|
143
|
+
export function buildMessages(request) {
|
|
144
|
+
const { ids, prompt } = positionalQuestions(request.questions);
|
|
145
|
+
const state = typeof request.state === 'string' ? request.state : JSON.stringify(request.state, null, 2);
|
|
146
|
+
const user = `STATE:\n${state}\n\nQUESTIONS:\n${JSON.stringify(prompt, null, 2)}`;
|
|
147
|
+
return { messages: [{ role: 'system', content: SYSTEM_PROMPT }, { role: 'user', content: user }], ids };
|
|
148
|
+
}
|
|
149
|
+
/** Grammar schema for backends that constrain output (Ollama `format`); others ignore it. */
|
|
150
|
+
export function buildOutputSchema(request) {
|
|
151
|
+
const properties = {};
|
|
152
|
+
Object.values(request.questions).forEach((question, index) => {
|
|
153
|
+
const keys = outcomeKeys(question);
|
|
154
|
+
properties[`q${index + 1}`] = {
|
|
155
|
+
type: 'object',
|
|
156
|
+
properties: Object.fromEntries(keys.map(key => [key, { type: 'number' }])),
|
|
157
|
+
required: keys,
|
|
158
|
+
additionalProperties: false,
|
|
159
|
+
};
|
|
160
|
+
});
|
|
161
|
+
return { type: 'object', properties, required: Object.keys(properties), additionalProperties: false };
|
|
162
|
+
}
|
|
163
|
+
/** Accept a bare object, or one wrapped in fences/prose; reject anything else. */
|
|
164
|
+
export function parseModelOutput(text) {
|
|
165
|
+
const start = text.indexOf('{'), end = text.lastIndexOf('}');
|
|
166
|
+
if (start < 0 || end <= start)
|
|
167
|
+
throw new JudgmentError('model-output', 'The model returned no JSON object.');
|
|
168
|
+
let parsed;
|
|
169
|
+
try {
|
|
170
|
+
parsed = JSON.parse(text.slice(start, end + 1));
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
throw new JudgmentError('model-output', 'The model returned malformed JSON.');
|
|
174
|
+
}
|
|
175
|
+
if (!isRecord(parsed))
|
|
176
|
+
throw new JudgmentError('model-output', 'The model returned JSON that is not an object.');
|
|
177
|
+
return parsed;
|
|
178
|
+
}
|
|
179
|
+
/** Clamp, fill missing outcomes with 0 and renormalize; all-zero is a model failure. */
|
|
180
|
+
export function normalizeDistribution(id, keys, raw) {
|
|
181
|
+
if (!isRecord(raw))
|
|
182
|
+
throw new JudgmentError('model-output', `No distribution returned for question "${id}".`);
|
|
183
|
+
const values = keys.map(key => {
|
|
184
|
+
const value = raw[key];
|
|
185
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : 0;
|
|
186
|
+
});
|
|
187
|
+
const total = values.reduce((sum, value) => sum + value, 0);
|
|
188
|
+
if (total <= 0)
|
|
189
|
+
throw new JudgmentError('model-output', `Question "${id}" received no usable probabilities.`);
|
|
190
|
+
return Object.fromEntries(keys.map((key, index) => [key, values[index] / total]));
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* How far the leading outcome sits above chance: (max - 1/n) / (1 - 1/n).
|
|
194
|
+
* 1 when one outcome holds all mass, 0 when the distribution is uniform. This
|
|
195
|
+
* tracks the confidence TypeSafe reports for the same distributions closely,
|
|
196
|
+
* though their exact statistic is unpublished.
|
|
197
|
+
*/
|
|
198
|
+
export function confidenceOf(probabilities) {
|
|
199
|
+
const values = Object.values(probabilities), n = values.length;
|
|
200
|
+
if (n < 2)
|
|
201
|
+
return 1;
|
|
202
|
+
const chance = 1 / n;
|
|
203
|
+
return round(Math.max(0, Math.min(1, (Math.max(...values) - chance) / (1 - chance))));
|
|
204
|
+
}
|
|
205
|
+
function round(value) { return Math.round(value * 1e4) / 1e4; }
|
|
206
|
+
function roundAll(probabilities) {
|
|
207
|
+
return Object.fromEntries(Object.entries(probabilities).map(([key, value]) => [key, round(value)]));
|
|
208
|
+
}
|
|
209
|
+
/** Derive the typed answer from a normalized distribution. */
|
|
210
|
+
export function toAnswer(question, probabilities) {
|
|
211
|
+
if (question.type === 'noul')
|
|
212
|
+
return { type: 'noul', noul: round(probabilities.yes ?? 0) };
|
|
213
|
+
const confidence = confidenceOf(probabilities);
|
|
214
|
+
if (question.type === 'choice') {
|
|
215
|
+
const choice = Object.entries(probabilities).reduce((best, entry) => (entry[1] > best[1] ? entry : best))[0];
|
|
216
|
+
return { type: 'choice', choice, probabilities: roundAll(probabilities), confidence };
|
|
217
|
+
}
|
|
218
|
+
const score = Object.entries(probabilities).reduce((sum, [level, p]) => sum + Number(level) * p, 0);
|
|
219
|
+
const legend = Object.fromEntries(question.criteria.map((level, index) => [String(index), level]));
|
|
220
|
+
return { type: 'score', score: round(score), legend, probabilities: roundAll(probabilities), confidence };
|
|
221
|
+
}
|
|
222
|
+
async function evaluatePrompted(request, provider, model, options) {
|
|
223
|
+
const { messages, ids } = buildMessages(request);
|
|
224
|
+
// Mirror chat()'s own resolution so the response names the backend that answered.
|
|
225
|
+
const actualProvider = selectProvider(provider), actualModel = model || DEFAULT_MODELS[actualProvider];
|
|
226
|
+
const chatOptions = {
|
|
227
|
+
signal: options.signal,
|
|
228
|
+
format: buildOutputSchema(request),
|
|
229
|
+
selectionMode: provider === 'auto' ? 'auto' : 'explicit',
|
|
230
|
+
maxOutputTokens: options.maxOutputTokens,
|
|
231
|
+
bounded: options.bounded,
|
|
232
|
+
attemptBudget: options.attemptBudget,
|
|
233
|
+
};
|
|
234
|
+
const response = await chat(provider, messages, [], model, undefined, undefined, chatOptions);
|
|
235
|
+
if (response.finishReason === 'error' || response.errorCode === 'refusal')
|
|
236
|
+
throw new JudgmentError('model-output', 'The model did not complete the judgment request.');
|
|
237
|
+
const parsed = parseModelOutput(response.content);
|
|
238
|
+
const answers = {};
|
|
239
|
+
ids.forEach((id, index) => {
|
|
240
|
+
const question = request.questions[id];
|
|
241
|
+
answers[id] = toAnswer(question, normalizeDistribution(id, outcomeKeys(question), parsed[`q${index + 1}`]));
|
|
242
|
+
});
|
|
243
|
+
return {
|
|
244
|
+
provider: actualProvider,
|
|
245
|
+
model: actualModel,
|
|
246
|
+
answers,
|
|
247
|
+
usage: { input_tokens: response.usage?.inputTokens ?? 0, output_tokens: response.usage?.outputTokens ?? 0 },
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
// ---------------------------------------------------------------------------
|
|
251
|
+
// Native TypeSafe engine
|
|
252
|
+
export function typesafeCredentials() {
|
|
253
|
+
const stored = config.getProviderCred('typesafe');
|
|
254
|
+
return {
|
|
255
|
+
apiKey: process.env.TYPESAFE_API_KEY || stored.apiKey,
|
|
256
|
+
baseUrl: (process.env.TYPESAFE_BASE_URL || stored.baseUrl || TYPESAFE_DEFAULT_BASE_URL).replace(/\/+$/, ''),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
function expectNumber(id, value, field) {
|
|
260
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
261
|
+
throw new JudgmentError('model-output', `TypeSafe answer "${id}" is missing numeric "${field}".`);
|
|
262
|
+
return value;
|
|
263
|
+
}
|
|
264
|
+
function expectDistribution(id, value) {
|
|
265
|
+
if (!isRecord(value))
|
|
266
|
+
throw new JudgmentError('model-output', `TypeSafe answer "${id}" is missing "probabilities".`);
|
|
267
|
+
return Object.fromEntries(Object.entries(value).map(([key, p]) => [key, expectNumber(id, p, `probabilities.${key}`)]));
|
|
268
|
+
}
|
|
269
|
+
/** Keep the native answer, validating shape against the question that asked for it. */
|
|
270
|
+
function nativeAnswer(id, question, raw) {
|
|
271
|
+
if (!isRecord(raw) || raw.type !== question.type)
|
|
272
|
+
throw new JudgmentError('model-output', `TypeSafe answer "${id}" does not match its ${question.type} question.`);
|
|
273
|
+
if (question.type === 'noul')
|
|
274
|
+
return { type: 'noul', noul: expectNumber(id, raw.noul, 'noul') };
|
|
275
|
+
if (question.type === 'choice') {
|
|
276
|
+
if (typeof raw.choice !== 'string' || !(raw.choice in question.criteria))
|
|
277
|
+
throw new JudgmentError('model-output', `TypeSafe answer "${id}" chose an option outside the criteria.`);
|
|
278
|
+
return { type: 'choice', choice: raw.choice, probabilities: expectDistribution(id, raw.probabilities), confidence: expectNumber(id, raw.confidence, 'confidence') };
|
|
279
|
+
}
|
|
280
|
+
const legend = isRecord(raw.legend) ? Object.fromEntries(Object.entries(raw.legend).map(([k, v]) => [k, String(v)])) : Object.fromEntries(question.criteria.map((level, i) => [String(i), level]));
|
|
281
|
+
return { type: 'score', score: expectNumber(id, raw.score, 'score'), legend, probabilities: expectDistribution(id, raw.probabilities), confidence: expectNumber(id, raw.confidence, 'confidence') };
|
|
282
|
+
}
|
|
283
|
+
const TYPESAFE_MAX_ATTEMPTS = 4;
|
|
284
|
+
const TYPESAFE_MAX_DELAY_MS = 30000;
|
|
285
|
+
/** Honor `retry-after` when present, else exponential backoff from 1s. */
|
|
286
|
+
function retryDelayMs(response, attempt) {
|
|
287
|
+
const header = Number(response.headers.get('retry-after'));
|
|
288
|
+
const delay = Number.isFinite(header) && header > 0 ? header * 1000 : 1000 * 2 ** (attempt - 1);
|
|
289
|
+
return Math.min(delay, TYPESAFE_MAX_DELAY_MS);
|
|
290
|
+
}
|
|
291
|
+
function sleep(ms, signal) {
|
|
292
|
+
return new Promise((resolve, reject) => {
|
|
293
|
+
const timer = setTimeout(() => { signal?.removeEventListener('abort', abort); resolve(); }, ms);
|
|
294
|
+
const abort = () => { clearTimeout(timer); reject(signal?.reason ?? new Error('Cancelled')); };
|
|
295
|
+
if (signal?.aborted)
|
|
296
|
+
abort();
|
|
297
|
+
else
|
|
298
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
async function evaluateTypesafe(request, model, options) {
|
|
302
|
+
const { apiKey, baseUrl } = typesafeCredentials();
|
|
303
|
+
if (!apiKey)
|
|
304
|
+
throw new JudgmentError('unavailable', 'TypeSafe needs TYPESAFE_API_KEY (or a stored typesafe credential).');
|
|
305
|
+
const doFetch = options.fetch ?? fetch;
|
|
306
|
+
const payload = JSON.stringify({ state: request.state, model, questions: request.questions });
|
|
307
|
+
let response;
|
|
308
|
+
// Rate limits (429) and overload (529) are documented as retry-with-backoff.
|
|
309
|
+
for (let attempt = 1;; attempt++) {
|
|
310
|
+
throwIfCancelled(options.signal);
|
|
311
|
+
try {
|
|
312
|
+
response = await doFetch(`${baseUrl}/systemone`, {
|
|
313
|
+
method: 'POST',
|
|
314
|
+
headers: { authorization: `Bearer ${apiKey}`, 'content-type': 'application/json' },
|
|
315
|
+
body: payload,
|
|
316
|
+
signal: options.signal,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
throwIfCancelled(options.signal);
|
|
321
|
+
throw new JudgmentError('unavailable', `TypeSafe request failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
322
|
+
}
|
|
323
|
+
if ((response.status !== 429 && response.status !== 529) || attempt >= TYPESAFE_MAX_ATTEMPTS)
|
|
324
|
+
break;
|
|
325
|
+
await sleep(retryDelayMs(response, attempt), options.signal);
|
|
326
|
+
}
|
|
327
|
+
if (!response.ok) {
|
|
328
|
+
const code = response.status === 422 ? 'invalid-request' : 'unavailable';
|
|
329
|
+
let detail = '';
|
|
330
|
+
try {
|
|
331
|
+
detail = (await response.text()).slice(0, 300);
|
|
332
|
+
}
|
|
333
|
+
catch { /* body is optional */ }
|
|
334
|
+
throw new JudgmentError(code, `TypeSafe returned HTTP ${response.status}${detail ? `: ${detail}` : ''}`);
|
|
335
|
+
}
|
|
336
|
+
let body;
|
|
337
|
+
try {
|
|
338
|
+
body = await response.json();
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
throw new JudgmentError('model-output', 'TypeSafe returned a non-JSON body.');
|
|
342
|
+
}
|
|
343
|
+
if (!isRecord(body) || !isRecord(body.answers))
|
|
344
|
+
throw new JudgmentError('model-output', 'TypeSafe response is missing "answers".');
|
|
345
|
+
const answers = {};
|
|
346
|
+
for (const [id, question] of Object.entries(request.questions))
|
|
347
|
+
answers[id] = nativeAnswer(id, question, body.answers[id]);
|
|
348
|
+
const usage = isRecord(body.usage) ? body.usage : {};
|
|
349
|
+
return {
|
|
350
|
+
provider: 'typesafe',
|
|
351
|
+
model: typeof body.model === 'string' ? body.model : model,
|
|
352
|
+
answers,
|
|
353
|
+
usage: { input_tokens: typeof usage.input_tokens === 'number' ? usage.input_tokens : 0, output_tokens: typeof usage.output_tokens === 'number' ? usage.output_tokens : 0 },
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
// ---------------------------------------------------------------------------
|
|
357
|
+
/** Evaluate every question in one request; answers come back under the caller's ids. */
|
|
358
|
+
export async function evaluate(input, options = {}) {
|
|
359
|
+
const request = validateRequest(input);
|
|
360
|
+
throwIfCancelled(options.signal);
|
|
361
|
+
const provider = options.provider ?? 'auto';
|
|
362
|
+
if (provider === 'typesafe') {
|
|
363
|
+
if (options.attemptBudget || options.bounded || options.maxOutputTokens !== undefined)
|
|
364
|
+
invalid('Bounded execution controls (maxOutputTokens, bounded, attemptBudget) have no effect on the typesafe engine, which never calls chat().');
|
|
365
|
+
return evaluateTypesafe(request, options.model ?? TYPESAFE_DEFAULT_MODEL, options);
|
|
366
|
+
}
|
|
367
|
+
return evaluatePrompted(request, provider, options.model, options);
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/judgment/evaluate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { evaluate, validateRequest, confidenceOf, TYPESAFE_DEFAULT_MODEL } from './evaluate.js';
|
|
2
|
+
export type { EvaluateOptions } from './evaluate.js';
|
|
3
|
+
export { runJudge, formatJudgment, JUDGE_USAGE } from './cli.js';
|
|
4
|
+
export { runJudgePolicy, validatePolicyRules, decidePolicy } from './policy.js';
|
|
5
|
+
export type { DenyRule, PolicyRules, PolicyVerdict } from './policy.js';
|
|
6
|
+
export { JudgmentError } from './types.js';
|
|
7
|
+
export type { Answer, ChoiceAnswer, ChoiceQuestion, Instructions, JudgmentEngine, JudgmentErrorCode, JudgmentRequest, JudgmentResponse, NoulAnswer, NoulQuestion, Question, ScoreAnswer, ScoreQuestion } from './types.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/judgment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAChG,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { evaluate, validateRequest, confidenceOf, TYPESAFE_DEFAULT_MODEL } from './evaluate.js';
|
|
2
|
+
export { runJudge, formatJudgment, JUDGE_USAGE } from './cli.js';
|
|
3
|
+
export { runJudgePolicy, validatePolicyRules, decidePolicy } from './policy.js';
|
|
4
|
+
export { JudgmentError } from './types.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/judgment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEhG,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|