@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.
- package/LICENSE +21 -0
- package/README.md +210 -0
- package/dist/adapters/_netbytes.d.ts +31 -0
- package/dist/adapters/_netbytes.d.ts.map +1 -0
- package/dist/adapters/_netbytes.js +154 -0
- package/dist/adapters/_netbytes.js.map +1 -0
- package/dist/adapters/aws-lambda.d.ts +41 -0
- package/dist/adapters/aws-lambda.d.ts.map +1 -0
- package/dist/adapters/aws-lambda.js +65 -0
- package/dist/adapters/aws-lambda.js.map +1 -0
- package/dist/adapters/browser.d.ts +52 -0
- package/dist/adapters/browser.d.ts.map +1 -0
- package/dist/adapters/browser.js +127 -0
- package/dist/adapters/browser.js.map +1 -0
- package/dist/adapters/compute-wrap.d.ts +33 -0
- package/dist/adapters/compute-wrap.d.ts.map +1 -0
- package/dist/adapters/compute-wrap.js +188 -0
- package/dist/adapters/compute-wrap.js.map +1 -0
- package/dist/adapters/data/aws_lambda_pricing.json +61 -0
- package/dist/adapters/gpu-wrap.d.ts +31 -0
- package/dist/adapters/gpu-wrap.d.ts.map +1 -0
- package/dist/adapters/gpu-wrap.js +147 -0
- package/dist/adapters/gpu-wrap.js.map +1 -0
- package/dist/adapters/http.d.ts +58 -0
- package/dist/adapters/http.d.ts.map +1 -0
- package/dist/adapters/http.js +769 -0
- package/dist/adapters/http.js.map +1 -0
- package/dist/adapters/index.d.ts +11 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +12 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/network-accountant.d.ts +63 -0
- package/dist/adapters/network-accountant.d.ts.map +1 -0
- package/dist/adapters/network-accountant.js +153 -0
- package/dist/adapters/network-accountant.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +225 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/scanner.d.ts +39 -0
- package/dist/cli/scanner.d.ts.map +1 -0
- package/dist/cli/scanner.js +480 -0
- package/dist/cli/scanner.js.map +1 -0
- package/dist/clients.d.ts +54 -0
- package/dist/clients.d.ts.map +1 -0
- package/dist/clients.js +240 -0
- package/dist/clients.js.map +1 -0
- package/dist/cloud-detect.d.ts +96 -0
- package/dist/cloud-detect.d.ts.map +1 -0
- package/dist/cloud-detect.js +545 -0
- package/dist/cloud-detect.js.map +1 -0
- package/dist/core/auto-task.d.ts +20 -0
- package/dist/core/auto-task.d.ts.map +1 -0
- package/dist/core/auto-task.js +34 -0
- package/dist/core/auto-task.js.map +1 -0
- package/dist/core/cgroup-reader.d.ts +45 -0
- package/dist/core/cgroup-reader.d.ts.map +1 -0
- package/dist/core/cgroup-reader.js +124 -0
- package/dist/core/cgroup-reader.js.map +1 -0
- package/dist/core/cgroup-walker.d.ts +60 -0
- package/dist/core/cgroup-walker.d.ts.map +1 -0
- package/dist/core/cgroup-walker.js +166 -0
- package/dist/core/cgroup-walker.js.map +1 -0
- package/dist/core/compute-accountant.d.ts +51 -0
- package/dist/core/compute-accountant.d.ts.map +1 -0
- package/dist/core/compute-accountant.js +179 -0
- package/dist/core/compute-accountant.js.map +1 -0
- package/dist/core/compute-runtime.d.ts +42 -0
- package/dist/core/compute-runtime.d.ts.map +1 -0
- package/dist/core/compute-runtime.js +80 -0
- package/dist/core/compute-runtime.js.map +1 -0
- package/dist/core/config.d.ts +44 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +66 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/context.d.ts +76 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +91 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/fargate-metadata.d.ts +27 -0
- package/dist/core/fargate-metadata.d.ts.map +1 -0
- package/dist/core/fargate-metadata.js +102 -0
- package/dist/core/fargate-metadata.js.map +1 -0
- package/dist/core/gpu-accountant.d.ts +104 -0
- package/dist/core/gpu-accountant.d.ts.map +1 -0
- package/dist/core/gpu-accountant.js +383 -0
- package/dist/core/gpu-accountant.js.map +1 -0
- package/dist/core/gpu-runtime.d.ts +58 -0
- package/dist/core/gpu-runtime.d.ts.map +1 -0
- package/dist/core/gpu-runtime.js +131 -0
- package/dist/core/gpu-runtime.js.map +1 -0
- package/dist/core/heuristics.d.ts +74 -0
- package/dist/core/heuristics.d.ts.map +1 -0
- package/dist/core/heuristics.js +182 -0
- package/dist/core/heuristics.js.map +1 -0
- package/dist/core/models.d.ts +149 -0
- package/dist/core/models.d.ts.map +1 -0
- package/dist/core/models.js +226 -0
- package/dist/core/models.js.map +1 -0
- package/dist/core/nvml-reader.d.ts +114 -0
- package/dist/core/nvml-reader.d.ts.map +1 -0
- package/dist/core/nvml-reader.js +323 -0
- package/dist/core/nvml-reader.js.map +1 -0
- package/dist/core/session.d.ts +48 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +123 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/tracker.d.ts +364 -0
- package/dist/core/tracker.d.ts.map +1 -0
- package/dist/core/tracker.js +1073 -0
- package/dist/core/tracker.js.map +1 -0
- package/dist/data/compute_prices.json +180 -0
- package/dist/data/egress_prices.json +418 -0
- package/dist/data/gpu_prices.json +412 -0
- package/dist/data/service_prices.json +2595 -0
- package/dist/dev-console.d.ts +12 -0
- package/dist/dev-console.d.ts.map +1 -0
- package/dist/dev-console.js +60 -0
- package/dist/dev-console.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/instruments/anthropic.d.ts +26 -0
- package/dist/instruments/anthropic.d.ts.map +1 -0
- package/dist/instruments/anthropic.js +242 -0
- package/dist/instruments/anthropic.js.map +1 -0
- package/dist/instruments/bedrock.d.ts +29 -0
- package/dist/instruments/bedrock.d.ts.map +1 -0
- package/dist/instruments/bedrock.js +215 -0
- package/dist/instruments/bedrock.js.map +1 -0
- package/dist/instruments/cohere.d.ts +29 -0
- package/dist/instruments/cohere.d.ts.map +1 -0
- package/dist/instruments/cohere.js +237 -0
- package/dist/instruments/cohere.js.map +1 -0
- package/dist/instruments/gemini.d.ts +30 -0
- package/dist/instruments/gemini.d.ts.map +1 -0
- package/dist/instruments/gemini.js +247 -0
- package/dist/instruments/gemini.js.map +1 -0
- package/dist/instruments/index.d.ts +35 -0
- package/dist/instruments/index.d.ts.map +1 -0
- package/dist/instruments/index.js +54 -0
- package/dist/instruments/index.js.map +1 -0
- package/dist/instruments/mcp.d.ts +24 -0
- package/dist/instruments/mcp.d.ts.map +1 -0
- package/dist/instruments/mcp.js +459 -0
- package/dist/instruments/mcp.js.map +1 -0
- package/dist/instruments/openai.d.ts +26 -0
- package/dist/instruments/openai.d.ts.map +1 -0
- package/dist/instruments/openai.js +221 -0
- package/dist/instruments/openai.js.map +1 -0
- package/dist/instruments/vercel-ai.d.ts +28 -0
- package/dist/instruments/vercel-ai.d.ts.map +1 -0
- package/dist/instruments/vercel-ai.js +192 -0
- package/dist/instruments/vercel-ai.js.map +1 -0
- package/dist/integrations/langchain.d.ts +65 -0
- package/dist/integrations/langchain.d.ts.map +1 -0
- package/dist/integrations/langchain.js +165 -0
- package/dist/integrations/langchain.js.map +1 -0
- package/dist/middleware/express.d.ts +55 -0
- package/dist/middleware/express.d.ts.map +1 -0
- package/dist/middleware/express.js +101 -0
- package/dist/middleware/express.js.map +1 -0
- package/dist/middleware/index.d.ts +6 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +5 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/pricing/compute-pricing.d.ts +57 -0
- package/dist/pricing/compute-pricing.d.ts.map +1 -0
- package/dist/pricing/compute-pricing.js +627 -0
- package/dist/pricing/compute-pricing.js.map +1 -0
- package/dist/pricing/cost_map.json +37665 -0
- package/dist/pricing/egress-pricing.d.ts +55 -0
- package/dist/pricing/egress-pricing.d.ts.map +1 -0
- package/dist/pricing/egress-pricing.js +226 -0
- package/dist/pricing/egress-pricing.js.map +1 -0
- package/dist/pricing/engine.d.ts +24 -0
- package/dist/pricing/engine.d.ts.map +1 -0
- package/dist/pricing/engine.js +148 -0
- package/dist/pricing/engine.js.map +1 -0
- package/dist/pricing/gpu-pricing.d.ts +63 -0
- package/dist/pricing/gpu-pricing.d.ts.map +1 -0
- package/dist/pricing/gpu-pricing.js +484 -0
- package/dist/pricing/gpu-pricing.js.map +1 -0
- package/dist/pricing/rates.d.ts +17 -0
- package/dist/pricing/rates.d.ts.map +1 -0
- package/dist/pricing/rates.js +102 -0
- package/dist/pricing/rates.js.map +1 -0
- package/dist/pricing/service-catalog.d.ts +87 -0
- package/dist/pricing/service-catalog.d.ts.map +1 -0
- package/dist/pricing/service-catalog.js +406 -0
- package/dist/pricing/service-catalog.js.map +1 -0
- package/dist/schema/dexcost-event.v1.json +111 -0
- package/dist/schema/dexcost-task.v1.json +160 -0
- package/dist/schema/validate.d.ts +15 -0
- package/dist/schema/validate.d.ts.map +1 -0
- package/dist/schema/validate.js +87 -0
- package/dist/schema/validate.js.map +1 -0
- package/dist/security/redaction.d.ts +55 -0
- package/dist/security/redaction.d.ts.map +1 -0
- package/dist/security/redaction.js +144 -0
- package/dist/security/redaction.js.map +1 -0
- package/dist/transport/buffer.d.ts +117 -0
- package/dist/transport/buffer.d.ts.map +1 -0
- package/dist/transport/buffer.js +759 -0
- package/dist/transport/buffer.js.map +1 -0
- package/dist/transport/pusher.d.ts +89 -0
- package/dist/transport/pusher.d.ts.map +1 -0
- package/dist/transport/pusher.js +323 -0
- package/dist/transport/pusher.js.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DexcostCallbackHandler — duck-typed LangChain callback handler.
|
|
3
|
+
*
|
|
4
|
+
* Works with any LangChain version without importing `@langchain/core`.
|
|
5
|
+
* Attach to a LangChain chain/agent as a callback to automatically track
|
|
6
|
+
* LLM call costs inside dexcost tasks.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const handler = new DexcostCallbackHandler(tracker);
|
|
10
|
+
* const chain = new LLMChain({ llm, prompt, callbacks: [handler] });
|
|
11
|
+
*/
|
|
12
|
+
import { randomUUID } from "node:crypto";
|
|
13
|
+
import { getCurrentTask } from "../core/context.js";
|
|
14
|
+
import { createCostEvent } from "../core/models.js";
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// DexcostCallbackHandler
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* A duck-typed LangChain callback handler that records cost events for every
|
|
20
|
+
* LLM call that occurs inside a dexcost tracked task.
|
|
21
|
+
*
|
|
22
|
+
* No `@langchain/core` dependency — the handler implements the subset of the
|
|
23
|
+
* BaseCallbackHandler interface that LangChain calls for LLM lifecycle events.
|
|
24
|
+
*/
|
|
25
|
+
export class DexcostCallbackHandler {
|
|
26
|
+
_pricing;
|
|
27
|
+
_buffer;
|
|
28
|
+
_pending = new Map();
|
|
29
|
+
constructor(tracker) {
|
|
30
|
+
this._pricing = tracker.pricing;
|
|
31
|
+
this._buffer = tracker.buffer;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Called by LangChain at the start of an LLM invocation.
|
|
35
|
+
*
|
|
36
|
+
* @param serialized - Serialized LLM object. Model name is extracted from
|
|
37
|
+
* `serialized.kwargs.model_name` (preferred) or the last element of
|
|
38
|
+
* `serialized.id` (fallback).
|
|
39
|
+
* @param prompts - The input prompt strings (unused beyond signalling start).
|
|
40
|
+
* @param runId - Unique identifier for this run, used to correlate start/end.
|
|
41
|
+
*/
|
|
42
|
+
handleLLMStart(serialized, _prompts, runId) {
|
|
43
|
+
const model = this._extractModel(serialized);
|
|
44
|
+
this._pending.set(runId, { model, startTime: Date.now() });
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Called by LangChain when an LLM invocation completes successfully.
|
|
48
|
+
*
|
|
49
|
+
* Records a `llm_call` cost event into the active task (if any).
|
|
50
|
+
*
|
|
51
|
+
* @param output - LLM output object. Token counts are read from
|
|
52
|
+
* `output.llmOutput.tokenUsage.{promptTokens, completionTokens}`.
|
|
53
|
+
* @param runId - Matches the runId from the corresponding handleLLMStart.
|
|
54
|
+
*/
|
|
55
|
+
handleLLMEnd(output, runId) {
|
|
56
|
+
const pending = this._pending.get(runId);
|
|
57
|
+
if (!pending)
|
|
58
|
+
return;
|
|
59
|
+
const { model, startTime } = pending;
|
|
60
|
+
const latencyMs = Date.now() - startTime;
|
|
61
|
+
// Extract token counts from output.llmOutput.tokenUsage
|
|
62
|
+
const llmOutput = output["llmOutput"];
|
|
63
|
+
const tokenUsage = llmOutput?.["tokenUsage"];
|
|
64
|
+
const promptTokens = tokenUsage?.["promptTokens"] ?? 0;
|
|
65
|
+
const completionTokens = tokenUsage?.["completionTokens"] ?? 0;
|
|
66
|
+
// Requires an active task context
|
|
67
|
+
const task = getCurrentTask();
|
|
68
|
+
if (!task) {
|
|
69
|
+
this._pending.delete(runId);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Compute cost
|
|
73
|
+
const costResult = this._pricing.getCost(model, promptTokens, completionTokens);
|
|
74
|
+
// Build event
|
|
75
|
+
const event = createCostEvent({
|
|
76
|
+
eventId: randomUUID(),
|
|
77
|
+
taskId: task.taskId,
|
|
78
|
+
eventType: "llm_call",
|
|
79
|
+
provider: "langchain",
|
|
80
|
+
model,
|
|
81
|
+
inputTokens: promptTokens,
|
|
82
|
+
outputTokens: completionTokens,
|
|
83
|
+
costUsd: costResult.costUsd,
|
|
84
|
+
costConfidence: costResult.costConfidence,
|
|
85
|
+
pricingSource: costResult.pricingSource,
|
|
86
|
+
latencyMs,
|
|
87
|
+
isRetry: false,
|
|
88
|
+
});
|
|
89
|
+
// Persist event
|
|
90
|
+
this._buffer.addEvent(event);
|
|
91
|
+
// Update task aggregates
|
|
92
|
+
task.llmCostUsd += costResult.costUsd;
|
|
93
|
+
task.totalCostUsd += costResult.costUsd;
|
|
94
|
+
task.totalInputTokens += promptTokens;
|
|
95
|
+
task.totalOutputTokens += completionTokens;
|
|
96
|
+
this._buffer.upsertTask(task);
|
|
97
|
+
this._pending.delete(runId);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Called by LangChain when an LLM invocation fails.
|
|
101
|
+
*
|
|
102
|
+
* Records a failure `llm_call` event (cost 0, `error_type` in details)
|
|
103
|
+
* when a task context is active, mirroring the Python SDK's
|
|
104
|
+
* `on_llm_error`. Never throws.
|
|
105
|
+
*
|
|
106
|
+
* @param error - The error that occurred.
|
|
107
|
+
* @param runId - Matches the runId from the corresponding handleLLMStart.
|
|
108
|
+
*/
|
|
109
|
+
handleLLMError(error, runId) {
|
|
110
|
+
const pending = this._pending.get(runId);
|
|
111
|
+
this._pending.delete(runId);
|
|
112
|
+
const task = getCurrentTask();
|
|
113
|
+
if (!task) {
|
|
114
|
+
// No active task — nothing to attribute the failure to.
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const model = pending?.model ?? "unknown";
|
|
118
|
+
const latencyMs = pending ? Date.now() - pending.startTime : undefined;
|
|
119
|
+
const errorType = error?.name ?? "Error";
|
|
120
|
+
try {
|
|
121
|
+
const event = createCostEvent({
|
|
122
|
+
eventId: randomUUID(),
|
|
123
|
+
taskId: task.taskId,
|
|
124
|
+
eventType: "llm_call",
|
|
125
|
+
costUsd: 0,
|
|
126
|
+
costConfidence: "unknown",
|
|
127
|
+
pricingSource: "unknown",
|
|
128
|
+
provider: "langchain",
|
|
129
|
+
model,
|
|
130
|
+
latencyMs,
|
|
131
|
+
isRetry: false,
|
|
132
|
+
details: { error: String(error?.message ?? error), error_type: errorType },
|
|
133
|
+
});
|
|
134
|
+
this._buffer.addEvent(event);
|
|
135
|
+
this._buffer.upsertTask(task);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// dexcost errors must never crash user code
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
// Private helpers
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
/**
|
|
145
|
+
* Extract the model identifier from a serialized LangChain LLM object.
|
|
146
|
+
*
|
|
147
|
+
* Preference order:
|
|
148
|
+
* 1. `serialized.kwargs.model_name` — set by most ChatModel subclasses
|
|
149
|
+
* 2. last element of `serialized.id` — the class name (e.g. "ChatOpenAI")
|
|
150
|
+
*/
|
|
151
|
+
_extractModel(serialized) {
|
|
152
|
+
const kwargs = serialized["kwargs"];
|
|
153
|
+
if (kwargs?.["model_name"] && typeof kwargs["model_name"] === "string") {
|
|
154
|
+
return kwargs["model_name"];
|
|
155
|
+
}
|
|
156
|
+
const id = serialized["id"];
|
|
157
|
+
if (Array.isArray(id) && id.length > 0) {
|
|
158
|
+
const last = id[id.length - 1];
|
|
159
|
+
if (typeof last === "string")
|
|
160
|
+
return last;
|
|
161
|
+
}
|
|
162
|
+
return "unknown";
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=langchain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langchain.js","sourceRoot":"","sources":["../../src/integrations/langchain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express/Connect middleware for automatic HTTP request cost tracking.
|
|
3
|
+
*
|
|
4
|
+
* Wraps each incoming request in a tracked task, attaching the TrackedTask
|
|
5
|
+
* instance to `req.dexcostTask` so downstream handlers can record costs.
|
|
6
|
+
*/
|
|
7
|
+
import type { CostTracker } from "../core/tracker.js";
|
|
8
|
+
/** Options for configuring the Express middleware. */
|
|
9
|
+
export interface ExpressMiddlewareOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Dot-path into the request object to extract a customer ID.
|
|
12
|
+
* For example, "user.orgId" reads `req.user.orgId`.
|
|
13
|
+
*/
|
|
14
|
+
customerIdFrom?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Dot-path into the request object to extract a project ID.
|
|
17
|
+
* For example, "headers.x-project-id" reads `req.headers["x-project-id"]`.
|
|
18
|
+
*/
|
|
19
|
+
projectIdFrom?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Custom function to derive the task type from the request.
|
|
22
|
+
* Defaults to `"METHOD /path"`.
|
|
23
|
+
*/
|
|
24
|
+
taskType?: (req: unknown) => string;
|
|
25
|
+
/**
|
|
26
|
+
* Predicate to skip tracking for certain requests (e.g. health checks).
|
|
27
|
+
* Return `true` to skip.
|
|
28
|
+
*/
|
|
29
|
+
skip?: (req: unknown) => boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create an Express/Connect middleware that wraps each request in a
|
|
33
|
+
* dexcost tracked task.
|
|
34
|
+
*
|
|
35
|
+
* The middleware attaches the `TrackedTask` instance to `req.dexcostTask`
|
|
36
|
+
* so that downstream route handlers can call `req.dexcostTask.recordLlmCall()`
|
|
37
|
+
* and similar methods.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* import express from "express";
|
|
42
|
+
* import { CostTracker } from "dexcost";
|
|
43
|
+
* import { createExpressMiddleware } from "dexcost/middleware/express";
|
|
44
|
+
*
|
|
45
|
+
* const app = express();
|
|
46
|
+
* const tracker = new CostTracker();
|
|
47
|
+
*
|
|
48
|
+
* app.use(createExpressMiddleware(tracker, {
|
|
49
|
+
* customerIdFrom: "user.orgId",
|
|
50
|
+
* skip: (req) => req.path === "/health",
|
|
51
|
+
* }));
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare function createExpressMiddleware(tracker: CostTracker, options?: ExpressMiddlewareOptions): (req: unknown, res: unknown, next: () => void) => void;
|
|
55
|
+
//# sourceMappingURL=express.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/middleware/express.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,sDAAsD;AACtD,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAEpC;;;OAGG;IACH,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;CAClC;AAiBD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,wBAA6B,GACrC,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,CAkExD"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express/Connect middleware for automatic HTTP request cost tracking.
|
|
3
|
+
*
|
|
4
|
+
* Wraps each incoming request in a tracked task, attaching the TrackedTask
|
|
5
|
+
* instance to `req.dexcostTask` so downstream handlers can record costs.
|
|
6
|
+
*/
|
|
7
|
+
import { scrubUrl } from "../security/redaction.js";
|
|
8
|
+
/**
|
|
9
|
+
* Resolve a dot-separated path on an object.
|
|
10
|
+
*
|
|
11
|
+
* @example getNestedValue({ user: { orgId: "acme" } }, "user.orgId") // "acme"
|
|
12
|
+
*/
|
|
13
|
+
function getNestedValue(obj, path) {
|
|
14
|
+
const parts = path.split(".");
|
|
15
|
+
let current = obj;
|
|
16
|
+
for (const part of parts) {
|
|
17
|
+
if (current == null || typeof current !== "object")
|
|
18
|
+
return undefined;
|
|
19
|
+
current = current[part];
|
|
20
|
+
}
|
|
21
|
+
return typeof current === "string" ? current : undefined;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create an Express/Connect middleware that wraps each request in a
|
|
25
|
+
* dexcost tracked task.
|
|
26
|
+
*
|
|
27
|
+
* The middleware attaches the `TrackedTask` instance to `req.dexcostTask`
|
|
28
|
+
* so that downstream route handlers can call `req.dexcostTask.recordLlmCall()`
|
|
29
|
+
* and similar methods.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* import express from "express";
|
|
34
|
+
* import { CostTracker } from "dexcost";
|
|
35
|
+
* import { createExpressMiddleware } from "dexcost/middleware/express";
|
|
36
|
+
*
|
|
37
|
+
* const app = express();
|
|
38
|
+
* const tracker = new CostTracker();
|
|
39
|
+
*
|
|
40
|
+
* app.use(createExpressMiddleware(tracker, {
|
|
41
|
+
* customerIdFrom: "user.orgId",
|
|
42
|
+
* skip: (req) => req.path === "/health",
|
|
43
|
+
* }));
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export function createExpressMiddleware(tracker, options = {}) {
|
|
47
|
+
return (req, res, next) => {
|
|
48
|
+
const reqObj = req;
|
|
49
|
+
const resObj = res;
|
|
50
|
+
if (options.skip?.(req)) {
|
|
51
|
+
next();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const method = typeof reqObj["method"] === "string" ? reqObj["method"] : "UNKNOWN";
|
|
55
|
+
// Express keeps the raw query string on originalUrl even when the
|
|
56
|
+
// body is streamed (B11 correlation); a literal scrubUrl call here
|
|
57
|
+
// strips userinfo and sensitive query params before this lands in
|
|
58
|
+
// Task.taskType, which ships to the control plane.
|
|
59
|
+
const rawUrl = typeof reqObj["originalUrl"] === "string"
|
|
60
|
+
? reqObj["originalUrl"]
|
|
61
|
+
: typeof reqObj["path"] === "string"
|
|
62
|
+
? reqObj["path"]
|
|
63
|
+
: "/";
|
|
64
|
+
// scrubUrl is a no-op on relative paths (no scheme), but kicks in
|
|
65
|
+
// when callers pass absolute URLs through originalUrl.
|
|
66
|
+
const url = scrubUrl(rawUrl);
|
|
67
|
+
const taskType = options.taskType?.(req) ?? `${method} ${url}`;
|
|
68
|
+
const customerId = options.customerIdFrom
|
|
69
|
+
? getNestedValue(req, options.customerIdFrom)
|
|
70
|
+
: undefined;
|
|
71
|
+
const projectId = options.projectIdFrom
|
|
72
|
+
? getNestedValue(req, options.projectIdFrom)
|
|
73
|
+
: undefined;
|
|
74
|
+
const onFn = typeof resObj["on"] === "function" ? resObj["on"] : null;
|
|
75
|
+
if (onFn) {
|
|
76
|
+
void tracker.track({ taskType, customerId, projectId }, async (task) => {
|
|
77
|
+
reqObj["dexcostTask"] = task;
|
|
78
|
+
next();
|
|
79
|
+
await new Promise((resolve) => {
|
|
80
|
+
onFn.call(resObj, "finish", () => {
|
|
81
|
+
const statusCode = typeof resObj["statusCode"] === "number" ? resObj["statusCode"] : 200;
|
|
82
|
+
const status = statusCode >= 400 ? "failed" : "success";
|
|
83
|
+
task.end(status);
|
|
84
|
+
resolve();
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// Can't detect response end — finalize immediately after next()
|
|
91
|
+
void tracker.track({ taskType, customerId, projectId }, async (task) => {
|
|
92
|
+
reqObj["dexcostTask"] = task;
|
|
93
|
+
next();
|
|
94
|
+
const statusCode = typeof resObj["statusCode"] === "number" ? resObj["statusCode"] : 200;
|
|
95
|
+
const status = statusCode >= 400 ? "failed" : "success";
|
|
96
|
+
task.end(status);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/middleware/express.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,YAAY,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute pricing engine — dispatches on `details.billing_model` and applies
|
|
3
|
+
* the per-billing-model math from spec §6.
|
|
4
|
+
*
|
|
5
|
+
* The per-runtime memory-unit conversion table (Decision #7) is pinned at the
|
|
6
|
+
* catalog-lookup boundary in §6.2 of the spec; the implementation enforces
|
|
7
|
+
* it via two Decimal divisor constants (decimal GB vs binary GiB) selected
|
|
8
|
+
* per billing model. Confusing them silently over-attributes Fargate memory
|
|
9
|
+
* cost by ~4.86% — the pricing tests pin the divisor choice per model.
|
|
10
|
+
*
|
|
11
|
+
* Fail-silent contract (convention §9): every code path returns a usable
|
|
12
|
+
* `ComputeCost` — the five-tier degradation ladder from convention §7
|
|
13
|
+
* applies (per-region exact → per-runtime default → universal _meta default
|
|
14
|
+
* → hardcoded constants → cost=0 with warning).
|
|
15
|
+
*
|
|
16
|
+
* Mirrors python/src/dexcost/compute_pricing.py.
|
|
17
|
+
*/
|
|
18
|
+
import { Decimal } from "decimal.js";
|
|
19
|
+
import type { CloudEnv } from "../cloud-detect.js";
|
|
20
|
+
export declare function _resetWarningStateForTests(): void;
|
|
21
|
+
export interface ComputeCost {
|
|
22
|
+
costUsd: Decimal;
|
|
23
|
+
pricingSource: string;
|
|
24
|
+
costConfidence: "exact" | "computed" | "estimated" | "unknown";
|
|
25
|
+
}
|
|
26
|
+
export interface ComputePricingEngineOptions {
|
|
27
|
+
/** Override path to the catalog JSON; defaults to the bundled file. */
|
|
28
|
+
catalogPath?: string;
|
|
29
|
+
/** Already-parsed catalog object — overrides both `catalogPath` and bundled load. */
|
|
30
|
+
catalog?: Record<string, any>;
|
|
31
|
+
}
|
|
32
|
+
export declare class ComputePricingEngine {
|
|
33
|
+
private _catalog;
|
|
34
|
+
private _catalogVersion;
|
|
35
|
+
constructor(opts?: ComputePricingEngineOptions);
|
|
36
|
+
private _load;
|
|
37
|
+
get catalogVersion(): string;
|
|
38
|
+
resolveComputeCost(details: Record<string, any>, cloudEnv: CloudEnv, overrides: Record<string, string> | null | undefined, windowS?: Decimal): ComputeCost;
|
|
39
|
+
private _dispatch;
|
|
40
|
+
private _lambda;
|
|
41
|
+
private _resolveLambdaRate;
|
|
42
|
+
private _fargate;
|
|
43
|
+
private _resolveFargateRate;
|
|
44
|
+
private _cloudRunRequest;
|
|
45
|
+
private _cloudRunInstanceOverride;
|
|
46
|
+
private _resolveCloudRunRate;
|
|
47
|
+
private _cloudFunctions;
|
|
48
|
+
private _azureFunctions;
|
|
49
|
+
private _resolveAzureFunctionsRate;
|
|
50
|
+
private _vercel;
|
|
51
|
+
private _resolveVercelRate;
|
|
52
|
+
private _iaasShare;
|
|
53
|
+
private _resolveIaasRate;
|
|
54
|
+
private _k8sPodLimits;
|
|
55
|
+
private _resolveK8sPodRate;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=compute-pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-pricing.d.ts","sourceRoot":"","sources":["../../src/pricing/compute-pricing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAMnD,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AA4DD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;CAChE;AAED,MAAM,WAAW,2BAA2B;IAC1C,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAsBD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,eAAe,CAAqB;gBAEhC,IAAI,CAAC,EAAE,2BAA2B;IAgB9C,OAAO,CAAC,KAAK;IAuDb,IAAI,cAAc,IAAI,MAAM,CAE3B;IAMD,kBAAkB,CAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,EACpD,OAAO,CAAC,EAAE,OAAO,GAChB,WAAW;IAuBd,OAAO,CAAC,SAAS;IAqCjB,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,kBAAkB;IA+C1B,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,mBAAmB;IA+C3B,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,yBAAyB;IAuBjC,OAAO,CAAC,oBAAoB;IAgD5B,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,0BAA0B;IA2ClC,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,kBAAkB;IA0C1B,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,gBAAgB;IA0DxB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,kBAAkB;CAoB3B"}
|