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.
Files changed (258) hide show
  1. package/dist/cli/bootstrap.cjs +7 -1
  2. package/dist/cli/bootstrap.cjs.map +1 -1
  3. package/dist/cli/project-configuration.cjs +8 -11
  4. package/dist/cli/project-configuration.cjs.map +1 -1
  5. package/dist/expect/index.cjs.map +1 -1
  6. package/dist/expect/index.d.cts +1 -0
  7. package/dist/expect/index.d.mts +1 -0
  8. package/dist/expect/index.d.ts +1 -0
  9. package/dist/experiment/host/cli/contribution.cjs +6 -11
  10. package/dist/experiment/host/cli/contribution.cjs.map +1 -1
  11. package/dist/experiment/host/cli/contribution.d.cts +0 -16
  12. package/dist/experiment/host/cli/contribution.d.mts +0 -16
  13. package/dist/experiment/host/cli/contribution.d.ts +0 -16
  14. package/dist/experiment/host/operations.cjs +3 -3
  15. package/dist/experiment/host/operations.cjs.map +1 -1
  16. package/dist/experiment/host/types.cjs.map +1 -1
  17. package/dist/experiment/host/types.d.cts +0 -4
  18. package/dist/experiment/host/types.d.mts +0 -4
  19. package/dist/experiment/host/types.d.ts +0 -4
  20. package/dist/fresh-import.cjs +2 -2
  21. package/dist/fresh-import.cjs.map +1 -1
  22. package/dist/fresh-import.d.cts +3 -3
  23. package/dist/fresh-import.d.mts +3 -3
  24. package/dist/fresh-import.d.ts +3 -3
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +1 -0
  27. package/dist/index.d.mts +1 -0
  28. package/dist/index.d.ts +1 -0
  29. package/dist/inspection/codec.cjs.map +1 -1
  30. package/dist/inspection/codec.d.cts +1 -1
  31. package/dist/inspection/codec.d.mts +1 -1
  32. package/dist/inspection/codec.d.ts +1 -1
  33. package/dist/inspection/facts.cjs +66 -9
  34. package/dist/inspection/facts.cjs.map +1 -1
  35. package/dist/inspection/facts.d.cts +4 -0
  36. package/dist/inspection/facts.d.mts +4 -0
  37. package/dist/inspection/facts.d.ts +4 -0
  38. package/dist/inspection/facts.js +4 -2
  39. package/dist/inspection/index.cjs +1 -3
  40. package/dist/inspection/index.cjs.map +1 -1
  41. package/dist/inspection/index.d.cts +1 -1
  42. package/dist/inspection/index.d.mts +1 -1
  43. package/dist/inspection/index.d.ts +1 -1
  44. package/dist/inspection/index.js +44 -48
  45. package/dist/inspection/limits.cjs +3 -1
  46. package/dist/inspection/limits.cjs.map +1 -1
  47. package/dist/inspection/limits.d.cts +2 -0
  48. package/dist/inspection/limits.d.mts +2 -0
  49. package/dist/inspection/limits.d.ts +2 -0
  50. package/dist/inspection/limits.js +6 -4
  51. package/dist/inspection/project-source.cjs +4 -1
  52. package/dist/inspection/project-source.cjs.map +1 -1
  53. package/dist/inspection/protocol.cjs +10 -18
  54. package/dist/inspection/protocol.cjs.map +1 -1
  55. package/dist/inspection/protocol.d.cts +111 -173
  56. package/dist/inspection/protocol.d.mts +111 -173
  57. package/dist/inspection/protocol.d.ts +111 -173
  58. package/dist/inspection/public.mjs +73 -109
  59. package/dist/inspection/results.cjs +12 -48
  60. package/dist/inspection/results.cjs.map +1 -1
  61. package/dist/inspection/results.d.cts +124 -122
  62. package/dist/inspection/results.d.mts +124 -122
  63. package/dist/inspection/results.d.ts +124 -122
  64. package/dist/inspection/results.js +16 -20
  65. package/dist/inspection/select.cjs +80 -117
  66. package/dist/inspection/select.cjs.map +1 -1
  67. package/dist/inspection/source.cjs +14 -15
  68. package/dist/inspection/source.cjs.map +1 -1
  69. package/dist/inspection/source.d.cts +6 -3
  70. package/dist/inspection/source.d.mts +6 -3
  71. package/dist/inspection/source.d.ts +6 -3
  72. package/dist/inspection/trace.cjs +1 -1
  73. package/dist/inspection/trace.cjs.map +1 -1
  74. package/dist/load-config.cjs +17 -11
  75. package/dist/load-config.cjs.map +1 -1
  76. package/dist/load-config.d.cts +3 -2
  77. package/dist/load-config.d.mts +3 -2
  78. package/dist/load-config.d.ts +3 -2
  79. package/dist/o11y/adapter-usage-projection.cjs +5 -1
  80. package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
  81. package/dist/o11y/adapter-usage-projection.d.cts +109 -1
  82. package/dist/o11y/adapter-usage-projection.d.mts +109 -1
  83. package/dist/o11y/adapter-usage-projection.d.ts +109 -1
  84. package/dist/o11y/cache-read.cjs +113 -0
  85. package/dist/o11y/cache-read.cjs.map +1 -0
  86. package/dist/o11y/cache-read.d.cts +80 -0
  87. package/dist/o11y/cache-read.d.mts +80 -0
  88. package/dist/o11y/cache-read.d.ts +80 -0
  89. package/dist/o11y/cache-read.js +8 -0
  90. package/dist/o11y/cache-read.js.map +1 -0
  91. package/dist/o11y/eval-usage.cjs +4 -1
  92. package/dist/o11y/eval-usage.cjs.map +1 -1
  93. package/dist/o11y/eval-usage.d.cts +4 -1
  94. package/dist/o11y/eval-usage.d.mts +4 -1
  95. package/dist/o11y/eval-usage.d.ts +4 -1
  96. package/dist/record/host/sqlite-host.cjs +188 -53
  97. package/dist/record/host/sqlite-host.cjs.map +1 -1
  98. package/dist/record/host/sqlite-host.d.cts +37 -1
  99. package/dist/record/host/sqlite-host.d.mts +37 -1
  100. package/dist/record/host/sqlite-host.d.ts +37 -1
  101. package/dist/record/host/sqlite-host.js +16 -8
  102. package/dist/record/maintenance/runtime.cjs +3 -3
  103. package/dist/record/maintenance/runtime.cjs.map +1 -1
  104. package/dist/record/sqlite/admission-repository.cjs +18 -18
  105. package/dist/record/sqlite/admission-repository.cjs.map +1 -1
  106. package/dist/record/sqlite/case-repository.cjs +6 -6
  107. package/dist/record/sqlite/case-repository.cjs.map +1 -1
  108. package/dist/record/sqlite/coordination-repository.cjs +25 -25
  109. package/dist/record/sqlite/coordination-repository.cjs.map +1 -1
  110. package/dist/record/sqlite/current-schema.cjs +115 -111
  111. package/dist/record/sqlite/current-schema.cjs.map +1 -1
  112. package/dist/record/sqlite/current-schema.d.cts +3 -3
  113. package/dist/record/sqlite/current-schema.d.mts +3 -3
  114. package/dist/record/sqlite/current-schema.d.ts +3 -3
  115. package/dist/record/sqlite/database.cjs +56 -53
  116. package/dist/record/sqlite/database.cjs.map +1 -1
  117. package/dist/record/sqlite/index.cjs +3 -1
  118. package/dist/record/sqlite/index.cjs.map +1 -1
  119. package/dist/record/sqlite/index.d.cts +5 -2
  120. package/dist/record/sqlite/index.d.mts +5 -2
  121. package/dist/record/sqlite/index.d.ts +5 -2
  122. package/dist/record/sqlite/legacy-schema-018.cjs +443 -0
  123. package/dist/record/sqlite/legacy-schema-018.cjs.map +1 -0
  124. package/dist/record/sqlite/legacy-schema-018.d.cts +6 -0
  125. package/dist/record/sqlite/legacy-schema-018.d.mts +6 -0
  126. package/dist/record/sqlite/legacy-schema-018.d.ts +6 -0
  127. package/dist/record/sqlite/legacy-schema-018.js +6 -0
  128. package/dist/record/sqlite/legacy-schema-018.js.map +1 -0
  129. package/dist/record/sqlite/migration.cjs +105 -46
  130. package/dist/record/sqlite/migration.cjs.map +1 -1
  131. package/dist/record/sqlite/migration.d.cts +2 -1
  132. package/dist/record/sqlite/migration.d.mts +2 -1
  133. package/dist/record/sqlite/migration.d.ts +2 -1
  134. package/dist/record/sqlite/portable-capture.cjs +13 -13
  135. package/dist/record/sqlite/portable-capture.cjs.map +1 -1
  136. package/dist/record/sqlite/registry-repository.cjs +22 -22
  137. package/dist/record/sqlite/registry-repository.cjs.map +1 -1
  138. package/dist/record/sqlite/schema.cjs +10 -2
  139. package/dist/record/sqlite/schema.cjs.map +1 -1
  140. package/dist/record/sqlite/schema.d.cts +4 -1
  141. package/dist/record/sqlite/schema.d.mts +4 -1
  142. package/dist/record/sqlite/schema.d.ts +4 -1
  143. package/dist/record/sqlite/schema.js +20 -14
  144. package/dist/record/sqlite/storage-worker.cjs +1 -1
  145. package/dist/record/sqlite/storage-worker.cjs.map +1 -1
  146. package/dist/record/sqlite/storage.cjs +316 -232
  147. package/dist/record/sqlite/storage.cjs.map +1 -1
  148. package/dist/record/sqlite/storage.d.cts +10 -2
  149. package/dist/record/sqlite/storage.d.mts +10 -2
  150. package/dist/record/sqlite/storage.d.ts +10 -2
  151. package/dist/record/sqlite/storage.js +54 -50
  152. package/dist/record/sqlite/types.cjs +1 -1
  153. package/dist/record/sqlite/types.cjs.map +1 -1
  154. package/dist/record/sqlite/types.d.cts +13 -1
  155. package/dist/record/sqlite/types.d.mts +13 -1
  156. package/dist/record/sqlite/types.d.ts +13 -1
  157. package/dist/run/cli/contribution.cjs +17 -12
  158. package/dist/run/cli/contribution.cjs.map +1 -1
  159. package/dist/run/host/lifecycle-adapter.cjs +1 -1
  160. package/dist/run/host/lifecycle-adapter.cjs.map +1 -1
  161. package/dist/run/storage/owner-identity.cjs +78 -16
  162. package/dist/run/storage/owner-identity.cjs.map +1 -1
  163. package/dist/run/storage/owner-identity.d.cts +2 -1
  164. package/dist/run/storage/owner-identity.d.mts +2 -1
  165. package/dist/run/storage/owner-identity.d.ts +2 -1
  166. package/dist/run/storage/sqlite.cjs +55 -55
  167. package/dist/run/storage/sqlite.cjs.map +1 -1
  168. package/dist/runner/accept.cjs +12 -42
  169. package/dist/runner/accept.cjs.map +1 -1
  170. package/dist/runner/accept.d.cts +2 -3
  171. package/dist/runner/accept.d.mts +2 -3
  172. package/dist/runner/accept.d.ts +2 -3
  173. package/dist/runner/adapter-usage.cjs +2 -2
  174. package/dist/runner/adapter-usage.cjs.map +1 -1
  175. package/dist/runner/adoption.cjs +14 -26
  176. package/dist/runner/adoption.cjs.map +1 -1
  177. package/dist/runner/adoption.d.cts +5 -13
  178. package/dist/runner/adoption.d.mts +5 -13
  179. package/dist/runner/adoption.d.ts +5 -13
  180. package/dist/runner/adoption.js +2 -4
  181. package/dist/runner/record.cjs +24 -18
  182. package/dist/runner/record.cjs.map +1 -1
  183. package/dist/runner/rename-experiment.cjs +5 -7
  184. package/dist/runner/rename-experiment.cjs.map +1 -1
  185. package/dist/runner/reuse-plan.cjs +37 -18
  186. package/dist/runner/reuse-plan.cjs.map +1 -1
  187. package/dist/runner/reuse-plan.d.cts +4 -1
  188. package/dist/runner/reuse-plan.d.mts +4 -1
  189. package/dist/runner/reuse-plan.d.ts +4 -1
  190. package/dist/runner/setup-prefix-plan.cjs +17 -12
  191. package/dist/runner/setup-prefix-plan.cjs.map +1 -1
  192. package/dist/runner/setup-prefix-plan.d.cts +0 -2
  193. package/dist/runner/setup-prefix-plan.d.mts +0 -2
  194. package/dist/runner/setup-prefix-plan.d.ts +0 -2
  195. package/dist/runner/setup-prefix-plan.js +8 -12
  196. package/dist/sandbox/backend.cjs +10 -1
  197. package/dist/sandbox/backend.cjs.map +1 -1
  198. package/dist/sandbox/backend.d.cts +16 -8
  199. package/dist/sandbox/backend.d.mts +16 -8
  200. package/dist/sandbox/backend.d.ts +16 -8
  201. package/dist/sandbox/backend.js +28 -26
  202. package/dist/sandbox/docker.cjs +7 -1
  203. package/dist/sandbox/docker.cjs.map +1 -1
  204. package/dist/sandbox/e2b-cache-repository.cjs +13 -3
  205. package/dist/sandbox/e2b-cache-repository.cjs.map +1 -1
  206. package/dist/sandbox/e2b-cache-repository.d.cts +3 -0
  207. package/dist/sandbox/e2b-cache-repository.d.mts +3 -0
  208. package/dist/sandbox/e2b-cache-repository.d.ts +3 -0
  209. package/dist/sandbox/e2b-cache-repository.js +16 -12
  210. package/dist/sandbox/e2b.cjs +2 -2
  211. package/dist/sandbox/e2b.cjs.map +1 -1
  212. package/dist/sandbox/incus/materialize.cjs +1 -1
  213. package/dist/sandbox/incus/materialize.cjs.map +1 -1
  214. package/dist/show/contribution.cjs +3 -3
  215. package/dist/show/contribution.cjs.map +1 -1
  216. package/dist/show/model.cjs +14 -13
  217. package/dist/show/model.cjs.map +1 -1
  218. package/dist/show/model.d.cts +7 -7
  219. package/dist/show/model.d.mts +7 -7
  220. package/dist/show/model.d.ts +7 -7
  221. package/dist/show/render.cjs +14 -0
  222. package/dist/show/render.cjs.map +1 -1
  223. package/dist/user-database/storage-worker.cjs +13 -3
  224. package/dist/user-database/storage-worker.cjs.map +1 -1
  225. package/dist/view/app-dist/.vite/manifest.json +2 -2
  226. package/dist/view/app-dist/assets/{index-CmVoXbwG.js → index-B3ijZRph.js} +17 -17
  227. package/dist/view/app-dist/assets/{quality-cost-scatter-BuLISaH4.js → quality-cost-scatter-B--DfJ9s.js} +1 -1
  228. package/dist/view/app-dist/index.html +1 -1
  229. package/dist/view/application-runtime.cjs +8 -0
  230. package/dist/view/application-runtime.cjs.map +1 -0
  231. package/dist/view/application-runtime.d.cts +9 -0
  232. package/dist/view/application-runtime.d.mts +9 -0
  233. package/dist/view/application-runtime.d.ts +9 -0
  234. package/dist/view/application-runtime.js +6 -0
  235. package/dist/view/application-runtime.js.map +1 -0
  236. package/dist/view/cli/contribution.cjs +5 -2
  237. package/dist/view/cli/contribution.cjs.map +1 -1
  238. package/dist/view/cli/contribution.d.cts +2 -1
  239. package/dist/view/cli/contribution.d.mts +2 -1
  240. package/dist/view/cli/contribution.d.ts +2 -1
  241. package/dist/view/function-runtime.mjs +1019 -456
  242. package/dist/view/http-protocol.d.cts +1 -9
  243. package/dist/view/http-protocol.d.mts +1 -9
  244. package/dist/view/http-protocol.d.ts +1 -9
  245. package/dist/view/inspection-host.cjs +39 -30
  246. package/dist/view/inspection-host.cjs.map +1 -1
  247. package/dist/view/inspection-host.d.cts +7545 -2
  248. package/dist/view/inspection-host.d.mts +7545 -2
  249. package/dist/view/inspection-host.d.ts +7545 -2
  250. package/dist/view/server.cjs +8 -5
  251. package/dist/view/server.cjs.map +1 -1
  252. package/dist/view/server.d.cts +4 -2
  253. package/dist/view/server.d.mts +4 -2
  254. package/dist/view/server.d.ts +4 -2
  255. package/docs-site/zh/reference/cli.mdx +1 -2
  256. package/docs-site/zh/tutorials/control-run-cost.mdx +22 -0
  257. package/docs-site/zh/tutorials/niceeval-taste-application.mdx +21 -0
  258. package/package.json +1 -1
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CacheReadReportSchema = void 0;
4
+ exports.projectCacheRead = projectCacheRead;
5
+ const effect_1 = require("effect");
6
+ const common_ts_1 = require("../record/family/common.cjs");
7
+ const Reason = effect_1.Schema.Literals([
8
+ "usage-not-recorded", "source-invalid", "adapter-usage-required", "collection-incomplete",
9
+ "call-status-unknown", "no-calls", "cache-read-missing", "input-total-missing", "zero-input-total", "unsafe-token-total",
10
+ ]);
11
+ const Rate = effect_1.Schema.Union([
12
+ effect_1.Schema.Struct({ state: effect_1.Schema.Literal("exact"), value: effect_1.Schema.Number.check(effect_1.Schema.makeFilter((value) => Number.isFinite(value) && value >= 0 && value <= 1)) }),
13
+ effect_1.Schema.Struct({ state: effect_1.Schema.Literal("unavailable"), reason: Reason }),
14
+ ]);
15
+ const fields = {
16
+ rate: Rate,
17
+ recordedCalls: common_ts_1.NonNegativeSafeIntegerSchema,
18
+ coveredCalls: common_ts_1.NonNegativeSafeIntegerSchema,
19
+ missingCacheReadCalls: common_ts_1.NonNegativeSafeIntegerSchema,
20
+ missingInputTotalCalls: common_ts_1.NonNegativeSafeIntegerSchema,
21
+ unknownStatusCalls: common_ts_1.NonNegativeSafeIntegerSchema,
22
+ collectionComplete: effect_1.Schema.Boolean,
23
+ reasons: effect_1.Schema.Array(Reason),
24
+ };
25
+ const consistent = (value) => {
26
+ const count = value.recordedCalls;
27
+ return count <= 4000 && value.coveredCalls <= count && value.unknownStatusCalls <= count &&
28
+ value.missingCacheReadCalls <= count && value.missingInputTotalCalls <= count &&
29
+ value.coveredCalls <= count - Math.max(value.missingCacheReadCalls, value.missingInputTotalCalls) &&
30
+ value.coveredCalls >= count - value.missingCacheReadCalls - value.missingInputTotalCalls &&
31
+ new Set(value.reasons).size === value.reasons.length &&
32
+ (value.rate.state === "exact" ? value.reasons.length === 0 && value.collectionComplete && count > 0 &&
33
+ value.coveredCalls === count && value.unknownStatusCalls === 0 : value.rate.reason === value.reasons[0]);
34
+ };
35
+ const SummaryShape = effect_1.Schema.Struct(fields);
36
+ const Summary = SummaryShape.check(effect_1.Schema.makeFilter(consistent));
37
+ exports.CacheReadReportSchema = effect_1.Schema.Struct({
38
+ total: Summary,
39
+ modelSlots: effect_1.Schema.Array(effect_1.Schema.Struct({ modelSlot: effect_1.Schema.NullOr(effect_1.Schema.String), ...fields }).check(effect_1.Schema.makeFilter(consistent))),
40
+ models: effect_1.Schema.Array(effect_1.Schema.Struct({ modelSlot: effect_1.Schema.NullOr(effect_1.Schema.String), provider: effect_1.Schema.NullOr(effect_1.Schema.String), model: effect_1.Schema.NullOr(effect_1.Schema.String), ...fields }).check(effect_1.Schema.makeFilter(consistent))),
41
+ }).check(effect_1.Schema.makeFilter((value) => value.modelSlots.length <= 65 && value.models.length <= 4000));
42
+ function summary(calls, collectionComplete, absent) {
43
+ let numerator = 0;
44
+ let denominator = 0;
45
+ let coveredCalls = 0;
46
+ let missingCacheReadCalls = 0;
47
+ let missingInputTotalCalls = 0;
48
+ let unknownStatusCalls = 0;
49
+ let unsafe = false;
50
+ for (const call of calls) {
51
+ const total = call.inputTotalTokens ?? (call.inputTokens !== null && call.cacheReadTokens !== null && call.cacheWriteTokens !== null
52
+ ? call.inputTokens + call.cacheReadTokens + call.cacheWriteTokens : null);
53
+ if (call.status === "unknown")
54
+ unknownStatusCalls++;
55
+ if (call.cacheReadTokens === null)
56
+ missingCacheReadCalls++;
57
+ else
58
+ numerator += call.cacheReadTokens;
59
+ if (total === null)
60
+ missingInputTotalCalls++;
61
+ else
62
+ denominator += total;
63
+ if (total !== null && call.cacheReadTokens !== null)
64
+ coveredCalls++;
65
+ if ((total !== null && !Number.isSafeInteger(total)) || !Number.isSafeInteger(numerator) || !Number.isSafeInteger(denominator))
66
+ unsafe = true;
67
+ }
68
+ const reasons = absent === undefined ? [
69
+ ...(!collectionComplete ? ["collection-incomplete"] : []),
70
+ ...(unknownStatusCalls > 0 ? ["call-status-unknown"] : []),
71
+ ...(calls.length === 0 ? ["no-calls"] : []),
72
+ ...(missingCacheReadCalls > 0 ? ["cache-read-missing"] : []),
73
+ ...(missingInputTotalCalls > 0 ? ["input-total-missing"] : []),
74
+ ...(calls.length > 0 && missingInputTotalCalls === 0 && denominator === 0 ? ["zero-input-total"] : []),
75
+ ...(unsafe ? ["unsafe-token-total"] : []),
76
+ ] : [absent];
77
+ const rate = reasons.length === 0
78
+ ? Object.freeze({ state: "exact", value: numerator / denominator })
79
+ : Object.freeze({ state: "unavailable", reason: reasons[0] });
80
+ return Object.freeze({ rate, recordedCalls: calls.length, coveredCalls, missingCacheReadCalls, missingInputTotalCalls,
81
+ unknownStatusCalls, collectionComplete, reasons: Object.freeze(reasons) });
82
+ }
83
+ const compare = (a, b) => a === b ? 0 : a === null ? -1 : b === null ? 1 : a < b ? -1 : 1;
84
+ /** A historical collection marked complete is not proof of an explicit producer seal. */
85
+ function projectCacheRead(usage, slots, producerCompletenessKnown, absent = "usage-not-recorded") {
86
+ if (usage === null)
87
+ return Object.freeze({ total: summary([], false, absent), modelSlots: Object.freeze([]), models: Object.freeze([]) });
88
+ const complete = producerCompletenessKnown && usage.collection.state === "complete";
89
+ const bySlot = new Map(Object.keys(slots ?? {}).map((slot) => [slot, []]));
90
+ const byModel = new Map();
91
+ for (const call of usage.calls) {
92
+ const slot = bySlot.get(call.modelSlot);
93
+ if (slot === undefined)
94
+ bySlot.set(call.modelSlot, [call]);
95
+ else
96
+ slot.push(call);
97
+ const key = JSON.stringify([call.modelSlot, call.provider, call.model]);
98
+ const model = byModel.get(key);
99
+ if (model === undefined)
100
+ byModel.set(key, [call]);
101
+ else
102
+ model.push(call);
103
+ }
104
+ const models = [...byModel.values()].map((calls) => {
105
+ const { modelSlot, provider, model } = calls[0];
106
+ return Object.freeze({ modelSlot, provider, model, ...summary(calls, complete) });
107
+ }).sort((a, b) => compare(a.modelSlot, b.modelSlot) || compare(a.provider, b.provider) || compare(a.model, b.model));
108
+ return Object.freeze({ total: summary(usage.calls, complete),
109
+ modelSlots: Object.freeze([...bySlot].sort(([a], [b]) => compare(a, b)).map(([modelSlot, calls]) => Object.freeze({ modelSlot, ...summary(calls, complete) }))),
110
+ models: Object.freeze(models),
111
+ });
112
+ }
113
+ //# sourceMappingURL=cache-read.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-read.js","sourceRoot":"","sources":["cache-read.ts"],"names":[],"mappings":"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","sourcesContent":["import { Schema } from \"effect\";\nimport type { ResolvedModelSlots } from \"../model-slots.ts\";\nimport type { AdapterUsageCall, ReadableAdapterUsageAttachment } from \"../record/family/adapter-usage/schema.ts\";\nimport { NonNegativeSafeIntegerSchema } from \"../record/family/common.ts\";\nconst Reason = Schema.Literals([\n \"usage-not-recorded\", \"source-invalid\", \"adapter-usage-required\", \"collection-incomplete\",\n \"call-status-unknown\", \"no-calls\", \"cache-read-missing\", \"input-total-missing\", \"zero-input-total\", \"unsafe-token-total\",\n]);\ntype Reason = typeof Reason.Type;\nconst Rate = Schema.Union([\n Schema.Struct({ state: Schema.Literal(\"exact\"), value: Schema.Number.check(Schema.makeFilter((value) => Number.isFinite(value) && value >= 0 && value <= 1)) }),\n Schema.Struct({ state: Schema.Literal(\"unavailable\"), reason: Reason }),\n]);\nconst fields = {\n rate: Rate,\n recordedCalls: NonNegativeSafeIntegerSchema,\n coveredCalls: NonNegativeSafeIntegerSchema,\n missingCacheReadCalls: NonNegativeSafeIntegerSchema,\n missingInputTotalCalls: NonNegativeSafeIntegerSchema,\n unknownStatusCalls: NonNegativeSafeIntegerSchema,\n collectionComplete: Schema.Boolean,\n reasons: Schema.Array(Reason),\n};\nconst consistent = (value: typeof SummaryShape.Type): boolean => {\n const count = value.recordedCalls;\n return count <= 4000 && value.coveredCalls <= count && value.unknownStatusCalls <= count &&\n value.missingCacheReadCalls <= count && value.missingInputTotalCalls <= count &&\n value.coveredCalls <= count - Math.max(value.missingCacheReadCalls, value.missingInputTotalCalls) &&\n value.coveredCalls >= count - value.missingCacheReadCalls - value.missingInputTotalCalls &&\n new Set(value.reasons).size === value.reasons.length &&\n (value.rate.state === \"exact\" ? value.reasons.length === 0 && value.collectionComplete && count > 0 &&\n value.coveredCalls === count && value.unknownStatusCalls === 0 : value.rate.reason === value.reasons[0]);\n};\nconst SummaryShape = Schema.Struct(fields);\nconst Summary = SummaryShape.check(Schema.makeFilter(consistent));\n/** Token-weighted cache reading, with explicit input coverage and collection completeness. */\nexport type CacheReadSummary = typeof Summary.Type;\nexport const CacheReadReportSchema = Schema.Struct({\n total: Summary,\n modelSlots: Schema.Array(Schema.Struct({ modelSlot: Schema.NullOr(Schema.String), ...fields }).check(Schema.makeFilter(consistent))),\n models: Schema.Array(Schema.Struct({ modelSlot: Schema.NullOr(Schema.String), provider: Schema.NullOr(Schema.String), model: Schema.NullOr(Schema.String), ...fields }).check(Schema.makeFilter(consistent))),\n}).check(Schema.makeFilter((value) => value.modelSlots.length <= 65 && value.models.length <= 4000));\n/** Complete per-Attempt report; unknown model identities remain null. */\nexport type CacheReadReport = typeof CacheReadReportSchema.Type;\nfunction summary(calls: readonly AdapterUsageCall[], collectionComplete: boolean, absent?: Reason): CacheReadSummary {\n let numerator = 0;\n let denominator = 0;\n let coveredCalls = 0;\n let missingCacheReadCalls = 0;\n let missingInputTotalCalls = 0;\n let unknownStatusCalls = 0;\n let unsafe = false;\n for (const call of calls) {\n const total = call.inputTotalTokens ?? (call.inputTokens !== null && call.cacheReadTokens !== null && call.cacheWriteTokens !== null\n ? call.inputTokens + call.cacheReadTokens + call.cacheWriteTokens : null);\n if (call.status === \"unknown\")\n unknownStatusCalls++;\n if (call.cacheReadTokens === null)\n missingCacheReadCalls++;\n else\n numerator += call.cacheReadTokens;\n if (total === null)\n missingInputTotalCalls++;\n else\n denominator += total;\n if (total !== null && call.cacheReadTokens !== null)\n coveredCalls++;\n if ((total !== null && !Number.isSafeInteger(total)) || !Number.isSafeInteger(numerator) || !Number.isSafeInteger(denominator))\n unsafe = true;\n }\n const reasons: Reason[] = absent === undefined ? [\n ...(!collectionComplete ? [\"collection-incomplete\" as const] : []),\n ...(unknownStatusCalls > 0 ? [\"call-status-unknown\" as const] : []),\n ...(calls.length === 0 ? [\"no-calls\" as const] : []),\n ...(missingCacheReadCalls > 0 ? [\"cache-read-missing\" as const] : []),\n ...(missingInputTotalCalls > 0 ? [\"input-total-missing\" as const] : []),\n ...(calls.length > 0 && missingInputTotalCalls === 0 && denominator === 0 ? [\"zero-input-total\" as const] : []),\n ...(unsafe ? [\"unsafe-token-total\" as const] : []),\n ] : [absent];\n const rate: CacheReadSummary[\"rate\"] = reasons.length === 0\n ? Object.freeze({ state: \"exact\", value: numerator / denominator })\n : Object.freeze({ state: \"unavailable\", reason: reasons[0]! });\n return Object.freeze({ rate, recordedCalls: calls.length, coveredCalls, missingCacheReadCalls, missingInputTotalCalls,\n unknownStatusCalls, collectionComplete, reasons: Object.freeze(reasons) });\n}\nconst compare = (a: string | null, b: string | null): number => a === b ? 0 : a === null ? -1 : b === null ? 1 : a < b ? -1 : 1;\n/** A historical collection marked complete is not proof of an explicit producer seal. */\nexport function projectCacheRead(usage: ReadableAdapterUsageAttachment | null, slots: ResolvedModelSlots | undefined, producerCompletenessKnown: boolean, absent: \"usage-not-recorded\" | \"source-invalid\" | \"adapter-usage-required\" = \"usage-not-recorded\"): CacheReadReport {\n if (usage === null)\n return Object.freeze({ total: summary([], false, absent), modelSlots: Object.freeze([]), models: Object.freeze([]) });\n const complete = producerCompletenessKnown && usage.collection.state === \"complete\";\n const bySlot = new Map<string | null, AdapterUsageCall[]>(Object.keys(slots ?? {}).map((slot) => [slot, []]));\n const byModel = new Map<string, AdapterUsageCall[]>();\n for (const call of usage.calls) {\n const slot = bySlot.get(call.modelSlot);\n if (slot === undefined)\n bySlot.set(call.modelSlot, [call]);\n else\n slot.push(call);\n const key = JSON.stringify([call.modelSlot, call.provider, call.model]);\n const model = byModel.get(key);\n if (model === undefined)\n byModel.set(key, [call]);\n else\n model.push(call);\n }\n const models = [...byModel.values()].map((calls) => {\n const { modelSlot, provider, model } = calls[0]!;\n return Object.freeze({ modelSlot, provider, model, ...summary(calls, complete) });\n }).sort((a, b) => compare(a.modelSlot, b.modelSlot) || compare(a.provider, b.provider) || compare(a.model, b.model));\n return Object.freeze({ total: summary(usage.calls, complete),\n modelSlots: Object.freeze([...bySlot].sort(([a], [b]) => compare(a, b)).map(([modelSlot, calls]) => Object.freeze({ modelSlot, ...summary(calls, complete) }))),\n models: Object.freeze(models),\n });\n}\n"]}
@@ -0,0 +1,80 @@
1
+ import { Schema } from "effect";
2
+ import type { ResolvedModelSlots } from "../model-slots.cjs";
3
+ import type { ReadableAdapterUsageAttachment } from "../record/family/adapter-usage/schema.cjs";
4
+ declare const Summary: Schema.Struct<{
5
+ rate: Schema.Union<readonly [Schema.Struct<{
6
+ readonly state: Schema.Literal<"exact">;
7
+ readonly value: Schema.Number;
8
+ }>, Schema.Struct<{
9
+ readonly state: Schema.Literal<"unavailable">;
10
+ readonly reason: Schema.Literals<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"]>;
11
+ }>]>;
12
+ recordedCalls: Schema.Number;
13
+ coveredCalls: Schema.Number;
14
+ missingCacheReadCalls: Schema.Number;
15
+ missingInputTotalCalls: Schema.Number;
16
+ unknownStatusCalls: Schema.Number;
17
+ collectionComplete: Schema.Boolean;
18
+ reasons: Schema.$Array<Schema.Literals<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"]>>;
19
+ }>;
20
+ /** Token-weighted cache reading, with explicit input coverage and collection completeness. */
21
+ export type CacheReadSummary = typeof Summary.Type;
22
+ export declare const CacheReadReportSchema: Schema.Struct<{
23
+ readonly total: Schema.Struct<{
24
+ rate: Schema.Union<readonly [Schema.Struct<{
25
+ readonly state: Schema.Literal<"exact">;
26
+ readonly value: Schema.Number;
27
+ }>, Schema.Struct<{
28
+ readonly state: Schema.Literal<"unavailable">;
29
+ readonly reason: Schema.Literals<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"]>;
30
+ }>]>;
31
+ recordedCalls: Schema.Number;
32
+ coveredCalls: Schema.Number;
33
+ missingCacheReadCalls: Schema.Number;
34
+ missingInputTotalCalls: Schema.Number;
35
+ unknownStatusCalls: Schema.Number;
36
+ collectionComplete: Schema.Boolean;
37
+ reasons: Schema.$Array<Schema.Literals<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"]>>;
38
+ }>;
39
+ readonly modelSlots: Schema.$Array<Schema.Struct<{
40
+ readonly rate: Schema.Union<readonly [Schema.Struct<{
41
+ readonly state: Schema.Literal<"exact">;
42
+ readonly value: Schema.Number;
43
+ }>, Schema.Struct<{
44
+ readonly state: Schema.Literal<"unavailable">;
45
+ readonly reason: Schema.Literals<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"]>;
46
+ }>]>;
47
+ readonly recordedCalls: Schema.Number;
48
+ readonly coveredCalls: Schema.Number;
49
+ readonly missingCacheReadCalls: Schema.Number;
50
+ readonly missingInputTotalCalls: Schema.Number;
51
+ readonly unknownStatusCalls: Schema.Number;
52
+ readonly collectionComplete: Schema.Boolean;
53
+ readonly reasons: Schema.$Array<Schema.Literals<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"]>>;
54
+ readonly modelSlot: Schema.NullOr<Schema.String>;
55
+ }>>;
56
+ readonly models: Schema.$Array<Schema.Struct<{
57
+ readonly rate: Schema.Union<readonly [Schema.Struct<{
58
+ readonly state: Schema.Literal<"exact">;
59
+ readonly value: Schema.Number;
60
+ }>, Schema.Struct<{
61
+ readonly state: Schema.Literal<"unavailable">;
62
+ readonly reason: Schema.Literals<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"]>;
63
+ }>]>;
64
+ readonly recordedCalls: Schema.Number;
65
+ readonly coveredCalls: Schema.Number;
66
+ readonly missingCacheReadCalls: Schema.Number;
67
+ readonly missingInputTotalCalls: Schema.Number;
68
+ readonly unknownStatusCalls: Schema.Number;
69
+ readonly collectionComplete: Schema.Boolean;
70
+ readonly reasons: Schema.$Array<Schema.Literals<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"]>>;
71
+ readonly modelSlot: Schema.NullOr<Schema.String>;
72
+ readonly provider: Schema.NullOr<Schema.String>;
73
+ readonly model: Schema.NullOr<Schema.String>;
74
+ }>>;
75
+ }>;
76
+ /** Complete per-Attempt report; unknown model identities remain null. */
77
+ export type CacheReadReport = typeof CacheReadReportSchema.Type;
78
+ /** A historical collection marked complete is not proof of an explicit producer seal. */
79
+ export declare function projectCacheRead(usage: ReadableAdapterUsageAttachment | null, slots: ResolvedModelSlots | undefined, producerCompletenessKnown: boolean, absent?: "usage-not-recorded" | "source-invalid" | "adapter-usage-required"): CacheReadReport;
80
+ export {};
@@ -0,0 +1,80 @@
1
+ import { Schema } from "effect";
2
+ import type { ResolvedModelSlots } from "../model-slots.mjs";
3
+ import type { ReadableAdapterUsageAttachment } from "../record/family/adapter-usage/schema.mjs";
4
+ declare const Summary: Schema.Struct<{
5
+ rate: Schema.Union<readonly [Schema.Struct<{
6
+ readonly state: Schema.Literal<"exact">;
7
+ readonly value: Schema.Number;
8
+ }>, Schema.Struct<{
9
+ readonly state: Schema.Literal<"unavailable">;
10
+ readonly reason: Schema.Literals<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"]>;
11
+ }>]>;
12
+ recordedCalls: Schema.Number;
13
+ coveredCalls: Schema.Number;
14
+ missingCacheReadCalls: Schema.Number;
15
+ missingInputTotalCalls: Schema.Number;
16
+ unknownStatusCalls: Schema.Number;
17
+ collectionComplete: Schema.Boolean;
18
+ reasons: Schema.$Array<Schema.Literals<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"]>>;
19
+ }>;
20
+ /** Token-weighted cache reading, with explicit input coverage and collection completeness. */
21
+ export type CacheReadSummary = typeof Summary.Type;
22
+ export declare const CacheReadReportSchema: Schema.Struct<{
23
+ readonly total: Schema.Struct<{
24
+ rate: Schema.Union<readonly [Schema.Struct<{
25
+ readonly state: Schema.Literal<"exact">;
26
+ readonly value: Schema.Number;
27
+ }>, Schema.Struct<{
28
+ readonly state: Schema.Literal<"unavailable">;
29
+ readonly reason: Schema.Literals<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"]>;
30
+ }>]>;
31
+ recordedCalls: Schema.Number;
32
+ coveredCalls: Schema.Number;
33
+ missingCacheReadCalls: Schema.Number;
34
+ missingInputTotalCalls: Schema.Number;
35
+ unknownStatusCalls: Schema.Number;
36
+ collectionComplete: Schema.Boolean;
37
+ reasons: Schema.$Array<Schema.Literals<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"]>>;
38
+ }>;
39
+ readonly modelSlots: Schema.$Array<Schema.Struct<{
40
+ readonly rate: Schema.Union<readonly [Schema.Struct<{
41
+ readonly state: Schema.Literal<"exact">;
42
+ readonly value: Schema.Number;
43
+ }>, Schema.Struct<{
44
+ readonly state: Schema.Literal<"unavailable">;
45
+ readonly reason: Schema.Literals<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"]>;
46
+ }>]>;
47
+ readonly recordedCalls: Schema.Number;
48
+ readonly coveredCalls: Schema.Number;
49
+ readonly missingCacheReadCalls: Schema.Number;
50
+ readonly missingInputTotalCalls: Schema.Number;
51
+ readonly unknownStatusCalls: Schema.Number;
52
+ readonly collectionComplete: Schema.Boolean;
53
+ readonly reasons: Schema.$Array<Schema.Literals<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"]>>;
54
+ readonly modelSlot: Schema.NullOr<Schema.String>;
55
+ }>>;
56
+ readonly models: Schema.$Array<Schema.Struct<{
57
+ readonly rate: Schema.Union<readonly [Schema.Struct<{
58
+ readonly state: Schema.Literal<"exact">;
59
+ readonly value: Schema.Number;
60
+ }>, Schema.Struct<{
61
+ readonly state: Schema.Literal<"unavailable">;
62
+ readonly reason: Schema.Literals<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"]>;
63
+ }>]>;
64
+ readonly recordedCalls: Schema.Number;
65
+ readonly coveredCalls: Schema.Number;
66
+ readonly missingCacheReadCalls: Schema.Number;
67
+ readonly missingInputTotalCalls: Schema.Number;
68
+ readonly unknownStatusCalls: Schema.Number;
69
+ readonly collectionComplete: Schema.Boolean;
70
+ readonly reasons: Schema.$Array<Schema.Literals<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"]>>;
71
+ readonly modelSlot: Schema.NullOr<Schema.String>;
72
+ readonly provider: Schema.NullOr<Schema.String>;
73
+ readonly model: Schema.NullOr<Schema.String>;
74
+ }>>;
75
+ }>;
76
+ /** Complete per-Attempt report; unknown model identities remain null. */
77
+ export type CacheReadReport = typeof CacheReadReportSchema.Type;
78
+ /** A historical collection marked complete is not proof of an explicit producer seal. */
79
+ export declare function projectCacheRead(usage: ReadableAdapterUsageAttachment | null, slots: ResolvedModelSlots | undefined, producerCompletenessKnown: boolean, absent?: "usage-not-recorded" | "source-invalid" | "adapter-usage-required"): CacheReadReport;
80
+ export {};
@@ -0,0 +1,80 @@
1
+ import { Schema } from "effect";
2
+ import type { ResolvedModelSlots } from "../model-slots.js";
3
+ import type { ReadableAdapterUsageAttachment } from "../record/family/adapter-usage/schema.js";
4
+ declare const Summary: Schema.Struct<{
5
+ rate: Schema.Union<readonly [Schema.Struct<{
6
+ readonly state: Schema.Literal<"exact">;
7
+ readonly value: Schema.Number;
8
+ }>, Schema.Struct<{
9
+ readonly state: Schema.Literal<"unavailable">;
10
+ readonly reason: Schema.Literals<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"]>;
11
+ }>]>;
12
+ recordedCalls: Schema.Number;
13
+ coveredCalls: Schema.Number;
14
+ missingCacheReadCalls: Schema.Number;
15
+ missingInputTotalCalls: Schema.Number;
16
+ unknownStatusCalls: Schema.Number;
17
+ collectionComplete: Schema.Boolean;
18
+ reasons: Schema.$Array<Schema.Literals<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"]>>;
19
+ }>;
20
+ /** Token-weighted cache reading, with explicit input coverage and collection completeness. */
21
+ export type CacheReadSummary = typeof Summary.Type;
22
+ export declare const CacheReadReportSchema: Schema.Struct<{
23
+ readonly total: Schema.Struct<{
24
+ rate: Schema.Union<readonly [Schema.Struct<{
25
+ readonly state: Schema.Literal<"exact">;
26
+ readonly value: Schema.Number;
27
+ }>, Schema.Struct<{
28
+ readonly state: Schema.Literal<"unavailable">;
29
+ readonly reason: Schema.Literals<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"]>;
30
+ }>]>;
31
+ recordedCalls: Schema.Number;
32
+ coveredCalls: Schema.Number;
33
+ missingCacheReadCalls: Schema.Number;
34
+ missingInputTotalCalls: Schema.Number;
35
+ unknownStatusCalls: Schema.Number;
36
+ collectionComplete: Schema.Boolean;
37
+ reasons: Schema.$Array<Schema.Literals<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"]>>;
38
+ }>;
39
+ readonly modelSlots: Schema.$Array<Schema.Struct<{
40
+ readonly rate: Schema.Union<readonly [Schema.Struct<{
41
+ readonly state: Schema.Literal<"exact">;
42
+ readonly value: Schema.Number;
43
+ }>, Schema.Struct<{
44
+ readonly state: Schema.Literal<"unavailable">;
45
+ readonly reason: Schema.Literals<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"]>;
46
+ }>]>;
47
+ readonly recordedCalls: Schema.Number;
48
+ readonly coveredCalls: Schema.Number;
49
+ readonly missingCacheReadCalls: Schema.Number;
50
+ readonly missingInputTotalCalls: Schema.Number;
51
+ readonly unknownStatusCalls: Schema.Number;
52
+ readonly collectionComplete: Schema.Boolean;
53
+ readonly reasons: Schema.$Array<Schema.Literals<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"]>>;
54
+ readonly modelSlot: Schema.NullOr<Schema.String>;
55
+ }>>;
56
+ readonly models: Schema.$Array<Schema.Struct<{
57
+ readonly rate: Schema.Union<readonly [Schema.Struct<{
58
+ readonly state: Schema.Literal<"exact">;
59
+ readonly value: Schema.Number;
60
+ }>, Schema.Struct<{
61
+ readonly state: Schema.Literal<"unavailable">;
62
+ readonly reason: Schema.Literals<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"]>;
63
+ }>]>;
64
+ readonly recordedCalls: Schema.Number;
65
+ readonly coveredCalls: Schema.Number;
66
+ readonly missingCacheReadCalls: Schema.Number;
67
+ readonly missingInputTotalCalls: Schema.Number;
68
+ readonly unknownStatusCalls: Schema.Number;
69
+ readonly collectionComplete: Schema.Boolean;
70
+ readonly reasons: Schema.$Array<Schema.Literals<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"]>>;
71
+ readonly modelSlot: Schema.NullOr<Schema.String>;
72
+ readonly provider: Schema.NullOr<Schema.String>;
73
+ readonly model: Schema.NullOr<Schema.String>;
74
+ }>>;
75
+ }>;
76
+ /** Complete per-Attempt report; unknown model identities remain null. */
77
+ export type CacheReadReport = typeof CacheReadReportSchema.Type;
78
+ /** A historical collection marked complete is not proof of an explicit producer seal. */
79
+ export declare function projectCacheRead(usage: ReadableAdapterUsageAttachment | null, slots: ResolvedModelSlots | undefined, producerCompletenessKnown: boolean, absent?: "usage-not-recorded" | "source-invalid" | "adapter-usage-required"): CacheReadReport;
80
+ export {};
@@ -0,0 +1,8 @@
1
+ import { createRequire as __niceevalCreateRequire } from "node:module";
2
+ const __niceevalRequire = __niceevalCreateRequire(import.meta.url);
3
+ const __niceevalCanonical = __niceevalRequire("./cache-read.cjs");
4
+ const __niceevalExport0 = __niceevalCanonical["CacheReadReportSchema"];
5
+ export { __niceevalExport0 as CacheReadReportSchema };
6
+ const __niceevalExport1 = __niceevalCanonical["projectCacheRead"];
7
+ export { __niceevalExport1 as projectCacheRead };
8
+ //# sourceMappingURL=cache-read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-read.js","sources":[],"names":[],"mappings":""}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.projectAdapterEvalUsage = projectAdapterEvalUsage;
4
4
  exports.projectAgentEvalUsage = projectAgentEvalUsage;
