@tangle-network/agent-eval 0.118.0 → 0.118.2

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 (66) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/analyst/index.d.ts +10 -3
  3. package/dist/analyst/index.js +6 -6
  4. package/dist/benchmarks/index.js +9 -9
  5. package/dist/campaign/index.d.ts +22 -15
  6. package/dist/campaign/index.js +8 -8
  7. package/dist/{chunk-3EHHMC6E.js → chunk-63KG3ASG.js} +2 -2
  8. package/dist/{chunk-DP3BBMYJ.js → chunk-6JQE3YVE.js} +34 -45
  9. package/dist/chunk-6JQE3YVE.js.map +1 -0
  10. package/dist/{chunk-SVH2ANFD.js → chunk-7V3QDWNL.js} +2 -2
  11. package/dist/{chunk-QKEGNI5B.js → chunk-BUBU3YHT.js} +2 -2
  12. package/dist/{chunk-BFW56GTT.js → chunk-DRSFTBKU.js} +3 -3
  13. package/dist/{chunk-BFW56GTT.js.map → chunk-DRSFTBKU.js.map} +1 -1
  14. package/dist/{chunk-OIIMMLRB.js → chunk-DZBCDDIE.js} +3 -3
  15. package/dist/chunk-DZBCDDIE.js.map +1 -0
  16. package/dist/{chunk-IDZTTFRR.js → chunk-EGNRE7VA.js} +2 -2
  17. package/dist/chunk-EGNRE7VA.js.map +1 -0
  18. package/dist/{chunk-Q442S5AS.js → chunk-GCT3DQWU.js} +7 -7
  19. package/dist/chunk-GCT3DQWU.js.map +1 -0
  20. package/dist/{chunk-YLMUS4MM.js → chunk-I42AAGHL.js} +5 -5
  21. package/dist/chunk-I42AAGHL.js.map +1 -0
  22. package/dist/{chunk-33JA4TFA.js → chunk-J23QK2U5.js} +8 -3
  23. package/dist/chunk-J23QK2U5.js.map +1 -0
  24. package/dist/{chunk-LTVG32KX.js → chunk-JTMFT5QZ.js} +2 -2
  25. package/dist/chunk-JTMFT5QZ.js.map +1 -0
  26. package/dist/{chunk-JSDVRFAP.js → chunk-KK2O4VWA.js} +2 -2
  27. package/dist/{chunk-VCTY3W6J.js → chunk-MLHRFWQK.js} +1 -1
  28. package/dist/chunk-MLHRFWQK.js.map +1 -0
  29. package/dist/chunk-NW4AQBXD.js +53 -0
  30. package/dist/chunk-NW4AQBXD.js.map +1 -0
  31. package/dist/{chunk-KSDQVPLR.js → chunk-TVXPJJ7H.js} +2 -2
  32. package/dist/cli.js +2 -2
  33. package/dist/contract/index.d.ts +17 -10
  34. package/dist/contract/index.js +9 -9
  35. package/dist/contract/index.js.map +1 -1
  36. package/dist/fuzz.d.ts +8 -1
  37. package/dist/fuzz.js +1 -1
  38. package/dist/fuzz.js.map +1 -1
  39. package/dist/index.d.ts +52 -17
  40. package/dist/index.js +25 -15
  41. package/dist/index.js.map +1 -1
  42. package/dist/openapi.json +1 -1
  43. package/dist/{run-campaign-IM26A6PD.js → run-campaign-DWC67KJP.js} +3 -3
  44. package/dist/trace-attributes.d.ts +21 -1
  45. package/dist/trace-attributes.js +9 -3
  46. package/dist/traces.d.ts +29 -1
  47. package/dist/traces.js +16 -6
  48. package/dist/wire/index.d.ts +8 -1
  49. package/dist/wire/index.js +2 -2
  50. package/package.json +1 -1
  51. package/dist/chunk-33JA4TFA.js.map +0 -1
  52. package/dist/chunk-DP3BBMYJ.js.map +0 -1
  53. package/dist/chunk-IDZTTFRR.js.map +0 -1
  54. package/dist/chunk-LTVG32KX.js.map +0 -1
  55. package/dist/chunk-OIIMMLRB.js.map +0 -1
  56. package/dist/chunk-Q442S5AS.js.map +0 -1
  57. package/dist/chunk-VCTY3W6J.js.map +0 -1
  58. package/dist/chunk-WDHBCA3M.js +0 -31
  59. package/dist/chunk-WDHBCA3M.js.map +0 -1
  60. package/dist/chunk-YLMUS4MM.js.map +0 -1
  61. /package/dist/{chunk-3EHHMC6E.js.map → chunk-63KG3ASG.js.map} +0 -0
  62. /package/dist/{chunk-SVH2ANFD.js.map → chunk-7V3QDWNL.js.map} +0 -0
  63. /package/dist/{chunk-QKEGNI5B.js.map → chunk-BUBU3YHT.js.map} +0 -0
  64. /package/dist/{chunk-JSDVRFAP.js.map → chunk-KK2O4VWA.js.map} +0 -0
  65. /package/dist/{chunk-KSDQVPLR.js.map → chunk-TVXPJJ7H.js.map} +0 -0
  66. /package/dist/{run-campaign-IM26A6PD.js.map → run-campaign-DWC67KJP.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cost-ledger.ts"],"sourcesContent":["import { z } from 'zod'\nimport { ValidationError } from './errors'\nimport { estimateCost, isModelPriced, resolveModelPricing } from './metrics'\n\nexport type CostChannel = 'agent' | 'judge' | 'verifier' | 'analyst' | 'driver' | (string & {})\n\nexport interface CostUsage {\n inputTokens: number\n outputTokens: number\n cachedTokens?: number\n}\n\ninterface CostCallBase {\n callId: string\n channel: CostChannel\n phase: string\n actor: string\n model: string\n maximumCostUsd?: number\n tags?: Record<string, string>\n timestamp: number\n}\n\nexport interface PendingCostCall extends CostCallBase {\n status: 'pending'\n}\n\nexport interface CostReceipt extends CostCallBase, CostUsage {\n status: 'settled'\n costUsd: number\n costUnknown: boolean\n usageUnknown?: boolean\n pricing?: {\n inputUsdPerThousand: number\n outputUsdPerThousand: number\n }\n actualCostUsd?: number\n error?: string\n}\n\nexport type CostLedgerRecord = PendingCostCall | CostReceipt\n\n/** @deprecated Read-only compatibility shape. New paid work uses `runPaidCall`. */\nexport type CostLedgerEntry = Omit<\n CostReceipt,\n 'status' | 'callId' | 'phase' | 'actor' | 'maximumCostUsd' | 'usageUnknown' | 'pricing' | 'error'\n>\n\nexport interface CostReceiptInput extends CostUsage {\n model: string\n actualCostUsd?: number\n costUnknown?: boolean\n usageUnknown?: boolean\n}\n\nexport type MaximumCharge =\n | { externallyEnforcedMaximumUsd: number }\n | ({ model: string } & CostUsage)\n\nexport interface RunPaidCallInput<T> {\n callId?: string\n channel: CostChannel\n phase: string\n actor: string\n /** Used before a provider receipt exists and on failures without one. */\n model?: string\n tags?: Record<string, string>\n signal?: AbortSignal\n /** Provider-enforced dollar maximum, or maximum priced token usage. Required when capped. */\n maximumCharge?: MaximumCharge\n /** `callId` can be forwarded as the provider's idempotency key. */\n execute(signal: AbortSignal, callId: string): Promise<T>\n receipt(value: T): CostReceiptInput\n receiptFromError?(error: Error): CostReceiptInput | undefined\n}\n\nexport type PaidCallResult<T> =\n | { succeeded: true; callId: string; value: T; receipt: CostReceipt }\n | { succeeded: false; callId?: string; error: Error; receipt?: CostReceipt }\n\nexport interface ChannelRollup {\n channel: CostChannel\n calls: number\n inputTokens: number\n outputTokens: number\n cachedTokens: number\n costUsd: number\n unpricedCalls: number\n unknownUsageCalls: number\n}\n\nexport interface CostLedgerSummary {\n totalCalls: number\n pendingCalls: number\n unresolvedCalls: number\n reservedCostUsd: number\n inputTokens: number\n outputTokens: number\n cachedTokens: number\n totalCostUsd: number\n byChannel: ChannelRollup[]\n unpricedModels: string[]\n fullyPriced: boolean\n usageComplete: boolean\n accountingComplete: boolean\n incompleteReasons: string[]\n}\n\nexport interface CostLedgerFilter {\n channel?: CostChannel\n phase?: string\n tags?: Record<string, string>\n}\n\n/** Append-only storage. `append` must atomically reject stale revisions. */\nexport interface CostLedgerPersistence {\n read(): { revision: string; events: string }\n append(expectedRevision: string, event: string): string | undefined\n}\n\nexport interface CostLedgerOptions {\n costCeilingUsd?: number\n persistence?: CostLedgerPersistence\n /** Import already-settled receipts without admitting new paid work. */\n receipts?: readonly CostReceipt[]\n}\n\nexport class CostCeilingReachedError extends ValidationError {\n constructor(\n ceilingUsd: number,\n committedAndReservedUsd: number,\n requestedUsd: number,\n phase: string,\n actor: string,\n ) {\n super(\n `CostLedger: reserving ${requestedUsd} for '${actor}' during '${phase}' would exceed ceiling ${ceilingUsd} with ${committedAndReservedUsd} already committed or reserved`,\n )\n }\n}\n\nexport class CostAccountingIncompleteError extends ValidationError {}\n\nexport class CostReservationExceededError extends ValidationError {\n constructor(actor: string, actualUsd: number, maximumUsd: number) {\n super(\n `CostLedger: '${actor}' charged ${actualUsd}, exceeding its enforced maximum ${maximumUsd}`,\n )\n }\n}\n\nexport class CostCallConflictError extends ValidationError {\n readonly callId?: string\n readonly receipt?: CostReceipt\n\n constructor(\n message: string,\n options: { callId?: string; receipt?: CostReceipt; cause?: unknown } = {},\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause })\n this.callId = options.callId\n this.receipt = options.receipt ? cloneReceipt(options.receipt) : undefined\n }\n}\n\nexport class CostLedgerPersistenceError extends ValidationError {\n readonly callId?: string\n readonly receipt?: CostReceipt\n\n constructor(cause: unknown, callId?: string, receipt?: CostReceipt) {\n super(\n `CostLedger: failed to persist${callId ? ` call '${callId}'` : ''}: ${toError(cause).message}`,\n { cause },\n )\n this.callId = callId\n this.receipt = receipt ? cloneReceipt(receipt) : undefined\n }\n}\n\nexport class CostReceiptCaptureError extends ValidationError {\n readonly callId: string\n readonly receipt?: CostReceipt\n readonly receiptError: Error\n\n constructor(callId: string, cause: unknown, receiptError: unknown, receipt?: CostReceipt) {\n super(`CostLedger: could not capture the provider receipt for call '${callId}'`, { cause })\n this.callId = callId\n this.receipt = receipt ? cloneReceipt(receipt) : undefined\n this.receiptError = toError(receiptError)\n }\n}\n\ninterface CostCallEvent {\n version: 1\n record: CostLedgerRecord\n}\n\ninterface CompletedTasksEvent {\n version: 1\n completedTasks: number\n}\n\ninterface CostLimitEvent {\n version: 1\n costCeilingUsd: number\n}\n\ntype CostLedgerEvent = CostCallEvent | CompletedTasksEvent | CostLimitEvent\n\n/** Run-wide paid-call admission, durable call state, receipts, and summaries. */\nexport class CostLedger {\n private readonly records = new Map<string, CostLedgerRecord>()\n private readonly activeCallIds = new Set<string>()\n private readonly lateCallIds = new Set<string>()\n private completedTasks = 0\n private revision = 'memory'\n private costLimitPersisted = false\n readonly costCeilingUsd?: number\n private readonly persistence?: CostLedgerPersistence\n\n constructor(input?: number | CostLedgerOptions) {\n const options = typeof input === 'number' ? { costCeilingUsd: input } : (input ?? {})\n this.persistence = options.persistence\n if (options.costCeilingUsd !== undefined) {\n assertNonNegative(options.costCeilingUsd, 'costCeilingUsd')\n }\n\n let persistedCostCeilingUsd: number | undefined\n if (this.persistence) {\n let stored: ReturnType<CostLedgerPersistence['read']>\n try {\n stored = this.persistence.read()\n } catch (cause) {\n throw new CostLedgerPersistenceError(cause)\n }\n assertString(stored.revision, 'persistence revision')\n this.revision = stored.revision\n const restored = parseEvents(stored.events)\n for (const record of restored.records) this.records.set(record.callId, record)\n this.completedTasks = restored.completedTasks\n persistedCostCeilingUsd = restored.costCeilingUsd\n }\n\n if (\n options.costCeilingUsd !== undefined &&\n persistedCostCeilingUsd !== undefined &&\n options.costCeilingUsd !== persistedCostCeilingUsd\n ) {\n throw new ValidationError(\n `CostLedger: requested cost ceiling ${options.costCeilingUsd} does not match persisted ceiling ${persistedCostCeilingUsd}`,\n )\n }\n this.costCeilingUsd = persistedCostCeilingUsd ?? options.costCeilingUsd\n this.costLimitPersisted =\n !this.persistence ||\n this.costCeilingUsd === undefined ||\n persistedCostCeilingUsd !== undefined\n\n if (\n this.costCeilingUsd !== undefined &&\n [...this.records.values()].some(\n (record) => record.status === 'pending' && record.maximumCostUsd === undefined,\n )\n ) {\n throw new ValidationError('CostLedger: capped event log contains an unbounded pending call')\n }\n\n if (options.receipts?.length) {\n const imported = options.receipts.map((receipt, index) =>\n parseImportedReceipt(receipt, `imported receipt ${index + 1}`),\n )\n this.ensureCostLimitPersisted()\n for (const receipt of imported) this.appendRecord(receipt)\n }\n }\n\n async runPaidCall<T>(input: RunPaidCallInput<T>): Promise<PaidCallResult<T>> {\n let callId: string | undefined\n let pending: PendingCostCall | undefined\n try {\n callId = resolveCallId(input.callId)\n validateAttribution(input)\n if (input.signal?.aborted) {\n return { succeeded: false, callId, error: abortError(input.signal) }\n }\n if (this.records.has(callId)) {\n return {\n succeeded: false,\n callId,\n error: new CostCallConflictError(`CostLedger: callId '${callId}' already exists`),\n }\n }\n this.ensureCostLimitPersisted(callId)\n\n const summary = this.summary()\n if (summary.unresolvedCalls > 0) {\n return {\n succeeded: false,\n callId,\n error: new CostAccountingIncompleteError(\n `CostLedger: ${summary.unresolvedCalls} unresolved call(s) must be reconciled before new paid work`,\n ),\n }\n }\n\n const maximumCostUsd = this.resolveMaximum(input.maximumCharge)\n if (this.costCeilingUsd !== undefined && this.hasIncompleteSettledCall()) {\n return {\n succeeded: false,\n callId,\n error: new CostAccountingIncompleteError(\n `CostLedger: accounting is incomplete; refusing paid call '${input.actor}' during '${input.phase}'`,\n ),\n }\n }\n if (this.costCeilingUsd !== undefined) {\n const committedAndReserved = summary.totalCostUsd + summary.reservedCostUsd\n if (committedAndReserved + maximumCostUsd! > this.costCeilingUsd) {\n return {\n succeeded: false,\n callId,\n error: new CostCeilingReachedError(\n this.costCeilingUsd,\n committedAndReserved,\n maximumCostUsd!,\n input.phase,\n input.actor,\n ),\n }\n }\n }\n\n pending = {\n status: 'pending',\n callId,\n channel: input.channel,\n phase: input.phase,\n actor: input.actor,\n model: pendingModel(input),\n ...(maximumCostUsd === undefined ? {} : { maximumCostUsd }),\n ...(input.tags ? { tags: { ...input.tags } } : {}),\n timestamp: Date.now(),\n }\n this.appendRecord(pending)\n this.activeCallIds.add(callId)\n } catch (error) {\n return { succeeded: false, ...(callId ? { callId } : {}), error: toError(error) }\n }\n\n try {\n return await this.execute(input, pending)\n } catch (error) {\n return { succeeded: false, callId: pending.callId, error: toError(error) }\n } finally {\n if (!this.lateCallIds.has(pending.callId)) this.activeCallIds.delete(pending.callId)\n }\n }\n\n /** Settle a call left pending by a crashed process after reconciling with the provider. */\n reconcile(\n callId: string,\n observed: CostReceiptInput,\n options: { error?: string } = {},\n ): CostReceipt {\n const pending = [...this.records.values()].find(\n (record): record is PendingCostCall =>\n record.callId === callId && record.status === 'pending',\n )\n if (!pending) throw new CostCallConflictError(`CostLedger: no pending call '${callId}'`)\n if (this.activeCallIds.has(callId)) {\n throw new CostCallConflictError(`CostLedger: call '${callId}' is still active`)\n }\n this.ensureCostLimitPersisted(callId)\n return this.commitReceipt(pending, observed, options.error)\n }\n\n list(filter?: CostLedgerFilter): CostReceipt[] {\n return [...this.records.values()]\n .filter((record): record is CostReceipt => record.status === 'settled')\n .filter((receipt) => matches(receipt, filter))\n .map(cloneReceipt)\n }\n\n summary(filter?: CostLedgerFilter): CostLedgerSummary {\n const records = [...this.records.values()].filter((record) => matches(record, filter))\n const pending = records.filter(\n (record): record is PendingCostCall => record.status === 'pending',\n )\n const receipts = records.filter((record): record is CostReceipt => record.status === 'settled')\n const byChannel = new Map<string, ChannelRollup>()\n const unpriced = new Set<string>()\n const incompleteReasons: string[] = pending.map(\n (record) => `call '${record.callId}' for '${record.actor}' is pending`,\n )\n let inputTokens = 0\n let outputTokens = 0\n let cachedTokens = 0\n let totalCostUsd = 0\n\n for (const receipt of receipts) {\n inputTokens += receipt.inputTokens\n outputTokens += receipt.outputTokens\n cachedTokens += receipt.cachedTokens ?? 0\n totalCostUsd += receipt.costUsd\n if (receipt.costUnknown) {\n unpriced.add(receipt.model)\n incompleteReasons.push(\n receipt.error ?? `cost unknown for '${receipt.actor}' using '${receipt.model}'`,\n )\n }\n if (receipt.usageUnknown) {\n incompleteReasons.push(\n `token usage unknown for '${receipt.actor}' using '${receipt.model}'`,\n )\n }\n if (receipt.maximumCostUsd !== undefined && receipt.costUsd > receipt.maximumCostUsd) {\n incompleteReasons.push(\n `'${receipt.actor}' charged ${receipt.costUsd}, exceeding its enforced maximum ${receipt.maximumCostUsd}`,\n )\n }\n const rollup = byChannel.get(receipt.channel) ?? emptyRollup(receipt.channel)\n rollup.calls += 1\n rollup.inputTokens += receipt.inputTokens\n rollup.outputTokens += receipt.outputTokens\n rollup.cachedTokens += receipt.cachedTokens ?? 0\n rollup.costUsd += receipt.costUsd\n if (receipt.costUnknown) rollup.unpricedCalls += 1\n if (receipt.usageUnknown) rollup.unknownUsageCalls += 1\n byChannel.set(receipt.channel, rollup)\n }\n\n return {\n totalCalls: receipts.length,\n pendingCalls: pending.length,\n unresolvedCalls: pending.filter(\n (record) => !this.activeCallIds.has(record.callId) || this.lateCallIds.has(record.callId),\n ).length,\n reservedCostUsd: pending.reduce((sum, record) => sum + (record.maximumCostUsd ?? 0), 0),\n inputTokens,\n outputTokens,\n cachedTokens,\n totalCostUsd,\n byChannel: [...byChannel.values()].sort((a, b) => a.channel.localeCompare(b.channel)),\n unpricedModels: [...unpriced].sort(),\n fullyPriced: unpriced.size === 0,\n usageComplete: receipts.every((receipt) => !receipt.usageUnknown),\n accountingComplete: incompleteReasons.length === 0,\n incompleteReasons: [...new Set(incompleteReasons)],\n }\n }\n\n markCompleted(count = 1): void {\n if (!Number.isInteger(count) || count < 0) {\n throw new ValidationError(\n `CostLedger.markCompleted: count must be a non-negative integer, got ${count}`,\n )\n }\n if (count === 0) return\n this.ensureCostLimitPersisted()\n this.appendEvent({ version: 1, completedTasks: count })\n this.completedTasks += count\n }\n\n costPerCompletedTask(): number | null {\n return this.completedTasks === 0 ? null : this.summary().totalCostUsd / this.completedTasks\n }\n\n private async execute<T>(\n input: RunPaidCallInput<T>,\n pending: PendingCostCall,\n ): Promise<PaidCallResult<T>> {\n const signal = input.signal ?? new AbortController().signal\n if (signal.aborted) {\n return this.commitOutcome(pending, abortError(signal), {\n model: pending.model,\n inputTokens: 0,\n outputTokens: 0,\n actualCostUsd: 0,\n })\n }\n\n const operation = Promise.resolve().then(() => input.execute(signal, pending.callId))\n const settled = await settle(operation, signal)\n if (settled.kind === 'aborted') {\n this.lateCallIds.add(pending.callId)\n this.captureLateOutcome(input, pending, operation)\n return paidFailure(pending.callId, abortError(signal))\n }\n if (settled.kind === 'error') {\n let observed: CostReceiptInput | undefined\n try {\n observed = input.receiptFromError?.(settled.error)\n } catch (receiptError) {\n return this.captureFailure(pending, settled.error, receiptError)\n }\n return this.commitOutcome(pending, settled.error, observed ?? unknownReceipt(pending.model))\n }\n\n try {\n const receipt = this.commitReceipt(pending, input.receipt(settled.value))\n if (receipt.maximumCostUsd !== undefined && receipt.costUsd > receipt.maximumCostUsd) {\n return paidFailure(\n pending.callId,\n new CostReservationExceededError(pending.actor, receipt.costUsd, receipt.maximumCostUsd),\n receipt,\n )\n }\n return { succeeded: true, callId: pending.callId, value: settled.value, receipt }\n } catch (receiptError) {\n if (\n receiptError instanceof CostLedgerPersistenceError ||\n receiptError instanceof CostCallConflictError\n ) {\n return paidFailure(pending.callId, receiptError)\n }\n return this.captureFailure(pending, receiptError, receiptError)\n }\n }\n\n private captureLateOutcome<T>(\n input: RunPaidCallInput<T>,\n pending: PendingCostCall,\n operation: Promise<T>,\n ): void {\n void operation\n .then(\n (value) => {\n if (this.records.get(pending.callId)?.status !== 'pending') return\n try {\n this.commitReceipt(pending, input.receipt(value))\n } catch {\n // A failed durable settlement leaves the reservation pending and blocks new paid work.\n }\n },\n (cause) => {\n if (this.records.get(pending.callId)?.status !== 'pending') return\n const error = toError(cause)\n try {\n const observed = input.receiptFromError?.(error)\n this.commitReceipt(pending, observed ?? unknownReceipt(pending.model), error.message)\n } catch (receiptError) {\n if (\n receiptError instanceof CostLedgerPersistenceError ||\n receiptError instanceof CostCallConflictError\n ) {\n return\n }\n this.captureFailure(pending, error, receiptError)\n }\n },\n )\n .finally(() => {\n this.lateCallIds.delete(pending.callId)\n this.activeCallIds.delete(pending.callId)\n })\n }\n\n private commitOutcome<T>(\n pending: PendingCostCall,\n error: Error,\n observed: CostReceiptInput,\n ): PaidCallResult<T> {\n try {\n const receipt = this.commitReceipt(pending, observed, error.message)\n return paidFailure(pending.callId, error, receipt)\n } catch (receiptError) {\n if (\n receiptError instanceof CostLedgerPersistenceError ||\n receiptError instanceof CostCallConflictError\n ) {\n return paidFailure(pending.callId, receiptError)\n }\n return this.captureFailure(pending, error, receiptError)\n }\n }\n\n private captureFailure<T>(\n pending: PendingCostCall,\n cause: unknown,\n receiptError: unknown,\n ): PaidCallResult<T> {\n try {\n const receipt = this.commitReceipt(\n pending,\n unknownReceipt(pending.model),\n toError(receiptError).message,\n )\n return paidFailure(\n pending.callId,\n new CostReceiptCaptureError(pending.callId, cause, receiptError, receipt),\n receipt,\n )\n } catch (error) {\n const typed = error instanceof Error ? error : toError(error)\n return paidFailure(pending.callId, typed)\n }\n }\n\n private commitReceipt(\n pending: PendingCostCall,\n observed: CostReceiptInput,\n error?: string,\n ): CostReceipt {\n const receipt = buildReceipt(pending, observed, error)\n if (this.records.get(pending.callId)?.status !== 'pending') {\n throw new CostCallConflictError(`CostLedger: call '${pending.callId}' is not pending`)\n }\n this.appendRecord(receipt)\n return cloneReceipt(receipt)\n }\n\n private resolveMaximum(maximum: MaximumCharge | undefined): number | undefined {\n if (!maximum) {\n if (this.costCeilingUsd !== undefined) {\n throw new CostAccountingIncompleteError(\n 'CostLedger: capped paid calls require a hard maximumCharge before execution',\n )\n }\n return undefined\n }\n if ('externallyEnforcedMaximumUsd' in maximum) {\n assertNonNegative(\n maximum.externallyEnforcedMaximumUsd,\n 'maximumCharge.externallyEnforcedMaximumUsd',\n )\n return maximum.externallyEnforcedMaximumUsd\n }\n const priced = costForUsage(maximum.model, maximum)\n if (priced.costUnknown) {\n if (this.costCeilingUsd !== undefined) {\n throw new CostAccountingIncompleteError(\n `CostLedger: cannot reserve unpriced model '${maximum.model}' in a capped run`,\n )\n }\n return undefined\n }\n return priced.costUsd\n }\n\n private hasIncompleteSettledCall(): boolean {\n return [...this.records.values()].some(\n (record) =>\n record.status === 'settled' &&\n (record.costUnknown ||\n record.usageUnknown ||\n (record.maximumCostUsd !== undefined && record.costUsd > record.maximumCostUsd)),\n )\n }\n\n private appendRecord(record: CostLedgerRecord): void {\n const callId = record.callId\n const receipt = record.status === 'settled' ? record : undefined\n validateTransition(this.records, record)\n const event: CostCallEvent = {\n version: 1,\n record: cloneRecord(record),\n }\n this.appendEvent(event, callId, receipt)\n this.records.set(callId, cloneRecord(record))\n }\n\n private ensureCostLimitPersisted(callId?: string): void {\n if (this.costLimitPersisted || this.costCeilingUsd === undefined) return\n this.appendEvent({ version: 1, costCeilingUsd: this.costCeilingUsd }, callId)\n this.costLimitPersisted = true\n }\n\n private appendEvent(event: CostLedgerEvent, callId?: string, receipt?: CostReceipt): void {\n try {\n if (this.persistence) {\n const nextRevision = this.persistence.append(this.revision, `${JSON.stringify(event)}\\n`)\n if (nextRevision === undefined) {\n throw new CostCallConflictError(\n `CostLedger: persisted revision changed while writing call '${callId}'`,\n { callId, receipt },\n )\n }\n assertString(nextRevision, 'persistence revision')\n this.revision = nextRevision\n }\n } catch (cause) {\n if (cause instanceof CostCallConflictError) throw cause\n throw new CostLedgerPersistenceError(cause, callId, receipt)\n }\n }\n}\n\n/** Return the canonical pricing-table key, or null when the model is unpriced. */\nexport function modelPriceKey(model: string): string | null {\n return isModelPriced(model) ? model : null\n}\n\nexport interface CostResult {\n costUsd: number\n costUnknown: boolean\n}\n\nexport function costForUsage(model: string, usage: CostUsage): CostResult {\n assertUsage(usage)\n if (!resolveModelPricing(model)) return { costUsd: 0, costUnknown: true }\n return {\n costUsd: estimateCost(usage.inputTokens + (usage.cachedTokens ?? 0), usage.outputTokens, model),\n costUnknown: false,\n }\n}\n\ntype Settled<T> =\n | { kind: 'value'; value: T }\n | { kind: 'error'; error: Error }\n | { kind: 'aborted' }\n\nasync function settle<T>(promise: Promise<T>, signal: AbortSignal): Promise<Settled<T>> {\n return await new Promise((resolve) => {\n let done = false\n const finish = (value: Settled<T>): void => {\n if (done) return\n done = true\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n }\n const onAbort = () => finish({ kind: 'aborted' })\n signal.addEventListener('abort', onAbort, { once: true })\n if (signal.aborted) onAbort()\n promise.then(\n (value) => finish({ kind: 'value', value }),\n (error) => finish({ kind: 'error', error: toError(error) }),\n )\n })\n}\n\nfunction buildReceipt(\n pending: PendingCostCall,\n observed: CostReceiptInput,\n error?: string,\n): CostReceipt {\n assertUsage(observed)\n assertString(observed.model, 'receipt.model')\n const estimated = costForUsage(observed.model, observed)\n const hasActual = observed.actualCostUsd !== undefined\n if (hasActual && observed.costUnknown === true) {\n throw new ValidationError(\n 'CostLedger: a receipt cannot have both actualCostUsd and costUnknown=true',\n )\n }\n if (hasActual) assertNonNegative(observed.actualCostUsd!, 'actualCostUsd')\n const usageUnknown = observed.usageUnknown === true\n const costUnknown =\n observed.costUnknown === true || (!hasActual && (usageUnknown || estimated.costUnknown))\n const resolvedPricing = !hasActual && !costUnknown ? resolveModelPricing(observed.model) : null\n return parseReceipt(\n {\n status: 'settled',\n callId: pending.callId,\n channel: pending.channel,\n phase: pending.phase,\n actor: pending.actor,\n model: observed.model,\n inputTokens: observed.inputTokens,\n outputTokens: observed.outputTokens,\n ...(observed.cachedTokens === undefined ? {} : { cachedTokens: observed.cachedTokens }),\n costUsd: costUnknown ? 0 : hasActual ? observed.actualCostUsd! : estimated.costUsd,\n costUnknown,\n usageUnknown,\n ...(resolvedPricing\n ? {\n pricing: {\n inputUsdPerThousand: resolvedPricing.input,\n outputUsdPerThousand: resolvedPricing.output,\n },\n }\n : {}),\n ...(hasActual ? { actualCostUsd: observed.actualCostUsd } : {}),\n ...(pending.maximumCostUsd === undefined ? {} : { maximumCostUsd: pending.maximumCostUsd }),\n ...(error ? { error } : {}),\n ...(pending.tags ? { tags: { ...pending.tags } } : {}),\n timestamp: pending.timestamp,\n },\n 'provider receipt',\n )\n}\n\nconst NonEmptyString = z.string().refine((value) => value.trim().length > 0, 'must be non-empty')\nconst TokenCount = z.number().int().nonnegative().finite()\nconst NonNegative = z.number().nonnegative().finite()\nconst Positive = z.number().positive().finite()\nconst Tags = z.record(NonEmptyString, z.string())\nconst CostPricingSchema = z.strictObject({\n inputUsdPerThousand: Positive,\n outputUsdPerThousand: Positive,\n})\nconst CostCallBaseShape = {\n callId: NonEmptyString,\n channel: NonEmptyString,\n phase: NonEmptyString,\n actor: NonEmptyString,\n model: NonEmptyString,\n maximumCostUsd: NonNegative.optional(),\n tags: Tags.optional(),\n timestamp: NonNegative,\n}\nconst PendingCostCallSchema = z.strictObject({\n status: z.literal('pending'),\n ...CostCallBaseShape,\n})\nconst CostReceiptSchema = z\n .strictObject({\n status: z.literal('settled'),\n ...CostCallBaseShape,\n inputTokens: TokenCount,\n outputTokens: TokenCount,\n cachedTokens: TokenCount.optional(),\n costUsd: NonNegative,\n costUnknown: z.boolean(),\n usageUnknown: z.boolean().default(false),\n pricing: CostPricingSchema.optional(),\n actualCostUsd: NonNegative.optional(),\n error: z.string().optional(),\n })\n .superRefine((receipt, ctx) => {\n if (receipt.actualCostUsd !== undefined) {\n if (receipt.costUnknown || receipt.costUsd !== receipt.actualCostUsd) {\n ctx.addIssue({ code: 'custom', message: 'actual cost must be known and equal costUsd' })\n }\n if (receipt.pricing !== undefined) {\n ctx.addIssue({ code: 'custom', message: 'actual cost must not include estimated pricing' })\n }\n return\n }\n if (receipt.costUnknown) {\n if (receipt.costUsd !== 0) {\n ctx.addIssue({ code: 'custom', message: 'unknown cost must have costUsd 0' })\n }\n if (receipt.pricing !== undefined) {\n ctx.addIssue({ code: 'custom', message: 'unknown cost must not include estimated pricing' })\n }\n return\n }\n if (receipt.usageUnknown) {\n ctx.addIssue({ code: 'custom', message: 'known estimated cost requires known usage' })\n }\n if (!receipt.pricing) {\n ctx.addIssue({ code: 'custom', message: 'known estimated cost requires a pricing snapshot' })\n return\n }\n const expected = costFromPricing(receipt, receipt.pricing)\n if (receipt.costUsd !== expected) {\n ctx.addIssue({\n code: 'custom',\n message: `estimated cost ${receipt.costUsd} does not match pricing snapshot ${expected}`,\n })\n }\n })\nconst CostLedgerEventSchema = z.union([\n z.strictObject({\n version: z.literal(1),\n record: z.union([PendingCostCallSchema, CostReceiptSchema]),\n }),\n z.strictObject({\n version: z.literal(1),\n completedTasks: TokenCount,\n }),\n z.strictObject({\n version: z.literal(1),\n costCeilingUsd: NonNegative,\n }),\n])\n\nfunction parseEvents(serialized: string): {\n records: CostLedgerRecord[]\n completedTasks: number\n costCeilingUsd?: number\n} {\n const records = new Map<string, CostLedgerRecord>()\n let completedTasks = 0\n let costCeilingUsd: number | undefined\n let lineNumber = 0\n try {\n for (const line of serialized.split('\\n')) {\n if (!line.trim()) continue\n lineNumber += 1\n const event = CostLedgerEventSchema.parse(JSON.parse(line)) as CostLedgerEvent\n if ('record' in event) {\n validateTransition(records, event.record)\n records.set(event.record.callId, cloneRecord(event.record))\n } else if ('completedTasks' in event) {\n completedTasks += event.completedTasks\n if (!Number.isSafeInteger(completedTasks)) {\n throw new ValidationError('CostLedger: completed task count exceeds safe integer range')\n }\n } else {\n if (costCeilingUsd !== undefined) {\n throw new ValidationError('CostLedger: duplicate persisted cost ceiling')\n }\n costCeilingUsd = event.costCeilingUsd\n }\n }\n return {\n records: [...records.values()],\n completedTasks,\n ...(costCeilingUsd === undefined ? {} : { costCeilingUsd }),\n }\n } catch (cause) {\n throw new ValidationError(\n `CostLedger: invalid persisted event ${lineNumber || 1}: ${validationMessage(cause)}`,\n { cause },\n )\n }\n}\n\nfunction validateTransition(\n records: ReadonlyMap<string, CostLedgerRecord>,\n record: CostLedgerRecord,\n): void {\n const current = records.get(record.callId)\n if (!current) return\n if (record.status === 'pending' || current.status === 'settled') {\n throw new CostCallConflictError(`CostLedger: duplicate callId '${record.callId}'`)\n }\n if (!sameAttribution(current, record)) {\n throw new ValidationError(`CostLedger: receipt attribution changed for call '${record.callId}'`)\n }\n}\n\nfunction sameAttribution(before: CostCallBase, after: CostCallBase): boolean {\n return (\n before.channel === after.channel &&\n before.phase === after.phase &&\n before.actor === after.actor &&\n before.maximumCostUsd === after.maximumCostUsd &&\n before.timestamp === after.timestamp &&\n JSON.stringify(before.tags ?? {}) === JSON.stringify(after.tags ?? {})\n )\n}\n\nfunction parseReceipt(value: unknown, path: string): CostReceipt {\n try {\n return CostReceiptSchema.parse(value) as CostReceipt\n } catch (cause) {\n throw new ValidationError(`CostLedger: invalid ${path}: ${validationMessage(cause)}`, { cause })\n }\n}\n\nfunction parseImportedReceipt(value: unknown, path: string): CostReceipt {\n if (typeof value !== 'object' || value === null) return parseReceipt(value, path)\n const candidate = { ...value } as Record<string, unknown>\n if (\n candidate.status === 'settled' &&\n candidate.actualCostUsd === undefined &&\n candidate.costUnknown === false &&\n candidate.pricing === undefined &&\n typeof candidate.model === 'string'\n ) {\n const pricing = resolveModelPricing(candidate.model)\n if (pricing) {\n candidate.pricing = {\n inputUsdPerThousand: pricing.input,\n outputUsdPerThousand: pricing.output,\n }\n }\n }\n return parseReceipt(candidate, path)\n}\n\nfunction validateAttribution(\n input: Pick<RunPaidCallInput<unknown>, 'channel' | 'phase' | 'actor' | 'model' | 'tags'>,\n): void {\n assertString(input.channel, 'channel')\n assertString(input.phase, 'phase')\n assertString(input.actor, 'actor')\n if (input.model !== undefined) assertString(input.model, 'model')\n if (input.tags !== undefined) {\n const parsed = Tags.safeParse(input.tags)\n if (!parsed.success)\n throw new ValidationError(`CostLedger: invalid tags: ${parsed.error.message}`)\n }\n}\n\nfunction matches(record: CostCallBase, filter: CostLedgerFilter | undefined): boolean {\n if (!filter) return true\n if (filter.channel !== undefined && record.channel !== filter.channel) return false\n if (filter.phase !== undefined && record.phase !== filter.phase) return false\n return Object.entries(filter.tags ?? {}).every(([key, value]) => record.tags?.[key] === value)\n}\n\nfunction cloneRecord(record: CostLedgerRecord): CostLedgerRecord {\n return record.status === 'settled'\n ? cloneReceipt(record)\n : { ...record, tags: record.tags ? { ...record.tags } : undefined }\n}\n\nfunction cloneReceipt(receipt: CostReceipt): CostReceipt {\n return {\n ...receipt,\n tags: receipt.tags ? { ...receipt.tags } : undefined,\n pricing: receipt.pricing ? { ...receipt.pricing } : undefined,\n }\n}\n\nfunction costFromPricing(usage: CostUsage, pricing: NonNullable<CostReceipt['pricing']>): number {\n return (\n ((usage.inputTokens + (usage.cachedTokens ?? 0)) / 1000) * pricing.inputUsdPerThousand +\n (usage.outputTokens / 1000) * pricing.outputUsdPerThousand\n )\n}\n\nfunction emptyRollup(channel: CostChannel): ChannelRollup {\n return {\n channel,\n calls: 0,\n inputTokens: 0,\n outputTokens: 0,\n cachedTokens: 0,\n costUsd: 0,\n unpricedCalls: 0,\n unknownUsageCalls: 0,\n }\n}\n\nfunction pendingModel(input: RunPaidCallInput<unknown>): string {\n if (input.model) return input.model\n if (input.maximumCharge && 'model' in input.maximumCharge) return input.maximumCharge.model\n return 'unknown'\n}\n\nfunction unknownReceipt(model: string): CostReceiptInput {\n return { model, inputTokens: 0, outputTokens: 0, costUnknown: true, usageUnknown: true }\n}\n\nfunction resolveCallId(input: string | undefined): string {\n if (input !== undefined) {\n assertString(input, 'callId')\n return input\n }\n if (typeof globalThis.crypto?.randomUUID !== 'function') {\n throw new ValidationError('CostLedger: crypto.randomUUID is required when callId is omitted')\n }\n return globalThis.crypto.randomUUID()\n}\n\nfunction abortError(signal: AbortSignal): Error {\n const reason = (signal as { reason?: unknown }).reason\n if (reason instanceof Error) return reason\n const error = new Error('CostLedger: paid call aborted')\n error.name = 'AbortError'\n return error\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value))\n}\n\nfunction paidFailure<T>(callId: string, error: Error, receipt?: CostReceipt): PaidCallResult<T> {\n return {\n succeeded: false,\n callId,\n error,\n ...(receipt ? { receipt: cloneReceipt(receipt) } : {}),\n }\n}\n\nfunction validationMessage(cause: unknown): string {\n return cause instanceof z.ZodError ? z.prettifyError(cause) : toError(cause).message\n}\n\nfunction assertUsage(usage: CostUsage): void {\n assertTokenCount(usage.inputTokens, 'inputTokens')\n assertTokenCount(usage.outputTokens, 'outputTokens')\n if (usage.cachedTokens !== undefined) assertTokenCount(usage.cachedTokens, 'cachedTokens')\n}\n\nfunction assertTokenCount(value: unknown, name: string): asserts value is number {\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {\n throw new ValidationError(\n `CostLedger: ${name} must be a non-negative integer, got ${String(value)}`,\n )\n }\n}\n\nfunction assertNonNegative(value: unknown, name: string): asserts value is number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n throw new ValidationError(\n `CostLedger: ${name} must be a non-negative finite number, got ${String(value)}`,\n )\n }\n}\n\nfunction assertString(value: unknown, name: string): asserts value is string {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new ValidationError(`CostLedger: ${name} must be a non-empty string`)\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,31 +0,0 @@
1
- // src/trace/attribute-vocabulary.ts
2
- var OPENINFERENCE_SPAN_KIND = "openinference.span.kind";
3
- var LLM_MODEL_NAME = "llm.model_name";
4
- var LLM_INPUT_TOKENS = "llm.token_count.prompt";
5
- var LLM_OUTPUT_TOKENS = "llm.token_count.completion";
6
- var LLM_REASONING_TOKENS = "llm.token_count.reasoning";
7
- var LLM_CACHED_TOKENS = "llm.token_count.prompt_cache_hit";
8
- var LLM_CACHE_WRITE_TOKENS = "llm.token_count.prompt_cache_write";
9
- var LLM_COST_USD = "llm.cost_usd";
10
- var TOOL_NAME = "tool.name";
11
- var TOOL_ARGS_CAPTURED = "tool.args_captured";
12
- var TOOL_LATENCY_MS = "tool.latency_ms";
13
- var INPUT_VALUE = "input.value";
14
- var OUTPUT_VALUE = "output.value";
15
-
16
- export {
17
- OPENINFERENCE_SPAN_KIND,
18
- LLM_MODEL_NAME,
19
- LLM_INPUT_TOKENS,
20
- LLM_OUTPUT_TOKENS,
21
- LLM_REASONING_TOKENS,
22
- LLM_CACHED_TOKENS,
23
- LLM_CACHE_WRITE_TOKENS,
24
- LLM_COST_USD,
25
- TOOL_NAME,
26
- TOOL_ARGS_CAPTURED,
27
- TOOL_LATENCY_MS,
28
- INPUT_VALUE,
29
- OUTPUT_VALUE
30
- };
31
- //# sourceMappingURL=chunk-WDHBCA3M.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/trace/attribute-vocabulary.ts"],"sourcesContent":["/** Canonical OpenInference-over-OTLP attribute names used at trace boundaries. */\n\nexport const OPENINFERENCE_SPAN_KIND = 'openinference.span.kind'\nexport const LLM_MODEL_NAME = 'llm.model_name'\nexport const LLM_INPUT_TOKENS = 'llm.token_count.prompt'\nexport const LLM_OUTPUT_TOKENS = 'llm.token_count.completion'\nexport const LLM_REASONING_TOKENS = 'llm.token_count.reasoning'\nexport const LLM_CACHED_TOKENS = 'llm.token_count.prompt_cache_hit'\nexport const LLM_CACHE_WRITE_TOKENS = 'llm.token_count.prompt_cache_write'\nexport const LLM_COST_USD = 'llm.cost_usd'\nexport const TOOL_NAME = 'tool.name'\nexport const TOOL_ARGS_CAPTURED = 'tool.args_captured'\nexport const TOOL_LATENCY_MS = 'tool.latency_ms'\nexport const INPUT_VALUE = 'input.value'\nexport const OUTPUT_VALUE = 'output.value'\n"],"mappings":";AAEO,IAAM,0BAA0B;AAChC,IAAM,iBAAiB;AACvB,IAAM,mBAAmB;AACzB,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAC7B,IAAM,oBAAoB;AAC1B,IAAM,yBAAyB;AAC/B,IAAM,eAAe;AACrB,IAAM,YAAY;AAClB,IAAM,qBAAqB;AAC3B,IAAM,kBAAkB;AACxB,IAAM,cAAc;AACpB,IAAM,eAAe;","names":[]}