@dexcost/sdk 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +210 -0
  3. package/dist/adapters/_netbytes.d.ts +31 -0
  4. package/dist/adapters/_netbytes.d.ts.map +1 -0
  5. package/dist/adapters/_netbytes.js +154 -0
  6. package/dist/adapters/_netbytes.js.map +1 -0
  7. package/dist/adapters/aws-lambda.d.ts +41 -0
  8. package/dist/adapters/aws-lambda.d.ts.map +1 -0
  9. package/dist/adapters/aws-lambda.js +65 -0
  10. package/dist/adapters/aws-lambda.js.map +1 -0
  11. package/dist/adapters/browser.d.ts +52 -0
  12. package/dist/adapters/browser.d.ts.map +1 -0
  13. package/dist/adapters/browser.js +127 -0
  14. package/dist/adapters/browser.js.map +1 -0
  15. package/dist/adapters/compute-wrap.d.ts +33 -0
  16. package/dist/adapters/compute-wrap.d.ts.map +1 -0
  17. package/dist/adapters/compute-wrap.js +188 -0
  18. package/dist/adapters/compute-wrap.js.map +1 -0
  19. package/dist/adapters/data/aws_lambda_pricing.json +61 -0
  20. package/dist/adapters/gpu-wrap.d.ts +31 -0
  21. package/dist/adapters/gpu-wrap.d.ts.map +1 -0
  22. package/dist/adapters/gpu-wrap.js +147 -0
  23. package/dist/adapters/gpu-wrap.js.map +1 -0
  24. package/dist/adapters/http.d.ts +58 -0
  25. package/dist/adapters/http.d.ts.map +1 -0
  26. package/dist/adapters/http.js +769 -0
  27. package/dist/adapters/http.js.map +1 -0
  28. package/dist/adapters/index.d.ts +11 -0
  29. package/dist/adapters/index.d.ts.map +1 -0
  30. package/dist/adapters/index.js +12 -0
  31. package/dist/adapters/index.js.map +1 -0
  32. package/dist/adapters/network-accountant.d.ts +63 -0
  33. package/dist/adapters/network-accountant.d.ts.map +1 -0
  34. package/dist/adapters/network-accountant.js +153 -0
  35. package/dist/adapters/network-accountant.js.map +1 -0
  36. package/dist/cli/index.d.ts +13 -0
  37. package/dist/cli/index.d.ts.map +1 -0
  38. package/dist/cli/index.js +225 -0
  39. package/dist/cli/index.js.map +1 -0
  40. package/dist/cli/scanner.d.ts +39 -0
  41. package/dist/cli/scanner.d.ts.map +1 -0
  42. package/dist/cli/scanner.js +480 -0
  43. package/dist/cli/scanner.js.map +1 -0
  44. package/dist/clients.d.ts +54 -0
  45. package/dist/clients.d.ts.map +1 -0
  46. package/dist/clients.js +240 -0
  47. package/dist/clients.js.map +1 -0
  48. package/dist/cloud-detect.d.ts +96 -0
  49. package/dist/cloud-detect.d.ts.map +1 -0
  50. package/dist/cloud-detect.js +545 -0
  51. package/dist/cloud-detect.js.map +1 -0
  52. package/dist/core/auto-task.d.ts +20 -0
  53. package/dist/core/auto-task.d.ts.map +1 -0
  54. package/dist/core/auto-task.js +34 -0
  55. package/dist/core/auto-task.js.map +1 -0
  56. package/dist/core/cgroup-reader.d.ts +45 -0
  57. package/dist/core/cgroup-reader.d.ts.map +1 -0
  58. package/dist/core/cgroup-reader.js +124 -0
  59. package/dist/core/cgroup-reader.js.map +1 -0
  60. package/dist/core/cgroup-walker.d.ts +60 -0
  61. package/dist/core/cgroup-walker.d.ts.map +1 -0
  62. package/dist/core/cgroup-walker.js +166 -0
  63. package/dist/core/cgroup-walker.js.map +1 -0
  64. package/dist/core/compute-accountant.d.ts +51 -0
  65. package/dist/core/compute-accountant.d.ts.map +1 -0
  66. package/dist/core/compute-accountant.js +179 -0
  67. package/dist/core/compute-accountant.js.map +1 -0
  68. package/dist/core/compute-runtime.d.ts +42 -0
  69. package/dist/core/compute-runtime.d.ts.map +1 -0
  70. package/dist/core/compute-runtime.js +80 -0
  71. package/dist/core/compute-runtime.js.map +1 -0
  72. package/dist/core/config.d.ts +44 -0
  73. package/dist/core/config.d.ts.map +1 -0
  74. package/dist/core/config.js +66 -0
  75. package/dist/core/config.js.map +1 -0
  76. package/dist/core/context.d.ts +76 -0
  77. package/dist/core/context.d.ts.map +1 -0
  78. package/dist/core/context.js +91 -0
  79. package/dist/core/context.js.map +1 -0
  80. package/dist/core/fargate-metadata.d.ts +27 -0
  81. package/dist/core/fargate-metadata.d.ts.map +1 -0
  82. package/dist/core/fargate-metadata.js +102 -0
  83. package/dist/core/fargate-metadata.js.map +1 -0
  84. package/dist/core/gpu-accountant.d.ts +104 -0
  85. package/dist/core/gpu-accountant.d.ts.map +1 -0
  86. package/dist/core/gpu-accountant.js +383 -0
  87. package/dist/core/gpu-accountant.js.map +1 -0
  88. package/dist/core/gpu-runtime.d.ts +58 -0
  89. package/dist/core/gpu-runtime.d.ts.map +1 -0
  90. package/dist/core/gpu-runtime.js +131 -0
  91. package/dist/core/gpu-runtime.js.map +1 -0
  92. package/dist/core/heuristics.d.ts +74 -0
  93. package/dist/core/heuristics.d.ts.map +1 -0
  94. package/dist/core/heuristics.js +182 -0
  95. package/dist/core/heuristics.js.map +1 -0
  96. package/dist/core/models.d.ts +149 -0
  97. package/dist/core/models.d.ts.map +1 -0
  98. package/dist/core/models.js +226 -0
  99. package/dist/core/models.js.map +1 -0
  100. package/dist/core/nvml-reader.d.ts +114 -0
  101. package/dist/core/nvml-reader.d.ts.map +1 -0
  102. package/dist/core/nvml-reader.js +323 -0
  103. package/dist/core/nvml-reader.js.map +1 -0
  104. package/dist/core/session.d.ts +48 -0
  105. package/dist/core/session.d.ts.map +1 -0
  106. package/dist/core/session.js +123 -0
  107. package/dist/core/session.js.map +1 -0
  108. package/dist/core/tracker.d.ts +364 -0
  109. package/dist/core/tracker.d.ts.map +1 -0
  110. package/dist/core/tracker.js +1073 -0
  111. package/dist/core/tracker.js.map +1 -0
  112. package/dist/data/compute_prices.json +180 -0
  113. package/dist/data/egress_prices.json +418 -0
  114. package/dist/data/gpu_prices.json +412 -0
  115. package/dist/data/service_prices.json +2595 -0
  116. package/dist/dev-console.d.ts +12 -0
  117. package/dist/dev-console.d.ts.map +1 -0
  118. package/dist/dev-console.js +60 -0
  119. package/dist/dev-console.js.map +1 -0
  120. package/dist/index.d.ts +52 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +61 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/instruments/anthropic.d.ts +26 -0
  125. package/dist/instruments/anthropic.d.ts.map +1 -0
  126. package/dist/instruments/anthropic.js +242 -0
  127. package/dist/instruments/anthropic.js.map +1 -0
  128. package/dist/instruments/bedrock.d.ts +29 -0
  129. package/dist/instruments/bedrock.d.ts.map +1 -0
  130. package/dist/instruments/bedrock.js +215 -0
  131. package/dist/instruments/bedrock.js.map +1 -0
  132. package/dist/instruments/cohere.d.ts +29 -0
  133. package/dist/instruments/cohere.d.ts.map +1 -0
  134. package/dist/instruments/cohere.js +237 -0
  135. package/dist/instruments/cohere.js.map +1 -0
  136. package/dist/instruments/gemini.d.ts +30 -0
  137. package/dist/instruments/gemini.d.ts.map +1 -0
  138. package/dist/instruments/gemini.js +247 -0
  139. package/dist/instruments/gemini.js.map +1 -0
  140. package/dist/instruments/index.d.ts +35 -0
  141. package/dist/instruments/index.d.ts.map +1 -0
  142. package/dist/instruments/index.js +54 -0
  143. package/dist/instruments/index.js.map +1 -0
  144. package/dist/instruments/mcp.d.ts +24 -0
  145. package/dist/instruments/mcp.d.ts.map +1 -0
  146. package/dist/instruments/mcp.js +459 -0
  147. package/dist/instruments/mcp.js.map +1 -0
  148. package/dist/instruments/openai.d.ts +26 -0
  149. package/dist/instruments/openai.d.ts.map +1 -0
  150. package/dist/instruments/openai.js +221 -0
  151. package/dist/instruments/openai.js.map +1 -0
  152. package/dist/instruments/vercel-ai.d.ts +28 -0
  153. package/dist/instruments/vercel-ai.d.ts.map +1 -0
  154. package/dist/instruments/vercel-ai.js +192 -0
  155. package/dist/instruments/vercel-ai.js.map +1 -0
  156. package/dist/integrations/langchain.d.ts +65 -0
  157. package/dist/integrations/langchain.d.ts.map +1 -0
  158. package/dist/integrations/langchain.js +165 -0
  159. package/dist/integrations/langchain.js.map +1 -0
  160. package/dist/middleware/express.d.ts +55 -0
  161. package/dist/middleware/express.d.ts.map +1 -0
  162. package/dist/middleware/express.js +101 -0
  163. package/dist/middleware/express.js.map +1 -0
  164. package/dist/middleware/index.d.ts +6 -0
  165. package/dist/middleware/index.d.ts.map +1 -0
  166. package/dist/middleware/index.js +5 -0
  167. package/dist/middleware/index.js.map +1 -0
  168. package/dist/pricing/compute-pricing.d.ts +57 -0
  169. package/dist/pricing/compute-pricing.d.ts.map +1 -0
  170. package/dist/pricing/compute-pricing.js +627 -0
  171. package/dist/pricing/compute-pricing.js.map +1 -0
  172. package/dist/pricing/cost_map.json +37665 -0
  173. package/dist/pricing/egress-pricing.d.ts +55 -0
  174. package/dist/pricing/egress-pricing.d.ts.map +1 -0
  175. package/dist/pricing/egress-pricing.js +226 -0
  176. package/dist/pricing/egress-pricing.js.map +1 -0
  177. package/dist/pricing/engine.d.ts +24 -0
  178. package/dist/pricing/engine.d.ts.map +1 -0
  179. package/dist/pricing/engine.js +148 -0
  180. package/dist/pricing/engine.js.map +1 -0
  181. package/dist/pricing/gpu-pricing.d.ts +63 -0
  182. package/dist/pricing/gpu-pricing.d.ts.map +1 -0
  183. package/dist/pricing/gpu-pricing.js +484 -0
  184. package/dist/pricing/gpu-pricing.js.map +1 -0
  185. package/dist/pricing/rates.d.ts +17 -0
  186. package/dist/pricing/rates.d.ts.map +1 -0
  187. package/dist/pricing/rates.js +102 -0
  188. package/dist/pricing/rates.js.map +1 -0
  189. package/dist/pricing/service-catalog.d.ts +87 -0
  190. package/dist/pricing/service-catalog.d.ts.map +1 -0
  191. package/dist/pricing/service-catalog.js +406 -0
  192. package/dist/pricing/service-catalog.js.map +1 -0
  193. package/dist/schema/dexcost-event.v1.json +111 -0
  194. package/dist/schema/dexcost-task.v1.json +160 -0
  195. package/dist/schema/validate.d.ts +15 -0
  196. package/dist/schema/validate.d.ts.map +1 -0
  197. package/dist/schema/validate.js +87 -0
  198. package/dist/schema/validate.js.map +1 -0
  199. package/dist/security/redaction.d.ts +55 -0
  200. package/dist/security/redaction.d.ts.map +1 -0
  201. package/dist/security/redaction.js +144 -0
  202. package/dist/security/redaction.js.map +1 -0
  203. package/dist/transport/buffer.d.ts +117 -0
  204. package/dist/transport/buffer.d.ts.map +1 -0
  205. package/dist/transport/buffer.js +759 -0
  206. package/dist/transport/buffer.js.map +1 -0
  207. package/dist/transport/pusher.d.ts +89 -0
  208. package/dist/transport/pusher.d.ts.map +1 -0
  209. package/dist/transport/pusher.js +323 -0
  210. package/dist/transport/pusher.js.map +1 -0
  211. package/package.json +93 -0
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Development mode console output for dexcost.
3
+ *
4
+ * When DEXCOST_ENV=development or environment: "development" is passed,
5
+ * every recorded event is printed to stderr with a formatted summary.
6
+ */
7
+ import type { CostEvent, Task } from "./core/models.js";
8
+ export declare function isDevMode(): boolean;
9
+ export declare function enableDevMode(): void;
10
+ export declare function logEvent(event: CostEvent, taskType?: string): void;
11
+ export declare function logTaskComplete(task: Task): void;
12
+ //# sourceMappingURL=dev-console.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-console.d.ts","sourceRoot":"","sources":["../src/dev-console.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAIxD,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,GAAE,MAAW,GAAG,IAAI,CAiCtE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAYhD"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Development mode console output for dexcost.
3
+ *
4
+ * When DEXCOST_ENV=development or environment: "development" is passed,
5
+ * every recorded event is printed to stderr with a formatted summary.
6
+ */
7
+ let _devMode = false;
8
+ export function isDevMode() {
9
+ return _devMode;
10
+ }
11
+ export function enableDevMode() {
12
+ _devMode = true;
13
+ print("\x1b[36m[dexcost]\x1b[0m dev mode — cloud sync disabled");
14
+ }
15
+ export function logEvent(event, taskType = "") {
16
+ if (!_devMode)
17
+ return;
18
+ const cost = event.costUsd;
19
+ const taskTag = taskType ? ` \x1b[90m(task: ${taskType})\x1b[0m` : "";
20
+ if (event.eventType === "llm_call") {
21
+ const provider = event.provider ?? "?";
22
+ const model = event.model ?? "?";
23
+ const inTok = event.inputTokens ?? 0;
24
+ const outTok = event.outputTokens ?? 0;
25
+ const cached = event.cachedTokens ?? 0;
26
+ const retryTag = event.isRetry ? " \x1b[33m(retry)\x1b[0m" : "";
27
+ const cacheTag = cached > 0 ? ` cached: ${cached.toLocaleString()}` : "";
28
+ print(`\x1b[32m✓\x1b[0m llm_call ${provider}/${model} ` +
29
+ `${inTok.toLocaleString()} in / ${outTok.toLocaleString()} out${cacheTag} ` +
30
+ `$${cost}${retryTag}${taskTag}`);
31
+ }
32
+ else if (event.eventType === "external_cost" || event.eventType === "compute_cost") {
33
+ const service = event.serviceName ?? "unknown";
34
+ if (event.costConfidence === "unknown" || cost === 0) {
35
+ print(`\x1b[33m⚠\x1b[0m ${event.eventType} ${service} ` +
36
+ `$0.00 \x1b[33m(no rate configured)\x1b[0m${taskTag}`);
37
+ }
38
+ else {
39
+ print(`\x1b[32m✓\x1b[0m ${event.eventType} ${service} $${cost}${taskTag}`);
40
+ }
41
+ }
42
+ else if (event.eventType === "retry_marker") {
43
+ const reason = event.retryReason ?? "unknown";
44
+ print(`\x1b[33m↻\x1b[0m retry_marker reason: ${reason} $${cost}${taskTag}`);
45
+ }
46
+ }
47
+ export function logTaskComplete(task) {
48
+ if (!_devMode)
49
+ return;
50
+ let retryInfo = "";
51
+ if (task.retryCount > 0) {
52
+ retryInfo = ` retries: ${task.retryCount} retry cost: $${task.retryCostUsd}`;
53
+ }
54
+ print(`\x1b[36m✓\x1b[0m task ${task.status} ${task.taskType} ` +
55
+ `total: $${task.totalCostUsd}${retryInfo}`);
56
+ }
57
+ function print(msg) {
58
+ process.stderr.write(`\x1b[36m[dexcost]\x1b[0m ${msg}\n`);
59
+ }
60
+ //# sourceMappingURL=dev-console.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-console.js","sourceRoot":"","sources":["../src/dev-console.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * dexcost TypeScript SDK — Agent Unit Economics for Node.js.
3
+ *
4
+ * Tracks LLM costs, non-LLM service fees, retry waste, and attributes
5
+ * them to customers, projects, and workflows.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { CostTracker } from 'dexcost';
10
+ *
11
+ * const tracker = new CostTracker();
12
+ * await tracker.track({ taskType: 'summarize', customerId: 'acme' }, async (task) => {
13
+ * task.recordLlmCall('openai', 'gpt-4o', 800, 150);
14
+ * task.recordCost('pdf_parser', 0.002);
15
+ * });
16
+ * ```
17
+ */
18
+ export { CostTracker, TrackedTask } from "./core/tracker.js";
19
+ export type { TrackerOptions } from "./core/tracker.js";
20
+ export { init, getTracker, globalTrack as track, globalFlush as flush, globalClose as close, globalCloseAsync as closeAsync, setApiKey, } from "./core/tracker.js";
21
+ export { getCurrentTask, runWithTask, setContext, getContext, clearContext, } from "./core/context.js";
22
+ export type { DexcostContext } from "./core/context.js";
23
+ export { createTask, createCostEvent, taskToDict, eventToDict, taskFromDict, eventFromDict, } from "./core/models.js";
24
+ export type { Task, CostEvent, TaskStatus, EventType, CostConfidence, PricingSource, } from "./core/models.js";
25
+ export { validateApiKey, resolveConfig, InvalidAPIKeyError, } from "./core/config.js";
26
+ export type { KeyType, StorageMode, ResolvedConfig } from "./core/config.js";
27
+ export { createAutoTask, needsAutoTask } from "./core/auto-task.js";
28
+ export { isDevMode } from "./dev-console.js";
29
+ export { EventBuffer } from "./transport/buffer.js";
30
+ export { EventPusher } from "./transport/pusher.js";
31
+ export { redactDict, hashValue, enforceMetadataLimit, scrubUrl, } from "./security/redaction.js";
32
+ export { PricingEngine } from "./pricing/engine.js";
33
+ export type { CostResult } from "./pricing/engine.js";
34
+ export { RateRegistry } from "./pricing/rates.js";
35
+ export type { RateEntry } from "./pricing/rates.js";
36
+ export { RetryHeuristicEngine, TRANSIENT_ERRORS, ERROR_LIKELIHOODS } from "./core/heuristics.js";
37
+ export type { HeuristicMatch } from "./core/heuristics.js";
38
+ export { ALL_SUPPORTED_INSTRUMENTS } from "./instruments/index.js";
39
+ export type { InstrumentName } from "./instruments/index.js";
40
+ export { createExpressMiddleware } from "./middleware/express.js";
41
+ export type { ExpressMiddlewareOptions } from "./middleware/express.js";
42
+ export { SessionManager } from "./core/session.js";
43
+ export { ServiceCatalog } from "./pricing/service-catalog.js";
44
+ export type { ServiceEntry, CostExtractionResult } from "./pricing/service-catalog.js";
45
+ export { registerDomainRate, getDomainRates, clearDomainRates, trackHttp, untrackHttp, getRecordedEvents, clearRecordedEvents, getServiceCatalog, resetServiceCatalog, getSessionManager, trackBrowser, getBrowserEvents, clearBrowserEvents, lambdaCost, getSupportedRegions, } from "./adapters/index.js";
46
+ export type { TrackBrowserOptions, LambdaCostResult, LambdaCostDetails, } from "./adapters/index.js";
47
+ export { wrapLambdaHandler, wrapCloudRunHandler, wrapCloudFunctionsHandler, wrapAzureFunctionsHandler, wrapVercelHandler, } from "./adapters/compute-wrap.js";
48
+ export { wrapModalHandler, wrapRunpodHandler, wrapReplicateHandler, } from "./adapters/gpu-wrap.js";
49
+ export { DexcostCallbackHandler } from "./integrations/langchain.js";
50
+ export { validate } from "./schema/validate.js";
51
+ export { TrackedOpenAI, TrackedAnthropic } from "./clients.js";
52
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,61 @@
1
+ /**
2
+ * dexcost TypeScript SDK — Agent Unit Economics for Node.js.
3
+ *
4
+ * Tracks LLM costs, non-LLM service fees, retry waste, and attributes
5
+ * them to customers, projects, and workflows.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { CostTracker } from 'dexcost';
10
+ *
11
+ * const tracker = new CostTracker();
12
+ * await tracker.track({ taskType: 'summarize', customerId: 'acme' }, async (task) => {
13
+ * task.recordLlmCall('openai', 'gpt-4o', 800, 150);
14
+ * task.recordCost('pdf_parser', 0.002);
15
+ * });
16
+ * ```
17
+ */
18
+ // Core
19
+ export { CostTracker, TrackedTask } from "./core/tracker.js";
20
+ // Singleton / init pattern
21
+ export { init, getTracker, globalTrack as track, globalFlush as flush, globalClose as close, globalCloseAsync as closeAsync, setApiKey, } from "./core/tracker.js";
22
+ export { getCurrentTask, runWithTask, setContext, getContext, clearContext, } from "./core/context.js";
23
+ export { createTask, createCostEvent, taskToDict, eventToDict, taskFromDict, eventFromDict, } from "./core/models.js";
24
+ // Configuration / API-key validation
25
+ export { validateApiKey, resolveConfig, InvalidAPIKeyError, } from "./core/config.js";
26
+ // Auto-task
27
+ export { createAutoTask, needsAutoTask } from "./core/auto-task.js";
28
+ // Dev Mode
29
+ export { isDevMode } from "./dev-console.js";
30
+ // Transport
31
+ export { EventBuffer } from "./transport/buffer.js";
32
+ export { EventPusher } from "./transport/pusher.js";
33
+ // Security
34
+ export { redactDict, hashValue, enforceMetadataLimit, scrubUrl, } from "./security/redaction.js";
35
+ // Pricing
36
+ export { PricingEngine } from "./pricing/engine.js";
37
+ // Rate Registry
38
+ export { RateRegistry } from "./pricing/rates.js";
39
+ // Retry Heuristics
40
+ export { RetryHeuristicEngine, TRANSIENT_ERRORS, ERROR_LIKELIHOODS } from "./core/heuristics.js";
41
+ // Instruments
42
+ export { ALL_SUPPORTED_INSTRUMENTS } from "./instruments/index.js";
43
+ // Middleware
44
+ export { createExpressMiddleware } from "./middleware/express.js";
45
+ // Session
46
+ export { SessionManager } from "./core/session.js";
47
+ // Service Catalog
48
+ export { ServiceCatalog } from "./pricing/service-catalog.js";
49
+ // Adapters
50
+ export { registerDomainRate, getDomainRates, clearDomainRates, trackHttp, untrackHttp, getRecordedEvents, clearRecordedEvents, getServiceCatalog, resetServiceCatalog, getSessionManager, trackBrowser, getBrowserEvents, clearBrowserEvents, lambdaCost, getSupportedRegions, } from "./adapters/index.js";
51
+ // Compute handler wraps — serverless capture (Phase 1 compute foundation).
52
+ export { wrapLambdaHandler, wrapCloudRunHandler, wrapCloudFunctionsHandler, wrapAzureFunctionsHandler, wrapVercelHandler, } from "./adapters/compute-wrap.js";
53
+ // GPU handler wraps — serverless GPU capture (Phase 2 GPU foundation).
54
+ export { wrapModalHandler, wrapRunpodHandler, wrapReplicateHandler, } from "./adapters/gpu-wrap.js";
55
+ // Integrations
56
+ export { DexcostCallbackHandler } from "./integrations/langchain.js";
57
+ // Schema Validation
58
+ export { validate } from "./schema/validate.js";
59
+ // Client Wrappers
60
+ export { TrackedOpenAI, TrackedAnthropic } from "./clients.js";
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO;AACP,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG7D,2BAA2B;AAC3B,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,IAAI,KAAK,EACpB,WAAW,IAAI,KAAK,EACpB,WAAW,IAAI,KAAK,EACpB,gBAAgB,IAAI,UAAU,EAC9B,SAAS,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,UAAU,EACV,eAAe,EACf,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,GACd,MAAM,kBAAkB,CAAC;AAU1B,qCAAqC;AACrC,OAAO,EACL,cAAc,EACd,aAAa,EACb,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAG1B,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpE,WAAW;AACX,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,YAAY;AACZ,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,WAAW;AACX,OAAO,EACL,UAAU,EACV,SAAS,EACT,oBAAoB,EACpB,QAAQ,GACT,MAAM,yBAAyB,CAAC;AAEjC,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,mBAAmB;AACnB,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGjG,cAAc;AACd,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,aAAa;AACb,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAGlE,UAAU;AACV,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG9D,WAAW;AACX,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAO7B,2EAA2E;AAC3E,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAEpC,uEAAuE;AACvE,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,eAAe;AACf,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,oBAAoB;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,kBAAkB;AAClB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Anthropic auto-instrumentation for dexcost TypeScript SDK.
3
+ *
4
+ * Monkey-patches `Anthropic.Messages.prototype.create` to automatically
5
+ * record cost events and aggregate token usage on the active task context.
6
+ *
7
+ * Supports both non-streaming and streaming responses.
8
+ */
9
+ import type { EventBuffer } from "../transport/buffer.js";
10
+ import type { PricingEngine } from "../pricing/engine.js";
11
+ /** Test helper: inject a mock Messages class so tests avoid importing @anthropic-ai/sdk. */
12
+ export declare function _setMessagesClass(cls: any): void;
13
+ /** Test helper: reset to real module resolution. */
14
+ export declare function _resetMessagesClass(): void;
15
+ /**
16
+ * Patch `Anthropic.Messages.prototype.create` to record cost events.
17
+ *
18
+ * If `@anthropic-ai/sdk` is not installed and no mock class is injected, the
19
+ * dynamic import will throw and the function will reject.
20
+ */
21
+ export declare function instrumentAnthropic(pricing: PricingEngine, buffer: EventBuffer): Promise<void>;
22
+ /**
23
+ * Remove the monkey-patch and restore the original `create` method.
24
+ */
25
+ export declare function uninstrumentAnthropic(): void;
26
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/instruments/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,sBAAsB,CAAC;AAYtE,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAEhD;AAED,oDAAoD;AACpD,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CAmDf;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAW5C"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Anthropic auto-instrumentation for dexcost TypeScript SDK.
3
+ *
4
+ * Monkey-patches `Anthropic.Messages.prototype.create` to automatically
5
+ * record cost events and aggregate token usage on the active task context.
6
+ *
7
+ * Supports both non-streaming and streaming responses.
8
+ */
9
+ import { randomUUID } from "node:crypto";
10
+ import { createCostEvent } from "../core/models.js";
11
+ import { getCurrentTask } from "../core/context.js";
12
+ import { createAutoTask } from "../core/auto-task.js";
13
+ import { registerInstrument } from "./index.js";
14
+ /* eslint-disable @typescript-eslint/no-explicit-any */
15
+ let _patched = false;
16
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
17
+ let _original = null;
18
+ let _messagesClass = null;
19
+ let _buffer = null;
20
+ let _pricing = null;
21
+ /** Test helper: inject a mock Messages class so tests avoid importing @anthropic-ai/sdk. */
22
+ export function _setMessagesClass(cls) {
23
+ _messagesClass = cls;
24
+ }
25
+ /** Test helper: reset to real module resolution. */
26
+ export function _resetMessagesClass() {
27
+ _messagesClass = null;
28
+ }
29
+ /**
30
+ * Patch `Anthropic.Messages.prototype.create` to record cost events.
31
+ *
32
+ * If `@anthropic-ai/sdk` is not installed and no mock class is injected, the
33
+ * dynamic import will throw and the function will reject.
34
+ */
35
+ export async function instrumentAnthropic(pricing, buffer) {
36
+ if (_patched)
37
+ return;
38
+ let MessagesProto;
39
+ if (_messagesClass) {
40
+ MessagesProto = _messagesClass.prototype;
41
+ }
42
+ else {
43
+ // @anthropic-ai/sdk is an optional peer dependency; the dynamic import
44
+ // only succeeds at runtime if the user has installed it.
45
+ // @ts-ignore -- @anthropic-ai/sdk is an optional peer dependency
46
+ const anthropicModule = await import("@anthropic-ai/sdk");
47
+ const Anthropic = anthropicModule.default ?? anthropicModule;
48
+ MessagesProto = Anthropic.Messages.prototype;
49
+ }
50
+ _original = MessagesProto.create;
51
+ _buffer = buffer;
52
+ _pricing = pricing;
53
+ MessagesProto.create = async function (body, options) {
54
+ let task = getCurrentTask();
55
+ // Auto-create a task when no explicit task is active so LLM costs
56
+ // are never silently lost (mirrors Python create_auto_task).
57
+ if (!task) {
58
+ task = createAutoTask("anthropic.messages");
59
+ _buffer?.upsertTask(task);
60
+ }
61
+ const startTime = performance.now();
62
+ if (body?.stream) {
63
+ const rawStream = await _original.call(this, body, options);
64
+ return wrapStream(rawStream, task, startTime);
65
+ }
66
+ const response = await _original.call(this, body, options);
67
+ try {
68
+ const latencyMs = Math.round(performance.now() - startTime);
69
+ recordEvent(response, task, latencyMs);
70
+ }
71
+ catch {
72
+ // dexcost errors must never crash user code
73
+ }
74
+ return response;
75
+ };
76
+ _patched = true;
77
+ }
78
+ /**
79
+ * Remove the monkey-patch and restore the original `create` method.
80
+ */
81
+ export function uninstrumentAnthropic() {
82
+ if (!_patched || !_original)
83
+ return;
84
+ if (_messagesClass) {
85
+ _messagesClass.prototype.create = _original;
86
+ }
87
+ _original = null;
88
+ _buffer = null;
89
+ _pricing = null;
90
+ _patched = false;
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // Internal helpers
94
+ // ---------------------------------------------------------------------------
95
+ function recordEvent(response, task, latencyMs) {
96
+ if (!_buffer || !_pricing)
97
+ return;
98
+ const model = response?.model ?? "unknown";
99
+ const usage = response?.usage;
100
+ const hasUsage = usage != null;
101
+ const inputTokens = usage?.input_tokens ?? 0;
102
+ const outputTokens = usage?.output_tokens ?? 0;
103
+ const cachedTokens = usage?.cache_read_input_tokens ?? 0;
104
+ const cacheCreationTokens = usage?.cache_creation_input_tokens ?? 0;
105
+ let costUsd = 0;
106
+ let costConfidence = "estimated";
107
+ let pricingSource = "unknown";
108
+ if (hasUsage) {
109
+ const result = _pricing.getCost(model, inputTokens, outputTokens, cachedTokens, cacheCreationTokens);
110
+ costUsd = result.costUsd;
111
+ costConfidence = result.costConfidence;
112
+ pricingSource = result.pricingSource;
113
+ }
114
+ const details = {};
115
+ if (cacheCreationTokens > 0) {
116
+ details["cache_creation_input_tokens"] = cacheCreationTokens;
117
+ }
118
+ const event = createCostEvent({
119
+ eventId: randomUUID(),
120
+ taskId: task.taskId,
121
+ eventType: "llm_call",
122
+ costUsd,
123
+ costConfidence,
124
+ pricingSource,
125
+ provider: "anthropic",
126
+ model,
127
+ inputTokens,
128
+ outputTokens,
129
+ cachedTokens,
130
+ latencyMs,
131
+ isRetry: false,
132
+ details,
133
+ });
134
+ _buffer.addEvent(event);
135
+ task.llmCostUsd += costUsd;
136
+ task.totalCostUsd += costUsd;
137
+ task.totalInputTokens += inputTokens;
138
+ task.totalOutputTokens += outputTokens;
139
+ task.totalCachedTokens += cachedTokens;
140
+ _buffer.upsertTask(task);
141
+ }
142
+ function wrapStream(rawStream, task, startTime) {
143
+ let model = "unknown";
144
+ let inputTokens = 0;
145
+ let outputTokens = 0;
146
+ let cachedTokens = 0;
147
+ let cacheCreationTokens = 0;
148
+ let hasUsage = false;
149
+ let finalized = false;
150
+ return {
151
+ [Symbol.asyncIterator]() {
152
+ const iter = rawStream[Symbol.asyncIterator]();
153
+ return {
154
+ async next() {
155
+ const result = await iter.next();
156
+ if (result.done) {
157
+ if (finalized)
158
+ return result;
159
+ finalized = true;
160
+ try {
161
+ const latencyMs = Math.round(performance.now() - startTime);
162
+ if (hasUsage && _pricing && _buffer) {
163
+ const costResult = _pricing.getCost(model, inputTokens, outputTokens, cachedTokens, cacheCreationTokens);
164
+ const details = {};
165
+ if (cacheCreationTokens > 0) {
166
+ details["cache_creation_input_tokens"] = cacheCreationTokens;
167
+ }
168
+ const event = createCostEvent({
169
+ eventId: randomUUID(),
170
+ taskId: task.taskId,
171
+ eventType: "llm_call",
172
+ costUsd: costResult.costUsd,
173
+ costConfidence: costResult.costConfidence,
174
+ pricingSource: costResult.pricingSource,
175
+ provider: "anthropic",
176
+ model,
177
+ inputTokens,
178
+ outputTokens,
179
+ cachedTokens,
180
+ latencyMs,
181
+ isRetry: false,
182
+ details,
183
+ });
184
+ _buffer.addEvent(event);
185
+ task.llmCostUsd += costResult.costUsd;
186
+ task.totalCostUsd += costResult.costUsd;
187
+ task.totalInputTokens += inputTokens;
188
+ task.totalOutputTokens += outputTokens;
189
+ task.totalCachedTokens += cachedTokens;
190
+ _buffer.upsertTask(task);
191
+ }
192
+ else if (_buffer) {
193
+ const event = createCostEvent({
194
+ eventId: randomUUID(),
195
+ taskId: task.taskId,
196
+ eventType: "llm_call",
197
+ costUsd: 0,
198
+ costConfidence: "estimated",
199
+ pricingSource: "unknown",
200
+ provider: "anthropic",
201
+ model,
202
+ inputTokens: 0,
203
+ outputTokens: 0,
204
+ latencyMs,
205
+ isRetry: false,
206
+ });
207
+ _buffer.addEvent(event);
208
+ _buffer.upsertTask(task);
209
+ }
210
+ }
211
+ catch {
212
+ // dexcost errors must never crash user code
213
+ }
214
+ return result;
215
+ }
216
+ const chunk = result.value;
217
+ // Anthropic streaming event types
218
+ if (chunk?.type === "message_start" && chunk?.message) {
219
+ if (chunk.message.model)
220
+ model = chunk.message.model;
221
+ if (chunk.message.usage) {
222
+ hasUsage = true;
223
+ inputTokens = chunk.message.usage.input_tokens ?? inputTokens;
224
+ cachedTokens =
225
+ chunk.message.usage.cache_read_input_tokens ?? cachedTokens;
226
+ cacheCreationTokens =
227
+ chunk.message.usage.cache_creation_input_tokens ?? cacheCreationTokens;
228
+ }
229
+ }
230
+ if (chunk?.type === "message_delta" && chunk?.usage) {
231
+ hasUsage = true;
232
+ outputTokens = chunk.usage.output_tokens ?? outputTokens;
233
+ }
234
+ return result;
235
+ },
236
+ };
237
+ },
238
+ };
239
+ }
240
+ // Self-register so importing this module is enough to make the instrument available.
241
+ registerInstrument("anthropic", instrumentAnthropic, uninstrumentAnthropic);
242
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/instruments/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * AWS Bedrock auto-instrumentation for dexcost TypeScript SDK.
3
+ *
4
+ * Monkey-patches `BedrockRuntimeClient.prototype.send` to capture
5
+ * InvokeModel and InvokeModelWithResponseStream commands, automatically
6
+ * recording cost events and aggregating token usage on the active task context.
7
+ *
8
+ * Token usage is parsed from the response body JSON and varies by model
9
+ * family (Anthropic, Amazon Titan, Meta Llama, Cohere, Mistral, AI21).
10
+ */
11
+ import type { EventBuffer } from "../transport/buffer.js";
12
+ import type { PricingEngine } from "../pricing/engine.js";
13
+ /** Test helper: inject a mock BedrockRuntimeClient class so tests avoid importing @aws-sdk/client-bedrock-runtime. */
14
+ export declare function _setClientClass(cls: any): void;
15
+ /** Test helper: reset to real module resolution. */
16
+ export declare function _resetClientClass(): void;
17
+ /**
18
+ * Patch `BedrockRuntimeClient.prototype.send` to record cost events for
19
+ * InvokeModelCommand calls.
20
+ *
21
+ * If `@aws-sdk/client-bedrock-runtime` is not installed and no mock class is
22
+ * injected, the dynamic import will throw and the function will reject.
23
+ */
24
+ export declare function instrumentBedrock(pricing: PricingEngine, buffer: EventBuffer): Promise<void>;
25
+ /**
26
+ * Remove the monkey-patch and restore the original `send` method.
27
+ */
28
+ export declare function uninstrumentBedrock(): void;
29
+ //# sourceMappingURL=bedrock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bedrock.d.ts","sourceRoot":"","sources":["../../src/instruments/bedrock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,sBAAsB,CAAC;AAYtE,sHAAsH;AACtH,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAE9C;AAED,oDAAoD;AACpD,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CAoDf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAW1C"}