modelrig 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 +94 -0
- package/README.md +41 -11
- package/data/PROVENANCE.md +19 -0
- package/data/pricing-manual.json +22 -0
- package/data/pricing-map.json +46362 -0
- package/data/pricing-overlay.json +419 -0
- package/dist/adapters/anthropic.d.ts +50 -6
- package/dist/adapters/anthropic.d.ts.map +1 -1
- package/dist/adapters/anthropic.js +123 -29
- package/dist/adapters/build-adapters.d.ts +11 -0
- package/dist/adapters/build-adapters.d.ts.map +1 -0
- package/dist/adapters/build-adapters.js +45 -0
- package/dist/adapters/deepseek.d.ts +6 -0
- package/dist/adapters/deepseek.d.ts.map +1 -1
- package/dist/adapters/deepseek.js +54 -1
- package/dist/adapters/gemini.d.ts.map +1 -1
- package/dist/adapters/gemini.js +46 -6
- package/dist/adapters/grok.d.ts +9 -0
- package/dist/adapters/grok.d.ts.map +1 -1
- package/dist/adapters/grok.js +67 -3
- package/dist/adapters/openai-compat.d.ts +6 -0
- package/dist/adapters/openai-compat.d.ts.map +1 -1
- package/dist/adapters/openai-compat.js +58 -1
- package/dist/adapters/openai-stream.d.ts +58 -0
- package/dist/adapters/openai-stream.d.ts.map +1 -0
- package/dist/adapters/openai-stream.js +120 -0
- package/dist/adapters/openai.d.ts +6 -0
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +60 -1
- package/dist/adapters/sampling.d.ts +28 -0
- package/dist/adapters/sampling.d.ts.map +1 -0
- package/dist/adapters/sampling.js +34 -0
- package/dist/adapters/tool-mapping.d.ts +92 -0
- package/dist/adapters/tool-mapping.d.ts.map +1 -0
- package/dist/adapters/tool-mapping.js +143 -0
- package/dist/artifacts/artifact.d.ts +137 -0
- package/dist/artifacts/artifact.d.ts.map +1 -0
- package/dist/artifacts/artifact.js +377 -0
- package/dist/artifacts/content-uploader.d.ts +87 -0
- package/dist/artifacts/content-uploader.d.ts.map +1 -0
- package/dist/artifacts/content-uploader.js +124 -0
- package/dist/artifacts/index.d.ts +63 -0
- package/dist/artifacts/index.d.ts.map +1 -0
- package/dist/artifacts/index.js +80 -0
- package/dist/artifacts/run-context.d.ts +129 -0
- package/dist/artifacts/run-context.d.ts.map +1 -0
- package/dist/artifacts/run-context.js +208 -0
- package/dist/artifacts/scrub.d.ts +60 -0
- package/dist/artifacts/scrub.d.ts.map +1 -0
- package/dist/artifacts/scrub.js +139 -0
- package/dist/artifacts/step.d.ts +26 -0
- package/dist/artifacts/step.d.ts.map +1 -0
- package/dist/artifacts/step.js +37 -0
- package/dist/artifacts/taint.d.ts +63 -0
- package/dist/artifacts/taint.d.ts.map +1 -0
- package/dist/artifacts/taint.js +76 -0
- package/dist/bakeoff/cache-sim.d.ts +99 -0
- package/dist/bakeoff/cache-sim.d.ts.map +1 -0
- package/dist/bakeoff/cache-sim.js +126 -0
- package/dist/bakeoff/eval-cases.d.ts +96 -0
- package/dist/bakeoff/eval-cases.d.ts.map +1 -0
- package/dist/bakeoff/eval-cases.js +105 -0
- package/dist/bakeoff/report.d.ts +41 -0
- package/dist/bakeoff/report.d.ts.map +1 -0
- package/dist/bakeoff/report.js +142 -0
- package/dist/bakeoff/samples.d.ts +15 -0
- package/dist/bakeoff/samples.d.ts.map +1 -1
- package/dist/bakeoff/samples.js +20 -0
- package/dist/cli.d.ts +1 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +134 -116
- package/dist/config.d.ts +100 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +104 -0
- package/dist/deprecations.d.ts +32 -0
- package/dist/deprecations.d.ts.map +1 -0
- package/dist/deprecations.js +59 -0
- package/dist/gateway/http-protocol.d.ts +175 -0
- package/dist/gateway/http-protocol.d.ts.map +1 -0
- package/dist/gateway/http-protocol.js +105 -0
- package/dist/index.d.ts +105 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +266 -138
- package/dist/init/finder.d.ts +15 -0
- package/dist/init/finder.d.ts.map +1 -1
- package/dist/init/finder.js +46 -0
- package/dist/init/init-cli.d.ts +10 -0
- package/dist/init/init-cli.d.ts.map +1 -0
- package/dist/init/init-cli.js +86 -0
- package/dist/init/observe-cli.d.ts +19 -0
- package/dist/init/observe-cli.d.ts.map +1 -0
- package/dist/init/observe-cli.js +73 -0
- package/dist/init/observe.d.ts +81 -0
- package/dist/init/observe.d.ts.map +1 -0
- package/dist/init/observe.js +245 -0
- package/dist/registry/build.d.ts +94 -1
- package/dist/registry/build.d.ts.map +1 -1
- package/dist/registry/build.js +125 -4
- package/dist/registry/cache-policy.d.ts +94 -0
- package/dist/registry/cache-policy.d.ts.map +1 -0
- package/dist/registry/cache-policy.js +238 -0
- package/dist/registry/call-notes.d.ts.map +1 -1
- package/dist/registry/call-notes.js +40 -2
- package/dist/registry/effective-rate.d.ts +151 -0
- package/dist/registry/effective-rate.d.ts.map +1 -0
- package/dist/registry/effective-rate.js +156 -0
- package/dist/registry/facts.d.ts.map +1 -1
- package/dist/registry/facts.js +16 -0
- package/dist/registry/parity.d.ts +26 -0
- package/dist/registry/parity.d.ts.map +1 -1
- package/dist/registry/parity.js +43 -2
- package/dist/registry/pricing-shape.d.ts +113 -0
- package/dist/registry/pricing-shape.d.ts.map +1 -0
- package/dist/registry/pricing-shape.js +123 -0
- package/dist/registry/pricing.d.ts +25 -1
- package/dist/registry/pricing.d.ts.map +1 -1
- package/dist/registry/pricing.js +64 -6
- package/dist/rigindex/bootstrap.d.ts +36 -0
- package/dist/rigindex/bootstrap.d.ts.map +1 -0
- package/dist/rigindex/bootstrap.js +97 -0
- package/dist/rigindex/fit.d.ts +24 -0
- package/dist/rigindex/fit.d.ts.map +1 -0
- package/dist/rigindex/fit.js +76 -0
- package/dist/rigindex/gates.d.ts +52 -0
- package/dist/rigindex/gates.d.ts.map +1 -0
- package/dist/rigindex/gates.js +109 -0
- package/dist/rigindex/graph.d.ts +31 -0
- package/dist/rigindex/graph.d.ts.map +1 -0
- package/dist/rigindex/graph.js +120 -0
- package/dist/rigindex/index.d.ts +23 -0
- package/dist/rigindex/index.d.ts.map +1 -0
- package/dist/rigindex/index.js +112 -0
- package/dist/rigindex/types.d.ts +76 -0
- package/dist/rigindex/types.d.ts.map +1 -0
- package/dist/rigindex/types.js +8 -0
- package/dist/routes/cache-lint.d.ts +41 -0
- package/dist/routes/cache-lint.d.ts.map +1 -0
- package/dist/routes/cache-lint.js +81 -0
- package/dist/routes/loader.d.ts +37 -0
- package/dist/routes/loader.d.ts.map +1 -1
- package/dist/routes/loader.js +138 -0
- package/dist/routes/resolved-bundle.d.ts +79 -0
- package/dist/routes/resolved-bundle.d.ts.map +1 -0
- package/dist/routes/resolved-bundle.js +148 -0
- package/dist/routes/sampling-config.d.ts +32 -0
- package/dist/routes/sampling-config.d.ts.map +1 -0
- package/dist/routes/sampling-config.js +91 -0
- package/dist/run/ajv.d.ts +22 -0
- package/dist/run/ajv.d.ts.map +1 -0
- package/dist/run/ajv.js +32 -0
- package/dist/run/cache-handle.d.ts +58 -0
- package/dist/run/cache-handle.d.ts.map +1 -0
- package/dist/run/cache-handle.js +54 -0
- package/dist/run/cache-stamp.d.ts +65 -0
- package/dist/run/cache-stamp.d.ts.map +1 -0
- package/dist/run/cache-stamp.js +0 -0
- package/dist/run/capture-write.d.ts +33 -0
- package/dist/run/capture-write.d.ts.map +1 -0
- package/dist/run/capture-write.js +55 -0
- package/dist/run/cost.d.ts.map +1 -1
- package/dist/run/cost.js +1 -1
- package/dist/run/dispatch.d.ts +99 -0
- package/dist/run/dispatch.d.ts.map +1 -0
- package/dist/run/dispatch.js +191 -0
- package/dist/run/raw.d.ts +88 -0
- package/dist/run/raw.d.ts.map +1 -0
- package/dist/run/raw.js +286 -0
- package/dist/run/record-attempt.d.ts +40 -0
- package/dist/run/record-attempt.d.ts.map +1 -0
- package/dist/run/record-attempt.js +99 -0
- package/dist/run/resolve.d.ts +75 -2
- package/dist/run/resolve.d.ts.map +1 -1
- package/dist/run/resolve.js +126 -4
- package/dist/run/run.d.ts +14 -0
- package/dist/run/run.d.ts.map +1 -1
- package/dist/run/run.js +0 -0
- package/dist/run/stream.d.ts +49 -0
- package/dist/run/stream.d.ts.map +1 -0
- package/dist/run/stream.js +87 -0
- package/dist/run/validate.d.ts.map +1 -1
- package/dist/run/validate.js +6 -7
- package/dist/savings/cache-ledger.d.ts +108 -0
- package/dist/savings/cache-ledger.d.ts.map +1 -0
- package/dist/savings/cache-ledger.js +174 -0
- package/dist/savings/cache-reconcile.d.ts +64 -0
- package/dist/savings/cache-reconcile.d.ts.map +1 -0
- package/dist/savings/cache-reconcile.js +59 -0
- package/dist/savings/cache-stats.d.ts +63 -0
- package/dist/savings/cache-stats.d.ts.map +1 -0
- package/dist/savings/cache-stats.js +108 -0
- package/dist/savings/emit.d.ts +13 -0
- package/dist/savings/emit.d.ts.map +1 -1
- package/dist/savings/emit.js +25 -0
- package/dist/savings/swap-execute.d.ts +14 -0
- package/dist/savings/swap-execute.d.ts.map +1 -1
- package/dist/savings/swap-execute.js +44 -1
- package/dist/savings/swaps-client.d.ts +14 -0
- package/dist/savings/swaps-client.d.ts.map +1 -1
- package/dist/savings/swaps-client.js +16 -2
- package/dist/settings/api-fetcher.d.ts +39 -0
- package/dist/settings/api-fetcher.d.ts.map +1 -0
- package/dist/settings/api-fetcher.js +92 -0
- package/dist/settings/index.d.ts +10 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +15 -0
- package/dist/settings/task-settings.d.ts +91 -0
- package/dist/settings/task-settings.d.ts.map +1 -0
- package/dist/settings/task-settings.js +116 -0
- package/dist/status.d.ts +77 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +113 -0
- package/dist/telemetry/artifact-store.d.ts +48 -0
- package/dist/telemetry/artifact-store.d.ts.map +1 -0
- package/dist/telemetry/artifact-store.js +189 -0
- package/dist/telemetry/cache-miss-streak.d.ts +79 -0
- package/dist/telemetry/cache-miss-streak.d.ts.map +1 -0
- package/dist/telemetry/cache-miss-streak.js +99 -0
- package/dist/telemetry/capture.d.ts +3 -0
- package/dist/telemetry/capture.d.ts.map +1 -1
- package/dist/telemetry/capture.js +15 -8
- package/dist/telemetry/exporter-setup.d.ts +28 -0
- package/dist/telemetry/exporter-setup.d.ts.map +1 -0
- package/dist/telemetry/exporter-setup.js +34 -0
- package/dist/telemetry/exporter.d.ts +75 -0
- package/dist/telemetry/exporter.d.ts.map +1 -1
- package/dist/telemetry/exporter.js +324 -47
- package/dist/telemetry/health.d.ts +76 -0
- package/dist/telemetry/health.d.ts.map +1 -0
- package/dist/telemetry/health.js +92 -0
- package/dist/telemetry/ingest-protocol.d.ts +152 -3
- package/dist/telemetry/ingest-protocol.d.ts.map +1 -1
- package/dist/telemetry/ingest-protocol.js +204 -4
- package/dist/telemetry/load-error-report.d.ts +24 -0
- package/dist/telemetry/load-error-report.d.ts.map +1 -0
- package/dist/telemetry/load-error-report.js +50 -0
- package/dist/telemetry/otel-map.d.ts +121 -0
- package/dist/telemetry/otel-map.d.ts.map +1 -0
- package/dist/telemetry/otel-map.js +224 -0
- package/dist/telemetry/otel-normalize.d.ts +104 -0
- package/dist/telemetry/otel-normalize.d.ts.map +1 -0
- package/dist/telemetry/otel-normalize.js +530 -0
- package/dist/telemetry/otlp-emitter.d.ts +52 -0
- package/dist/telemetry/otlp-emitter.d.ts.map +1 -0
- package/dist/telemetry/otlp-emitter.js +144 -0
- package/dist/telemetry/otlp-proto.d.ts +29 -0
- package/dist/telemetry/otlp-proto.d.ts.map +1 -0
- package/dist/telemetry/otlp-proto.js +266 -0
- package/dist/telemetry/sinks.d.ts +37 -1
- package/dist/telemetry/sinks.d.ts.map +1 -1
- package/dist/telemetry/sinks.js +121 -30
- package/dist/telemetry/store.d.ts +28 -1
- package/dist/telemetry/store.d.ts.map +1 -1
- package/dist/telemetry/store.js +218 -3
- package/dist/tenancy/api-key-format.d.ts +15 -5
- package/dist/tenancy/api-key-format.d.ts.map +1 -1
- package/dist/tenancy/api-key-format.js +24 -5
- package/dist/types/config-teaching.d.ts +62 -0
- package/dist/types/config-teaching.d.ts.map +1 -0
- package/dist/types/config-teaching.js +183 -0
- package/dist/types/provider.d.ts +122 -1
- package/dist/types/provider.d.ts.map +1 -1
- package/dist/types/provider.js +21 -1
- package/dist/types/route.d.ts +79 -1
- package/dist/types/route.d.ts.map +1 -1
- package/dist/types/telemetry.d.ts +117 -0
- package/dist/types/telemetry.d.ts.map +1 -1
- package/dist/validate-cli.d.ts +12 -0
- package/dist/validate-cli.d.ts.map +1 -0
- package/dist/validate-cli.js +57 -0
- package/dist/verify/capture.d.ts +66 -0
- package/dist/verify/capture.d.ts.map +1 -0
- package/dist/verify/capture.js +180 -0
- package/dist/verify/cli-run.d.ts +23 -0
- package/dist/verify/cli-run.d.ts.map +1 -0
- package/dist/verify/cli-run.js +57 -0
- package/dist/verify/diff.d.ts +48 -0
- package/dist/verify/diff.d.ts.map +1 -0
- package/dist/verify/diff.js +157 -0
- package/dist/verify/index.d.ts +17 -0
- package/dist/verify/index.d.ts.map +1 -0
- package/dist/verify/index.js +24 -0
- package/dist/verify/report.d.ts +14 -0
- package/dist/verify/report.d.ts.map +1 -0
- package/dist/verify/report.js +88 -0
- package/dist/verify/types.d.ts +101 -0
- package/dist/verify/types.d.ts.map +1 -0
- package/dist/verify/types.js +17 -0
- package/dist/verify/verify.d.ts +29 -0
- package/dist/verify/verify.d.ts.map +1 -0
- package/dist/verify/verify.js +148 -0
- package/dist/watch/evaluate.d.ts +162 -3
- package/dist/watch/evaluate.d.ts.map +1 -1
- package/dist/watch/evaluate.js +61 -0
- package/dist/watch/monitor.d.ts +116 -0
- package/dist/watch/monitor.d.ts.map +1 -0
- package/dist/watch/monitor.js +199 -0
- package/dist/watch/proposals.d.ts +20 -4
- package/dist/watch/proposals.d.ts.map +1 -1
- package/dist/watch/proposals.js +31 -3
- package/dist/watch/run.d.ts +33 -0
- package/dist/watch/run.d.ts.map +1 -1
- package/dist/watch/run.js +39 -0
- package/package.json +7 -1
- package/registry/LICENSE +20 -0
- package/registry/leaderboard.json +3639 -0
- package/registry/registry.json +7263 -0
- package/dist/telemetry/supabase-exporter.d.ts +0 -64
- package/dist/telemetry/supabase-exporter.d.ts.map +0 -1
- package/dist/telemetry/supabase-exporter.js +0 -211
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Async batch exporter: SQLite telemetry → ModelRig Supabase project.
|
|
3
|
-
* Spec §5 (cloud sink) + §6 criteria 8–9. Fire-and-forget from the run loop:
|
|
4
|
-
* the inference path NEVER blocks on, or fails because of, this sink.
|
|
5
|
-
* At-least-once delivery with idempotent ids; unexported rows queue locally in
|
|
6
|
-
* SQLite (the inferences table itself, behind a rowid watermark) and flush on
|
|
7
|
-
* recovery; watermark bookkeeping per source instance.
|
|
8
|
-
*
|
|
9
|
-
* Transport is raw PostgREST over fetch (dependency-light, service-role key).
|
|
10
|
-
*/
|
|
11
|
-
import type { RigManifest } from "../routes/manifest";
|
|
12
|
-
import type { ServeabilityWarning } from "../routes/serveability";
|
|
13
|
-
import type { ExportableTelemetryStore } from "./store";
|
|
14
|
-
export interface ExportedRouteMirror {
|
|
15
|
-
readonly route: string;
|
|
16
|
-
readonly version: number;
|
|
17
|
-
readonly candidates: ReadonlyArray<{
|
|
18
|
-
readonly provider: string;
|
|
19
|
-
readonly model: string;
|
|
20
|
-
}>;
|
|
21
|
-
/** Capture opt-in FLAG (Phase 3 WS4) — status only; capture content never
|
|
22
|
-
* has a cloud surface. */
|
|
23
|
-
readonly capture?: boolean;
|
|
24
|
-
}
|
|
25
|
-
export interface ExporterConfig {
|
|
26
|
-
readonly supabaseUrl: string;
|
|
27
|
-
/** Service-role key — server-side only; never reaches the console. */
|
|
28
|
-
readonly serviceRoleKey: string;
|
|
29
|
-
readonly sourceId: string;
|
|
30
|
-
/**
|
|
31
|
-
* Tenant for every row this exporter writes (Phase 6 WS1). Defaults to the
|
|
32
|
-
* house org, which is the right answer for a self-hosted control plane —
|
|
33
|
-
* there is exactly one org there and everything belongs to it.
|
|
34
|
-
*
|
|
35
|
-
* This is DIRECT mode only. In api mode the server resolves org and project
|
|
36
|
-
* from the `rig_sk_` key and stamps them itself: a client that could choose
|
|
37
|
-
* its own tenant would not be a tenant boundary (T3).
|
|
38
|
-
*/
|
|
39
|
-
readonly orgId?: string;
|
|
40
|
-
/** Finer scope inside the org. Null is legitimate — not every rig has one. */
|
|
41
|
-
readonly projectId?: string | null;
|
|
42
|
-
readonly batchSize?: number;
|
|
43
|
-
readonly intervalMs?: number;
|
|
44
|
-
/** Loaded route bundles, mirrored to the `routes` table for the console. */
|
|
45
|
-
readonly routes?: readonly ExportedRouteMirror[];
|
|
46
|
-
/** Rig manifest, mirrored to the `rig_manifests` table for the console
|
|
47
|
-
* (dimension NAMES only — tag values never leave the telemetry rows). */
|
|
48
|
-
readonly manifest?: RigManifest | null;
|
|
49
|
-
/** Inert-candidate warnings for THIS deployment (F1) — mirrored onto the
|
|
50
|
-
* manifest row so console /setup can say "2 candidates inert here, set
|
|
51
|
-
* XAI_API_KEY" instead of the fact living only in a boot log. Names only:
|
|
52
|
-
* route, provider, model, env var. */
|
|
53
|
-
readonly serveability?: readonly ServeabilityWarning[];
|
|
54
|
-
/** Injectable for tests; defaults to global fetch. */
|
|
55
|
-
readonly fetchFn?: typeof fetch;
|
|
56
|
-
}
|
|
57
|
-
export interface Exporter {
|
|
58
|
-
start(): void;
|
|
59
|
-
/** Flush pending rows now (used by tests and process-exit hooks). */
|
|
60
|
-
flush(): Promise<void>;
|
|
61
|
-
stop(): Promise<void>;
|
|
62
|
-
}
|
|
63
|
-
export declare function createSupabaseExporter(store: ExportableTelemetryStore, config: ExporterConfig): Exporter;
|
|
64
|
-
//# sourceMappingURL=supabase-exporter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-exporter.d.ts","sourceRoot":"","sources":["../../src/telemetry/supabase-exporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAIlE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1F;8BAC0B;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACjD;6EACyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACvC;;;0CAGsC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACvD,sDAAsD;IACtD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,IAAI,IAAI,CAAC;IACd,qEAAqE;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAiFD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,wBAAwB,EAC/B,MAAM,EAAE,cAAc,GACrB,QAAQ,CA4KV"}
|
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Async batch exporter: SQLite telemetry → ModelRig Supabase project.
|
|
4
|
-
* Spec §5 (cloud sink) + §6 criteria 8–9. Fire-and-forget from the run loop:
|
|
5
|
-
* the inference path NEVER blocks on, or fails because of, this sink.
|
|
6
|
-
* At-least-once delivery with idempotent ids; unexported rows queue locally in
|
|
7
|
-
* SQLite (the inferences table itself, behind a rowid watermark) and flush on
|
|
8
|
-
* recovery; watermark bookkeeping per source instance.
|
|
9
|
-
*
|
|
10
|
-
* Transport is raw PostgREST over fetch (dependency-light, service-role key).
|
|
11
|
-
*/
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.createSupabaseExporter = createSupabaseExporter;
|
|
14
|
-
const constants_1 = require("../tenancy/constants");
|
|
15
|
-
const DEFAULT_BATCH_SIZE = 200;
|
|
16
|
-
const DEFAULT_INTERVAL_MS = 10000;
|
|
17
|
-
/** After a sink failure, skip this many intervals, doubling per consecutive
|
|
18
|
-
* failure (simple exponential backoff, capped). */
|
|
19
|
-
const BACKOFF_MAX_SKIPS = 32;
|
|
20
|
-
function toRemote(row, tenancy) {
|
|
21
|
-
return {
|
|
22
|
-
...tenancy,
|
|
23
|
-
id: row.id,
|
|
24
|
-
ts: row.ts,
|
|
25
|
-
route: row.route,
|
|
26
|
-
route_version: row.routeVersion,
|
|
27
|
-
provider: row.provider,
|
|
28
|
-
model: row.model,
|
|
29
|
-
requested_tier: row.requestedTier,
|
|
30
|
-
served_tier: row.servedTier,
|
|
31
|
-
tokens_in: row.tokensIn,
|
|
32
|
-
tokens_out: row.tokensOut,
|
|
33
|
-
tokens_cached: row.tokensCached,
|
|
34
|
-
cost_estimate_usd: row.costEstimateUsd,
|
|
35
|
-
latency_ms: row.latencyMs,
|
|
36
|
-
ttfb_ms: row.ttfbMs,
|
|
37
|
-
failure_class: row.failureClass,
|
|
38
|
-
attempts: JSON.parse(row.attemptsJson),
|
|
39
|
-
tags: JSON.parse(row.tagsJson),
|
|
40
|
-
fingerprint_cell: row.fingerprintCell,
|
|
41
|
-
served_variant: row.servedVariant,
|
|
42
|
-
repaired_by: row.repairedBy,
|
|
43
|
-
pricing_missing: row.pricingMissing,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
function feedbackToRemote(row, tenancy) {
|
|
47
|
-
return {
|
|
48
|
-
org_id: tenancy.org_id,
|
|
49
|
-
project_id: tenancy.project_id,
|
|
50
|
-
id: row.id,
|
|
51
|
-
ts: row.ts,
|
|
52
|
-
inference_id: row.inferenceId,
|
|
53
|
-
episode_key: row.episodeKey,
|
|
54
|
-
verdict: row.verdict,
|
|
55
|
-
score: row.score,
|
|
56
|
-
note: row.note,
|
|
57
|
-
source: row.source,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function createSupabaseExporter(store, config) {
|
|
61
|
-
const batchSize = config.batchSize ?? DEFAULT_BATCH_SIZE;
|
|
62
|
-
const intervalMs = config.intervalMs ?? DEFAULT_INTERVAL_MS;
|
|
63
|
-
const fetchFn = config.fetchFn ?? fetch;
|
|
64
|
-
const base = config.supabaseUrl.replace(/\/$/, "");
|
|
65
|
-
const tenancy = {
|
|
66
|
-
org_id: config.orgId ?? constants_1.HOUSE_ORG_ID,
|
|
67
|
-
project_id: config.projectId ?? null,
|
|
68
|
-
source_id: config.sourceId,
|
|
69
|
-
};
|
|
70
|
-
let timer = null;
|
|
71
|
-
let flushing = false;
|
|
72
|
-
let skipsRemaining = 0;
|
|
73
|
-
let consecutiveFailures = 0;
|
|
74
|
-
let routesMirrored = false;
|
|
75
|
-
let manifestMirrored = false;
|
|
76
|
-
async function post(table, body, upsert) {
|
|
77
|
-
const response = await fetchFn(`${base}/rest/v1/${table}`, {
|
|
78
|
-
method: "POST",
|
|
79
|
-
headers: {
|
|
80
|
-
"content-type": "application/json",
|
|
81
|
-
apikey: config.serviceRoleKey,
|
|
82
|
-
authorization: `Bearer ${config.serviceRoleKey}`,
|
|
83
|
-
prefer: upsert
|
|
84
|
-
? "resolution=merge-duplicates,return=minimal"
|
|
85
|
-
: "resolution=ignore-duplicates,return=minimal",
|
|
86
|
-
},
|
|
87
|
-
body: JSON.stringify(body),
|
|
88
|
-
});
|
|
89
|
-
if (!response.ok) {
|
|
90
|
-
throw new Error(`sink POST ${table} → ${response.status} ${await response.text().catch(() => "")}`);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
async function flushOnce() {
|
|
94
|
-
// Routes mirror first (idempotent upsert; retried until it succeeds once).
|
|
95
|
-
if (!routesMirrored && config.routes !== undefined && config.routes.length > 0) {
|
|
96
|
-
await post("routes", config.routes.map((r) => ({
|
|
97
|
-
org_id: tenancy.org_id,
|
|
98
|
-
route: r.route,
|
|
99
|
-
version: r.version,
|
|
100
|
-
candidates: r.candidates,
|
|
101
|
-
capture: r.capture ?? false,
|
|
102
|
-
updated_at: new Date().toISOString(),
|
|
103
|
-
})), true);
|
|
104
|
-
routesMirrored = true;
|
|
105
|
-
}
|
|
106
|
-
// Manifest mirror (idempotent upsert, once per process — like routes).
|
|
107
|
-
if (!manifestMirrored && config.manifest !== undefined && config.manifest !== null) {
|
|
108
|
-
await post("rig_manifests", [
|
|
109
|
-
{
|
|
110
|
-
org_id: tenancy.org_id,
|
|
111
|
-
source_id: config.sourceId,
|
|
112
|
-
name: config.manifest.name,
|
|
113
|
-
dimensions: config.manifest.dimensions,
|
|
114
|
-
contribution: config.manifest.contribution,
|
|
115
|
-
// F1: names only — route, provider/model, and the env var to set.
|
|
116
|
-
serveability: (config.serveability ?? []).map((w) => ({
|
|
117
|
-
route: w.route,
|
|
118
|
-
inert: w.inert.map((c) => ({ provider: c.provider, model: c.model })),
|
|
119
|
-
serveable_count: w.serveableCount,
|
|
120
|
-
fix_hint: w.fixHint,
|
|
121
|
-
})),
|
|
122
|
-
updated_at: new Date().toISOString(),
|
|
123
|
-
},
|
|
124
|
-
], true);
|
|
125
|
-
manifestMirrored = true;
|
|
126
|
-
}
|
|
127
|
-
// Inferences past the watermark, in batches. Watermark advances ONLY
|
|
128
|
-
// after a confirmed write (at-least-once; remote id conflicts ignored).
|
|
129
|
-
for (;;) {
|
|
130
|
-
const watermark = store.getExportWatermark(config.sourceId);
|
|
131
|
-
const pending = store.readInferencesAfter(watermark, batchSize);
|
|
132
|
-
if (pending.length === 0)
|
|
133
|
-
break;
|
|
134
|
-
await post("inferences", pending.map(({ row }) => toRemote(row, tenancy)), false);
|
|
135
|
-
store.setExportWatermark(config.sourceId, pending[pending.length - 1].rowid);
|
|
136
|
-
await post("export_watermarks", [{ org_id: tenancy.org_id, source_id: config.sourceId, last_exported_ts: new Date().toISOString() }], true);
|
|
137
|
-
if (pending.length < batchSize)
|
|
138
|
-
break;
|
|
139
|
-
}
|
|
140
|
-
// Feedback mirror (Phase 4 WS2): same at-least-once watermark dance as
|
|
141
|
-
// inferences, behind its own export_state key so the two streams never
|
|
142
|
-
// block each other.
|
|
143
|
-
const feedbackSource = `${config.sourceId}:feedback`;
|
|
144
|
-
for (;;) {
|
|
145
|
-
const watermark = store.getExportWatermark(feedbackSource);
|
|
146
|
-
const pending = store.readFeedbackAfter(watermark, batchSize);
|
|
147
|
-
if (pending.length === 0)
|
|
148
|
-
break;
|
|
149
|
-
await post("feedback", pending.map(({ row }) => feedbackToRemote(row, tenancy)), false);
|
|
150
|
-
store.setExportWatermark(feedbackSource, pending[pending.length - 1].rowid);
|
|
151
|
-
if (pending.length < batchSize)
|
|
152
|
-
break;
|
|
153
|
-
}
|
|
154
|
-
// Envelopes: small table, full upsert each flush.
|
|
155
|
-
const envelopes = store.listEnvelopes();
|
|
156
|
-
if (envelopes.length > 0) {
|
|
157
|
-
await post("envelopes", envelopes.map((e) => ({
|
|
158
|
-
org_id: tenancy.org_id,
|
|
159
|
-
envelope_key: e.envelopeKey,
|
|
160
|
-
budget_usd: e.budgetUsd,
|
|
161
|
-
spent_usd: e.spentUsd,
|
|
162
|
-
status: e.status,
|
|
163
|
-
exported_at: new Date().toISOString(),
|
|
164
|
-
})), true);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
async function guardedFlush() {
|
|
168
|
-
if (flushing)
|
|
169
|
-
return;
|
|
170
|
-
flushing = true;
|
|
171
|
-
try {
|
|
172
|
-
await flushOnce();
|
|
173
|
-
consecutiveFailures = 0;
|
|
174
|
-
}
|
|
175
|
-
catch (err) {
|
|
176
|
-
// Swallow-and-log, ALWAYS — sink failures must never reach the run loop.
|
|
177
|
-
consecutiveFailures += 1;
|
|
178
|
-
skipsRemaining = Math.min(2 ** consecutiveFailures, BACKOFF_MAX_SKIPS);
|
|
179
|
-
console.warn(`[modelrig exporter] sink flush failed (attempt ${consecutiveFailures}, backing off ` +
|
|
180
|
-
`${skipsRemaining} intervals): ${err instanceof Error ? err.message : String(err)}`);
|
|
181
|
-
}
|
|
182
|
-
finally {
|
|
183
|
-
flushing = false;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
return {
|
|
187
|
-
start() {
|
|
188
|
-
if (timer !== null)
|
|
189
|
-
return;
|
|
190
|
-
timer = setInterval(() => {
|
|
191
|
-
if (skipsRemaining > 0) {
|
|
192
|
-
skipsRemaining -= 1;
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
void guardedFlush();
|
|
196
|
-
}, intervalMs);
|
|
197
|
-
// Never keep the process alive for telemetry export.
|
|
198
|
-
timer.unref?.();
|
|
199
|
-
},
|
|
200
|
-
async flush() {
|
|
201
|
-
await guardedFlush();
|
|
202
|
-
},
|
|
203
|
-
async stop() {
|
|
204
|
-
if (timer !== null) {
|
|
205
|
-
clearInterval(timer);
|
|
206
|
-
timer = null;
|
|
207
|
-
}
|
|
208
|
-
await guardedFlush();
|
|
209
|
-
},
|
|
210
|
-
};
|
|
211
|
-
}
|