@revenium/openai 1.0.16 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +159 -18
  3. package/dist/cjs/core/config/loader.js +27 -1
  4. package/dist/cjs/core/config/loader.js.map +1 -1
  5. package/dist/cjs/core/middleware/interfaces.js +70 -32
  6. package/dist/cjs/core/middleware/interfaces.js.map +1 -1
  7. package/dist/cjs/core/tracking/index.js +3 -1
  8. package/dist/cjs/core/tracking/index.js.map +1 -1
  9. package/dist/cjs/core/tracking/payload-builder.js +34 -5
  10. package/dist/cjs/core/tracking/payload-builder.js.map +1 -1
  11. package/dist/cjs/core/tracking/summary-printer.js +196 -0
  12. package/dist/cjs/core/tracking/summary-printer.js.map +1 -0
  13. package/dist/cjs/core/tracking/usage-tracker.js +37 -5
  14. package/dist/cjs/core/tracking/usage-tracker.js.map +1 -1
  15. package/dist/cjs/types/index.js.map +1 -1
  16. package/dist/cjs/utils/metadata-builder.js +21 -9
  17. package/dist/cjs/utils/metadata-builder.js.map +1 -1
  18. package/dist/cjs/utils/prompt-extraction.js +231 -0
  19. package/dist/cjs/utils/prompt-extraction.js.map +1 -0
  20. package/dist/esm/core/config/loader.js +27 -1
  21. package/dist/esm/core/config/loader.js.map +1 -1
  22. package/dist/esm/core/middleware/interfaces.js +70 -32
  23. package/dist/esm/core/middleware/interfaces.js.map +1 -1
  24. package/dist/esm/core/tracking/index.js +1 -0
  25. package/dist/esm/core/tracking/index.js.map +1 -1
  26. package/dist/esm/core/tracking/payload-builder.js +34 -5
  27. package/dist/esm/core/tracking/payload-builder.js.map +1 -1
  28. package/dist/esm/core/tracking/summary-printer.js +193 -0
  29. package/dist/esm/core/tracking/summary-printer.js.map +1 -0
  30. package/dist/esm/core/tracking/usage-tracker.js +37 -5
  31. package/dist/esm/core/tracking/usage-tracker.js.map +1 -1
  32. package/dist/esm/types/index.js.map +1 -1
  33. package/dist/esm/utils/metadata-builder.js +21 -9
  34. package/dist/esm/utils/metadata-builder.js.map +1 -1
  35. package/dist/esm/utils/prompt-extraction.js +225 -0
  36. package/dist/esm/utils/prompt-extraction.js.map +1 -0
  37. package/dist/types/core/config/loader.d.ts.map +1 -1
  38. package/dist/types/core/middleware/interfaces.d.ts +4 -1
  39. package/dist/types/core/middleware/interfaces.d.ts.map +1 -1
  40. package/dist/types/core/tracking/index.d.ts +1 -0
  41. package/dist/types/core/tracking/index.d.ts.map +1 -1
  42. package/dist/types/core/tracking/payload-builder.d.ts.map +1 -1
  43. package/dist/types/core/tracking/summary-printer.d.ts +9 -0
  44. package/dist/types/core/tracking/summary-printer.d.ts.map +1 -0
  45. package/dist/types/core/tracking/usage-tracker.d.ts +2 -0
  46. package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -1
  47. package/dist/types/types/index.d.ts +39 -4
  48. package/dist/types/types/index.d.ts.map +1 -1
  49. package/dist/types/utils/metadata-builder.d.ts +3 -0
  50. package/dist/types/utils/metadata-builder.d.ts.map +1 -1
  51. package/dist/types/utils/prompt-extraction.d.ts +29 -0
  52. package/dist/types/utils/prompt-extraction.d.ts.map +1 -0
  53. package/examples/README.md +2 -2
  54. package/examples/azure/basic.ts +3 -3
  55. package/examples/azure/responses-basic.ts +4 -4
  56. package/examples/azure/responses-stream.ts +4 -4
  57. package/examples/azure/stream.ts +3 -3
  58. package/examples/getting_started.ts +2 -2
  59. package/examples/openai/basic.ts +3 -3
  60. package/examples/openai/metadata.ts +4 -4
  61. package/examples/openai/prompt-capture.ts +95 -0
  62. package/examples/openai/responses-basic.ts +4 -4
  63. package/examples/openai/responses-embed.ts +3 -3
  64. package/examples/openai/responses-streaming.ts +4 -4
  65. package/examples/openai/streaming.ts +3 -3
  66. package/package.json +1 -1
