@revenium/openai 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/.env.example +28 -8
  2. package/CHANGELOG.md +23 -29
  3. package/README.md +48 -0
  4. package/dist/cjs/core/tracking/tool-api-client.js +58 -0
  5. package/dist/cjs/core/tracking/tool-api-client.js.map +1 -0
  6. package/dist/cjs/core/tracking/tool-context.js +23 -0
  7. package/dist/cjs/core/tracking/tool-context.js.map +1 -0
  8. package/dist/cjs/core/tracking/tool-tracker.js +122 -0
  9. package/dist/cjs/core/tracking/tool-tracker.js.map +1 -0
  10. package/dist/cjs/index.js +9 -1
  11. package/dist/cjs/index.js.map +1 -1
  12. package/dist/cjs/types/index.js +1 -0
  13. package/dist/cjs/types/index.js.map +1 -1
  14. package/dist/cjs/types/tool-metering.js +3 -0
  15. package/dist/cjs/types/tool-metering.js.map +1 -0
  16. package/dist/esm/core/tracking/tool-api-client.js +55 -0
  17. package/dist/esm/core/tracking/tool-api-client.js.map +1 -0
  18. package/dist/esm/core/tracking/tool-context.js +17 -0
  19. package/dist/esm/core/tracking/tool-context.js.map +1 -0
  20. package/dist/esm/core/tracking/tool-tracker.js +118 -0
  21. package/dist/esm/core/tracking/tool-tracker.js.map +1 -0
  22. package/dist/esm/index.js +2 -0
  23. package/dist/esm/index.js.map +1 -1
  24. package/dist/esm/types/index.js +1 -0
  25. package/dist/esm/types/index.js.map +1 -1
  26. package/dist/esm/types/tool-metering.js +2 -0
  27. package/dist/esm/types/tool-metering.js.map +1 -0
  28. package/dist/types/core/tracking/tool-api-client.d.ts +3 -0
  29. package/dist/types/core/tracking/tool-api-client.d.ts.map +1 -0
  30. package/dist/types/core/tracking/tool-context.d.ts +6 -0
  31. package/dist/types/core/tracking/tool-context.d.ts.map +1 -0
  32. package/dist/types/core/tracking/tool-tracker.d.ts +4 -0
  33. package/dist/types/core/tracking/tool-tracker.d.ts.map +1 -0
  34. package/dist/types/index.d.ts +3 -0
  35. package/dist/types/index.d.ts.map +1 -1
  36. package/dist/types/types/index.d.ts +1 -0
  37. package/dist/types/types/index.d.ts.map +1 -1
  38. package/dist/types/types/tool-metering.d.ts +47 -0
  39. package/dist/types/types/tool-metering.d.ts.map +1 -0
  40. package/package.json +12 -1
package/.env.example CHANGED
@@ -1,15 +1,35 @@
1
- # Revenium Configuration (Required)
1
+ # OpenAI API Configuration
2
+ OPENAI_API_KEY=sk-your-openai-api-key-here
3
+
4
+ # Azure OpenAI Configuration (Optional)
5
+ AZURE_OPENAI_API_KEY=your-azure-openai-api-key
6
+ AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
7
+ AZURE_OPENAI_API_VERSION=2024-02-15-preview
8
+
9
+ # Revenium Metering Configuration
2
10
  REVENIUM_METERING_API_KEY=hak_your_revenium_api_key_here
3
11
  REVENIUM_METERING_BASE_URL=https://api.revenium.ai
4
12
 
5
- # OpenAI Configuration (Required for OpenAI native API)
6
- OPENAI_API_KEY=sk-your_openai_api_key_here
13
+ # Trace Visualization Fields (Optional)
14
+ REVENIUM_ENVIRONMENT=production
15
+ REVENIUM_REGION=us-east-1
16
+ REVENIUM_CREDENTIAL_ALIAS=OpenAI Production Key
17
+ REVENIUM_TRACE_TYPE=customer_support
18
+ REVENIUM_TRACE_NAME=Support Ticket #12345
19
+ REVENIUM_PARENT_TRANSACTION_ID=parent-txn-123
20
+ REVENIUM_TRANSACTION_NAME=Answer Customer Question
21
+ REVENIUM_RETRY_NUMBER=0
7
22
 
8
- # Azure OpenAI Configuration (Optional - for Azure OpenAI support)
9
- AZURE_OPENAI_API_KEY=your_azure_openai_api_key
10
- AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
11
- AZURE_OPENAI_API_VERSION=your_azure_openai_api_version
23
+ # Terminal Summary Output (Optional)
24
+ # Enable to print cost/metrics summary to terminal after each API request
25
+ # Values: 'true' or 'human' for human-readable output, 'json' for JSON output, 'false' to disable
26
+ REVENIUM_PRINT_SUMMARY=false
27
+ # Team ID required to display cost information in terminal summary
28
+ # Find your team ID in the Revenium web application
29
+ REVENIUM_TEAM_ID=your-team-id-here
12
30
 
13
31
  # Debug Configuration (Optional)
14
- REVENIUM_DEBUG=false # Set to true to enable debug logging
32
+ REVENIUM_DEBUG=false
15
33
 
34
+ # AWS Region Detection (Optional - auto-detected if not set)
35
+ AWS_REGION=us-east-1
package/CHANGELOG.md CHANGED
@@ -5,12 +5,33 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.1.2] - 2026-02-19
9
+
10
+ ### Added
11
+
12
+ - Tool metering support (meterTool, reportToolCall, setToolContext)
13
+ - outputFields feature for automatic result extraction
14
+ - Fetch timeout to sendToolEvent
15
+
16
+ ### Fixed
17
+
18
+ - Remove dead response.text() in sendToolEvent
19
+
20
+ ## [1.1.1] - 2026-02-06
21
+
22
+ ### Added
23
+
24
+ - Summary printer with human and JSON output formats
25
+ - Region detection from AWS, Azure, GCP environment variables
26
+ - Credential alias configuration support
27
+ - Trace name and trace type validation
28
+ - Retry number tracking
29
+
8
30
  ## [1.1.0] - 2026-01-20
