margin-meter 0.1.0 → 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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,mBAAmB,CAAC;AAC9C,MAAM,CAAC,MAAM,aAAa,GAAG,sBAAsB,CAAC;AACpD,MAAM,CAAC,MAAM,UAAU,GAAG,cAAc,CAAC;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;AAC1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AA6BzC,6EAA6E;AAC7E,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,UAAU,CAAS;IACnB,MAAM,CAAS;IACf,YAAY,UAAkB,EAAE,MAAc;QAC5C,KAAK,CAAC,oBAAoB,UAAU,MAAM,MAAM,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,8EAA8E;AAC9E,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,0EAA0E;AAC1E,MAAM,OAAO,cAAc;IACzB,OAAO,CAAS;IAChB,SAAS,CAAS;IAClB,YAAY,OAAe,EAAE,YAAoB,kBAAkB;QACjE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IACD,KAAK,CAAC,IAAI,CACR,IAAY,EACZ,IAAwD;QAExD,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE;YACtC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;YAChE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YAC/B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;CACF;AAmCD,iFAAiF;AACjF,MAAM,OAAO,WAAW;IACtB,SAAS,CAAS;IAClB,MAAM,CAAU;IAChB,YAAY,CAAU;IACd,SAAS,CAAY;IAE7B,YAAY,UAA8B,EAAE;QAC1C,MAAM,GAAG,GAAG,CAAC,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAClE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,iBAAiB,IAAI,kBAAkB,CAAC;QAClF,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,iBAAiB,CAAC;QACtD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC;QAClD,IAAI,CAAC,SAAS;YACZ,OAAO,CAAC,SAAS;gBACjB,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAC;IAChF,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,OAAgC;QAC/D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,sDAAsD,CAAC;YACrE,IAAI,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC1D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;QAC7C,CAAC;QAED,IAAI,IAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE;gBACrC,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE;aACvC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,oBAAqB,CAAW,CAAC,OAAO,EAAE,CAAC;YACzD,IAAI,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,iBAAiB,CAAC,CAAC,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;YAC5E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;QAC7C,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA4B,CAAC;YAC5D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAC7C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC/D,CAAC;IAED;0DACsD;IACtD,KAAK,CAAC,UAAU,CAAC,KAAsB;QACrC,MAAM,OAAO,GAA4B;YACvC,WAAW,EAAE,KAAK,CAAC,UAAU;YAC7B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,YAAY,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC;YACpC,aAAa,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC;YACtC,iBAAiB,EAAE,KAAK,CAAC,eAAe,IAAI,CAAC;YAC7C,UAAU,EAAE,KAAK,CAAC,SAAS,IAAI,CAAC;YAChC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;YAC5B,QAAQ,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK;YAChC,YAAY,EAAE,KAAK,CAAC,WAAW,IAAI,KAAK;SACzC,CAAC;QACF,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC;QACxE,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC;QACrE,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;QAClE,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED;mFAC+E;IAC/E,KAAK,CAAC,aAAa,CAAC,KAAyB;QAC3C,MAAM,OAAO,GAA4B;YACvC,WAAW,EAAE,KAAK,CAAC,UAAU;YAC7B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,YAAY,EAAE,KAAK,CAAC,WAAW,IAAI,KAAK;SACzC,CAAC;QACF,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;YAAE,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC,YAAY,CAAC;QACjF,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS;YAAE,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC;QACpF,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxD,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CACX,KAAoD,EACpD,EAAsC;QAEtC,MAAM,CAAC,GAAG,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC;QACpB,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,CAAC;YACb,MAAM,CAAC,CAAC;QACV,CAAC;gBAAS,CAAC;YACT,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;YAC5C,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;gBAC/B,GAAG,KAAK;gBACR,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,eAAe,EAAE,CAAC,CAAC,eAAe;gBAClC,SAAS;gBACT,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AAED,0DAA0D;AAC1D,MAAM,OAAO,WAAW;IACtB,WAAW,GAAG,CAAC,CAAC;IAChB,YAAY,GAAG,CAAC,CAAC;IACjB,eAAe,GAAG,CAAC,CAAC;IACpB,MAAM,CAAgB;IACtB,SAAS,CAAC,MAIT;QACC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC;IACrD,CAAC;CACF;AAED,KAAK,UAAU,aAAa,CAAC,IAAuB;IAClD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACzD,OAAO,MAAM,CAAE,IAAgC,CAAC,MAAM,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,wBAAwB,CAAC;IAClC,CAAC;AACH,CAAC;AAED,SAAS,GAAG;IACV,OAAO,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AAC7E,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * One-call auto-instrumentation of the common LLM JS clients.
3
+ *
4
+ * The TS twin of `margin_meter.instrument`. Unlike Python (where the SDKs expose
5
+ * patchable classes), JS agents construct client instances and call
6
+ * `client.chat.completions.create(...)` / `client.messages.create(...)` /
7
+ * `model.generateContent(...)`. So these helpers patch the METHOD ON THE
8
+ * INSTANCE the agent already holds — no import of the provider SDK, fully
9
+ * testable against a fake client object:
10
+ *
11
+ * import OpenAI from "openai";
12
+ * import { MarginMeter, instrumentOpenAI } from "margin-meter";
13
+ *
14
+ * const client = new OpenAI();
15
+ * const meter = new MarginMeter();
16
+ * const undo = instrumentOpenAI(client, meter, { workflowId: "aider-fix" });
17
+ * // ... client.chat.completions.create(...) calls are now metered ...
18
+ * undo();
19
+ *
20
+ * Honesty: the wrapper reads real tokens off the real response (`extractUsage`)
21
+ * — never fabricated — and a metering failure is fail-safe (the host's call
22
+ * still returns / still throws).
23
+ */
24
+ import type { MarginMeter, WrapOptions } from "./index.ts";
25
+ /** A requested client could not be instrumented (method missing / shape moved). */
26
+ export declare class MarginInstrumentError extends Error {
27
+ constructor(message: string);
28
+ }
29
+ /** Undo a patch — restores the exact original method. */
30
+ export type Uninstrument = () => void;
31
+ type MethodOwner = Record<string, unknown>;
32
+ /**
33
+ * Replace `owner[methodName]` with an auto-metered wrapper; return the undo.
34
+ * Provider-agnostic and the single testable seam for every instrumenter: it
35
+ * binds the original to its owner (so `this` is preserved), wraps it with
36
+ * `meter.wrap`, sets the wrapper back, and returns a thunk restoring the
37
+ * original.
38
+ */
39
+ export declare function patchMethod(owner: MethodOwner, methodName: string, meter: MarginMeter, opts: WrapOptions): Uninstrument;
40
+ type InstrumentOpts = Omit<WrapOptions, "provider" | "resolveModel" | "model">;
41
+ /** Instrument an OpenAI client's `chat.completions.create`. Returns the undo. */
42
+ export declare function instrumentOpenAI(client: unknown, meter: MarginMeter, opts: InstrumentOpts): Uninstrument;
43
+ /** Instrument an Anthropic client's `messages.create`. Returns the undo. */
44
+ export declare function instrumentAnthropic(client: unknown, meter: MarginMeter, opts: InstrumentOpts): Uninstrument;
45
+ /**
46
+ * Instrument a Gemini `GenerativeModel`'s `generateContent`. Returns the undo.
47
+ * The model name lives on the instance (`.model`), not the response, so it is
48
+ * resolved per call and the `models/` prefix stripped to match the pricing table.
49
+ */
50
+ export declare function instrumentGemini(model: unknown, meter: MarginMeter, opts: InstrumentOpts): Uninstrument;
51
+ /**
52
+ * Instrument an AWS Bedrock runtime client's Converse call. Returns the undo.
53
+ *
54
+ * The JS AWS SDK v3 uses a command pattern — `client.send(new ConverseCommand({
55
+ * modelId, messages }))` — so the seam is the client's `send` method, not a
56
+ * per-op method as in Python (boto3's `client.converse(...)`). The Converse
57
+ * response omits the model id, so it is recovered per call off the command's
58
+ * `input.modelId`; its gateway form (`us.anthropic.claude-…-v1:0`) prices through
59
+ * the server. The camelCase `usage` block (`inputTokens` / `outputTokens` +
60
+ * additive `cacheReadInputTokens` / `cacheWriteInputTokens`) is read by the
61
+ * bedrock extractor.
62
+ *
63
+ * Scope note: this patches `send`, which every Bedrock command flows through. A
64
+ * non-Converse command (e.g. `InvokeModelCommand`, whose usage rides HTTP
65
+ * headers, or a streaming command, whose usage rides the event stream) carries no
66
+ * `usage` block on its return value, so `recordResponse` reads nothing and the
67
+ * call is metered as a shapeless response rather than fabricated — the fail-safe
68
+ * path. Direct capture of those forms is the follow-on (the Python SDK already
69
+ * meters them); Converse is the modern, uniform form and lands first here.
70
+ */
71
+ export declare function instrumentBedrock(client: unknown, meter: MarginMeter, opts: InstrumentOpts): Uninstrument;
72
+ export {};
73
+ //# sourceMappingURL=instrument.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../src/instrument.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI3D,mFAAmF;AACnF,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,yDAAyD;AACzD,MAAM,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC;AAEtC,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,WAAW,GAChB,YAAY,CAad;AAiBD,KAAK,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,cAAc,GAAG,OAAO,CAAC,CAAC;AAE/E,iFAAiF;AACjF,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,cAAc,GACnB,YAAY,CAad;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,cAAc,GACnB,YAAY,CAOd;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,cAAc,GACnB,YAAY,CAmBd;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,cAAc,GACnB,YAAY,CAsBd"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * One-call auto-instrumentation of the common LLM JS clients.
3
+ *
4
+ * The TS twin of `margin_meter.instrument`. Unlike Python (where the SDKs expose
5
+ * patchable classes), JS agents construct client instances and call
6
+ * `client.chat.completions.create(...)` / `client.messages.create(...)` /
7
+ * `model.generateContent(...)`. So these helpers patch the METHOD ON THE
8
+ * INSTANCE the agent already holds — no import of the provider SDK, fully
9
+ * testable against a fake client object:
10
+ *
11
+ * import OpenAI from "openai";
12
+ * import { MarginMeter, instrumentOpenAI } from "margin-meter";
13
+ *
14
+ * const client = new OpenAI();
15
+ * const meter = new MarginMeter();
16
+ * const undo = instrumentOpenAI(client, meter, { workflowId: "aider-fix" });
17
+ * // ... client.chat.completions.create(...) calls are now metered ...
18
+ * undo();
19
+ *
20
+ * Honesty: the wrapper reads real tokens off the real response (`extractUsage`)
21
+ * — never fabricated — and a metering failure is fail-safe (the host's call
22
+ * still returns / still throws).
23
+ */
24
+ import { BEDROCK, fromClient } from "./substrate.js";
25
+ /** A requested client could not be instrumented (method missing / shape moved). */
26
+ export class MarginInstrumentError extends Error {
27
+ constructor(message) {
28
+ super(message);
29
+ this.name = "MarginInstrumentError";
30
+ }
31
+ }
32
+ /**
33
+ * Replace `owner[methodName]` with an auto-metered wrapper; return the undo.
34
+ * Provider-agnostic and the single testable seam for every instrumenter: it
35
+ * binds the original to its owner (so `this` is preserved), wraps it with
36
+ * `meter.wrap`, sets the wrapper back, and returns a thunk restoring the
37
+ * original.
38
+ */
39
+ export function patchMethod(owner, methodName, meter, opts) {
40
+ const original = owner[methodName];
41
+ if (typeof original !== "function") {
42
+ throw new MarginInstrumentError(`cannot instrument: '${methodName}' is not a function on the given object`);
43
+ }
44
+ const bound = original.bind(owner);
45
+ const wrapped = meter.wrap(bound, opts);
46
+ owner[methodName] = wrapped;
47
+ return () => {
48
+ owner[methodName] = original;
49
+ };
50
+ }
51
+ /** Navigate a dotted path to the object that directly owns the final method. */
52
+ function ownerOf(root, path) {
53
+ let cur = root;
54
+ for (let i = 0; i < path.length - 1; i++) {
55
+ cur = cur == null ? undefined : cur[path[i]];
56
+ if (cur == null) {
57
+ throw new MarginInstrumentError(`cannot instrument: '${path.slice(0, i + 1).join(".")}' is missing — ` +
58
+ "the client shape may have changed; wrap the call directly with meter.wrap().");
59
+ }
60
+ }
61
+ return { owner: cur, method: path[path.length - 1] };
62
+ }
63
+ /** Instrument an OpenAI client's `chat.completions.create`. Returns the undo. */
64
+ export function instrumentOpenAI(client, meter, opts) {
65
+ const { owner, method } = ownerOf(client, ["chat", "completions", "create"]);
66
+ return patchMethod(owner, method, meter, {
67
+ ...opts,
68
+ provider: "openai",
69
+ // Read off THIS client's endpoint, so a client aimed at openrouter.ai is
70
+ // recorded as OpenRouter and one aimed at Azure as Azure. Undefined when the
71
+ // endpoint is unreadable — an unmeasured path, never an assumed one.
72
+ substrate: fromClient(client),
73
+ // A streamed OpenAI call omits usage unless asked; the wrapper injects
74
+ // stream_options.include_usage so its final chunk carries the count.
75
+ streamIncludeUsage: true,
76
+ });
77
+ }
78
+ /** Instrument an Anthropic client's `messages.create`. Returns the undo. */
79
+ export function instrumentAnthropic(client, meter, opts) {
80
+ const { owner, method } = ownerOf(client, ["messages", "create"]);
81
+ return patchMethod(owner, method, meter, {
82
+ ...opts,
83
+ provider: "anthropic",
84
+ substrate: fromClient(client),
85
+ });
86
+ }
87
+ /**
88
+ * Instrument a Gemini `GenerativeModel`'s `generateContent`. Returns the undo.
89
+ * The model name lives on the instance (`.model`), not the response, so it is
90
+ * resolved per call and the `models/` prefix stripped to match the pricing table.
91
+ */
92
+ export function instrumentGemini(model, meter, opts) {
93
+ const m = model;
94
+ if (typeof m?.generateContent !== "function") {
95
+ throw new MarginInstrumentError("cannot instrument: 'generateContent' is not a function on the given model — " +
96
+ "the SDK shape may have changed; wrap the call directly with meter.wrap().");
97
+ }
98
+ const resolveModel = () => {
99
+ const name = (m.model ?? m.modelName);
100
+ if (!name)
101
+ return undefined;
102
+ return String(name).split("/").pop();
103
+ };
104
+ return patchMethod(m, "generateContent", meter, {
105
+ ...opts,
106
+ provider: "google",
107
+ resolveModel,
108
+ substrate: fromClient(model),
109
+ });
110
+ }
111
+ /**
112
+ * Instrument an AWS Bedrock runtime client's Converse call. Returns the undo.
113
+ *
114
+ * The JS AWS SDK v3 uses a command pattern — `client.send(new ConverseCommand({
115
+ * modelId, messages }))` — so the seam is the client's `send` method, not a
116
+ * per-op method as in Python (boto3's `client.converse(...)`). The Converse
117
+ * response omits the model id, so it is recovered per call off the command's
118
+ * `input.modelId`; its gateway form (`us.anthropic.claude-…-v1:0`) prices through
119
+ * the server. The camelCase `usage` block (`inputTokens` / `outputTokens` +
120
+ * additive `cacheReadInputTokens` / `cacheWriteInputTokens`) is read by the
121
+ * bedrock extractor.
122
+ *
123
+ * Scope note: this patches `send`, which every Bedrock command flows through. A
124
+ * non-Converse command (e.g. `InvokeModelCommand`, whose usage rides HTTP
125
+ * headers, or a streaming command, whose usage rides the event stream) carries no
126
+ * `usage` block on its return value, so `recordResponse` reads nothing and the
127
+ * call is metered as a shapeless response rather than fabricated — the fail-safe
128
+ * path. Direct capture of those forms is the follow-on (the Python SDK already
129
+ * meters them); Converse is the modern, uniform form and lands first here.
130
+ */
131
+ export function instrumentBedrock(client, meter, opts) {
132
+ const c = client;
133
+ if (typeof c?.send !== "function") {
134
+ throw new MarginInstrumentError("cannot instrument: 'send' is not a function on the given client — " +
135
+ "pass an @aws-sdk/client-bedrock-runtime BedrockRuntimeClient.");
136
+ }
137
+ // The model rides the command's `input.modelId` (botocore's `modelId=` twin).
138
+ const resolveModel = (args) => {
139
+ const command = args[0];
140
+ const input = command?.input;
141
+ const mid = input?.modelId;
142
+ return typeof mid === "string" && mid ? mid : undefined;
143
+ };
144
+ return patchMethod(c, "send", meter, {
145
+ ...opts,
146
+ provider: "bedrock",
147
+ resolveModel,
148
+ // Bedrock IS the path — the transport names itself, no endpoint to read.
149
+ substrate: BEDROCK,
150
+ });
151
+ }
152
+ //# sourceMappingURL=instrument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrument.js","sourceRoot":"","sources":["../src/instrument.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Read the measured economics of one LLM call straight off a provider response.
3
+ *
4
+ * The TS twin of `margin_meter.providers`: given the object an OpenAI /
5
+ * Anthropic / Gemini JS client returns, recover the `(provider, model, tokens)`
6
+ * a Margin call row needs — so auto-instrumentation is a few lines with no
7
+ * manual token bookkeeping.
8
+ *
9
+ * Dependency-free and duck-typed on purpose: it never imports the provider SDKs,
10
+ * reading fields by shape so it works on a real SDK object, a plain object (the
11
+ * shape a mocked provider returns in tests), or JSON. The three shapes, as the
12
+ * current JS SDKs publish them:
13
+ *
14
+ * - **OpenAI** — `model`; `usage.prompt_tokens` / `completion_tokens`; cached
15
+ * reads at `usage.prompt_tokens_details.cached_tokens` (Responses API:
16
+ * `usage.input_tokens` / `output_tokens` / `input_tokens_details.cached_tokens`).
17
+ * - **Anthropic** — `model`; `usage.input_tokens` / `output_tokens`; cached
18
+ * reads at `usage.cache_read_input_tokens`; cache WRITES at
19
+ * `usage.cache_creation_input_tokens` (a ~1.25x premium bucket).
20
+ * - **Gemini** (`@google/generative-ai`) — `response.usageMetadata` (the
21
+ * `generateContent` result nests it under `.response`), with
22
+ * `promptTokenCount` / `candidatesTokenCount` / `cachedContentTokenCount`, plus
23
+ * `thoughtsTokenCount` (thinking tokens, billed as output and folded in).
24
+ * The model does not ride the response, so the caller passes it.
25
+ * - **Cohere** (v2 `/chat`) — billed counts nest under `usage.billed_units`
26
+ * (what is charged; raw `usage.tokens` is the fallback), each with
27
+ * `input_tokens` / `output_tokens`. Cohere publishes no chat prompt-cache
28
+ * discount, so cache reads bill as ordinary input (`cacheReadTokens` stays 0);
29
+ * the model does not ride the response, so the caller passes it.
30
+ * - **AWS Bedrock** (`@aws-sdk/client-bedrock-runtime`, Converse) — usage rides
31
+ * `usage.inputTokens` / `outputTokens` in camelCase, with ADDITIVE cache
32
+ * buckets `cacheReadInputTokens` / `cacheWriteInputTokens` (AWS documents
33
+ * `totalTokens = inputTokens + outputTokens + cacheReadInputTokens +
34
+ * cacheWriteInputTokens`), so the three input-side buckets are disjoint and
35
+ * each reads verbatim, no subtraction. The Converse response omits the model
36
+ * id, so the caller passes it (`instrumentBedrock` reads it off the command's
37
+ * `input.modelId`); its gateway form (`us.anthropic.claude-…-v1:0`) prices
38
+ * through the server's `normalize_model`.
39
+ *
40
+ * Numbers are read verbatim — never inflated. A field the provider didn't report
41
+ * reads 0; an unrecognised shape throws `UsageExtractionError` rather than
42
+ * emitting a silently-zero (free-looking) call.
43
+ */
44
+ export declare const OPENAI = "openai";
45
+ export declare const ANTHROPIC = "anthropic";
46
+ export declare const GOOGLE = "google";
47
+ export declare const COHERE = "cohere";
48
+ export declare const BEDROCK = "bedrock";
49
+ export type ProviderName = "openai" | "anthropic" | "google" | "cohere" | "bedrock";
50
+ /** The metered economics of one call, recovered from a provider response. */
51
+ export interface Usage {
52
+ provider: ProviderName;
53
+ /** May be undefined only when the provider omits it AND no override was passed. */
54
+ model?: string;
55
+ inputTokens: number;
56
+ outputTokens: number;
57
+ cacheReadTokens: number;
58
+ /**
59
+ * Cache-CREATION (write) tokens — a premium bucket (Anthropic bills ~1.25x
60
+ * input to write a prompt-cache entry). 0 for providers that report no
61
+ * distinct write bucket (OpenAI/Gemini bill the writing call as ordinary
62
+ * input). Kept separate so the server never drops the premium. When a request
63
+ * pins a 1-hour TTL this holds ONLY the 5-minute portion; the 1-hour portion
64
+ * moves to `cacheCreation1hTokens` below.
65
+ */
66
+ cacheCreationTokens: number;
67
+ /**
68
+ * The portion of cache creation written with the LONGER 1-hour TTL, which
69
+ * Anthropic bills at a higher premium (~2x input vs the 5-minute ~1.25x).
70
+ * Disjoint from `cacheCreationTokens`. Optional/0 unless the provider reports a
71
+ * 1-hour breakdown, so a call using only the default cache is unchanged.
72
+ */
73
+ cacheCreation1hTokens?: number;
74
+ /**
75
+ * The hidden-thinking share of `outputTokens` (Gemini `thoughtsTokenCount`,
76
+ * OpenAI `completion_tokens_details.reasoning_tokens`). A SUBSET of output, not
77
+ * an addition — already priced at the output rate, so it is NEVER priced
78
+ * separately (that would double-bill). Carried only for visibility: the
79
+ * thinking-token share is what isolates the reasoning-effort lever from
80
+ * ordinary verbose output. Optional/0 on a call with no reasoning breakdown.
81
+ */
82
+ reasoningTokens?: number;
83
+ }
84
+ /** The response object matched no provider shape we can meter. */
85
+ export declare class UsageExtractionError extends Error {
86
+ constructor(message: string);
87
+ }
88
+ type Any = Record<string, unknown> | null | undefined | unknown;
89
+ /**
90
+ * Best-effort provider inference from a response's shape. Prefers unambiguous
91
+ * signals: Gemini exposes `usageMetadata`; Anthropic's usage carries
92
+ * `input_tokens` while OpenAI's carries `prompt_tokens`. Returns undefined when
93
+ * nothing distinguishes it — the caller must then name the provider (the
94
+ * instrumenter always does).
95
+ */
96
+ export declare function detectProvider(response: Any): ProviderName | undefined;
97
+ /**
98
+ * Recover the metered `Usage` of one call from its provider response. `provider`
99
+ * forces the shape (the instrumenter always knows which client it patched);
100
+ * omit it and the provider is inferred from the response's shape. `model`
101
+ * overrides a response that omits its model (Gemini). Throws
102
+ * `UsageExtractionError` when the shape matches no known provider or carries no
103
+ * usage block, so a silently-free call is never emitted.
104
+ */
105
+ export declare function extractUsage(response: Any, opts?: {
106
+ provider?: ProviderName;
107
+ model?: string;
108
+ }): Usage;
109
+ /**
110
+ * Read whatever usage ONE streaming chunk/event carries, or `undefined`.
111
+ *
112
+ * The three streamed shapes differ in WHERE (and whether) a chunk carries usage:
113
+ *
114
+ * - **OpenAI** (needs `stream_options: { include_usage: true }`): every content
115
+ * chunk has `usage: null`; only the FINAL chunk carries the full `.usage`.
116
+ * - **Gemini**: every chunk carries a CUMULATIVE `usageMetadata` — the last is
117
+ * authoritative, and the running max keeps it.
118
+ * - **Anthropic**: no single event is complete — `message_start` carries the
119
+ * input + cache counts nested under `event.message.usage`, while `message_delta`
120
+ * carries the final `event.usage.output_tokens`. This reads BOTH carriers so the
121
+ * merge can reunite them.
122
+ *
123
+ * Returns `undefined` (never throws) for a chunk with no usage, so an ordinary
124
+ * content chunk is skipped, not treated as an error.
125
+ */
126
+ export declare function usageFromStreamChunk(chunk: Any, provider?: ProviderName, model?: string): Usage | undefined;
127
+ /**
128
+ * Merge two per-chunk usages, taking the MAX of each token bucket.
129
+ *
130
+ * Every streamed token count is monotonic within one call — cumulative (Gemini),
131
+ * or populated exactly once (OpenAI's final chunk; Anthropic's input-here /
132
+ * output-there split) — so the running max reconstructs the final total no matter
133
+ * which chunk carried which field. The max never invents a token; it only keeps
134
+ * the largest REAL count each field reached.
135
+ */
136
+ export declare function mergeStreamUsage(a: Usage, b: Usage): Usage;
137
+ /**
138
+ * Accumulates the metered usage of one STREAMING call across its chunks.
139
+ *
140
+ * Feed every chunk to `observe` as the host iterates the stream, then call
141
+ * `finalize` once the stream is exhausted (or closed) to get the single `Usage`
142
+ * for the whole call — or `undefined` when the stream never carried a usage block
143
+ * (e.g. an OpenAI stream opened without `include_usage`, where there is genuinely
144
+ * no count to meter and inventing one would be a lie). Provider-agnostic: the
145
+ * per-chunk read + max-merge handles OpenAI, Anthropic and Gemini streams alike.
146
+ */
147
+ export declare class StreamUsageAccumulator {
148
+ private provider?;
149
+ private model?;
150
+ private usage;
151
+ constructor(provider?: ProviderName, model?: string);
152
+ /** Fold one chunk's usage (if any) into the running total. Never throws. */
153
+ observe(chunk: Any): void;
154
+ /** The accumulated usage, or `undefined` if the stream carried no usage. */
155
+ finalize(): Usage | undefined;
156
+ }
157
+ export {};
158
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,eAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,eAAO,MAAM,SAAS,cAAc,CAAC;AACrC,eAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,eAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,eAAO,MAAM,OAAO,YAAY,CAAC;AAEjC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEpF,6EAA6E;AAC7E,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,mFAAmF;IACnF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB;;;;;;;OAOG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,kEAAkE;AAClE,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;AAmChE;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,GAAG,GAAG,YAAY,GAAG,SAAS,CAuBtE;AA0JD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,GAAG,EACb,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,KAAK,CAUP;AAeD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,GAAG,EACV,QAAQ,CAAC,EAAE,YAAY,EACvB,KAAK,CAAC,EAAE,MAAM,GACb,KAAK,GAAG,SAAS,CAoBnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,KAAK,CAc1D;AAED;;;;;;;;;GASG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,KAAK,CAAgC;gBAIjC,QAAQ,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM;IAKnD,4EAA4E;IAC5E,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAWzB,4EAA4E;IAC5E,QAAQ,IAAI,KAAK,GAAG,SAAS;CAG9B"}