modelrig 0.4.0 → 0.5.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 +129 -0
- package/README.md +13 -0
- package/dist/adapters/gemini.d.ts +39 -0
- package/dist/adapters/gemini.d.ts.map +1 -1
- package/dist/adapters/gemini.js +53 -2
- package/dist/artifacts/artifact.d.ts +3 -2
- package/dist/artifacts/artifact.d.ts.map +1 -1
- package/dist/artifacts/artifact.js +11 -4
- package/dist/artifacts/run-context.d.ts +21 -2
- package/dist/artifacts/run-context.d.ts.map +1 -1
- package/dist/artifacts/run-context.js +46 -1
- package/dist/bakeoff/replay.d.ts.map +1 -1
- package/dist/bakeoff/replay.js +17 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -1
- package/dist/index.d.ts +15 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -5
- package/dist/registry/select.d.ts +59 -0
- package/dist/registry/select.d.ts.map +1 -1
- package/dist/registry/select.js +66 -0
- package/dist/routes/loader-warnings.d.ts +28 -0
- package/dist/routes/loader-warnings.d.ts.map +1 -0
- package/dist/routes/loader-warnings.js +56 -0
- package/dist/routes/loader.d.ts +1 -11
- package/dist/routes/loader.d.ts.map +1 -1
- package/dist/routes/loader.js +44 -26
- package/dist/run/raw-defaults.d.ts +52 -0
- package/dist/run/raw-defaults.d.ts.map +1 -0
- package/dist/run/raw-defaults.js +123 -0
- package/dist/run/raw.d.ts +12 -0
- package/dist/run/raw.d.ts.map +1 -1
- package/dist/run/raw.js +90 -8
- package/dist/run/resolve.d.ts +17 -1
- package/dist/run/resolve.d.ts.map +1 -1
- package/dist/run/resolve.js +20 -4
- package/dist/run/routing-docs.js +1 -1
- package/dist/run/run.d.ts +7 -1
- package/dist/run/run.d.ts.map +1 -1
- package/dist/run/run.js +14 -33
- package/dist/run/variant.d.ts +43 -0
- package/dist/run/variant.d.ts.map +1 -0
- package/dist/run/variant.js +86 -0
- package/dist/savings/emit.d.ts +33 -0
- package/dist/savings/emit.d.ts.map +1 -1
- package/dist/savings/emit.js +75 -3
- package/dist/types/route.d.ts +31 -0
- package/dist/types/route.d.ts.map +1 -1
- package/dist/watch/evaluate.d.ts +27 -1
- package/dist/watch/evaluate.d.ts.map +1 -1
- package/dist/watch/evaluate.js +13 -0
- package/dist/watch/proposals.d.ts +28 -0
- package/dist/watch/proposals.d.ts.map +1 -1
- package/dist/watch/proposals.js +51 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposals.d.ts","sourceRoot":"","sources":["../../src/watch/proposals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"proposals.d.ts","sourceRoot":"","sources":["../../src/watch/proposals.ts"],"names":[],"mappings":"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"}
|
package/dist/watch/proposals.js
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.assertTransition = assertTransition;
|
|
16
16
|
exports.createProposalsClient = createProposalsClient;
|
|
17
|
+
const evaluate_1 = require("./evaluate");
|
|
17
18
|
const ALLOWED_TRANSITIONS = {
|
|
18
19
|
suggested: ["evidenced", "rejected", "expired"],
|
|
19
20
|
evidenced: ["approved", "rejected", "expired"],
|
|
@@ -193,5 +194,55 @@ function createProposalsClient(config) {
|
|
|
193
194
|
body: JSON.stringify({ status: "expired", updated_at: cutoff }),
|
|
194
195
|
});
|
|
195
196
|
},
|
|
197
|
+
async createManualChallenger(input) {
|
|
198
|
+
const trigger = {
|
|
199
|
+
type: "manual_challenger",
|
|
200
|
+
route: input.route,
|
|
201
|
+
challenger: { provider: input.challenger.provider, model: input.challenger.model },
|
|
202
|
+
variant: input.variant,
|
|
203
|
+
...(input.reason !== undefined ? { reason: input.reason } : {}),
|
|
204
|
+
...(input.requestedBy !== undefined ? { requestedBy: input.requestedBy } : {}),
|
|
205
|
+
};
|
|
206
|
+
const hash = (0, evaluate_1.manualChallengerTriggerHash)(input.route, input.challenger);
|
|
207
|
+
const expiresAt = new Date(Date.now() + evaluate_1.PROPOSAL_TTL_DAYS * 24 * 3600 * 1000).toISOString();
|
|
208
|
+
const row = {
|
|
209
|
+
...(config.orgId !== undefined ? { org_id: config.orgId } : {}),
|
|
210
|
+
route: input.route,
|
|
211
|
+
kind: "bakeoff",
|
|
212
|
+
trigger,
|
|
213
|
+
trigger_hash: hash,
|
|
214
|
+
status: "suggested",
|
|
215
|
+
expires_at: expiresAt,
|
|
216
|
+
...(input.createdByUserId != null ? { created_by: input.createdByUserId } : {}),
|
|
217
|
+
...(input.createdByKeyId != null ? { created_by_key: input.createdByKeyId } : {}),
|
|
218
|
+
};
|
|
219
|
+
// Idempotent insert on the tenant-first composite (00013). ignore-duplicates
|
|
220
|
+
// means a re-declare of the SAME challenger returns NOTHING — we then read
|
|
221
|
+
// back the existing row so the caller can 409 with its id (spec §3).
|
|
222
|
+
const response = await request(`proposals?on_conflict=${encodeURIComponent("org_id,route,trigger_hash")}`, {
|
|
223
|
+
method: "POST",
|
|
224
|
+
headers: { prefer: "resolution=ignore-duplicates,return=representation" },
|
|
225
|
+
body: JSON.stringify([row]),
|
|
226
|
+
});
|
|
227
|
+
const inserted = (await response.json().catch(() => []));
|
|
228
|
+
if (Array.isArray(inserted) && inserted.length > 0 && typeof inserted[0].id === "string") {
|
|
229
|
+
return { id: inserted[0].id, created: true };
|
|
230
|
+
}
|
|
231
|
+
const orgPredicate = config.orgId !== undefined ? `&org_id=eq.${encodeURIComponent(config.orgId)}` : "";
|
|
232
|
+
const existing = await request(`proposals?select=id,status&route=eq.${encodeURIComponent(input.route)}` +
|
|
233
|
+
`&trigger_hash=eq.${encodeURIComponent(hash)}${orgPredicate}&limit=1`, { method: "GET" });
|
|
234
|
+
const rows = (await existing.json().catch(() => []));
|
|
235
|
+
if (Array.isArray(rows) && rows.length > 0 && typeof rows[0].id === "string") {
|
|
236
|
+
// Return the existing row's STATUS too (spec §3, R3 review): a
|
|
237
|
+
// rejected/expired duplicate blocks re-declaring that model, and the
|
|
238
|
+
// caller's 409 should say WHY rather than look like a fresh conflict.
|
|
239
|
+
return {
|
|
240
|
+
id: rows[0].id,
|
|
241
|
+
created: false,
|
|
242
|
+
...(typeof rows[0].status === "string" ? { status: rows[0].status } : {}),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
throw new Error(`manual_challenger insert for "${input.route}" returned no row and no existing duplicate could be read`);
|
|
246
|
+
},
|
|
196
247
|
};
|
|
197
248
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "modelrig",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "ModelRig — capability-aware AI gateway: routes-as-code, provider adapters, typed failures, budget envelopes, and local-first telemetry.",
|
|
6
6
|
"license": "Apache-2.0",
|