9
31
 
10
32
  ### Added
11
33
 
12
- - Prompt capture functionality with comprehensive credential sanitization
13
- - Automatic redaction of sensitive credentials in captured prompts:
34
+ - Comprehensive credential sanitization with support for:
14
35
  - OpenAI keys (sk-_, sk-proj-_, sk-ant-\*)
15
36
  - Perplexity keys (pplx-\*)
16
37
  - AWS access keys (AKIA\*)
@@ -25,33 +46,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
25
46
  - Fixed password regex pattern to properly handle quoted values
26
47
  - Improved character class consistency across all patterns
27
48
 
28
- ## [1.0.16] - 2026-01-12
29
-
30
- ### Added
31
-
32
- - **Trace Visualization Fields**: Full implementation of trace fields in payload builder
33
- - `environment` - Deployment environment with fallback chain (REVENIUM_ENVIRONMENT → NODE_ENV → DEPLOYMENT_ENV)
34
- - `region` - Cloud region with auto-detection from AWS/Azure/GCP and metadata service fallback
35
- - `credentialAlias` - Human-readable credential name
36
- - `traceType` - Categorical identifier with format validation (alphanumeric, hyphens, underscores, max 128 chars)
37
- - `traceName` - Human-readable trace label with length validation (max 256 chars)
38
- - `parentTransactionId` - Parent transaction reference for distributed tracing
39
- - `transactionName` - Human-friendly operation label
40
- - `retryNumber` - Retry attempt tracking (0 for first attempt, 1+ for retries)
41
- - `operationSubtype` - Auto-detected operation details (e.g., function_call when tools are present)
42
-
43
- ### Changed
44
-
45
- - Updated `buildPayload()` function to async to support region detection
46
- - Enhanced README with comprehensive trace visualization fields documentation
47
- - Added trace fields to TypeScript interface `ReveniumPayload`
48
-
49
- ### Documentation
50
-
51
- - Added "Trace Visualization Fields" section to README with complete field descriptions
52
- - Added example configuration for trace fields
53
- - Updated documentation to match other middleware packages (anthropic-node, perplexity-node)
54
-
55
49
  ## [1.0.15] - 2025-12-09
56
50
 
57
51
  ### Added
package/README.md CHANGED
@@ -106,6 +106,54 @@ The middleware provides a Go-aligned API with the following main functions:
106
106
 
