niceeval 0.16.3-canary.99 → 0.17.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/dist/cli/bootstrap.cjs +7 -1
- package/dist/cli/bootstrap.cjs.map +1 -1
- package/dist/cli/project-configuration.cjs +8 -11
- package/dist/cli/project-configuration.cjs.map +1 -1
- package/dist/expect/index.cjs.map +1 -1
- package/dist/expect/index.d.cts +1 -0
- package/dist/expect/index.d.mts +1 -0
- package/dist/expect/index.d.ts +1 -0
- package/dist/experiment/host/cli/contribution.cjs +6 -11
- package/dist/experiment/host/cli/contribution.cjs.map +1 -1
- package/dist/experiment/host/cli/contribution.d.cts +0 -16
- package/dist/experiment/host/cli/contribution.d.mts +0 -16
- package/dist/experiment/host/cli/contribution.d.ts +0 -16
- package/dist/experiment/host/operations.cjs +3 -3
- package/dist/experiment/host/operations.cjs.map +1 -1
- package/dist/experiment/host/types.cjs.map +1 -1
- package/dist/experiment/host/types.d.cts +0 -4
- package/dist/experiment/host/types.d.mts +0 -4
- package/dist/experiment/host/types.d.ts +0 -4
- package/dist/fresh-import.cjs +2 -2
- package/dist/fresh-import.cjs.map +1 -1
- package/dist/fresh-import.d.cts +3 -3
- package/dist/fresh-import.d.mts +3 -3
- package/dist/fresh-import.d.ts +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/inspection/codec.cjs.map +1 -1
- package/dist/inspection/codec.d.cts +1 -1
- package/dist/inspection/codec.d.mts +1 -1
- package/dist/inspection/codec.d.ts +1 -1
- package/dist/inspection/facts.cjs +66 -9
- package/dist/inspection/facts.cjs.map +1 -1
- package/dist/inspection/facts.d.cts +4 -0
- package/dist/inspection/facts.d.mts +4 -0
- package/dist/inspection/facts.d.ts +4 -0
- package/dist/inspection/facts.js +4 -2
- package/dist/inspection/index.cjs +1 -3
- package/dist/inspection/index.cjs.map +1 -1
- package/dist/inspection/index.d.cts +1 -1
- package/dist/inspection/index.d.mts +1 -1
- package/dist/inspection/index.d.ts +1 -1
- package/dist/inspection/index.js +44 -48
- package/dist/inspection/limits.cjs +3 -1
- package/dist/inspection/limits.cjs.map +1 -1
- package/dist/inspection/limits.d.cts +2 -0
- package/dist/inspection/limits.d.mts +2 -0
- package/dist/inspection/limits.d.ts +2 -0
- package/dist/inspection/limits.js +6 -4
- package/dist/inspection/project-source.cjs +4 -1
- package/dist/inspection/project-source.cjs.map +1 -1
- package/dist/inspection/protocol.cjs +10 -18
- package/dist/inspection/protocol.cjs.map +1 -1
- package/dist/inspection/protocol.d.cts +111 -173
- package/dist/inspection/protocol.d.mts +111 -173
- package/dist/inspection/protocol.d.ts +111 -173
- package/dist/inspection/public.mjs +73 -109
- package/dist/inspection/results.cjs +12 -48
- package/dist/inspection/results.cjs.map +1 -1
- package/dist/inspection/results.d.cts +124 -122
- package/dist/inspection/results.d.mts +124 -122
- package/dist/inspection/results.d.ts +124 -122
- package/dist/inspection/results.js +16 -20
- package/dist/inspection/select.cjs +80 -117
- package/dist/inspection/select.cjs.map +1 -1
- package/dist/inspection/source.cjs +14 -15
- package/dist/inspection/source.cjs.map +1 -1
- package/dist/inspection/source.d.cts +6 -3
- package/dist/inspection/source.d.mts +6 -3
- package/dist/inspection/source.d.ts +6 -3
- package/dist/inspection/trace.cjs +1 -1
- package/dist/inspection/trace.cjs.map +1 -1
- package/dist/load-config.cjs +17 -11
- package/dist/load-config.cjs.map +1 -1
- package/dist/load-config.d.cts +3 -2
- package/dist/load-config.d.mts +3 -2
- package/dist/load-config.d.ts +3 -2
- package/dist/o11y/adapter-usage-projection.cjs +5 -1
- package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
- package/dist/o11y/adapter-usage-projection.d.cts +109 -1
- package/dist/o11y/adapter-usage-projection.d.mts +109 -1
- package/dist/o11y/adapter-usage-projection.d.ts +109 -1
- package/dist/o11y/cache-read.cjs +113 -0
- package/dist/o11y/cache-read.cjs.map +1 -0
- package/dist/o11y/cache-read.d.cts +80 -0
- package/dist/o11y/cache-read.d.mts +80 -0
- package/dist/o11y/cache-read.d.ts +80 -0
- package/dist/o11y/cache-read.js +8 -0
- package/dist/o11y/cache-read.js.map +1 -0
- package/dist/o11y/eval-usage.cjs +4 -1
- package/dist/o11y/eval-usage.cjs.map +1 -1
- package/dist/o11y/eval-usage.d.cts +4 -1
- package/dist/o11y/eval-usage.d.mts +4 -1
- package/dist/o11y/eval-usage.d.ts +4 -1
- package/dist/record/host/sqlite-host.cjs +188 -53
- package/dist/record/host/sqlite-host.cjs.map +1 -1
- package/dist/record/host/sqlite-host.d.cts +37 -1
- package/dist/record/host/sqlite-host.d.mts +37 -1
- package/dist/record/host/sqlite-host.d.ts +37 -1
- package/dist/record/host/sqlite-host.js +16 -8
- package/dist/record/maintenance/runtime.cjs +3 -3
- package/dist/record/maintenance/runtime.cjs.map +1 -1
- package/dist/record/sqlite/admission-repository.cjs +18 -18
- package/dist/record/sqlite/admission-repository.cjs.map +1 -1
- package/dist/record/sqlite/case-repository.cjs +6 -6
- package/dist/record/sqlite/case-repository.cjs.map +1 -1
- package/dist/record/sqlite/coordination-repository.cjs +25 -25
- package/dist/record/sqlite/coordination-repository.cjs.map +1 -1
- package/dist/record/sqlite/current-schema.cjs +115 -111
- package/dist/record/sqlite/current-schema.cjs.map +1 -1
- package/dist/record/sqlite/current-schema.d.cts +3 -3
- package/dist/record/sqlite/current-schema.d.mts +3 -3
- package/dist/record/sqlite/current-schema.d.ts +3 -3
- package/dist/record/sqlite/database.cjs +56 -53
- package/dist/record/sqlite/database.cjs.map +1 -1
- package/dist/record/sqlite/index.cjs +3 -1
- package/dist/record/sqlite/index.cjs.map +1 -1
- package/dist/record/sqlite/index.d.cts +5 -2
- package/dist/record/sqlite/index.d.mts +5 -2
- package/dist/record/sqlite/index.d.ts +5 -2
- package/dist/record/sqlite/legacy-schema-018.cjs +443 -0
- package/dist/record/sqlite/legacy-schema-018.cjs.map +1 -0
- package/dist/record/sqlite/legacy-schema-018.d.cts +6 -0
- package/dist/record/sqlite/legacy-schema-018.d.mts +6 -0
- package/dist/record/sqlite/legacy-schema-018.d.ts +6 -0
- package/dist/record/sqlite/legacy-schema-018.js +6 -0
- package/dist/record/sqlite/legacy-schema-018.js.map +1 -0
- package/dist/record/sqlite/migration.cjs +105 -46
- package/dist/record/sqlite/migration.cjs.map +1 -1
- package/dist/record/sqlite/migration.d.cts +2 -1
- package/dist/record/sqlite/migration.d.mts +2 -1
- package/dist/record/sqlite/migration.d.ts +2 -1
- package/dist/record/sqlite/portable-capture.cjs +13 -13
- package/dist/record/sqlite/portable-capture.cjs.map +1 -1
- package/dist/record/sqlite/registry-repository.cjs +22 -22
- package/dist/record/sqlite/registry-repository.cjs.map +1 -1
- package/dist/record/sqlite/schema.cjs +10 -2
- package/dist/record/sqlite/schema.cjs.map +1 -1
- package/dist/record/sqlite/schema.d.cts +4 -1
- package/dist/record/sqlite/schema.d.mts +4 -1
- package/dist/record/sqlite/schema.d.ts +4 -1
- package/dist/record/sqlite/schema.js +20 -14
- package/dist/record/sqlite/storage-worker.cjs +1 -1
- package/dist/record/sqlite/storage-worker.cjs.map +1 -1
- package/dist/record/sqlite/storage.cjs +316 -232
- package/dist/record/sqlite/storage.cjs.map +1 -1
- package/dist/record/sqlite/storage.d.cts +10 -2
- package/dist/record/sqlite/storage.d.mts +10 -2
- package/dist/record/sqlite/storage.d.ts +10 -2
- package/dist/record/sqlite/storage.js +54 -50
- package/dist/record/sqlite/types.cjs +1 -1
- package/dist/record/sqlite/types.cjs.map +1 -1
- package/dist/record/sqlite/types.d.cts +13 -1
- package/dist/record/sqlite/types.d.mts +13 -1
- package/dist/record/sqlite/types.d.ts +13 -1
- package/dist/run/cli/contribution.cjs +17 -12
- package/dist/run/cli/contribution.cjs.map +1 -1
- package/dist/run/host/lifecycle-adapter.cjs +1 -1
- package/dist/run/host/lifecycle-adapter.cjs.map +1 -1
- package/dist/run/storage/owner-identity.cjs +78 -16
- package/dist/run/storage/owner-identity.cjs.map +1 -1
- package/dist/run/storage/owner-identity.d.cts +2 -1
- package/dist/run/storage/owner-identity.d.mts +2 -1
- package/dist/run/storage/owner-identity.d.ts +2 -1
- package/dist/run/storage/sqlite.cjs +55 -55
- package/dist/run/storage/sqlite.cjs.map +1 -1
- package/dist/runner/accept.cjs +12 -42
- package/dist/runner/accept.cjs.map +1 -1
- package/dist/runner/accept.d.cts +2 -3
- package/dist/runner/accept.d.mts +2 -3
- package/dist/runner/accept.d.ts +2 -3
- package/dist/runner/adapter-usage.cjs +2 -2
- package/dist/runner/adapter-usage.cjs.map +1 -1
- package/dist/runner/adoption.cjs +14 -26
- package/dist/runner/adoption.cjs.map +1 -1
- package/dist/runner/adoption.d.cts +5 -13
- package/dist/runner/adoption.d.mts +5 -13
- package/dist/runner/adoption.d.ts +5 -13
- package/dist/runner/adoption.js +2 -4
- package/dist/runner/record.cjs +24 -18
- package/dist/runner/record.cjs.map +1 -1
- package/dist/runner/rename-experiment.cjs +5 -7
- package/dist/runner/rename-experiment.cjs.map +1 -1
- package/dist/runner/reuse-plan.cjs +37 -18
- package/dist/runner/reuse-plan.cjs.map +1 -1
- package/dist/runner/reuse-plan.d.cts +4 -1
- package/dist/runner/reuse-plan.d.mts +4 -1
- package/dist/runner/reuse-plan.d.ts +4 -1
- package/dist/runner/setup-prefix-plan.cjs +17 -12
- package/dist/runner/setup-prefix-plan.cjs.map +1 -1
- package/dist/runner/setup-prefix-plan.d.cts +0 -2
- package/dist/runner/setup-prefix-plan.d.mts +0 -2
- package/dist/runner/setup-prefix-plan.d.ts +0 -2
- package/dist/runner/setup-prefix-plan.js +8 -12
- package/dist/sandbox/backend.cjs +10 -1
- package/dist/sandbox/backend.cjs.map +1 -1
- package/dist/sandbox/backend.d.cts +16 -8
- package/dist/sandbox/backend.d.mts +16 -8
- package/dist/sandbox/backend.d.ts +16 -8
- package/dist/sandbox/backend.js +28 -26
- package/dist/sandbox/docker.cjs +7 -1
- package/dist/sandbox/docker.cjs.map +1 -1
- package/dist/sandbox/e2b-cache-repository.cjs +13 -3
- package/dist/sandbox/e2b-cache-repository.cjs.map +1 -1
- package/dist/sandbox/e2b-cache-repository.d.cts +3 -0
- package/dist/sandbox/e2b-cache-repository.d.mts +3 -0
- package/dist/sandbox/e2b-cache-repository.d.ts +3 -0
- package/dist/sandbox/e2b-cache-repository.js +16 -12
- package/dist/sandbox/e2b.cjs +2 -2
- package/dist/sandbox/e2b.cjs.map +1 -1
- package/dist/sandbox/incus/materialize.cjs +1 -1
- package/dist/sandbox/incus/materialize.cjs.map +1 -1
- package/dist/show/contribution.cjs +3 -3
- package/dist/show/contribution.cjs.map +1 -1
- package/dist/show/model.cjs +14 -13
- package/dist/show/model.cjs.map +1 -1
- package/dist/show/model.d.cts +7 -7
- package/dist/show/model.d.mts +7 -7
- package/dist/show/model.d.ts +7 -7
- package/dist/show/render.cjs +14 -0
- package/dist/show/render.cjs.map +1 -1
- package/dist/user-database/storage-worker.cjs +13 -3
- package/dist/user-database/storage-worker.cjs.map +1 -1
- package/dist/view/app-dist/.vite/manifest.json +2 -2
- package/dist/view/app-dist/assets/{index-CmVoXbwG.js → index-B3ijZRph.js} +17 -17
- package/dist/view/app-dist/assets/{quality-cost-scatter-BuLISaH4.js → quality-cost-scatter-B--DfJ9s.js} +1 -1
- package/dist/view/app-dist/index.html +1 -1
- package/dist/view/application-runtime.cjs +8 -0
- package/dist/view/application-runtime.cjs.map +1 -0
- package/dist/view/application-runtime.d.cts +9 -0
- package/dist/view/application-runtime.d.mts +9 -0
- package/dist/view/application-runtime.d.ts +9 -0
- package/dist/view/application-runtime.js +6 -0
- package/dist/view/application-runtime.js.map +1 -0
- package/dist/view/cli/contribution.cjs +5 -2
- package/dist/view/cli/contribution.cjs.map +1 -1
- package/dist/view/cli/contribution.d.cts +2 -1
- package/dist/view/cli/contribution.d.mts +2 -1
- package/dist/view/cli/contribution.d.ts +2 -1
- package/dist/view/function-runtime.mjs +1019 -456
- package/dist/view/http-protocol.d.cts +1 -9
- package/dist/view/http-protocol.d.mts +1 -9
- package/dist/view/http-protocol.d.ts +1 -9
- package/dist/view/inspection-host.cjs +39 -30
- package/dist/view/inspection-host.cjs.map +1 -1
- package/dist/view/inspection-host.d.cts +7545 -2
- package/dist/view/inspection-host.d.mts +7545 -2
- package/dist/view/inspection-host.d.ts +7545 -2
- package/dist/view/server.cjs +8 -5
- package/dist/view/server.cjs.map +1 -1
- package/dist/view/server.d.cts +4 -2
- package/dist/view/server.d.mts +4 -2
- package/dist/view/server.d.ts +4 -2
- package/docs-site/zh/reference/cli.mdx +1 -2
- package/docs-site/zh/tutorials/control-run-cost.mdx +22 -0
- package/docs-site/zh/tutorials/niceeval-taste-application.mdx +21 -0
- package/package.json +1 -1
package/dist/load-config.cjs
CHANGED
|
@@ -6,22 +6,28 @@ exports.rebuildConfigModule = rebuildConfigModule;
|
|
|
6
6
|
// 让当前配置模块图重新求值。
|
|
7
7
|
const node_fs_1 = require("node:fs");
|
|
8
8
|
const node_path_1 = require("node:path");
|
|
9
|
+
const effect_1 = require("effect");
|
|
9
10
|
const fresh_import_ts_1 = require("./fresh-import.cjs");
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
function loadConfigModule(cwd, rebuild) {
|
|
12
|
+
return effect_1.Effect.gen(function* () {
|
|
13
|
+
const path = (0, node_path_1.join)(cwd, "niceeval.config.ts");
|
|
14
|
+
yield* effect_1.Effect.try({ try: () => {
|
|
15
|
+
if (!(0, node_fs_1.existsSync)(path))
|
|
16
|
+
throw new Error(`Could not find niceeval.config.ts.
|
|
14
17
|
Ways to fix:
|
|
15
18
|
- [init] Run \`npx niceeval init\` to scaffold niceeval.config.ts and evals/
|
|
16
19
|
- [cd] Run from the project root that contains niceeval.config.ts
|
|
17
20
|
Docs: node_modules/niceeval/docs-site/zh/tutorials/quickstart.mdx`);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
}, catch: (cause) => cause });
|
|
22
|
+
const mod = yield* (rebuild
|
|
23
|
+
? (0, fresh_import_ts_1.freshImportModule)(path)
|
|
24
|
+
: effect_1.Effect.tryPromise({ try: () => (0, fresh_import_ts_1.importProjectModule)(path), catch: (cause) => cause }));
|
|
25
|
+
return yield* effect_1.Effect.try({ try: () => {
|
|
26
|
+
if (!mod.default)
|
|
27
|
+
throw new Error(`niceeval.config.ts must default export defineConfig(...).`);
|
|
28
|
+
return mod.default;
|
|
29
|
+
}, catch: (cause) => cause });
|
|
30
|
+
});
|
|
25
31
|
}
|
|
26
32
|
/** Canonical trusted module load; callers that need fresh evaluation use rebuild. */
|
|
27
33
|
function loadConfigModuleOnce(cwd) {
|
package/dist/load-config.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-config.js","sourceRoot":"","sources":["load-config.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"load-config.js","sourceRoot":"","sources":["load-config.ts"],"names":[],"mappings":";;AA6BA,oDAEC;AAED,kDAEC;AAnCD,qEAAqE;AACrE,gBAAgB;AAChB,qCAAqC;AACrC,yCAAiC;AACjC,mCAAgC;AAChC,uDAA2E;AAE3E,SAAS,gBAAgB,CAAC,GAAW,EAAE,OAAgB;IACnD,OAAO,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACvB,MAAM,IAAI,GAAG,IAAA,gBAAI,EAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QAC7C,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE;gBACtB,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC;;;;oEAIgC,CAAC,CAAC;YAC1D,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO;YACvB,CAAC,CAAC,IAAA,mCAAiB,EAAC,IAAI,CAAC;YACzB,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAA,qCAAmB,EAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5F,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE;gBAC7B,IAAI,CAAC,GAAG,CAAC,OAAO;oBACZ,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;gBACjF,OAAO,GAAG,CAAC,OAAiB,CAAC;YACjC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACP,CAAC;AACD,qFAAqF;AACrF,SAAgB,oBAAoB,CAAC,GAAW;IAC5C,OAAO,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACxC,CAAC;AACD,yFAAyF;AACzF,SAAgB,mBAAmB,CAAC,GAAW;IAC3C,OAAO,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC","sourcesContent":["// niceeval.config.ts 装载:CLI 与 view 共用。view 本地模式每次重建都使用 fresh import,\n// 让当前配置模块图重新求值。\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { Effect } from \"effect\";\nimport { freshImportModule, importProjectModule } from \"./fresh-import.ts\";\nimport type { Config } from \"./runner/types.ts\";\nfunction loadConfigModule(cwd: string, rebuild: boolean): Effect.Effect<Config, unknown> {\n return Effect.gen(function* () {\n const path = join(cwd, \"niceeval.config.ts\");\n yield* Effect.try({ try: () => {\n if (!existsSync(path))\n throw new Error(`Could not find niceeval.config.ts.\nWays to fix:\n - [init] Run \\`npx niceeval init\\` to scaffold niceeval.config.ts and evals/\n - [cd] Run from the project root that contains niceeval.config.ts\n Docs: node_modules/niceeval/docs-site/zh/tutorials/quickstart.mdx`);\n }, catch: (cause) => cause });\n const mod = yield* (rebuild\n ? freshImportModule(path)\n : Effect.tryPromise({ try: () => importProjectModule(path), catch: (cause) => cause }));\n return yield* Effect.try({ try: () => {\n if (!mod.default)\n throw new Error(`niceeval.config.ts must default export defineConfig(...).`);\n return mod.default as Config;\n }, catch: (cause) => cause });\n });\n}\n/** Canonical trusted module load; callers that need fresh evaluation use rebuild. */\nexport function loadConfigModuleOnce(cwd: string): Effect.Effect<Config, unknown> {\n return loadConfigModule(cwd, false);\n}\n/** Serial callers deliberately request a new module graph rather than a boolean mode. */\nexport function rebuildConfigModule(cwd: string): Effect.Effect<Config, unknown> {\n return loadConfigModule(cwd, true);\n}\n"]}
|
package/dist/load-config.d.cts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
1
2
|
import type { Config } from "./runner/types.cjs";
|
|
2
3
|
/** Canonical trusted module load; callers that need fresh evaluation use rebuild. */
|
|
3
|
-
export declare function loadConfigModuleOnce(cwd: string):
|
|
4
|
+
export declare function loadConfigModuleOnce(cwd: string): Effect.Effect<Config, unknown>;
|
|
4
5
|
/** Serial callers deliberately request a new module graph rather than a boolean mode. */
|
|
5
|
-
export declare function rebuildConfigModule(cwd: string):
|
|
6
|
+
export declare function rebuildConfigModule(cwd: string): Effect.Effect<Config, unknown>;
|
package/dist/load-config.d.mts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
1
2
|
import type { Config } from "./runner/types.mjs";
|
|
2
3
|
/** Canonical trusted module load; callers that need fresh evaluation use rebuild. */
|
|
3
|
-
export declare function loadConfigModuleOnce(cwd: string):
|
|
4
|
+
export declare function loadConfigModuleOnce(cwd: string): Effect.Effect<Config, unknown>;
|
|
4
5
|
/** Serial callers deliberately request a new module graph rather than a boolean mode. */
|
|
5
|
-
export declare function rebuildConfigModule(cwd: string):
|
|
6
|
+
export declare function rebuildConfigModule(cwd: string): Effect.Effect<Config, unknown>;
|
package/dist/load-config.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
1
2
|
import type { Config } from "./runner/types.js";
|
|
2
3
|
/** Canonical trusted module load; callers that need fresh evaluation use rebuild. */
|
|
3
|
-
export declare function loadConfigModuleOnce(cwd: string):
|
|
4
|
+
export declare function loadConfigModuleOnce(cwd: string): Effect.Effect<Config, unknown>;
|
|
4
5
|
/** Serial callers deliberately request a new module graph rather than a boolean mode. */
|
|
5
|
-
export declare function rebuildConfigModule(cwd: string):
|
|
6
|
+
export declare function rebuildConfigModule(cwd: string): Effect.Effect<Config, unknown>;
|
|
@@ -8,6 +8,7 @@ exports.compareAdapterModelGroups = compareAdapterModelGroups;
|
|
|
8
8
|
exports.projectAdapterModelUsage = projectAdapterModelUsage;
|
|
9
9
|
exports.projectAdapterUsageSnapshot = projectAdapterUsageSnapshot;
|
|
10
10
|
exports.compareCanonicalDecimal = compareCanonicalDecimal;
|
|
11
|
+
const cache_read_ts_1 = require("./cache-read.cjs");
|
|
11
12
|
const pricing_ts_1 = require("../record/family/adapter-usage/pricing.cjs");
|
|
12
13
|
function effectiveUsageCalls(usage) {
|
|
13
14
|
const receipts = new Map((usage.priceReceipts ?? []).map((receipt) => [receipt.callId, receipt]));
|
|
@@ -86,7 +87,8 @@ function compareAdapterModelGroups(left, right) {
|
|
|
86
87
|
return 0;
|
|
87
88
|
}
|
|
88
89
|
/** Configuration counts and grouped statistics both consume the complete sealed ledger. */
|
|
89
|
-
function projectAdapterModelUsage(usage, models, unavailable = { basis: "unavailable", reason: "usage-not-recorded" }) {
|
|
90
|
+
function projectAdapterModelUsage(usage, models, unavailable = { basis: "unavailable", reason: "usage-not-recorded" }, producerCompletenessKnown = true) {
|
|
91
|
+
const cacheRead = (0, cache_read_ts_1.projectCacheRead)(usage, models, producerCompletenessKnown, unavailable.reason === "physical-call-identity-not-recorded" ? "adapter-usage-required" : unavailable.reason);
|
|
90
92
|
const counts = new Map();
|
|
91
93
|
for (const call of usage?.calls ?? []) {
|
|
92
94
|
if (call.modelSlot !== null)
|
|
@@ -103,6 +105,7 @@ function projectAdapterModelUsage(usage, models, unavailable = { basis: "unavail
|
|
|
103
105
|
});
|
|
104
106
|
if (usage === null)
|
|
105
107
|
return Object.freeze({
|
|
108
|
+
cacheRead,
|
|
106
109
|
configuredModels,
|
|
107
110
|
modelGroups: Object.freeze({
|
|
108
111
|
state: "unavailable", ...unavailable,
|
|
@@ -134,6 +137,7 @@ function projectAdapterModelUsage(usage, models, unavailable = { basis: "unavail
|
|
|
134
137
|
});
|
|
135
138
|
});
|
|
136
139
|
return Object.freeze({
|
|
140
|
+
cacheRead,
|
|
137
141
|
configuredModels,
|
|
138
142
|
modelGroups: Object.freeze({
|
|
139
143
|
state: "available", basis: "recorded-calls",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-usage-projection.js","sourceRoot":"","sources":["adapter-usage-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReadableAdapterUsageAttachment, AdapterUsageCall, AdapterCallPriceReceipt } from \"../record/family/adapter-usage/schema.ts\";\nimport { addCanonicalDecimals } from \"../record/family/adapter-usage/pricing.ts\";\nimport type { NumericMaterial } from \"../assertions/match.ts\";\nimport type { ResolvedModelSlots } from \"../model-slots.ts\";\nexport interface EffectiveCallCost {\n readonly amount: string;\n readonly currency: string;\n readonly source: {\n readonly kind: \"reported\" | \"estimated\";\n readonly id: string;\n };\n readonly state: \"complete\" | \"partial\";\n}\nexport type EffectiveUsageCall = AdapterUsageCall & {\n readonly effectiveCost: EffectiveCallCost | null;\n};\nexport function effectiveUsageCalls(usage: ReadableAdapterUsageAttachment): readonly EffectiveUsageCall[] {\n const receipts = new Map((usage.priceReceipts ?? []).map((receipt) => [receipt.callId, receipt]));\n return Object.freeze(usage.calls.map((call) => {\n const receipt = receipts.get(call.callId);\n return Object.freeze({ ...call, effectiveCost: call.cost !== null ? Object.freeze({ ...call.cost, state: \"complete\" as const }) : receipt === undefined ? null : Object.freeze({ amount: receipt.amount, currency: receipt.currency, source: receipt.source, state: receipt.state }) });\n }));\n}\nexport function effectiveCostTotals(calls: readonly {\n readonly effectiveCost: EffectiveCallCost | null;\n}[], collectionState: \"complete\" | \"partial\") {\n const known = calls.flatMap((call) => call.effectiveCost === null ? [] : [call.effectiveCost]);\n const kind = (values: readonly EffectiveCallCost[]) => { const sources = new Set(values.map((value) => value.source.kind)); return sources.size === 0 ? null : sources.size === 1 ? [...sources][0]! : \"mixed\" as const; };\n const grouped = new Map<string, EffectiveCallCost[]>();\n for (const cost of known)\n grouped.set(cost.currency, [...(grouped.get(cost.currency) ?? []), cost]);\n const complete = collectionState === \"complete\" && known.length === calls.length && known.every((cost) => cost.state === \"complete\");\n return Object.freeze({ state: known.length === 0 ? \"unavailable\" as const : complete ? \"complete\" as const : \"partial\" as const, source: kind(known), values: Object.freeze([...grouped.entries()].sort(([left], [right]) => left.localeCompare(right)).map(([currency, values]) => Object.freeze({ currency, value: addCanonicalDecimals(values.map((value) => value.amount)), source: kind(values)!, coveredCalls: values.filter((value) => value.state === \"complete\").length, reportedCalls: values.filter((value) => value.source.kind === \"reported\").length, estimatedCalls: values.filter((value) => value.source.kind === \"estimated\").length }))), totalCalls: calls.length });\n}\nfunction inputTotal(call: AdapterUsageCall): {\n value: number | null;\n complete: boolean;\n} {\n const known = [call.inputTokens, call.cacheReadTokens, call.cacheWriteTokens].filter((value): value is number => value !== null);\n return { value: call.inputTotalTokens ?? (known.length === 0 ? null : known.reduce((sum, value) => sum + value, 0)), complete: call.inputTotalTokens !== null || known.length === 3 };\n}\nexport function adapterTokenMaterial(usage: ReadableAdapterUsageAttachment, metric: \"inputTokens\" | \"inputTotalTokens\" | \"outputTokens\" | \"cacheReadTokens\" | \"cacheWriteTokens\" | \"totalTokens\"): NumericMaterial {\n const provenance = Object.freeze({ source: \"adapter\", scope: \"recorded-calls\", unit: \"tokens\", cut: \"call-time\" });\n let value = 0;\n let observations = 0;\n let complete = usage.collection.state === \"complete\" && usage.calls.length > 0;\n for (const call of usage.calls) {\n if (call.status === \"unknown\")\n complete = false;\n const input = inputTotal(call);\n const buckets = metric === \"totalTokens\" ? [input.value, call.outputTokens] : metric === \"inputTotalTokens\" ? [input.value] : [call[metric]];\n const observedBuckets = metric === \"totalTokens\" || metric === \"inputTotalTokens\"\n ? [...(call.inputTotalTokens === null ? [call.inputTokens, call.cacheReadTokens, call.cacheWriteTokens] : [call.inputTotalTokens]), ...(metric === \"totalTokens\" ? [call.outputTokens] : [])]\n : buckets;\n if (observedBuckets.some((bucket) => bucket !== null && (!Number.isSafeInteger(bucket) || bucket < 0))) {\n return Object.freeze({ state: \"unavailable\", reason: \"usage-invalid-token-value\", provenance });\n }\n for (const bucket of buckets) {\n if (bucket === null)\n complete = false;\n else {\n value += bucket;\n observations += 1;\n }\n }\n if ((metric === \"totalTokens\" || metric === \"inputTotalTokens\") && !input.complete)\n complete = false;\n }\n return Object.freeze(!Number.isSafeInteger(value) ? { state: \"unavailable\", reason: \"usage-exceeds-safe-integer\", provenance } : observations === 0 ? { state: \"unavailable\", reason: \"usage-not-recorded\", provenance } : { state: complete ? \"exact\" : \"lower-bound\", value, provenance });\n}\nexport function adapterInspectionTokenTotal(usage: ReadableAdapterUsageAttachment, metric: \"inputTotalTokens\" | \"outputTokens\" | \"totalTokens\") {\n const material = adapterTokenMaterial(usage, metric);\n const observationCount = usage.calls.filter((call) => metric === \"outputTokens\"\n ? call.outputTokens !== null\n : inputTotal(call).value !== null || (metric === \"totalTokens\" && call.outputTokens !== null)).length;\n return Object.freeze({\n state: material.state === \"exact\" ? \"available\" as const\n : material.state === \"lower-bound\" ? \"partial\" as const : \"unavailable\" as const,\n value: material.state === \"unavailable\" ? null : material.value,\n observationCount,\n });\n}\n/** Tuple order is stable across hosts, with missing identities before strings. */\nexport function compareAdapterModelGroups(left: Pick<AdapterUsageCall, \"modelSlot\" | \"provider\" | \"model\">, right: Pick<AdapterUsageCall, \"modelSlot\" | \"provider\" | \"model\">): number {\n for (const key of [\"modelSlot\", \"provider\", \"model\"] as const) {\n const a = left[key];\n const b = right[key];\n if (a === b)\n continue;\n if (a === null)\n return -1;\n if (b === null)\n return 1;\n return a < b ? -1 : 1;\n }\n return 0;\n}\n/** Configuration counts and grouped statistics both consume the complete sealed ledger. */\nexport function projectAdapterModelUsage(usage: ReadableAdapterUsageAttachment | null, models: ResolvedModelSlots | undefined, unavailable: {\n readonly basis: \"recorded-calls\" | \"reported-sends\" | \"unavailable\";\n readonly reason: \"source-invalid\" | \"usage-not-recorded\" | \"physical-call-identity-not-recorded\";\n} = { basis: \"unavailable\", reason: \"usage-not-recorded\" }) {\n const counts = new Map<string, number>();\n for (const call of usage?.calls ?? []) {\n if (call.modelSlot !== null)\n counts.set(call.modelSlot, (counts.get(call.modelSlot) ?? 0) + 1);\n }\n const configuredModels = models === undefined\n ? Object.freeze({ state: \"not-recorded\" as const })\n : Object.freeze({\n state: \"available\" as const,\n bindings: Object.freeze(Object.keys(models).sort().map((modelSlot) => Object.freeze({\n modelSlot, ...models[modelSlot]!,\n recordedCalls: usage === null ? null : counts.get(modelSlot) ?? 0,\n }))),\n });\n if (usage === null)\n return Object.freeze({\n configuredModels,\n modelGroups: Object.freeze({\n state: \"unavailable\" as const, ...unavailable,\n groups: Object.freeze([]) as readonly [\n ], totalGroupCount: null,\n groupsTruncated: false as const, omittedGroupCount: 0 as const,\n }),\n });\n const grouped = new Map<string, EffectiveUsageCall[]>();\n for (const call of effectiveUsageCalls(usage)) {\n const identity = JSON.stringify([call.modelSlot, call.provider, call.model]);\n const group = grouped.get(identity);\n if (group === undefined)\n grouped.set(identity, [call]);\n else\n group.push(call);\n }\n const allGroups = [...grouped.values()].sort((left, right) => compareAdapterModelGroups(left[0]!, right[0]!));\n const groups = allGroups.slice(0, 64).map((calls) => {\n const { modelSlot, provider, model } = calls[0]!;\n const groupUsage = { ...usage, calls };\n return Object.freeze({\n modelSlot, provider, model, recordedCalls: calls.length,\n tokens: Object.freeze({\n inputTotalTokens: adapterInspectionTokenTotal(groupUsage, \"inputTotalTokens\"),\n outputTokens: adapterInspectionTokenTotal(groupUsage, \"outputTokens\"),\n totalTokens: adapterInspectionTokenTotal(groupUsage, \"totalTokens\"),\n }),\n costs: effectiveCostTotals(calls, usage.collection.state),\n });\n });\n return Object.freeze({\n configuredModels,\n modelGroups: Object.freeze({\n state: \"available\" as const, basis: \"recorded-calls\" as const,\n groups: Object.freeze(groups), totalGroupCount: allGroups.length,\n groupsTruncated: allGroups.length > groups.length,\n omittedGroupCount: allGroups.length - groups.length,\n }),\n });\n}\nexport interface AdapterAttemptUsageSnapshot {\n readonly source: \"adapter\";\n readonly scope: \"recorded-calls\";\n readonly cut: \"call-time\";\n readonly collection: ReadableAdapterUsageAttachment[\"collection\"];\n readonly calls: readonly EffectiveUsageCall[];\n readonly priceReceipts: readonly AdapterCallPriceReceipt[];\n readonly inputTokens: NumericMaterial;\n readonly inputTotalTokens: NumericMaterial;\n readonly outputTokens: NumericMaterial;\n readonly cacheReadTokens: NumericMaterial;\n readonly cacheWriteTokens: NumericMaterial;\n readonly totalTokens: NumericMaterial;\n readonly costs: ReturnType<typeof effectiveCostTotals>;\n}\nexport type AttemptUsageSnapshot = AdapterAttemptUsageSnapshot | {\n readonly source: \"unavailable\";\n readonly reason: \"usage-owner-not-bound\";\n};\nexport function projectAdapterUsageSnapshot(usage: ReadableAdapterUsageAttachment): AdapterAttemptUsageSnapshot {\n const calls = effectiveUsageCalls(usage);\n return Object.freeze({ source: \"adapter\", scope: \"recorded-calls\", cut: \"call-time\", collection: usage.collection, calls, priceReceipts: usage.priceReceipts ?? [], inputTokens: adapterTokenMaterial(usage, \"inputTokens\"), inputTotalTokens: adapterTokenMaterial(usage, \"inputTotalTokens\"), outputTokens: adapterTokenMaterial(usage, \"outputTokens\"), cacheReadTokens: adapterTokenMaterial(usage, \"cacheReadTokens\"), cacheWriteTokens: adapterTokenMaterial(usage, \"cacheWriteTokens\"), totalTokens: adapterTokenMaterial(usage, \"totalTokens\"), costs: effectiveCostTotals(calls, usage.collection.state) });\n}\nexport function compareCanonicalDecimal(left: string, right: string): -1 | 0 | 1 {\n const [li, lf = \"\"] = left.split(\".\");\n const [ri, rf = \"\"] = right.split(\".\");\n const width = Math.max(lf.length, rf.length);\n const l = BigInt(li! + lf.padEnd(width, \"0\"));\n const r = BigInt(ri! + rf.padEnd(width, \"0\"));\n return l < r ? -1 : l > r ? 1 : 0;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"adapter-usage-projection.js","sourceRoot":"","sources":["adapter-usage-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import { projectCacheRead } from \"./cache-read.ts\";\nimport type { ReadableAdapterUsageAttachment, AdapterUsageCall, AdapterCallPriceReceipt } from \"../record/family/adapter-usage/schema.ts\";\nimport { addCanonicalDecimals } from \"../record/family/adapter-usage/pricing.ts\";\nimport type { NumericMaterial } from \"../assertions/match.ts\";\nimport type { ResolvedModelSlots } from \"../model-slots.ts\";\nexport interface EffectiveCallCost {\n readonly amount: string;\n readonly currency: string;\n readonly source: {\n readonly kind: \"reported\" | \"estimated\";\n readonly id: string;\n };\n readonly state: \"complete\" | \"partial\";\n}\nexport type EffectiveUsageCall = AdapterUsageCall & {\n readonly effectiveCost: EffectiveCallCost | null;\n};\nexport function effectiveUsageCalls(usage: ReadableAdapterUsageAttachment): readonly EffectiveUsageCall[] {\n const receipts = new Map((usage.priceReceipts ?? []).map((receipt) => [receipt.callId, receipt]));\n return Object.freeze(usage.calls.map((call) => {\n const receipt = receipts.get(call.callId);\n return Object.freeze({ ...call, effectiveCost: call.cost !== null ? Object.freeze({ ...call.cost, state: \"complete\" as const }) : receipt === undefined ? null : Object.freeze({ amount: receipt.amount, currency: receipt.currency, source: receipt.source, state: receipt.state }) });\n }));\n}\nexport function effectiveCostTotals(calls: readonly {\n readonly effectiveCost: EffectiveCallCost | null;\n}[], collectionState: \"complete\" | \"partial\") {\n const known = calls.flatMap((call) => call.effectiveCost === null ? [] : [call.effectiveCost]);\n const kind = (values: readonly EffectiveCallCost[]) => { const sources = new Set(values.map((value) => value.source.kind)); return sources.size === 0 ? null : sources.size === 1 ? [...sources][0]! : \"mixed\" as const; };\n const grouped = new Map<string, EffectiveCallCost[]>();\n for (const cost of known)\n grouped.set(cost.currency, [...(grouped.get(cost.currency) ?? []), cost]);\n const complete = collectionState === \"complete\" && known.length === calls.length && known.every((cost) => cost.state === \"complete\");\n return Object.freeze({ state: known.length === 0 ? \"unavailable\" as const : complete ? \"complete\" as const : \"partial\" as const, source: kind(known), values: Object.freeze([...grouped.entries()].sort(([left], [right]) => left.localeCompare(right)).map(([currency, values]) => Object.freeze({ currency, value: addCanonicalDecimals(values.map((value) => value.amount)), source: kind(values)!, coveredCalls: values.filter((value) => value.state === \"complete\").length, reportedCalls: values.filter((value) => value.source.kind === \"reported\").length, estimatedCalls: values.filter((value) => value.source.kind === \"estimated\").length }))), totalCalls: calls.length });\n}\nfunction inputTotal(call: AdapterUsageCall): {\n value: number | null;\n complete: boolean;\n} {\n const known = [call.inputTokens, call.cacheReadTokens, call.cacheWriteTokens].filter((value): value is number => value !== null);\n return { value: call.inputTotalTokens ?? (known.length === 0 ? null : known.reduce((sum, value) => sum + value, 0)), complete: call.inputTotalTokens !== null || known.length === 3 };\n}\nexport function adapterTokenMaterial(usage: ReadableAdapterUsageAttachment, metric: \"inputTokens\" | \"inputTotalTokens\" | \"outputTokens\" | \"cacheReadTokens\" | \"cacheWriteTokens\" | \"totalTokens\"): NumericMaterial {\n const provenance = Object.freeze({ source: \"adapter\", scope: \"recorded-calls\", unit: \"tokens\", cut: \"call-time\" });\n let value = 0;\n let observations = 0;\n let complete = usage.collection.state === \"complete\" && usage.calls.length > 0;\n for (const call of usage.calls) {\n if (call.status === \"unknown\")\n complete = false;\n const input = inputTotal(call);\n const buckets = metric === \"totalTokens\" ? [input.value, call.outputTokens] : metric === \"inputTotalTokens\" ? [input.value] : [call[metric]];\n const observedBuckets = metric === \"totalTokens\" || metric === \"inputTotalTokens\"\n ? [...(call.inputTotalTokens === null ? [call.inputTokens, call.cacheReadTokens, call.cacheWriteTokens] : [call.inputTotalTokens]), ...(metric === \"totalTokens\" ? [call.outputTokens] : [])]\n : buckets;\n if (observedBuckets.some((bucket) => bucket !== null && (!Number.isSafeInteger(bucket) || bucket < 0))) {\n return Object.freeze({ state: \"unavailable\", reason: \"usage-invalid-token-value\", provenance });\n }\n for (const bucket of buckets) {\n if (bucket === null)\n complete = false;\n else {\n value += bucket;\n observations += 1;\n }\n }\n if ((metric === \"totalTokens\" || metric === \"inputTotalTokens\") && !input.complete)\n complete = false;\n }\n return Object.freeze(!Number.isSafeInteger(value) ? { state: \"unavailable\", reason: \"usage-exceeds-safe-integer\", provenance } : observations === 0 ? { state: \"unavailable\", reason: \"usage-not-recorded\", provenance } : { state: complete ? \"exact\" : \"lower-bound\", value, provenance });\n}\nexport function adapterInspectionTokenTotal(usage: ReadableAdapterUsageAttachment, metric: \"inputTotalTokens\" | \"outputTokens\" | \"totalTokens\") {\n const material = adapterTokenMaterial(usage, metric);\n const observationCount = usage.calls.filter((call) => metric === \"outputTokens\"\n ? call.outputTokens !== null\n : inputTotal(call).value !== null || (metric === \"totalTokens\" && call.outputTokens !== null)).length;\n return Object.freeze({\n state: material.state === \"exact\" ? \"available\" as const\n : material.state === \"lower-bound\" ? \"partial\" as const : \"unavailable\" as const,\n value: material.state === \"unavailable\" ? null : material.value,\n observationCount,\n });\n}\n/** Tuple order is stable across hosts, with missing identities before strings. */\nexport function compareAdapterModelGroups(left: Pick<AdapterUsageCall, \"modelSlot\" | \"provider\" | \"model\">, right: Pick<AdapterUsageCall, \"modelSlot\" | \"provider\" | \"model\">): number {\n for (const key of [\"modelSlot\", \"provider\", \"model\"] as const) {\n const a = left[key];\n const b = right[key];\n if (a === b)\n continue;\n if (a === null)\n return -1;\n if (b === null)\n return 1;\n return a < b ? -1 : 1;\n }\n return 0;\n}\n/** Configuration counts and grouped statistics both consume the complete sealed ledger. */\nexport function projectAdapterModelUsage(usage: ReadableAdapterUsageAttachment | null, models: ResolvedModelSlots | undefined, unavailable: {\n readonly basis: \"recorded-calls\" | \"reported-sends\" | \"unavailable\";\n readonly reason: \"source-invalid\" | \"usage-not-recorded\" | \"physical-call-identity-not-recorded\";\n} = { basis: \"unavailable\", reason: \"usage-not-recorded\" }, producerCompletenessKnown = true) {\n const cacheRead = projectCacheRead(usage, models, producerCompletenessKnown, unavailable.reason === \"physical-call-identity-not-recorded\" ? \"adapter-usage-required\" : unavailable.reason);\n const counts = new Map<string, number>();\n for (const call of usage?.calls ?? []) {\n if (call.modelSlot !== null)\n counts.set(call.modelSlot, (counts.get(call.modelSlot) ?? 0) + 1);\n }\n const configuredModels = models === undefined\n ? Object.freeze({ state: \"not-recorded\" as const })\n : Object.freeze({\n state: \"available\" as const,\n bindings: Object.freeze(Object.keys(models).sort().map((modelSlot) => Object.freeze({\n modelSlot, ...models[modelSlot]!,\n recordedCalls: usage === null ? null : counts.get(modelSlot) ?? 0,\n }))),\n });\n if (usage === null)\n return Object.freeze({\n cacheRead,\n configuredModels,\n modelGroups: Object.freeze({\n state: \"unavailable\" as const, ...unavailable,\n groups: Object.freeze([]) as readonly [\n ], totalGroupCount: null,\n groupsTruncated: false as const, omittedGroupCount: 0 as const,\n }),\n });\n const grouped = new Map<string, EffectiveUsageCall[]>();\n for (const call of effectiveUsageCalls(usage)) {\n const identity = JSON.stringify([call.modelSlot, call.provider, call.model]);\n const group = grouped.get(identity);\n if (group === undefined)\n grouped.set(identity, [call]);\n else\n group.push(call);\n }\n const allGroups = [...grouped.values()].sort((left, right) => compareAdapterModelGroups(left[0]!, right[0]!));\n const groups = allGroups.slice(0, 64).map((calls) => {\n const { modelSlot, provider, model } = calls[0]!;\n const groupUsage = { ...usage, calls };\n return Object.freeze({\n modelSlot, provider, model, recordedCalls: calls.length,\n tokens: Object.freeze({\n inputTotalTokens: adapterInspectionTokenTotal(groupUsage, \"inputTotalTokens\"),\n outputTokens: adapterInspectionTokenTotal(groupUsage, \"outputTokens\"),\n totalTokens: adapterInspectionTokenTotal(groupUsage, \"totalTokens\"),\n }),\n costs: effectiveCostTotals(calls, usage.collection.state),\n });\n });\n return Object.freeze({\n cacheRead,\n configuredModels,\n modelGroups: Object.freeze({\n state: \"available\" as const, basis: \"recorded-calls\" as const,\n groups: Object.freeze(groups), totalGroupCount: allGroups.length,\n groupsTruncated: allGroups.length > groups.length,\n omittedGroupCount: allGroups.length - groups.length,\n }),\n });\n}\nexport interface AdapterAttemptUsageSnapshot {\n readonly source: \"adapter\";\n readonly scope: \"recorded-calls\";\n readonly cut: \"call-time\";\n readonly collection: ReadableAdapterUsageAttachment[\"collection\"];\n readonly calls: readonly EffectiveUsageCall[];\n readonly priceReceipts: readonly AdapterCallPriceReceipt[];\n readonly inputTokens: NumericMaterial;\n readonly inputTotalTokens: NumericMaterial;\n readonly outputTokens: NumericMaterial;\n readonly cacheReadTokens: NumericMaterial;\n readonly cacheWriteTokens: NumericMaterial;\n readonly totalTokens: NumericMaterial;\n readonly costs: ReturnType<typeof effectiveCostTotals>;\n}\nexport type AttemptUsageSnapshot = AdapterAttemptUsageSnapshot | {\n readonly source: \"unavailable\";\n readonly reason: \"usage-owner-not-bound\";\n};\nexport function projectAdapterUsageSnapshot(usage: ReadableAdapterUsageAttachment): AdapterAttemptUsageSnapshot {\n const calls = effectiveUsageCalls(usage);\n return Object.freeze({ source: \"adapter\", scope: \"recorded-calls\", cut: \"call-time\", collection: usage.collection, calls, priceReceipts: usage.priceReceipts ?? [], inputTokens: adapterTokenMaterial(usage, \"inputTokens\"), inputTotalTokens: adapterTokenMaterial(usage, \"inputTotalTokens\"), outputTokens: adapterTokenMaterial(usage, \"outputTokens\"), cacheReadTokens: adapterTokenMaterial(usage, \"cacheReadTokens\"), cacheWriteTokens: adapterTokenMaterial(usage, \"cacheWriteTokens\"), totalTokens: adapterTokenMaterial(usage, \"totalTokens\"), costs: effectiveCostTotals(calls, usage.collection.state) });\n}\nexport function compareCanonicalDecimal(left: string, right: string): -1 | 0 | 1 {\n const [li, lf = \"\"] = left.split(\".\");\n const [ri, rf = \"\"] = right.split(\".\");\n const width = Math.max(lf.length, rf.length);\n const l = BigInt(li! + lf.padEnd(width, \"0\"));\n const r = BigInt(ri! + rf.padEnd(width, \"0\"));\n return l < r ? -1 : l > r ? 1 : 0;\n}\n"]}
|
|
@@ -41,7 +41,61 @@ export declare function compareAdapterModelGroups(left: Pick<AdapterUsageCall, "
|
|
|
41
41
|
export declare function projectAdapterModelUsage(usage: ReadableAdapterUsageAttachment | null, models: ResolvedModelSlots | undefined, unavailable?: {
|
|
42
42
|
readonly basis: "recorded-calls" | "reported-sends" | "unavailable";
|
|
43
43
|
readonly reason: "source-invalid" | "usage-not-recorded" | "physical-call-identity-not-recorded";
|
|
44
|
-
}): Readonly<{
|
|
44
|
+
}, producerCompletenessKnown?: boolean): Readonly<{
|
|
45
|
+
cacheRead: {
|
|
46
|
+
readonly total: {
|
|
47
|
+
readonly rate: {
|
|
48
|
+
readonly state: "exact";
|
|
49
|
+
readonly value: number;
|
|
50
|
+
} | {
|
|
51
|
+
readonly state: "unavailable";
|
|
52
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
53
|
+
};
|
|
54
|
+
readonly recordedCalls: number;
|
|
55
|
+
readonly coveredCalls: number;
|
|
56
|
+
readonly missingCacheReadCalls: number;
|
|
57
|
+
readonly missingInputTotalCalls: number;
|
|
58
|
+
readonly unknownStatusCalls: number;
|
|
59
|
+
readonly collectionComplete: boolean;
|
|
60
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
61
|
+
};
|
|
62
|
+
readonly modelSlots: readonly {
|
|
63
|
+
readonly rate: {
|
|
64
|
+
readonly state: "exact";
|
|
65
|
+
readonly value: number;
|
|
66
|
+
} | {
|
|
67
|
+
readonly state: "unavailable";
|
|
68
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
69
|
+
};
|
|
70
|
+
readonly recordedCalls: number;
|
|
71
|
+
readonly coveredCalls: number;
|
|
72
|
+
readonly missingCacheReadCalls: number;
|
|
73
|
+
readonly missingInputTotalCalls: number;
|
|
74
|
+
readonly unknownStatusCalls: number;
|
|
75
|
+
readonly collectionComplete: boolean;
|
|
76
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
77
|
+
readonly modelSlot: string | null;
|
|
78
|
+
}[];
|
|
79
|
+
readonly models: readonly {
|
|
80
|
+
readonly rate: {
|
|
81
|
+
readonly state: "exact";
|
|
82
|
+
readonly value: number;
|
|
83
|
+
} | {
|
|
84
|
+
readonly state: "unavailable";
|
|
85
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
86
|
+
};
|
|
87
|
+
readonly recordedCalls: number;
|
|
88
|
+
readonly coveredCalls: number;
|
|
89
|
+
readonly missingCacheReadCalls: number;
|
|
90
|
+
readonly missingInputTotalCalls: number;
|
|
91
|
+
readonly unknownStatusCalls: number;
|
|
92
|
+
readonly collectionComplete: boolean;
|
|
93
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
94
|
+
readonly modelSlot: string | null;
|
|
95
|
+
readonly provider: string | null;
|
|
96
|
+
readonly model: string | null;
|
|
97
|
+
}[];
|
|
98
|
+
};
|
|
45
99
|
configuredModels: Readonly<{
|
|
46
100
|
state: "not-recorded";
|
|
47
101
|
}> | Readonly<{
|
|
@@ -63,6 +117,60 @@ export declare function projectAdapterModelUsage(usage: ReadableAdapterUsageAtta
|
|
|
63
117
|
state: "unavailable";
|
|
64
118
|
}>;
|
|
65
119
|
}> | Readonly<{
|
|
120
|
+
cacheRead: {
|
|
121
|
+
readonly total: {
|
|
122
|
+
readonly rate: {
|
|
123
|
+
readonly state: "exact";
|
|
124
|
+
readonly value: number;
|
|
125
|
+
} | {
|
|
126
|
+
readonly state: "unavailable";
|
|
127
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
128
|
+
};
|
|
129
|
+
readonly recordedCalls: number;
|
|
130
|
+
readonly coveredCalls: number;
|
|
131
|
+
readonly missingCacheReadCalls: number;
|
|
132
|
+
readonly missingInputTotalCalls: number;
|
|
133
|
+
readonly unknownStatusCalls: number;
|
|
134
|
+
readonly collectionComplete: boolean;
|
|
135
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
136
|
+
};
|
|
137
|
+
readonly modelSlots: readonly {
|
|
138
|
+
readonly rate: {
|
|
139
|
+
readonly state: "exact";
|
|
140
|
+
readonly value: number;
|
|
141
|
+
} | {
|
|
142
|
+
readonly state: "unavailable";
|
|
143
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
144
|
+
};
|
|
145
|
+
readonly recordedCalls: number;
|
|
146
|
+
readonly coveredCalls: number;
|
|
147
|
+
readonly missingCacheReadCalls: number;
|
|
148
|
+
readonly missingInputTotalCalls: number;
|
|
149
|
+
readonly unknownStatusCalls: number;
|
|
150
|
+
readonly collectionComplete: boolean;
|
|
151
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
152
|
+
readonly modelSlot: string | null;
|
|
153
|
+
}[];
|
|
154
|
+
readonly models: readonly {
|
|
155
|
+
readonly rate: {
|
|
156
|
+
readonly state: "exact";
|
|
157
|
+
readonly value: number;
|
|
158
|
+
} | {
|
|
159
|
+
readonly state: "unavailable";
|
|
160
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
161
|
+
};
|
|
162
|
+
readonly recordedCalls: number;
|
|
163
|
+
readonly coveredCalls: number;
|
|
164
|
+
readonly missingCacheReadCalls: number;
|
|
165
|
+
readonly missingInputTotalCalls: number;
|
|
166
|
+
readonly unknownStatusCalls: number;
|
|
167
|
+
readonly collectionComplete: boolean;
|
|
168
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
169
|
+
readonly modelSlot: string | null;
|
|
170
|
+
readonly provider: string | null;
|
|
171
|
+
readonly model: string | null;
|
|
172
|
+
}[];
|
|
173
|
+
};
|
|
66
174
|
configuredModels: Readonly<{
|
|
67
175
|
state: "not-recorded";
|
|
68
176
|
}> | Readonly<{
|
|
@@ -41,7 +41,61 @@ export declare function compareAdapterModelGroups(left: Pick<AdapterUsageCall, "
|
|
|
41
41
|
export declare function projectAdapterModelUsage(usage: ReadableAdapterUsageAttachment | null, models: ResolvedModelSlots | undefined, unavailable?: {
|
|
42
42
|
readonly basis: "recorded-calls" | "reported-sends" | "unavailable";
|
|
43
43
|
readonly reason: "source-invalid" | "usage-not-recorded" | "physical-call-identity-not-recorded";
|
|
44
|
-
}): Readonly<{
|
|
44
|
+
}, producerCompletenessKnown?: boolean): Readonly<{
|
|
45
|
+
cacheRead: {
|
|
46
|
+
readonly total: {
|
|
47
|
+
readonly rate: {
|
|
48
|
+
readonly state: "exact";
|
|
49
|
+
readonly value: number;
|
|
50
|
+
} | {
|
|
51
|
+
readonly state: "unavailable";
|
|
52
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
53
|
+
};
|
|
54
|
+
readonly recordedCalls: number;
|
|
55
|
+
readonly coveredCalls: number;
|
|
56
|
+
readonly missingCacheReadCalls: number;
|
|
57
|
+
readonly missingInputTotalCalls: number;
|
|
58
|
+
readonly unknownStatusCalls: number;
|
|
59
|
+
readonly collectionComplete: boolean;
|
|
60
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
61
|
+
};
|
|
62
|
+
readonly modelSlots: readonly {
|
|
63
|
+
readonly rate: {
|
|
64
|
+
readonly state: "exact";
|
|
65
|
+
readonly value: number;
|
|
66
|
+
} | {
|
|
67
|
+
readonly state: "unavailable";
|
|
68
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
69
|
+
};
|
|
70
|
+
readonly recordedCalls: number;
|
|
71
|
+
readonly coveredCalls: number;
|
|
72
|
+
readonly missingCacheReadCalls: number;
|
|
73
|
+
readonly missingInputTotalCalls: number;
|
|
74
|
+
readonly unknownStatusCalls: number;
|
|
75
|
+
readonly collectionComplete: boolean;
|
|
76
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
77
|
+
readonly modelSlot: string | null;
|
|
78
|
+
}[];
|
|
79
|
+
readonly models: readonly {
|
|
80
|
+
readonly rate: {
|
|
81
|
+
readonly state: "exact";
|
|
82
|
+
readonly value: number;
|
|
83
|
+
} | {
|
|
84
|
+
readonly state: "unavailable";
|
|
85
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
86
|
+
};
|
|
87
|
+
readonly recordedCalls: number;
|
|
88
|
+
readonly coveredCalls: number;
|
|
89
|
+
readonly missingCacheReadCalls: number;
|
|
90
|
+
readonly missingInputTotalCalls: number;
|
|
91
|
+
readonly unknownStatusCalls: number;
|
|
92
|
+
readonly collectionComplete: boolean;
|
|
93
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
94
|
+
readonly modelSlot: string | null;
|
|
95
|
+
readonly provider: string | null;
|
|
96
|
+
readonly model: string | null;
|
|
97
|
+
}[];
|
|
98
|
+
};
|
|
45
99
|
configuredModels: Readonly<{
|
|
46
100
|
state: "not-recorded";
|
|
47
101
|
}> | Readonly<{
|
|
@@ -63,6 +117,60 @@ export declare function projectAdapterModelUsage(usage: ReadableAdapterUsageAtta
|
|
|
63
117
|
state: "unavailable";
|
|
64
118
|
}>;
|
|
65
119
|
}> | Readonly<{
|
|
120
|
+
cacheRead: {
|
|
121
|
+
readonly total: {
|
|
122
|
+
readonly rate: {
|
|
123
|
+
readonly state: "exact";
|
|
124
|
+
readonly value: number;
|
|
125
|
+
} | {
|
|
126
|
+
readonly state: "unavailable";
|
|
127
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
128
|
+
};
|
|
129
|
+
readonly recordedCalls: number;
|
|
130
|
+
readonly coveredCalls: number;
|
|
131
|
+
readonly missingCacheReadCalls: number;
|
|
132
|
+
readonly missingInputTotalCalls: number;
|
|
133
|
+
readonly unknownStatusCalls: number;
|
|
134
|
+
readonly collectionComplete: boolean;
|
|
135
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
136
|
+
};
|
|
137
|
+
readonly modelSlots: readonly {
|
|
138
|
+
readonly rate: {
|
|
139
|
+
readonly state: "exact";
|
|
140
|
+
readonly value: number;
|
|
141
|
+
} | {
|
|
142
|
+
readonly state: "unavailable";
|
|
143
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
144
|
+
};
|
|
145
|
+
readonly recordedCalls: number;
|
|
146
|
+
readonly coveredCalls: number;
|
|
147
|
+
readonly missingCacheReadCalls: number;
|
|
148
|
+
readonly missingInputTotalCalls: number;
|
|
149
|
+
readonly unknownStatusCalls: number;
|
|
150
|
+
readonly collectionComplete: boolean;
|
|
151
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
152
|
+
readonly modelSlot: string | null;
|
|
153
|
+
}[];
|
|
154
|
+
readonly models: readonly {
|
|
155
|
+
readonly rate: {
|
|
156
|
+
readonly state: "exact";
|
|
157
|
+
readonly value: number;
|
|
158
|
+
} | {
|
|
159
|
+
readonly state: "unavailable";
|
|
160
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
161
|
+
};
|
|
162
|
+
readonly recordedCalls: number;
|
|
163
|
+
readonly coveredCalls: number;
|
|
164
|
+
readonly missingCacheReadCalls: number;
|
|
165
|
+
readonly missingInputTotalCalls: number;
|
|
166
|
+
readonly unknownStatusCalls: number;
|
|
167
|
+
readonly collectionComplete: boolean;
|
|
168
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
169
|
+
readonly modelSlot: string | null;
|
|
170
|
+
readonly provider: string | null;
|
|
171
|
+
readonly model: string | null;
|
|
172
|
+
}[];
|
|
173
|
+
};
|
|
66
174
|
configuredModels: Readonly<{
|
|
67
175
|
state: "not-recorded";
|
|
68
176
|
}> | Readonly<{
|
|
@@ -41,7 +41,61 @@ export declare function compareAdapterModelGroups(left: Pick<AdapterUsageCall, "
|
|
|
41
41
|
export declare function projectAdapterModelUsage(usage: ReadableAdapterUsageAttachment | null, models: ResolvedModelSlots | undefined, unavailable?: {
|
|
42
42
|
readonly basis: "recorded-calls" | "reported-sends" | "unavailable";
|
|
43
43
|
readonly reason: "source-invalid" | "usage-not-recorded" | "physical-call-identity-not-recorded";
|
|
44
|
-
}): Readonly<{
|
|
44
|
+
}, producerCompletenessKnown?: boolean): Readonly<{
|
|
45
|
+
cacheRead: {
|
|
46
|
+
readonly total: {
|
|
47
|
+
readonly rate: {
|
|
48
|
+
readonly state: "exact";
|
|
49
|
+
readonly value: number;
|
|
50
|
+
} | {
|
|
51
|
+
readonly state: "unavailable";
|
|
52
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
53
|
+
};
|
|
54
|
+
readonly recordedCalls: number;
|
|
55
|
+
readonly coveredCalls: number;
|
|
56
|
+
readonly missingCacheReadCalls: number;
|
|
57
|
+
readonly missingInputTotalCalls: number;
|
|
58
|
+
readonly unknownStatusCalls: number;
|
|
59
|
+
readonly collectionComplete: boolean;
|
|
60
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
61
|
+
};
|
|
62
|
+
readonly modelSlots: readonly {
|
|
63
|
+
readonly rate: {
|
|
64
|
+
readonly state: "exact";
|
|
65
|
+
readonly value: number;
|
|
66
|
+
} | {
|
|
67
|
+
readonly state: "unavailable";
|
|
68
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
69
|
+
};
|
|
70
|
+
readonly recordedCalls: number;
|
|
71
|
+
readonly coveredCalls: number;
|
|
72
|
+
readonly missingCacheReadCalls: number;
|
|
73
|
+
readonly missingInputTotalCalls: number;
|
|
74
|
+
readonly unknownStatusCalls: number;
|
|
75
|
+
readonly collectionComplete: boolean;
|
|
76
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
77
|
+
readonly modelSlot: string | null;
|
|
78
|
+
}[];
|
|
79
|
+
readonly models: readonly {
|
|
80
|
+
readonly rate: {
|
|
81
|
+
readonly state: "exact";
|
|
82
|
+
readonly value: number;
|
|
83
|
+
} | {
|
|
84
|
+
readonly state: "unavailable";
|
|
85
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
86
|
+
};
|
|
87
|
+
readonly recordedCalls: number;
|
|
88
|
+
readonly coveredCalls: number;
|
|
89
|
+
readonly missingCacheReadCalls: number;
|
|
90
|
+
readonly missingInputTotalCalls: number;
|
|
91
|
+
readonly unknownStatusCalls: number;
|
|
92
|
+
readonly collectionComplete: boolean;
|
|
93
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
94
|
+
readonly modelSlot: string | null;
|
|
95
|
+
readonly provider: string | null;
|
|
96
|
+
readonly model: string | null;
|
|
97
|
+
}[];
|
|
98
|
+
};
|
|
45
99
|
configuredModels: Readonly<{
|
|
46
100
|
state: "not-recorded";
|
|
47
101
|
}> | Readonly<{
|
|
@@ -63,6 +117,60 @@ export declare function projectAdapterModelUsage(usage: ReadableAdapterUsageAtta
|
|
|
63
117
|
state: "unavailable";
|
|
64
118
|
}>;
|
|
65
119
|
}> | Readonly<{
|
|
120
|
+
cacheRead: {
|
|
121
|
+
readonly total: {
|
|
122
|
+
readonly rate: {
|
|
123
|
+
readonly state: "exact";
|
|
124
|
+
readonly value: number;
|
|
125
|
+
} | {
|
|
126
|
+
readonly state: "unavailable";
|
|
127
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
128
|
+
};
|
|
129
|
+
readonly recordedCalls: number;
|
|
130
|
+
readonly coveredCalls: number;
|
|
131
|
+
readonly missingCacheReadCalls: number;
|
|
132
|
+
readonly missingInputTotalCalls: number;
|
|
133
|
+
readonly unknownStatusCalls: number;
|
|
134
|
+
readonly collectionComplete: boolean;
|
|
135
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
136
|
+
};
|
|
137
|
+
readonly modelSlots: readonly {
|
|
138
|
+
readonly rate: {
|
|
139
|
+
readonly state: "exact";
|
|
140
|
+
readonly value: number;
|
|
141
|
+
} | {
|
|
142
|
+
readonly state: "unavailable";
|
|
143
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
144
|
+
};
|
|
145
|
+
readonly recordedCalls: number;
|
|
146
|
+
readonly coveredCalls: number;
|
|
147
|
+
readonly missingCacheReadCalls: number;
|
|
148
|
+
readonly missingInputTotalCalls: number;
|
|
149
|
+
readonly unknownStatusCalls: number;
|
|
150
|
+
readonly collectionComplete: boolean;
|
|
151
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
152
|
+
readonly modelSlot: string | null;
|
|
153
|
+
}[];
|
|
154
|
+
readonly models: readonly {
|
|
155
|
+
readonly rate: {
|
|
156
|
+
readonly state: "exact";
|
|
157
|
+
readonly value: number;
|
|
158
|
+
} | {
|
|
159
|
+
readonly state: "unavailable";
|
|
160
|
+
readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
|
|
161
|
+
};
|
|
162
|
+
readonly recordedCalls: number;
|
|
163
|
+
readonly coveredCalls: number;
|
|
164
|
+
readonly missingCacheReadCalls: number;
|
|
165
|
+
readonly missingInputTotalCalls: number;
|
|
166
|
+
readonly unknownStatusCalls: number;
|
|
167
|
+
readonly collectionComplete: boolean;
|
|
168
|
+
readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
|
|
169
|
+
readonly modelSlot: string | null;
|
|
170
|
+
readonly provider: string | null;
|
|
171
|
+
readonly model: string | null;
|
|
172
|
+
}[];
|
|
173
|
+
};
|
|
66
174
|
configuredModels: Readonly<{
|
|
67
175
|
state: "not-recorded";
|
|
68
176
|
}> | Readonly<{
|