@@ -15,11 +15,11 @@ async function main() {
15
15
  // Optional metadata for advanced reporting, lineage tracking, and cost allocation
16
16
  const metadata: UsageMetadata = {
17
17
  // Organization & billing
18
- organizationId: "org-metadata-demo",
18
+ organizationName: "org-metadata-demo",
19
19
  subscriptionId: "plan-premium-2025",
20
20
 
21
21
  // Product & task tracking
22
- productId: "ai-assistant",
22
+ productName: "ai-assistant",
23
23
  taskType: "explanation-request",
24
24
  agent: "openai-metadata-chat-node",
25
25
 
@@ -27,7 +27,7 @@ async function main() {
27
27
  traceId: "session-" + Date.now(),
28
28
 
29
29
  // Quality metrics
30
- responseQualityScore: 0.95, // 0.0-1.0 scale
30
+ responseQualityScore: 0.95,
31
31
 
32
32
  // User tracking
33
33
  subscriber: {
@@ -54,7 +54,7 @@ async function main() {
54
54
  ],
55
55
  max_tokens: 1000,
56
56
  },
57
- metadata
57
+ metadata,
58
58
  );
59
59
 
60
60
  // Display response
@@ -0,0 +1,95 @@
1
+ import OpenAI from "openai";
2
+ import { configure } from "../../src/index.js";
3
+
4
+ async function main() {
5
+ console.log("=== OpenAI Prompt Capture Example ===\n");
6
+
7
+ configure({
8
+ reveniumApiKey: process.env.REVENIUM_METERING_API_KEY || "test-key",
9
+ reveniumBaseUrl: process.env.REVENIUM_METERING_BASE_URL,
10
+ capturePrompts: true,
11
+ });
12
+
13
+ const openai = new OpenAI({
14
+ apiKey: process.env.OPENAI_API_KEY,
15
+ });
16
+
17
+ console.log("Example 1: Prompt capture enabled via config");
18
+ console.log("Making request with prompt capture enabled...\n");
19
+
20
+ try {
21
+ const response = await openai.chat.completions.create({
22
+ model: "gpt-4o-mini",
23
+ max_tokens: 100,
24
+ messages: [
25
+ {
26
+ role: "system",
27
+ content: "You are a helpful assistant that provides concise answers.",
28
+ },
29
+ {
30
+ role: "user",
31
+ content: "What is the capital of France?",
32
+ },
33
+ ],
34
+ usageMetadata: {
35
+ organizationName: "org-prompt-capture-demo",
36
+ productName: "prod-openai-prompt-capture",
37
+ },
38
+ });
39
+
40
+ console.log("Response:", response.choices[0]?.message?.content);
41
+ console.log("\nPrompts captured and sent to Revenium API!");
42
+ } catch (error) {
43
+ console.error(
44
+ "Error:",
45
+ error instanceof Error ? error.message : String(error),
46
+ );
47
+ }
48
+
49
+ console.log("\n" + "=".repeat(50) + "\n");
50
+ console.log("Example 2: Prompt capture disabled via metadata override");
51
+ console.log("Making request with prompt capture disabled...\n");
52
+
53
+ try {
54
+ const response2 = await openai.chat.completions.create({
55
+ model: "gpt-4o-mini",
56
+ max_tokens: 100,
57
+ messages: [
58
+ {
59
+ role: "system",
60
+ content: "You are a helpful assistant.",
61
+ },
62
+ {
63
+ role: "user",
64
+ content: "What is 2+2?",
65
+ },
66
+ ],
67
+ usageMetadata: {
68
+ organizationName: "org-prompt-capture-demo",
69
+ productName: "prod-openai-prompt-capture",
70
+ capturePrompts: false,
71
+ },
72
+ });
73
+
74
+ console.log("Response:", response2.choices[0]?.message?.content);
75
+ console.log("\nPrompts NOT captured (overridden via metadata)!");
76
+ } catch (error) {
77
+ console.error(
78
+ "Error:",
79
+ error instanceof Error ? error.message : String(error),
80
+ );
81
+ }
82
+
83
+ console.log("\n" + "=".repeat(50) + "\n");
84
+ console.log("Example 3: Prompt capture with environment variable");
85
+ console.log("Set REVENIUM_CAPTURE_PROMPTS=true in your .env file\n");
86
+
87
+ console.log("Prompt capture examples completed!");
88
+ console.log("\nConfiguration hierarchy:");
89
+ console.log("1. Per-call metadata (highest priority)");
90
+ console.log("2. Global config");
91
+ console.log("3. Environment variable REVENIUM_CAPTURE_PROMPTS");
92
+ console.log("4. Default: false (lowest priority)");
93
+ }
94
+
95
+ main().catch(console.error);
@@ -17,8 +17,8 @@ async function main() {
17
17
 
18
18
  // Create with metadata
19
19
  const metadata: UsageMetadata = {
20
- organizationId: "org-responses-basic-demo",
21
- productId: "prod-openai-responses-basic",
20
+ organizationName: "org-responses-basic-demo",
21
+ productName: "prod-openai-responses-basic",
22
22
  };
23
23
 
24
24
  try {
@@ -27,7 +27,7 @@ async function main() {
27
27
  model: "gpt-4",
28
28
  input: "What is the capital of France?",
29
29
  },
30
- metadata
30
+ metadata,
31
31
  );
32
32
 
33
33
  // Display response
@@ -36,7 +36,7 @@ async function main() {
36
36
  } catch (error) {
37
37
  console.error("Error:", (error as Error).message);
38
38
  console.log(
39
- "\nNote: Responses API is experimental and may not be available in all OpenAI SDK versions"
39
+ "\nNote: Responses API is experimental and may not be available in all OpenAI SDK versions",
40
40
  );
41
41
  }
42
42
  }
@@ -13,8 +13,8 @@ async function main() {
13
13
 
14
14
  // Create with metadata
15
15
  const metadata: UsageMetadata = {
16
- organizationId: "org-responses-embed-demo",
17
- productId: "prod-openai-responses-embed",
16
+ organizationName: "org-responses-embed-demo",
17
+ productName: "prod-openai-responses-embed",
18
18
  };
19
19
 
20
20
  const embedding = await client.embeddings().create(
@@ -22,7 +22,7 @@ async function main() {
22
22
  model: "text-embedding-3-small",
23
23
  input: "Hello world",
24
24
  },
25
- metadata
25
+ metadata,
26
26
  );
27
27
 
28
28
  console.log("Model:", embedding.model);
@@ -18,8 +18,8 @@ async function main() {
18
18
 
19
19
  // Create a metadata
20
20
  const metadata: UsageMetadata = {
21
- organizationId: "org-responses-streaming-demo",
22
- productId: "prod-openai-responses",
21
+ organizationName: "org-responses-streaming-demo",
22
+ productName: "prod-openai-responses",
23
23
  taskType: "creative-writing",
24
24
  };
25
25
 
@@ -31,7 +31,7 @@ async function main() {
31
31
  input: "Write a short poem about the ocean.",
32
32
  stream: true as const,
33
33
  },
34
- metadata
34
+ metadata,
35
35
  );
36
36
 
37
37
  // Process the stream
@@ -55,7 +55,7 @@ async function main() {
55
55
  console.error("Error:", (error as Error).message);
56
56
  console.error("Stack:", (error as Error).stack);
57
57
  console.log(
58
- "\nNote: Responses API is experimental and may not be available in all OpenAI SDK versions"
58
+ "\nNote: Responses API is experimental and may not be available in all OpenAI SDK versions",
59
59
  );
60
60
  }
61
61
  }
@@ -15,8 +15,8 @@ async function main() {
15
15
 
16
16
  // Create a metadata
17
17
  const metadata: UsageMetadata = {
18
- organizationId: "org-streaming-demo",
19
- productId: "prod-openai-streaming",
18
+ organizationName: "org-streaming-demo",
19
+ productName: "prod-openai-streaming",
20
20
  taskType: "creative-writing",
21
21
  agent: "story-generator",
22
22
  };
@@ -41,7 +41,7 @@ async function main() {
41
41
  max_tokens: 1000,
42
42
  stream: true as const,
43
43
  },
44
- metadata
44
+ metadata,
45
45
  );
46
46
 
47
47
  // Process the stream
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revenium/openai",
3
- "version": "1.0.16",
3
+ "version": "1.1.1",
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",