5
+ const cache_read_ts_1 = require("./cache-read.cjs");
5
6
  const pricing_ts_1 = require("../record/family/adapter-usage/pricing.cjs");
6
7
  const adapter_usage_projection_ts_1 = require("./adapter-usage-projection.cjs");
7
8
  function contributionCosts(calls, complete) {
@@ -19,12 +20,13 @@ function contributionCosts(calls, complete) {
19
20
  totalContributions: totals.totalCalls,
20
21
  });
21
22
  }
22
- function projectAdapterEvalUsage(usage) {
23
+ function projectAdapterEvalUsage(usage, models) {
23
24
  return Object.freeze({
24
25
  source: "adapter",
25
26
  scope: "attempt",
26
27
  basis: "recorded-calls",
27
28
  cut: "call-time",
29
+ cacheRead: (0, cache_read_ts_1.projectCacheRead)(usage, models, true),
28
30
  inputTokens: (0, adapter_usage_projection_ts_1.adapterTokenMaterial)(usage, "inputTokens"),
29
31
  inputTotalTokens: (0, adapter_usage_projection_ts_1.adapterTokenMaterial)(usage, "inputTotalTokens"),
30
32
  outputTokens: (0, adapter_usage_projection_ts_1.adapterTokenMaterial)(usage, "outputTokens"),
@@ -135,6 +137,7 @@ function projectAgentEvalUsage(input) {
135
137
  scope: input.scope,
136
138
  basis: "reported-sends",
137
139
  cut: "call-time",
140
+ cacheRead: (0, cache_read_ts_1.projectCacheRead)(null, undefined, false, "adapter-usage-required"),
138
141
  inputTokens: agentTokenMaterial(input.contributions, "inputTokens", input.scope),
139
142
  inputTotalTokens: agentTokenMaterial(input.contributions, "inputTotalTokens", input.scope),
140
143
  outputTokens: agentTokenMaterial(input.contributions, "outputTokens", input.scope),
@@ -1 +1 @@
1
- {"version":3,"file":"eval-usage.js","sourceRoot":"","sources":["eval-usage.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NumericMaterial } from \"../assertions/match.ts\";\nimport type { ResolvedEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport type { PriceOverride, Usage } from \"../types.ts\";\nimport type { ReadableAdapterUsageAttachment } from \"../record/family/adapter-usage/schema.ts\";\nimport { addCanonicalDecimals, canonicalDecimalFromNumber, multiplyCanonicalDecimalPerMillion, } from \"../record/family/adapter-usage/pricing.ts\";\nimport { adapterTokenMaterial, effectiveCostTotals, effectiveUsageCalls, type EffectiveCallCost, } from \"./adapter-usage-projection.ts\";\n/** Internal source-owned shape; package-root exposure belongs to the author facade. */\nexport interface EvalUsage {\n readonly source: \"agent\" | \"adapter\" | \"unavailable\";\n readonly scope: \"turn\" | \"session\" | \"attempt\";\n readonly basis: \"reported-sends\" | \"recorded-calls\" | \"unbound\";\n readonly cut: \"call-time\";\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: {\n readonly state: \"complete\" | \"partial\" | \"unavailable\";\n readonly values: readonly {\n readonly currency: string;\n readonly value: string;\n readonly source: \"reported\" | \"estimated\" | \"mixed\";\n readonly coveredContributions: number;\n readonly reportedContributions: number;\n readonly estimatedContributions: number;\n }[];\n readonly totalContributions: number;\n };\n}\nexport interface AgentUsageContribution {\n readonly sessionScopeId: string;\n readonly turnId: string;\n readonly sendAttempt: number;\n readonly state: \"pending\" | \"terminal\";\n readonly outcome: \"completed\" | \"failed\" | \"interrupted\" | null;\n readonly model: string | null;\n readonly usage: Readonly<Usage> | null;\n readonly coverage: ResolvedEvidenceCoverage[\"usage\"];\n}\ntype TokenMetric = \"inputTokens\" | \"inputTotalTokens\" | \"outputTokens\" | \"cacheReadTokens\" | \"cacheWriteTokens\" | \"totalTokens\";\nfunction contributionCosts(calls: readonly {\n readonly effectiveCost: EffectiveCallCost | null;\n}[], complete: boolean): EvalUsage[\"costs\"] {\n const totals = effectiveCostTotals(calls, complete ? \"complete\" : \"partial\");\n return Object.freeze({\n state: totals.state,\n values: Object.freeze(totals.values.map((value) => Object.freeze({\n currency: value.currency,\n value: value.value,\n source: value.source,\n coveredContributions: value.coveredCalls,\n reportedContributions: value.reportedCalls,\n estimatedContributions: value.estimatedCalls,\n }))),\n totalContributions: totals.totalCalls,\n });\n}\nexport function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment): EvalUsage {\n return Object.freeze({\n source: \"adapter\",\n scope: \"attempt\",\n basis: \"recorded-calls\",\n cut: \"call-time\",\n inputTokens: adapterTokenMaterial(usage, \"inputTokens\"),\n inputTotalTokens: adapterTokenMaterial(usage, \"inputTotalTokens\"),\n outputTokens: adapterTokenMaterial(usage, \"outputTokens\"),\n cacheReadTokens: adapterTokenMaterial(usage, \"cacheReadTokens\"),\n cacheWriteTokens: adapterTokenMaterial(usage, \"cacheWriteTokens\"),\n totalTokens: adapterTokenMaterial(usage, \"totalTokens\"),\n costs: contributionCosts(effectiveUsageCalls(usage), usage.collection.state === \"complete\"),\n });\n}\nfunction tokenBuckets(contribution: AgentUsageContribution, metric: TokenMetric): readonly (number | undefined)[] {\n // Some producers have an independent total. Missing totals retain the mutually exclusive bucket fallback.\n const usage: (Readonly<Usage> & {\n readonly inputTotalTokens?: number;\n }) | null = contribution.usage;\n if (contribution.state === \"pending\" || usage === null)\n return [undefined];\n const input = usage.inputTotalTokens !== undefined\n ? [usage.inputTotalTokens]\n : [usage.inputTokens, usage.cacheReadTokens, usage.cacheCreationTokens];\n switch (metric) {\n case \"inputTotalTokens\": return input;\n case \"totalTokens\": return [...input, usage.outputTokens];\n case \"cacheWriteTokens\": return [usage.cacheCreationTokens];\n default: return [usage[metric]];\n }\n}\nfunction agentTokenMaterial(contributions: readonly AgentUsageContribution[], metric: TokenMetric, scope: EvalUsage[\"scope\"]): NumericMaterial {\n const provenance = Object.freeze({ source: \"agent\", scope, unit: \"tokens\", cut: \"call-time\" });\n let value = 0;\n let observed = false;\n let complete = contributions.length > 0;\n for (const contribution of contributions) {\n if (contribution.state !== \"terminal\" || contribution.coverage.status !== \"complete\")\n complete = false;\n for (const bucket of tokenBuckets(contribution, metric)) {\n if (bucket === undefined) {\n complete = false;\n continue;\n }\n if (!Number.isSafeInteger(bucket) || bucket < 0) {\n return Object.freeze({ state: \"unavailable\", reason: \"usage-invalid-token-value\", provenance });\n }\n value += bucket;\n observed = true;\n if (!Number.isSafeInteger(value)) {\n return Object.freeze({ state: \"unavailable\", reason: \"usage-exceeds-safe-integer\", provenance });\n }\n }\n }\n return Object.freeze(!observed\n ? { state: \"unavailable\", reason: \"usage-not-reported\", provenance }\n : { state: complete ? \"exact\" : \"lower-bound\", value, provenance });\n}\nfunction agentCost(contribution: AgentUsageContribution, pricing: Record<string, PriceOverride> | undefined): EffectiveCallCost | null {\n const usage = contribution.usage;\n if (contribution.state === \"pending\" || usage === null)\n return null;\n const coverageComplete = contribution.coverage.status === \"complete\";\n if (usage.costUSD !== undefined) {\n const amount = canonicalDecimalFromNumber(usage.costUSD);\n return amount === undefined ? null : Object.freeze({\n amount, currency: \"USD\", source: Object.freeze({ kind: \"reported\", id: \"agent-send\" }),\n state: coverageComplete ? \"complete\" : \"partial\",\n });\n }\n const model = contribution.model;\n if (model === null || pricing === undefined)\n return null;\n const wildcard = model.includes(\"/\") ? `${model.slice(0, model.indexOf(\"/\"))}/*` : undefined;\n const profile = Object.hasOwn(pricing, model) ? pricing[model]\n : wildcard !== undefined && Object.hasOwn(pricing, wildcard) ? pricing[wildcard] : undefined;\n if (profile === undefined || profile.currency !== undefined && profile.currency !== \"USD\" ||\n profile.basis !== undefined && profile.basis !== \"catalog-reference\")\n return null;\n const buckets = [\n [usage.inputTokens, profile.inputPerMTok],\n [usage.outputTokens, profile.outputPerMTok],\n [usage.cacheReadTokens, profile.cacheReadPerMTok],\n [usage.cacheCreationTokens, profile.cacheWritePerMTok],\n ] as const;\n const charges: string[] = [];\n let complete = coverageComplete;\n for (const [tokens, price] of buckets) {\n if (tokens === undefined || !Number.isSafeInteger(tokens) || tokens < 0) {\n complete = false;\n continue;\n }\n if (tokens === 0) {\n charges.push(\"0\");\n continue;\n }\n const rate = price === undefined ? undefined : canonicalDecimalFromNumber(price);\n if (rate === undefined) {\n complete = false;\n continue;\n }\n charges.push(multiplyCanonicalDecimalPerMillion(rate, tokens));\n }\n return charges.length === 0 ? null : Object.freeze({\n amount: addCanonicalDecimals(charges),\n currency: \"USD\",\n source: Object.freeze({ kind: \"estimated\", id: profile.source?.id ?? \"niceeval.config.pricing\" }),\n state: complete ? \"complete\" : \"partial\",\n });\n}\n/** The receiver selects scope membership before calling this pure projection. */\nexport function projectAgentEvalUsage(input: {\n contributions: readonly AgentUsageContribution[];\n scope: \"turn\" | \"session\" | \"attempt\";\n pricing?: Record<string, PriceOverride>;\n}): EvalUsage {\n return Object.freeze({\n source: \"agent\",\n scope: input.scope,\n basis: \"reported-sends\",\n cut: \"call-time\",\n inputTokens: agentTokenMaterial(input.contributions, \"inputTokens\", input.scope),\n inputTotalTokens: agentTokenMaterial(input.contributions, \"inputTotalTokens\", input.scope),\n outputTokens: agentTokenMaterial(input.contributions, \"outputTokens\", input.scope),\n cacheReadTokens: agentTokenMaterial(input.contributions, \"cacheReadTokens\", input.scope),\n cacheWriteTokens: agentTokenMaterial(input.contributions, \"cacheWriteTokens\", input.scope),\n totalTokens: agentTokenMaterial(input.contributions, \"totalTokens\", input.scope),\n costs: contributionCosts(input.contributions.map((contribution) => ({\n effectiveCost: agentCost(contribution, input.pricing),\n })), input.contributions.every((contribution) => contribution.state === \"terminal\" && contribution.coverage.status === \"complete\")),\n });\n}\n"]}
1
+ {"version":3,"file":"eval-usage.js","sourceRoot":"","sources":["eval-usage.ts"],"names":[],"mappings":"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","sourcesContent":["import { projectCacheRead, type CacheReadReport } from \"./cache-read.ts\";\nimport type { ResolvedModelSlots } from \"../model-slots.ts\";\nimport type { NumericMaterial } from \"../assertions/match.ts\";\nimport type { ResolvedEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport type { PriceOverride, Usage } from \"../types.ts\";\nimport type { ReadableAdapterUsageAttachment } from \"../record/family/adapter-usage/schema.ts\";\nimport { addCanonicalDecimals, canonicalDecimalFromNumber, multiplyCanonicalDecimalPerMillion, } from \"../record/family/adapter-usage/pricing.ts\";\nimport { adapterTokenMaterial, effectiveCostTotals, effectiveUsageCalls, type EffectiveCallCost, } from \"./adapter-usage-projection.ts\";\n/** Internal source-owned shape; package-root exposure belongs to the author facade. */\nexport interface EvalUsage {\n readonly source: \"agent\" | \"adapter\" | \"unavailable\";\n readonly scope: \"turn\" | \"session\" | \"attempt\";\n readonly basis: \"reported-sends\" | \"recorded-calls\" | \"unbound\";\n readonly cut: \"call-time\";\n readonly cacheRead: CacheReadReport;\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: {\n readonly state: \"complete\" | \"partial\" | \"unavailable\";\n readonly values: readonly {\n readonly currency: string;\n readonly value: string;\n readonly source: \"reported\" | \"estimated\" | \"mixed\";\n readonly coveredContributions: number;\n readonly reportedContributions: number;\n readonly estimatedContributions: number;\n }[];\n readonly totalContributions: number;\n };\n}\nexport interface AgentUsageContribution {\n readonly sessionScopeId: string;\n readonly turnId: string;\n readonly sendAttempt: number;\n readonly state: \"pending\" | \"terminal\";\n readonly outcome: \"completed\" | \"failed\" | \"interrupted\" | null;\n readonly model: string | null;\n readonly usage: Readonly<Usage> | null;\n readonly coverage: ResolvedEvidenceCoverage[\"usage\"];\n}\ntype TokenMetric = \"inputTokens\" | \"inputTotalTokens\" | \"outputTokens\" | \"cacheReadTokens\" | \"cacheWriteTokens\" | \"totalTokens\";\nfunction contributionCosts(calls: readonly {\n readonly effectiveCost: EffectiveCallCost | null;\n}[], complete: boolean): EvalUsage[\"costs\"] {\n const totals = effectiveCostTotals(calls, complete ? \"complete\" : \"partial\");\n return Object.freeze({\n state: totals.state,\n values: Object.freeze(totals.values.map((value) => Object.freeze({\n currency: value.currency,\n value: value.value,\n source: value.source,\n coveredContributions: value.coveredCalls,\n reportedContributions: value.reportedCalls,\n estimatedContributions: value.estimatedCalls,\n }))),\n totalContributions: totals.totalCalls,\n });\n}\nexport function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment, models?: ResolvedModelSlots): EvalUsage {\n return Object.freeze({\n source: \"adapter\",\n scope: \"attempt\",\n basis: \"recorded-calls\",\n cut: \"call-time\",\n cacheRead: projectCacheRead(usage, models, true),\n inputTokens: adapterTokenMaterial(usage, \"inputTokens\"),\n inputTotalTokens: adapterTokenMaterial(usage, \"inputTotalTokens\"),\n outputTokens: adapterTokenMaterial(usage, \"outputTokens\"),\n cacheReadTokens: adapterTokenMaterial(usage, \"cacheReadTokens\"),\n cacheWriteTokens: adapterTokenMaterial(usage, \"cacheWriteTokens\"),\n totalTokens: adapterTokenMaterial(usage, \"totalTokens\"),\n costs: contributionCosts(effectiveUsageCalls(usage), usage.collection.state === \"complete\"),\n });\n}\nfunction tokenBuckets(contribution: AgentUsageContribution, metric: TokenMetric): readonly (number | undefined)[] {\n // Some producers have an independent total. Missing totals retain the mutually exclusive bucket fallback.\n const usage: (Readonly<Usage> & {\n readonly inputTotalTokens?: number;\n }) | null = contribution.usage;\n if (contribution.state === \"pending\" || usage === null)\n return [undefined];\n const input = usage.inputTotalTokens !== undefined\n ? [usage.inputTotalTokens]\n : [usage.inputTokens, usage.cacheReadTokens, usage.cacheCreationTokens];\n switch (metric) {\n case \"inputTotalTokens\": return input;\n case \"totalTokens\": return [...input, usage.outputTokens];\n case \"cacheWriteTokens\": return [usage.cacheCreationTokens];\n default: return [usage[metric]];\n }\n}\nfunction agentTokenMaterial(contributions: readonly AgentUsageContribution[], metric: TokenMetric, scope: EvalUsage[\"scope\"]): NumericMaterial {\n const provenance = Object.freeze({ source: \"agent\", scope, unit: \"tokens\", cut: \"call-time\" });\n let value = 0;\n let observed = false;\n let complete = contributions.length > 0;\n for (const contribution of contributions) {\n if (contribution.state !== \"terminal\" || contribution.coverage.status !== \"complete\")\n complete = false;\n for (const bucket of tokenBuckets(contribution, metric)) {\n if (bucket === undefined) {\n complete = false;\n continue;\n }\n if (!Number.isSafeInteger(bucket) || bucket < 0) {\n return Object.freeze({ state: \"unavailable\", reason: \"usage-invalid-token-value\", provenance });\n }\n value += bucket;\n observed = true;\n if (!Number.isSafeInteger(value)) {\n return Object.freeze({ state: \"unavailable\", reason: \"usage-exceeds-safe-integer\", provenance });\n }\n }\n }\n return Object.freeze(!observed\n ? { state: \"unavailable\", reason: \"usage-not-reported\", provenance }\n : { state: complete ? \"exact\" : \"lower-bound\", value, provenance });\n}\nfunction agentCost(contribution: AgentUsageContribution, pricing: Record<string, PriceOverride> | undefined): EffectiveCallCost | null {\n const usage = contribution.usage;\n if (contribution.state === \"pending\" || usage === null)\n return null;\n const coverageComplete = contribution.coverage.status === \"complete\";\n if (usage.costUSD !== undefined) {\n const amount = canonicalDecimalFromNumber(usage.costUSD);\n return amount === undefined ? null : Object.freeze({\n amount, currency: \"USD\", source: Object.freeze({ kind: \"reported\", id: \"agent-send\" }),\n state: coverageComplete ? \"complete\" : \"partial\",\n });\n }\n const model = contribution.model;\n if (model === null || pricing === undefined)\n return null;\n const wildcard = model.includes(\"/\") ? `${model.slice(0, model.indexOf(\"/\"))}/*` : undefined;\n const profile = Object.hasOwn(pricing, model) ? pricing[model]\n : wildcard !== undefined && Object.hasOwn(pricing, wildcard) ? pricing[wildcard] : undefined;\n if (profile === undefined || profile.currency !== undefined && profile.currency !== \"USD\" ||\n profile.basis !== undefined && profile.basis !== \"catalog-reference\")\n return null;\n const buckets = [\n [usage.inputTokens, profile.inputPerMTok],\n [usage.outputTokens, profile.outputPerMTok],\n [usage.cacheReadTokens, profile.cacheReadPerMTok],\n [usage.cacheCreationTokens, profile.cacheWritePerMTok],\n ] as const;\n const charges: string[] = [];\n let complete = coverageComplete;\n for (const [tokens, price] of buckets) {\n if (tokens === undefined || !Number.isSafeInteger(tokens) || tokens < 0) {\n complete = false;\n continue;\n }\n if (tokens === 0) {\n charges.push(\"0\");\n continue;\n }\n const rate = price === undefined ? undefined : canonicalDecimalFromNumber(price);\n if (rate === undefined) {\n complete = false;\n continue;\n }\n charges.push(multiplyCanonicalDecimalPerMillion(rate, tokens));\n }\n return charges.length === 0 ? null : Object.freeze({\n amount: addCanonicalDecimals(charges),\n currency: \"USD\",\n source: Object.freeze({ kind: \"estimated\", id: profile.source?.id ?? \"niceeval.config.pricing\" }),\n state: complete ? \"complete\" : \"partial\",\n });\n}\n/** The receiver selects scope membership before calling this pure projection. */\nexport function projectAgentEvalUsage(input: {\n contributions: readonly AgentUsageContribution[];\n scope: \"turn\" | \"session\" | \"attempt\";\n pricing?: Record<string, PriceOverride>;\n}): EvalUsage {\n return Object.freeze({\n source: \"agent\",\n scope: input.scope,\n basis: \"reported-sends\",\n cut: \"call-time\",\n cacheRead: projectCacheRead(null, undefined, false, \"adapter-usage-required\"),\n inputTokens: agentTokenMaterial(input.contributions, \"inputTokens\", input.scope),\n inputTotalTokens: agentTokenMaterial(input.contributions, \"inputTotalTokens\", input.scope),\n outputTokens: agentTokenMaterial(input.contributions, \"outputTokens\", input.scope),\n cacheReadTokens: agentTokenMaterial(input.contributions, \"cacheReadTokens\", input.scope),\n cacheWriteTokens: agentTokenMaterial(input.contributions, \"cacheWriteTokens\", input.scope),\n totalTokens: agentTokenMaterial(input.contributions, \"totalTokens\", input.scope),\n costs: contributionCosts(input.contributions.map((contribution) => ({\n effectiveCost: agentCost(contribution, input.pricing),\n })), input.contributions.every((contribution) => contribution.state === \"terminal\" && contribution.coverage.status === \"complete\")),\n });\n}\n"]}
@@ -1,3 +1,5 @@
1
+ import { type CacheReadReport } from "./cache-read.cjs";
2
+ import type { ResolvedModelSlots } from "../model-slots.cjs";
1
3
  import type { NumericMaterial } from "../assertions/match.cjs";
2
4
  import type { ResolvedEvidenceCoverage } from "../assertions/coverage.cjs";
3
5
  import type { PriceOverride, Usage } from "../types.cjs";
@@ -8,6 +10,7 @@ export interface EvalUsage {
8
10
  readonly scope: "turn" | "session" | "attempt";
9
11
  readonly basis: "reported-sends" | "recorded-calls" | "unbound";
10
12
  readonly cut: "call-time";
13
+ readonly cacheRead: CacheReadReport;
11
14
  readonly inputTokens: NumericMaterial;
12
15
  readonly inputTotalTokens: NumericMaterial;
13
16
  readonly outputTokens: NumericMaterial;
@@ -37,7 +40,7 @@ export interface AgentUsageContribution {
37
40
  readonly usage: Readonly<Usage> | null;
38
41
  readonly coverage: ResolvedEvidenceCoverage["usage"];
39
42
  }
40
- export declare function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment): EvalUsage;
43
+ export declare function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment, models?: ResolvedModelSlots): EvalUsage;
41
44
  /** The receiver selects scope membership before calling this pure projection. */
42
45
  export declare function projectAgentEvalUsage(input: {
43
46
  contributions: readonly AgentUsageContribution[];
@@ -1,3 +1,5 @@
1
+ import { type CacheReadReport } from "./cache-read.mjs";
2
+ import type { ResolvedModelSlots } from "../model-slots.mjs";
1
3
  import type { NumericMaterial } from "../assertions/match.mjs";
2
4
  import type { ResolvedEvidenceCoverage } from "../assertions/coverage.mjs";
3
5
  import type { PriceOverride, Usage } from "../types.mjs";
@@ -8,6 +10,7 @@ export interface EvalUsage {
8
10
  readonly scope: "turn" | "session" | "attempt";
9
11
  readonly basis: "reported-sends" | "recorded-calls" | "unbound";
10
12
  readonly cut: "call-time";
13
+ readonly cacheRead: CacheReadReport;
11
14
  readonly inputTokens: NumericMaterial;
12
15
  readonly inputTotalTokens: NumericMaterial;
13
16
  readonly outputTokens: NumericMaterial;
@@ -37,7 +40,7 @@ export interface AgentUsageContribution {
37
40
  readonly usage: Readonly<Usage> | null;
38
41
  readonly coverage: ResolvedEvidenceCoverage["usage"];
39
42
  }
40
- export declare function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment): EvalUsage;
43
+ export declare function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment, models?: ResolvedModelSlots): EvalUsage;
41
44
  /** The receiver selects scope membership before calling this pure projection. */
42
45
  export declare function projectAgentEvalUsage(input: {
43
46
  contributions: readonly AgentUsageContribution[];
@@ -1,3 +1,5 @@
1
+ import { type CacheReadReport } from "./cache-read.js";
2
+ import type { ResolvedModelSlots } from "../model-slots.js";
1
3
  import type { NumericMaterial } from "../assertions/match.js";
2
4
  import type { ResolvedEvidenceCoverage } from "../assertions/coverage.js";
3
5
  import type { PriceOverride, Usage } from "../types.js";
@@ -8,6 +10,7 @@ export interface EvalUsage {
8
10
  readonly scope: "turn" | "session" | "attempt";
9
11
  readonly basis: "reported-sends" | "recorded-calls" | "unbound";
10
12
  readonly cut: "call-time";
13
+ readonly cacheRead: CacheReadReport;
11
14
  readonly inputTokens: NumericMaterial;
12
15
  readonly inputTotalTokens: NumericMaterial;
13
16
  readonly outputTokens: NumericMaterial;
@@ -37,7 +40,7 @@ export interface AgentUsageContribution {
37
40
  readonly usage: Readonly<Usage> | null;
38
41
  readonly coverage: ResolvedEvidenceCoverage["usage"];
39
42
  }
40
- export declare function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment): EvalUsage;
43
+ export declare function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment, models?: ResolvedModelSlots): EvalUsage;
41
44
  /** The receiver selects scope membership before calling this pure projection. */
42
45
  export declare function projectAgentEvalUsage(input: {
43
46
  contributions: readonly AgentUsageContribution[];