107
107
  **For complete API documentation and usage examples, see [`examples/README.md`](https://github.com/revenium/revenium-middleware-openai-node/blob/HEAD/examples/README.md).**
108
108
 
109
+ ## Tool Metering
110
+
111
+ Track execution of custom tools and external API calls with automatic timing, error handling, and metadata collection.
112
+
113
+ ### Quick Example
114
+
115
+ ```typescript
116
+ import { meterTool, setToolContext } from '@revenium/openai';
117
+
118
+ setToolContext({
119
+ agent: 'my-agent',
120
+ traceId: 'session-123'
121
+ });
122
+
123
+ const result = await meterTool('weather-api', async () => {
124
+ return await fetch('https://api.example.com/weather');
125
+ }, {
126
+ operation: 'get_forecast',
127
+ outputFields: ['temperature', 'humidity']
128
+ });
129
+ ```
130
+
131
+ ### Functions
132
+
133
+ **meterTool(toolId, fn, metadata?)**
134
+
135
+ Wraps a function with automatic metering. Captures duration, success/failure, and errors. Returns function result unchanged.
136
+
137
+ **reportToolCall(toolId, report)**
138
+
139
+ Manually report a tool call that was already executed. Useful when wrapping is not possible.
140
+
141
+ **Context Management**
142
+
143
+ - `setToolContext(ctx)` - Set context for all subsequent tool calls
144
+ - `getToolContext()` - Get current context
145
+ - `clearToolContext()` - Clear context
146
+ - `runWithToolContext(ctx, fn)` - Run function with scoped context
147
+
148
+ ### Metadata Options
149
+
150
+ | Field | Description |
151
+ |-------|-------------|
152
+ | `operation` | Tool operation name (e.g., "search", "scrape") |
153
+ | `outputFields` | Array of field names to auto-extract from result |
154
+ | `usageMetadata` | Custom metrics (e.g., tokens, results count) |
155
+ | `agent`, `traceId`, etc. | Context fields (inherited from setToolContext) |
156
+
109
157
  ## Metadata Fields
110
158
 
111
159
  The middleware supports the following optional metadata fields for tracking:
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendToolEvent = sendToolEvent;
4
+ const index_js_1 = require("../config/index.js");
5
+ const url_builder_js_1 = require("../../utils/url-builder.js");
6
+ const constants_js_1 = require("../../utils/constants.js");
7
+ const TOOL_EVENTS_ENDPOINT = "/tool/events";
8
+ async function sendToolEvent(payload) {
9
+ const config = (0, index_js_1.getConfig)();
10
+ const logger = (0, index_js_1.getLogger)();
11
+ if (!config) {
12
+ logger.warn("Revenium configuration not found, skipping tool event tracking");
13
+ return;
14
+ }
15
+ const url = (0, url_builder_js_1.buildReveniumUrl)(config.reveniumBaseUrl || constants_js_1.DEFAULT_REVENIUM_BASE_URL, TOOL_EVENTS_ENDPOINT);
16
+ logger.debug("Sending tool event to Revenium", {
17
+ url,
18
+ toolId: payload.toolId,
19
+ transactionId: payload.transactionId,
20
+ operation: payload.operation,
21
+ durationMs: payload.durationMs,
22
+ success: payload.success,
23
+ });
24
+ const controller = new AbortController();
25
+ const timeoutId = setTimeout(() => controller.abort(), 10000);
26
+ const response = await fetch(url, {
27
+ method: "POST",
28
+ headers: {
29
+ "Content-Type": "application/json",
30
+ Accept: "application/json",
31
+ "x-api-key": config.reveniumApiKey,
32
+ },
33
+ body: JSON.stringify(payload),
34
+ signal: controller.signal,
35
+ }).finally(() => clearTimeout(timeoutId));
36
+ logger.debug("Tool event response", {
37
+ status: response.status,
38
+ statusText: response.statusText,
39
+ transactionId: payload.transactionId,
40
+ toolId: payload.toolId,
41
+ });
42
+ if (!response.ok) {
43
+ const responseText = await response.text();
44
+ logger.error("Tool event API error", {
45
+ status: response.status,
46
+ statusText: response.statusText,
47
+ body: responseText,
48
+ transactionId: payload.transactionId,
49
+ toolId: payload.toolId,
50
+ });
51
+ throw new Error(`Revenium tool event API error: ${response.status} ${response.statusText}`);
52
+ }
53
+ logger.debug("Tool event sent successfully", {
54
+ transactionId: payload.transactionId,
55
+ toolId: payload.toolId,
56
+ });
57
+ }
58
+ //# sourceMappingURL=tool-api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-api-client.js","sourceRoot":"","sources":["../../../../src/core/tracking/tool-api-client.ts"],"names":[],"mappings":";;AAOA,sCA4DC;AAlED,iDAA0D;AAC1D,+DAA8D;AAC9D,2DAAqE;AAErE,MAAM,oBAAoB,GAAG,cAAc,CAAC;AAErC,KAAK,UAAU,aAAa,CAAC,OAAyB;IAC3D,MAAM,MAAM,GAAG,IAAA,oBAAS,GAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAA,oBAAS,GAAE,CAAC;IAE3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,iCAAgB,EAC1B,MAAM,CAAC,eAAe,IAAI,wCAAyB,EACnD,oBAAoB,CACrB,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;QAC7C,GAAG;QACH,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAM,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;YAC1B,WAAW,EAAE,MAAM,CAAC,cAAc;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IAE1C,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE;QAClC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;YACnC,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,IAAI,EAAE,YAAY;YAClB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;QAC3C,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setToolContext = setToolContext;
4
+ exports.getToolContext = getToolContext;
5
+ exports.clearToolContext = clearToolContext;
6
+ exports.runWithToolContext = runWithToolContext;
7
+ const async_hooks_1 = require("async_hooks");
8
+ const contextStorage = new async_hooks_1.AsyncLocalStorage();
9
+ function setToolContext(ctx) {
10
+ const current = contextStorage.getStore() ?? {};
11
+ contextStorage.enterWith({ ...current, ...ctx });
12
+ }
13
+ function getToolContext() {
14
+ return contextStorage.getStore() ?? {};
15
+ }
16
+ function clearToolContext() {
17
+ contextStorage.enterWith({});
18
+ }
19
+ function runWithToolContext(ctx, fn) {
20
+ const merged = { ...getToolContext(), ...ctx };
21
+ return contextStorage.run(merged, fn);
22
+ }
23
+ //# sourceMappingURL=tool-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-context.js","sourceRoot":"","sources":["../../../../src/core/tracking/tool-context.ts"],"names":[],"mappings":";;AAKA,wCAGC;AAED,wCAEC;AAED,4CAEC;AAED,gDAMC;AAxBD,6CAAgD;AAGhD,MAAM,cAAc,GAAG,IAAI,+BAAiB,EAAe,CAAC;AAE5D,SAAgB,cAAc,CAAC,GAAgB;IAC7C,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IAChD,cAAc,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,SAAgB,cAAc;IAC5B,OAAO,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,SAAgB,gBAAgB;IAC9B,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,SAAgB,kBAAkB,CAChC,GAAgB,EAChB,EAAwB;IAExB,MAAM,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC;IAC/C,OAAO,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.meterTool = meterTool;
4
+ exports.reportToolCall = reportToolCall;
5
+ const crypto_1 = require("crypto");
6
+ const tool_context_js_1 = require("./tool-context.js");
7
+ const tool_api_client_js_1 = require("./tool-api-client.js");
8
+ const index_js_1 = require("../config/index.js");
9
+ const MIDDLEWARE_SOURCE = "revenium-openai-node";
10
+ function isPromise(value) {
11
+ return value !== null && typeof value === "object" && typeof value.then === "function";
12
+ }
13
+ function extractOutputFields(result, fields) {
14
+ if (typeof result !== "object" || result === null) {
15
+ return {};
16
+ }
17
+ const extracted = {};
18
+ for (const field of fields) {
19
+ if (field in result) {
20
+ extracted[field] = result[field];
21
+ }
22
+ }
23
+ return extracted;
24
+ }
25
+ function buildToolEventPayload(toolId, durationMs, success, metadata, errorMessage) {
26
+ const context = (0, tool_context_js_1.getToolContext)();
27
+ const transactionId = metadata?.transactionId ?? context.transactionId ?? (0, crypto_1.randomUUID)();
28
+ return {
29
+ transactionId,
30
+ toolId,
31
+ operation: metadata?.operation,
32
+ durationMs,
33
+ success,
34
+ timestamp: new Date().toISOString(),
35
+ errorMessage,
36
+ usageMetadata: metadata?.usageMetadata,
37
+ agent: metadata?.agent ?? context.agent,
38
+ organizationName: metadata?.organizationName ?? context.organizationName,
39
+ productName: metadata?.productName ?? context.productName,
40
+ subscriberCredential: metadata?.subscriberCredential ?? context.subscriberCredential,
41
+ workflowId: metadata?.workflowId ?? context.workflowId,
42
+ traceId: metadata?.traceId ?? context.traceId,
43
+ middlewareSource: MIDDLEWARE_SOURCE,
44
+ };
45
+ }
46
+ function dispatchToolEvent(payload) {
47
+ const logger = (0, index_js_1.getLogger)();
48
+ (0, tool_api_client_js_1.sendToolEvent)(payload)
49
+ .then(() => {
50
+ logger.debug("Tool event sent successfully", {
51
+ transactionId: payload.transactionId,
52
+ toolId: payload.toolId,
53
+ });
54
+ })
55
+ .catch((error) => {
56
+ logger.warn("Failed to send tool event", {
57
+ transactionId: payload.transactionId,
58
+ toolId: payload.toolId,
59
+ error: error instanceof Error ? error.message : String(error),
60
+ });
61
+ });
62
+ }
63
+ function meterTool(toolId, fn, metadata) {
64
+ const startTime = performance.now();
65
+ const handleSuccess = (result) => {
66
+ const durationMs = Math.round(performance.now() - startTime);
67
+ let finalMetadata = metadata;
68
+ if (metadata?.outputFields && metadata.outputFields.length > 0) {
69
+ const extracted = extractOutputFields(result, metadata.outputFields);
70
+ finalMetadata = {
71
+ ...metadata,
72
+ usageMetadata: {
73
+ ...metadata.usageMetadata,
74
+ ...extracted,
75
+ },
76
+ };
77
+ }
78
+ const payload = buildToolEventPayload(toolId, durationMs, true, finalMetadata);
79
+ dispatchToolEvent(payload);
80
+ return result;
81
+ };
82
+ const handleError = (error) => {
83
+ const durationMs = Math.round(performance.now() - startTime);
84
+ const errorMessage = error instanceof Error ? error.message : String(error);
85
+ const payload = buildToolEventPayload(toolId, durationMs, false, metadata, errorMessage);
86
+ dispatchToolEvent(payload);
87
+ throw error;
88
+ };
89
+ try {
90
+ const result = fn();
91
+ if (isPromise(result)) {
92
+ return result.then(handleSuccess, handleError);
93
+ }
94
+ return Promise.resolve(handleSuccess(result));
95
+ }
96
+ catch (error) {
97
+ return Promise.reject(handleError(error));
98
+ }
99
+ }
100
+ function reportToolCall(toolId, report) {
101
+ const context = (0, tool_context_js_1.getToolContext)();
102
+ const transactionId = report.transactionId ?? context.transactionId ?? (0, crypto_1.randomUUID)();
103
+ const payload = {
104
+ transactionId,
105
+ toolId,
106
+ operation: report.operation,
107
+ durationMs: report.durationMs,
108
+ success: report.success,
109
+ timestamp: report.timestamp ?? new Date().toISOString(),
110
+ errorMessage: report.errorMessage,
111
+ usageMetadata: report.usageMetadata,
112
+ agent: report.agent ?? context.agent,
113
+ organizationName: report.organizationName ?? context.organizationName,
114
+ productName: report.productName ?? context.productName,
115
+ subscriberCredential: report.subscriberCredential ?? context.subscriberCredential,
116
+ workflowId: report.workflowId ?? context.workflowId,
117
+ traceId: report.traceId ?? context.traceId,
118
+ middlewareSource: MIDDLEWARE_SOURCE,
119
+ };
120
+ dispatchToolEvent(payload);
121
+ }
122
+ //# sourceMappingURL=tool-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-tracker.js","sourceRoot":"","sources":["../../../../src/core/tracking/tool-tracker.ts"],"names":[],"mappings":"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"}
package/dist/cjs/index.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * This middleware tracks OpenAI usage and sends metrics to Revenium.
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.getProviderMetadata = exports.validateAzureConfig = exports.hasAzureConfig = exports.detectProvider = exports.trackAudioUsageAsync = exports.trackImageUsageAsync = exports.trackEmbeddingsUsageAsync = exports.trackUsageAsync = exports.AudioSpeechInterface = exports.AudioTranslationsInterface = exports.AudioTranscriptionsInterface = exports.ImagesInterface = exports.StreamingWrapper = exports.ResponsesInterface = exports.EmbeddingsInterface = exports.CompletionsInterface = exports.ChatInterface = exports.ReveniumOpenAI = exports.Configure = exports.Reset = exports.IsInitialized = exports.GetClient = exports.Initialize = void 0;
8
+ exports.runWithToolContext = exports.clearToolContext = exports.getToolContext = exports.setToolContext = exports.reportToolCall = exports.meterTool = exports.getProviderMetadata = exports.validateAzureConfig = exports.hasAzureConfig = exports.detectProvider = exports.trackAudioUsageAsync = exports.trackImageUsageAsync = exports.trackEmbeddingsUsageAsync = exports.trackUsageAsync = exports.AudioSpeechInterface = exports.AudioTranslationsInterface = exports.AudioTranscriptionsInterface = exports.ImagesInterface = exports.StreamingWrapper = exports.ResponsesInterface = exports.EmbeddingsInterface = exports.CompletionsInterface = exports.ChatInterface = exports.ReveniumOpenAI = exports.Configure = exports.Reset = exports.IsInitialized = exports.GetClient = exports.Initialize = void 0;
9
9
  // Import type augmentations to extend OpenAI types with usageMetadata
10
10
  require("./types/openai-augmentation.js");
11
11
  // Note: ExtendedChatCompletionCreateParams and ExtendedEmbeddingCreateParams are no longer exported
@@ -50,4 +50,12 @@ Object.defineProperty(exports, "detectProvider", { enumerable: true, get: functi
50
50
  Object.defineProperty(exports, "hasAzureConfig", { enumerable: true, get: function () { return providers_1.hasAzureConfig; } });
51
51
  Object.defineProperty(exports, "validateAzureConfig", { enumerable: true, get: function () { return providers_1.validateAzureConfig; } });
52
52
  Object.defineProperty(exports, "getProviderMetadata", { enumerable: true, get: function () { return providers_1.getProviderMetadata; } });
53
+ var tool_tracker_js_1 = require("./core/tracking/tool-tracker.js");
54
+ Object.defineProperty(exports, "meterTool", { enumerable: true, get: function () { return tool_tracker_js_1.meterTool; } });
55
+ Object.defineProperty(exports, "reportToolCall", { enumerable: true, get: function () { return tool_tracker_js_1.reportToolCall; } });
56
+ var tool_context_js_1 = require("./core/tracking/tool-context.js");
57
+ Object.defineProperty(exports, "setToolContext", { enumerable: true, get: function () { return tool_context_js_1.setToolContext; } });
58
+ Object.defineProperty(exports, "getToolContext", { enumerable: true, get: function () { return tool_context_js_1.getToolContext; } });
59
+ Object.defineProperty(exports, "clearToolContext", { enumerable: true, get: function () { return tool_context_js_1.clearToolContext; } });
60
+ Object.defineProperty(exports, "runWithToolContext", { enumerable: true, get: function () { return tool_context_js_1.runWithToolContext; } });
53
61
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,sEAAsE;AACtE,0CAAwC;AA8DxC,oGAAoG;AACpG,mGAAmG;AACnG,oFAAoF;AAEpF;;GAEG;AACH,wCAMuB;AALrB,oGAAA,UAAU,OAAA;AACV,mGAAA,SAAS,OAAA;AACT,uGAAA,aAAa,OAAA;AACb,+FAAA,KAAK,OAAA;AACL,mGAAA,SAAS,OAAA;AAGX;;GAEG;AACH,gDAW2B;AAVzB,4GAAA,cAAc,OAAA;AACd,2GAAA,aAAa,OAAA;AACb,kHAAA,oBAAoB,OAAA;AACpB,iHAAA,mBAAmB,OAAA;AACnB,gHAAA,kBAAkB,OAAA;AAClB,8GAAA,gBAAgB,OAAA;AAChB,6GAAA,eAAe,OAAA;AACf,0HAAA,4BAA4B,OAAA;AAC5B,wHAAA,0BAA0B,OAAA;AAC1B,kHAAA,oBAAoB,OAAA;AAGtB;;GAEG;AACH,4CAKyB;AAJvB,2GAAA,eAAe,OAAA;AACf,qHAAA,yBAAyB,OAAA;AACzB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AAGtB;;GAEG;AACH,8CAK0B;AAJxB,2GAAA,cAAc,OAAA;AACd,2GAAA,cAAc,OAAA;AACd,gHAAA,mBAAmB,OAAA;AACnB,gHAAA,mBAAmB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,sEAAsE;AACtE,0CAAwC;AA8DxC,oGAAoG;AACpG,mGAAmG;AACnG,oFAAoF;AAEpF;;GAEG;AACH,wCAMuB;AALrB,oGAAA,UAAU,OAAA;AACV,mGAAA,SAAS,OAAA;AACT,uGAAA,aAAa,OAAA;AACb,+FAAA,KAAK,OAAA;AACL,mGAAA,SAAS,OAAA;AAGX;;GAEG;AACH,gDAW2B;AAVzB,4GAAA,cAAc,OAAA;AACd,2GAAA,aAAa,OAAA;AACb,kHAAA,oBAAoB,OAAA;AACpB,iHAAA,mBAAmB,OAAA;AACnB,gHAAA,kBAAkB,OAAA;AAClB,8GAAA,gBAAgB,OAAA;AAChB,6GAAA,eAAe,OAAA;AACf,0HAAA,4BAA4B,OAAA;AAC5B,wHAAA,0BAA0B,OAAA;AAC1B,kHAAA,oBAAoB,OAAA;AAGtB;;GAEG;AACH,4CAKyB;AAJvB,2GAAA,eAAe,OAAA;AACf,qHAAA,yBAAyB,OAAA;AACzB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AAGtB;;GAEG;AACH,8CAK0B;AAJxB,2GAAA,cAAc,OAAA;AACd,2GAAA,cAAc,OAAA;AACd,gHAAA,mBAAmB,OAAA;AACnB,gHAAA,mBAAmB,OAAA;AAUrB,mEAGyC;AAFvC,4GAAA,SAAS,OAAA;AACT,iHAAA,cAAc,OAAA;AAGhB,mEAKyC;AAJvC,iHAAA,cAAc,OAAA;AACd,iHAAA,cAAc,OAAA;AACd,mHAAA,gBAAgB,OAAA;AAChB,qHAAA,kBAAkB,OAAA"}
@@ -38,4 +38,5 @@ var Provider;
38
38
  /** Azure OpenAI Service */
39
39
  Provider["AZURE_OPENAI"] = "AZURE_OPENAI";
40
40
  })(Provider || (exports.Provider = Provider = {}));
41
+ __exportStar(require("./tool-metering.js"), exports);
41
42
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;AAEH,qCAAqC;AACrC,2DAAyC;AAEzC,gCAAgC;AAChC,qDAAmC;AAgGnC;;;;;GAKG;AACH,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,0BAA0B;IAC1B,6BAAiB,CAAA;IACjB,2BAA2B;IAC3B,yCAA6B,CAAA;AAC/B,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;AAEH,qCAAqC;AACrC,2DAAyC;AAEzC,gCAAgC;AAChC,qDAAmC;AAgGnC;;;;;GAKG;AACH,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,0BAA0B;IAC1B,6BAAiB,CAAA;IACjB,2BAA2B;IAC3B,yCAA6B,CAAA;AAC/B,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB;AA2MD,qDAAmC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=tool-metering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-metering.js","sourceRoot":"","sources":["../../../src/types/tool-metering.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ import { getConfig, getLogger } from "../config/index.js";
2
+ import { buildReveniumUrl } from "../../utils/url-builder.js";
3
+ import { DEFAULT_REVENIUM_BASE_URL } from "../../utils/constants.js";
4
+ const TOOL_EVENTS_ENDPOINT = "/tool/events";
5
+ export async function sendToolEvent(payload) {
6
+ const config = getConfig();
7
+ const logger = getLogger();
8
+ if (!config) {
9
+ logger.warn("Revenium configuration not found, skipping tool event tracking");
10
+ return;
11
+ }
12
+ const url = buildReveniumUrl(config.reveniumBaseUrl || DEFAULT_REVENIUM_BASE_URL, TOOL_EVENTS_ENDPOINT);
13
+ logger.debug("Sending tool event to Revenium", {
14
+ url,
15
+ toolId: payload.toolId,
16
+ transactionId: payload.transactionId,
17
+ operation: payload.operation,
18
+ durationMs: payload.durationMs,
19
+ success: payload.success,
20
+ });
21
+ const controller = new AbortController();
22
+ const timeoutId = setTimeout(() => controller.abort(), 10000);
23
+ const response = await fetch(url, {
24
+ method: "POST",
25
+ headers: {
26
+ "Content-Type": "application/json",
27
+ Accept: "application/json",
28
+ "x-api-key": config.reveniumApiKey,
29
+ },
30
+ body: JSON.stringify(payload),
31
+ signal: controller.signal,
32
+ }).finally(() => clearTimeout(timeoutId));
33
+ logger.debug("Tool event response", {
34
+ status: response.status,
35
+ statusText: response.statusText,
36
+ transactionId: payload.transactionId,
37
+ toolId: payload.toolId,
38
+ });
39
+ if (!response.ok) {
40
+ const responseText = await response.text();
41
+ logger.error("Tool event API error", {
42
+ status: response.status,
43
+ statusText: response.statusText,
44
+ body: responseText,
45
+ transactionId: payload.transactionId,
46
+ toolId: payload.toolId,
47
+ });
48
+ throw new Error(`Revenium tool event API error: ${response.status} ${response.statusText}`);
49
+ }
50
+ logger.debug("Tool event sent successfully", {
51
+ transactionId: payload.transactionId,
52
+ toolId: payload.toolId,
53
+ });
54
+ }
55
+ //# sourceMappingURL=tool-api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-api-client.js","sourceRoot":"","sources":["../../../../src/core/tracking/tool-api-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAErE,MAAM,oBAAoB,GAAG,cAAc,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAyB;IAC3D,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,gBAAgB,CAC1B,MAAM,CAAC,eAAe,IAAI,yBAAyB,EACnD,oBAAoB,CACrB,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;QAC7C,GAAG;QACH,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAM,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;YAC1B,WAAW,EAAE,MAAM,CAAC,cAAc;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IAE1C,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE;QAClC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;YACnC,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,IAAI,EAAE,YAAY;YAClB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;QAC3C,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { AsyncLocalStorage } from "async_hooks";
2
+ const contextStorage = new AsyncLocalStorage();
3
+ export function setToolContext(ctx) {
4
+ const current = contextStorage.getStore() ?? {};
5
+ contextStorage.enterWith({ ...current, ...ctx });
6
+ }
7
+ export function getToolContext() {
8
+ return contextStorage.getStore() ?? {};
9
+ }
10
+ export function clearToolContext() {
11
+ contextStorage.enterWith({});
12
+ }
13
+ export function runWithToolContext(ctx, fn) {
14
+ const merged = { ...getToolContext(), ...ctx };
15
+ return contextStorage.run(merged, fn);
16
+ }
17
+ //# sourceMappingURL=tool-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-context.js","sourceRoot":"","sources":["../../../../src/core/tracking/tool-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,MAAM,cAAc,GAAG,IAAI,iBAAiB,EAAe,CAAC;AAE5D,MAAM,UAAU,cAAc,CAAC,GAAgB;IAC7C,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IAChD,cAAc,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAgB,EAChB,EAAwB;IAExB,MAAM,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC;IAC/C,OAAO,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,118 @@
1
+ import { randomUUID } from "crypto";
2
+ import { getToolContext } from "./tool-context.js";
3
+ import { sendToolEvent } from "./tool-api-client.js";
4
+ import { getLogger } from "../config/index.js";
5
+ const MIDDLEWARE_SOURCE = "revenium-openai-node";
6
+ function isPromise(value) {
7
+ return value !== null && typeof value === "object" && typeof value.then === "function";
8
+ }
9
+ function extractOutputFields(result, fields) {
10
+ if (typeof result !== "object" || result === null) {
11
+ return {};
12
+ }
13
+ const extracted = {};
14
+ for (const field of fields) {
15
+ if (field in result) {
16
+ extracted[field] = result[field];
17
+ }
18
+ }
19
+ return extracted;
20
+ }
21
+ function buildToolEventPayload(toolId, durationMs, success, metadata, errorMessage) {
22
+ const context = getToolContext();
23
+ const transactionId = metadata?.transactionId ?? context.transactionId ?? randomUUID();
24
+ return {
25
+ transactionId,
26
+ toolId,
27
+ operation: metadata?.operation,
28
+ durationMs,
29
+ success,
30
+ timestamp: new Date().toISOString(),
31
+ errorMessage,
32
+ usageMetadata: metadata?.usageMetadata,
33
+ agent: metadata?.agent ?? context.agent,
34
+ organizationName: metadata?.organizationName ?? context.organizationName,
35
+ productName: metadata?.productName ?? context.productName,
36
+ subscriberCredential: metadata?.subscriberCredential ?? context.subscriberCredential,
37
+ workflowId: metadata?.workflowId ?? context.workflowId,
38
+ traceId: metadata?.traceId ?? context.traceId,
39
+ middlewareSource: MIDDLEWARE_SOURCE,
40
+ };
41
+ }
42
+ function dispatchToolEvent(payload) {
43
+ const logger = getLogger();
44
+ sendToolEvent(payload)
45
+ .then(() => {
46
+ logger.debug("Tool event sent successfully", {
47
+ transactionId: payload.transactionId,
48
+ toolId: payload.toolId,
49
+ });
50
+ })
51
+ .catch((error) => {
52
+ logger.warn("Failed to send tool event", {
53
+ transactionId: payload.transactionId,
54
+ toolId: payload.toolId,
55
+ error: error instanceof Error ? error.message : String(error),
56
+ });
57
+ });
58
+ }
59
+ export function meterTool(toolId, fn, metadata) {
60
+ const startTime = performance.now();
61
+ const handleSuccess = (result) => {
62
+ const durationMs = Math.round(performance.now() - startTime);
63
+ let finalMetadata = metadata;
64
+ if (metadata?.outputFields && metadata.outputFields.length > 0) {
65
+ const extracted = extractOutputFields(result, metadata.outputFields);
66
+ finalMetadata = {
67
+ ...metadata,
68
+ usageMetadata: {
69
+ ...metadata.usageMetadata,
70
+ ...extracted,
71
+ },
72
+ };
73
+ }
74
+ const payload = buildToolEventPayload(toolId, durationMs, true, finalMetadata);
75
+ dispatchToolEvent(payload);
76
+ return result;
77
+ };
78
+ const handleError = (error) => {
79
+ const durationMs = Math.round(performance.now() - startTime);
80
+ const errorMessage = error instanceof Error ? error.message : String(error);
81
+ const payload = buildToolEventPayload(toolId, durationMs, false, metadata, errorMessage);
82
+ dispatchToolEvent(payload);
83
+ throw error;
84
+ };
85
+ try {
86
+ const result = fn();
87
+ if (isPromise(result)) {
88
+ return result.then(handleSuccess, handleError);
89
+ }
90
+ return Promise.resolve(handleSuccess(result));
91
+ }
92
+ catch (error) {
93
+ return Promise.reject(handleError(error));
94
+ }
95
+ }
96
+ export function reportToolCall(toolId, report) {
97
+ const context = getToolContext();
98
+ const transactionId = report.transactionId ?? context.transactionId ?? randomUUID();
99
+ const payload = {
100
+ transactionId,
101
+ toolId,
102
+ operation: report.operation,
103
+ durationMs: report.durationMs,
104
+ success: report.success,
105
+ timestamp: report.timestamp ?? new Date().toISOString(),
106
+ errorMessage: report.errorMessage,
107
+ usageMetadata: report.usageMetadata,
108
+ agent: report.agent ?? context.agent,
109
+ organizationName: report.organizationName ?? context.organizationName,
110
+ productName: report.productName ?? context.productName,
111
+ subscriberCredential: report.subscriberCredential ?? context.subscriberCredential,
112
+ workflowId: report.workflowId ?? context.workflowId,
113
+ traceId: report.traceId ?? context.traceId,
114
+ middlewareSource: MIDDLEWARE_SOURCE,
115
+ };
116
+ dispatchToolEvent(payload);
117
+ }
118
+ //# sourceMappingURL=tool-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-tracker.js","sourceRoot":"","sources":["../../../../src/core/tracking/tool-tracker.ts"],"names":[],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -24,4 +24,6 @@ export { trackUsageAsync, trackEmbeddingsUsageAsync, trackImageUsageAsync, track
24
24
  * Provider detection functions
25
25
  */
26
26
  export { detectProvider, hasAzureConfig, validateAzureConfig, getProviderMetadata, } from "./core/providers";
27
+ export { meterTool, reportToolCall, } from "./core/tracking/tool-tracker.js";
28
+ export { setToolContext, getToolContext, clearToolContext, runWithToolContext, } from "./core/tracking/tool-context.js";
27
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sEAAsE;AACtE,OAAO,gCAAgC,CAAC;AA8DxC,oGAAoG;AACpG,mGAAmG;AACnG,oFAAoF;AAEpF;;GAEG;AACH,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,KAAK,EACL,SAAS,GACV,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,OAAO,EACL,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,4BAA4B,EAC5B,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,OAAO,EACL,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sEAAsE;AACtE,OAAO,gCAAgC,CAAC;AA8DxC,oGAAoG;AACpG,mGAAmG;AACnG,oFAAoF;AAEpF;;GAEG;AACH,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,KAAK,EACL,SAAS,GACV,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,OAAO,EACL,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,4BAA4B,EAC5B,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,OAAO,EACL,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EACL,SAAS,EACT,cAAc,GACf,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,iCAAiC,CAAC"}
@@ -21,4 +21,5 @@ export var Provider;
21
21
  /** Azure OpenAI Service */
22
22
  Provider["AZURE_OPENAI"] = "AZURE_OPENAI";
23
23
  })(Provider || (Provider = {}));
24
+ export * from "./tool-metering.js";
24
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qCAAqC;AACrC,cAAc,0BAA0B,CAAC;AAEzC,gCAAgC;AAChC,cAAc,oBAAoB,CAAC;AAgGnC;;;;;GAKG;AACH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,0BAA0B;IAC1B,6BAAiB,CAAA;IACjB,2BAA2B;IAC3B,yCAA6B,CAAA;AAC/B,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qCAAqC;AACrC,cAAc,0BAA0B,CAAC;AAEzC,gCAAgC;AAChC,cAAc,oBAAoB,CAAC;AAgGnC;;;;;GAKG;AACH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,0BAA0B;IAC1B,6BAAiB,CAAA;IACjB,2BAA2B;IAC3B,yCAA6B,CAAA;AAC/B,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AA2MD,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tool-metering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-metering.js","sourceRoot":"","sources":["../../../src/types/tool-metering.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { ToolEventPayload } from "../../types/tool-metering.js";
2
+ export declare function sendToolEvent(payload: ToolEventPayload): Promise<void>;
3
+ //# sourceMappingURL=tool-api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-api-client.d.ts","sourceRoot":"","sources":["../../../../src/core/tracking/tool-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAOhE,wBAAsB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4D5E"}
@@ -0,0 +1,6 @@
1
+ import { ToolContext } from "../../types/tool-metering.js";
2
+ export declare function setToolContext(ctx: ToolContext): void;
3
+ export declare function getToolContext(): ToolContext;
4
+ export declare function clearToolContext(): void;
5
+ export declare function runWithToolContext<T>(ctx: ToolContext, fn: () => T | Promise<T>): T | Promise<T>;
6
+ //# sourceMappingURL=tool-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-context.d.ts","sourceRoot":"","sources":["../../../../src/core/tracking/tool-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAI3D,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAGrD;AAED,wBAAgB,cAAc,IAAI,WAAW,CAE5C;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,GAAG,EAAE,WAAW,EAChB,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGhB"}
@@ -0,0 +1,4 @@
1
+ import { ToolMetadata, ToolCallReport } from "../../types/tool-metering.js";
2
+ export declare function meterTool<T>(toolId: string, fn: () => T | Promise<T>, metadata?: ToolMetadata): Promise<T>;
3
+ export declare function reportToolCall(toolId: string, report: ToolCallReport): void;
4
+ //# sourceMappingURL=tool-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-tracker.d.ts","sourceRoot":"","sources":["../../../../src/core/tracking/tool-tracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAoB,MAAM,8BAA8B,CAAC;AAwE9F,wBAAgB,SAAS,CAAC,CAAC,EACzB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACxB,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC,CAAC,CAAC,CA0CZ;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAuB3E"}
@@ -73,4 +73,7 @@ export { trackUsageAsync, trackEmbeddingsUsageAsync, trackImageUsageAsync, track
73
73
  * Provider detection functions
74
74
  */
75
75
  export { detectProvider, hasAzureConfig, validateAzureConfig, getProviderMetadata, } from "./core/providers";
76
+ export type { ToolContext, ToolMetadata, ToolEventPayload, ToolCallReport, } from "./types/tool-metering.js";
77
+ export { meterTool, reportToolCall, } from "./core/tracking/tool-tracker.js";
78
+ export { setToolContext, getToolContext, clearToolContext, runWithToolContext, } from "./core/tracking/tool-context.js";
76
79
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,gCAAgC,CAAC;AAExC;;;;;;;GAOG;AACH,YAAY;AACV;;;;;GAKG;AACH,cAAc;AAEd;;;;;;GAMG;AACH,aAAa;AAEb;;;;;;GAMG;AACH,MAAM;AAEN;;;;;GAKG;AACH,WAAW;AAEX;;;;;GAKG;AACH,QAAQ;AAER;;;;;GAKG;AACH,YAAY,GACb,MAAM,SAAS,CAAC;AAMjB;;GAEG;AACH,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,KAAK,EACL,SAAS,GACV,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,OAAO,EACL,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,4BAA4B,EAC5B,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,OAAO,EACL,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,gCAAgC,CAAC;AAExC;;;;;;;GAOG;AACH,YAAY;AACV;;;;;GAKG;AACH,cAAc;AAEd;;;;;;GAMG;AACH,aAAa;AAEb;;;;;;GAMG;AACH,MAAM;AAEN;;;;;GAKG;AACH,WAAW;AAEX;;;;;GAKG;AACH,QAAQ;AAER;;;;;GAKG;AACH,YAAY,GACb,MAAM,SAAS,CAAC;AAMjB;;GAEG;AACH,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,KAAK,EACL,SAAS,GACV,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,OAAO,EACL,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,4BAA4B,EAC5B,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,OAAO,EACL,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,SAAS,EACT,cAAc,GACf,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,iCAAiC,CAAC"}
@@ -265,4 +265,5 @@ export interface AudioSpeechAttributes {
265
265
  audio_size_bytes?: number;
266
266
  }
267
267
  export type AudioAttributes = AudioTranscriptionAttributes | AudioSpeechAttributes;
268
+ export * from "./tool-metering.js";
268
269
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export interface ToolContext {
2
+ agent?: string;
3
+ organizationName?: string;
4
+ productName?: string;
5
+ subscriberCredential?: string;
6
+ workflowId?: string;
7
+ traceId?: string;
8
+ transactionId?: string;
9
+ }
10
+ export interface ToolMetadata extends ToolContext {
11
+ operation?: string;
12
+ outputFields?: string[];
13
+ usageMetadata?: Record<string, unknown>;
14
+ }
15
+ export interface ToolEventPayload {
16
+ transactionId: string;
17
+ toolId: string;
18
+ operation?: string;
19
+ durationMs: number;
20
+ success: boolean;
21
+ timestamp: string;
22
+ errorMessage?: string;
23
+ usageMetadata?: Record<string, unknown>;
24
+ agent?: string;
25
+ organizationName?: string;
26
+ productName?: string;
27
+ subscriberCredential?: string;
28
+ workflowId?: string;
29
+ traceId?: string;
30
+ middlewareSource: string;
31
+ }
32
+ export interface ToolCallReport {
33
+ operation?: string;
34
+ durationMs: number;
35
+ success: boolean;
36
+ errorMessage?: string;
37
+ usageMetadata?: Record<string, unknown>;
38
+ agent?: string;
39
+ organizationName?: string;
40
+ productName?: string;
41
+ subscriberCredential?: string;
42
+ workflowId?: string;
43
+ traceId?: string;
44
+ transactionId?: string;
45
+ timestamp?: string;
46
+ }
47
+ //# sourceMappingURL=tool-metering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-metering.d.ts","sourceRoot":"","sources":["../../../src/types/tool-metering.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revenium/openai",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "Transparent TypeScript middleware for automatic Revenium usage tracking with OpenAI",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -25,6 +25,13 @@
25
25
  "dev": "tsc --watch",
26
26
  "clean": "node -e \"const fs = require('fs'); if (fs.existsSync('dist')) fs.rmSync('dist', {recursive: true, force: true})\"",
27
27
  "prepublishOnly": "npm run clean && npm run build",
28
+ "test": "jest",
29
+ "test:unit": "jest --testPathPatterns=tests/unit",
30
+ "test:integration": "jest --testPathPatterns=tests/integration --passWithNoTests",
31
+ "test:performance": "jest --testPathPatterns=tests/performance --passWithNoTests",
32
+ "test:watch": "jest --watch",
33
+ "test:coverage": "jest --coverage",
34
+ "test:e2e": "jest --testPathPatterns=tests/integration/trace-fields.test.ts",
28
35
  "example:getting-started": "npm run build && npx tsx examples/getting_started.ts",
29
36
  "example:openai-basic": "npm run build && npx tsx examples/openai/basic.ts",
30
37
  "example:openai-metadata": "npm run build && npx tsx examples/openai/metadata.ts",
@@ -59,9 +66,13 @@
59
66
  "url": "https://github.com/revenium/revenium-middleware-openai-node/issues"
60
67
  },
61
68
  "devDependencies": {
69
+ "@jest/globals": "^30.2.0",
70
+ "@types/jest": "^30.0.0",
62
71
  "@types/node": "^20.0.0",
63
72
  "dotenv": "^16.5.0",
73
+ "jest": "^30.2.0",
64
74
  "rimraf": "^6.0.1",
75
+ "ts-jest": "^29.4.6",
65
76
  "ts-node": "^10.9.2",
66
77
  "tsx": "^4.20.6",
67
78
  "typescript": "^5.0.0"