@revenium/openai 1.0.13 → 1.0.14

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 (228) hide show
  1. package/.env.example +10 -15
  2. package/CHANGELOG.md +44 -11
  3. package/CODE_OF_CONDUCT.md +57 -0
  4. package/CONTRIBUTING.md +38 -0
  5. package/README.md +104 -216
  6. package/SECURITY.md +34 -0
  7. package/dist/cjs/core/client/index.js +14 -0
  8. package/dist/cjs/core/client/index.js.map +1 -0
  9. package/dist/cjs/core/client/manager.js +109 -0
  10. package/dist/cjs/core/client/manager.js.map +1 -0
  11. package/dist/cjs/core/config/azure-config.js +5 -17
  12. package/dist/cjs/core/config/azure-config.js.map +1 -1
  13. package/dist/cjs/core/config/index.js +2 -2
  14. package/dist/cjs/core/config/index.js.map +1 -1
  15. package/dist/cjs/core/config/loader.js +34 -14
  16. package/dist/cjs/core/config/loader.js.map +1 -1
  17. package/dist/cjs/core/config/manager.js +11 -5
  18. package/dist/cjs/core/config/manager.js.map +1 -1
  19. package/dist/cjs/core/config/validator.js +3 -45
  20. package/dist/cjs/core/config/validator.js.map +1 -1
  21. package/dist/cjs/core/middleware/index.js +17 -0
  22. package/dist/cjs/core/middleware/index.js.map +1 -0
  23. package/dist/cjs/core/middleware/interfaces.js +361 -0
  24. package/dist/cjs/core/middleware/interfaces.js.map +1 -0
  25. package/dist/cjs/core/middleware/revenium-client.js +142 -0
  26. package/dist/cjs/core/middleware/revenium-client.js.map +1 -0
  27. package/dist/cjs/core/providers/detector.js +45 -23
  28. package/dist/cjs/core/providers/detector.js.map +1 -1
  29. package/dist/cjs/core/providers/index.js +2 -1
  30. package/dist/cjs/core/providers/index.js.map +1 -1
  31. package/dist/cjs/core/tracking/api-client.js +14 -13
  32. package/dist/cjs/core/tracking/api-client.js.map +1 -1
  33. package/dist/cjs/core/tracking/payload-builder.js +15 -25
  34. package/dist/cjs/core/tracking/payload-builder.js.map +1 -1
  35. package/dist/cjs/core/tracking/usage-tracker.js +22 -18
  36. package/dist/cjs/core/tracking/usage-tracker.js.map +1 -1
  37. package/dist/cjs/index.js +26 -195
  38. package/dist/cjs/index.js.map +1 -1
  39. package/dist/cjs/types/index.js +0 -8
  40. package/dist/cjs/types/index.js.map +1 -1
  41. package/dist/cjs/types/openai-augmentation.js +0 -49
  42. package/dist/cjs/types/openai-augmentation.js.map +1 -1
  43. package/dist/cjs/utils/constants.js +17 -20
  44. package/dist/cjs/utils/constants.js.map +1 -1
  45. package/dist/cjs/utils/error-handler.js +18 -14
  46. package/dist/cjs/utils/error-handler.js.map +1 -1
  47. package/dist/cjs/utils/metadata-builder.js +17 -16
  48. package/dist/cjs/utils/metadata-builder.js.map +1 -1
  49. package/dist/cjs/utils/provider-detection.js +25 -28
  50. package/dist/cjs/utils/provider-detection.js.map +1 -1
  51. package/dist/esm/core/client/index.js +6 -0
  52. package/dist/esm/core/client/index.js.map +1 -0
  53. package/dist/esm/core/client/manager.js +102 -0
  54. package/dist/esm/core/client/manager.js.map +1 -0
  55. package/dist/esm/core/config/azure-config.js +6 -18
  56. package/dist/esm/core/config/azure-config.js.map +1 -1
  57. package/dist/esm/core/config/index.js +5 -4
  58. package/dist/esm/core/config/index.js.map +1 -1
  59. package/dist/esm/core/config/loader.js +33 -13
  60. package/dist/esm/core/config/loader.js.map +1 -1
  61. package/dist/esm/core/config/manager.js +13 -7
  62. package/dist/esm/core/config/manager.js.map +1 -1
  63. package/dist/esm/core/config/validator.js +3 -44
  64. package/dist/esm/core/config/validator.js.map +1 -1
  65. package/dist/esm/core/middleware/index.js +8 -0
  66. package/dist/esm/core/middleware/index.js.map +1 -0
  67. package/dist/esm/core/middleware/interfaces.js +353 -0
  68. package/dist/esm/core/middleware/interfaces.js.map +1 -0
  69. package/dist/esm/core/middleware/revenium-client.js +105 -0
  70. package/dist/esm/core/middleware/revenium-client.js.map +1 -0
  71. package/dist/esm/core/providers/detector.js +43 -22
  72. package/dist/esm/core/providers/detector.js.map +1 -1
  73. package/dist/esm/core/providers/index.js +2 -2
  74. package/dist/esm/core/providers/index.js.map +1 -1
  75. package/dist/esm/core/tracking/api-client.js +13 -12
  76. package/dist/esm/core/tracking/api-client.js.map +1 -1
  77. package/dist/esm/core/tracking/payload-builder.js +16 -26
  78. package/dist/esm/core/tracking/payload-builder.js.map +1 -1
  79. package/dist/esm/core/tracking/usage-tracker.js +24 -20
  80. package/dist/esm/core/tracking/usage-tracker.js.map +1 -1
  81. package/dist/esm/index.js +9 -177
  82. package/dist/esm/index.js.map +1 -1
  83. package/dist/esm/types/index.js +2 -10
  84. package/dist/esm/types/index.js.map +1 -1
  85. package/dist/esm/types/openai-augmentation.js +0 -49
  86. package/dist/esm/types/openai-augmentation.js.map +1 -1
  87. package/dist/esm/utils/constants.js +16 -19
  88. package/dist/esm/utils/constants.js.map +1 -1
  89. package/dist/esm/utils/error-handler.js +19 -15
  90. package/dist/esm/utils/error-handler.js.map +1 -1
  91. package/dist/esm/utils/metadata-builder.js +17 -16
  92. package/dist/esm/utils/metadata-builder.js.map +1 -1
  93. package/dist/esm/utils/provider-detection.js +26 -29
  94. package/dist/esm/utils/provider-detection.js.map +1 -1
  95. package/dist/types/core/client/index.d.ts +6 -0
  96. package/dist/types/core/client/index.d.ts.map +1 -0
  97. package/dist/types/core/client/manager.d.ts +32 -0
  98. package/dist/types/core/client/manager.d.ts.map +1 -0
  99. package/dist/types/core/config/azure-config.d.ts +2 -2
  100. package/dist/types/core/config/azure-config.d.ts.map +1 -1
  101. package/dist/types/core/config/index.d.ts +4 -4
  102. package/dist/types/core/config/index.d.ts.map +1 -1
  103. package/dist/types/core/config/loader.d.ts +3 -1
  104. package/dist/types/core/config/loader.d.ts.map +1 -1
  105. package/dist/types/core/config/manager.d.ts +1 -1
  106. package/dist/types/core/config/manager.d.ts.map +1 -1
  107. package/dist/types/core/config/validator.d.ts +1 -12
  108. package/dist/types/core/config/validator.d.ts.map +1 -1
  109. package/dist/types/core/middleware/index.d.ts +8 -0
  110. package/dist/types/core/middleware/index.d.ts.map +1 -0
  111. package/dist/types/core/middleware/interfaces.d.ts +74 -0
  112. package/dist/types/core/middleware/interfaces.d.ts.map +1 -0
  113. package/dist/types/core/middleware/revenium-client.d.ts +58 -0
  114. package/dist/types/core/middleware/revenium-client.d.ts.map +1 -0
  115. package/dist/types/core/providers/detector.d.ts +9 -2
  116. package/dist/types/core/providers/detector.d.ts.map +1 -1
  117. package/dist/types/core/providers/index.d.ts +2 -2
  118. package/dist/types/core/providers/index.d.ts.map +1 -1
  119. package/dist/types/core/tracking/api-client.d.ts +1 -1
  120. package/dist/types/core/tracking/api-client.d.ts.map +1 -1
  121. package/dist/types/core/tracking/payload-builder.d.ts +3 -3
  122. package/dist/types/core/tracking/payload-builder.d.ts.map +1 -1
  123. package/dist/types/core/tracking/usage-tracker.d.ts +2 -2
  124. package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -1
  125. package/dist/types/index.d.ts +11 -135
  126. package/dist/types/index.d.ts.map +1 -1
  127. package/dist/types/types/function-parameters.d.ts +2 -23
  128. package/dist/types/types/function-parameters.d.ts.map +1 -1
  129. package/dist/types/types/index.d.ts +11 -105
  130. package/dist/types/types/index.d.ts.map +1 -1
  131. package/dist/types/types/openai-augmentation.d.ts +4 -138
  132. package/dist/types/types/openai-augmentation.d.ts.map +1 -1
  133. package/dist/types/utils/constants.d.ts +7 -1
  134. package/dist/types/utils/constants.d.ts.map +1 -1
  135. package/dist/types/utils/error-handler.d.ts +2 -2
  136. package/dist/types/utils/error-handler.d.ts.map +1 -1
  137. package/dist/types/utils/metadata-builder.d.ts +2 -2
  138. package/dist/types/utils/metadata-builder.d.ts.map +1 -1
  139. package/dist/types/utils/provider-detection.d.ts +3 -3
  140. package/dist/types/utils/provider-detection.d.ts.map +1 -1
  141. package/examples/README.md +282 -198
  142. package/examples/azure/basic.ts +62 -0
  143. package/examples/azure/responses-basic.ts +45 -0
  144. package/examples/azure/responses-stream.ts +61 -0
  145. package/examples/azure/stream.ts +56 -0
  146. package/examples/getting_started.ts +31 -43
  147. package/examples/openai/basic.ts +45 -0
  148. package/examples/openai/metadata.ts +67 -0
  149. package/examples/openai/responses-basic.ts +44 -0
  150. package/examples/openai/responses-embed.ts +34 -0
  151. package/examples/openai/responses-streaming.ts +63 -0
  152. package/examples/openai/streaming.ts +59 -0
  153. package/package.json +20 -13
  154. package/dist/cjs/core/wrapper/index.js +0 -15
  155. package/dist/cjs/core/wrapper/index.js.map +0 -1
  156. package/dist/cjs/core/wrapper/instance-patcher.js +0 -202
  157. package/dist/cjs/core/wrapper/instance-patcher.js.map +0 -1
  158. package/dist/cjs/core/wrapper/request-handler.js +0 -317
  159. package/dist/cjs/core/wrapper/request-handler.js.map +0 -1
  160. package/dist/cjs/core/wrapper/stream-wrapper.js +0 -82
  161. package/dist/cjs/core/wrapper/stream-wrapper.js.map +0 -1
  162. package/dist/cjs/utils/azure-model-resolver.js +0 -211
  163. package/dist/cjs/utils/azure-model-resolver.js.map +0 -1
  164. package/dist/cjs/utils/request-handler-factory.js +0 -185
  165. package/dist/cjs/utils/request-handler-factory.js.map +0 -1
  166. package/dist/esm/core/wrapper/index.js +0 -9
  167. package/dist/esm/core/wrapper/index.js.map +0 -1
  168. package/dist/esm/core/wrapper/instance-patcher.js +0 -199
  169. package/dist/esm/core/wrapper/instance-patcher.js.map +0 -1
  170. package/dist/esm/core/wrapper/request-handler.js +0 -310
  171. package/dist/esm/core/wrapper/request-handler.js.map +0 -1
  172. package/dist/esm/core/wrapper/stream-wrapper.js +0 -79
  173. package/dist/esm/core/wrapper/stream-wrapper.js.map +0 -1
  174. package/dist/esm/utils/azure-model-resolver.js +0 -204
  175. package/dist/esm/utils/azure-model-resolver.js.map +0 -1
  176. package/dist/esm/utils/request-handler-factory.js +0 -146
  177. package/dist/esm/utils/request-handler-factory.js.map +0 -1
  178. package/dist/types/core/wrapper/index.d.ts +0 -8
  179. package/dist/types/core/wrapper/index.d.ts.map +0 -1
  180. package/dist/types/core/wrapper/instance-patcher.d.ts +0 -33
  181. package/dist/types/core/wrapper/instance-patcher.d.ts.map +0 -1
  182. package/dist/types/core/wrapper/request-handler.d.ts +0 -29
  183. package/dist/types/core/wrapper/request-handler.d.ts.map +0 -1
  184. package/dist/types/core/wrapper/stream-wrapper.d.ts +0 -13
  185. package/dist/types/core/wrapper/stream-wrapper.d.ts.map +0 -1
  186. package/dist/types/utils/azure-model-resolver.d.ts +0 -41
  187. package/dist/types/utils/azure-model-resolver.d.ts.map +0 -1
  188. package/dist/types/utils/request-handler-factory.d.ts +0 -81
  189. package/dist/types/utils/request-handler-factory.d.ts.map +0 -1
  190. package/examples/azure-basic.ts +0 -206
  191. package/examples/azure-responses-basic.ts +0 -233
  192. package/examples/azure-responses-streaming.ts +0 -255
  193. package/examples/azure-streaming.ts +0 -209
  194. package/examples/openai-basic.ts +0 -147
  195. package/examples/openai-function-calling.ts +0 -259
  196. package/examples/openai-responses-basic.ts +0 -212
  197. package/examples/openai-responses-streaming.ts +0 -232
  198. package/examples/openai-streaming.ts +0 -172
  199. package/examples/openai-vision.ts +0 -289
  200. package/src/core/config/azure-config.ts +0 -72
  201. package/src/core/config/index.ts +0 -23
  202. package/src/core/config/loader.ts +0 -66
  203. package/src/core/config/manager.ts +0 -95
  204. package/src/core/config/validator.ts +0 -89
  205. package/src/core/providers/detector.ts +0 -159
  206. package/src/core/providers/index.ts +0 -16
  207. package/src/core/tracking/api-client.ts +0 -78
  208. package/src/core/tracking/index.ts +0 -21
  209. package/src/core/tracking/payload-builder.ts +0 -137
  210. package/src/core/tracking/usage-tracker.ts +0 -189
  211. package/src/core/wrapper/index.ts +0 -9
  212. package/src/core/wrapper/instance-patcher.ts +0 -288
  213. package/src/core/wrapper/request-handler.ts +0 -423
  214. package/src/core/wrapper/stream-wrapper.ts +0 -100
  215. package/src/index.ts +0 -360
  216. package/src/types/function-parameters.ts +0 -251
  217. package/src/types/index.ts +0 -310
  218. package/src/types/openai-augmentation.ts +0 -232
  219. package/src/types/responses-api.ts +0 -308
  220. package/src/utils/azure-model-resolver.ts +0 -220
  221. package/src/utils/constants.ts +0 -21
  222. package/src/utils/error-handler.ts +0 -251
  223. package/src/utils/metadata-builder.ts +0 -228
  224. package/src/utils/provider-detection.ts +0 -257
  225. package/src/utils/request-handler-factory.ts +0 -285
  226. package/src/utils/stop-reason-mapper.ts +0 -78
  227. package/src/utils/type-guards.ts +0 -202
  228. package/src/utils/url-builder.ts +0 -68
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Azure Responses API Basic Example
3
+ *
4
+ * Demonstrates usage of the OpenAI Responses API with Azure OpenAI (stateful API).
5
+ * The Responses API is experimental and may not be available in all SDK versions.
6
+ *
7
+ * Reference: https://platform.openai.com/docs/api-reference/responses
8
+ */
9
+
10
+ import { Initialize, GetClient, UsageMetadata } from "@revenium/openai";
11
+
12
+ async function main() {
13
+ // Initialize middleware
14
+ Initialize();
15
+
16
+ // Get client
17
+ const client = GetClient();
18
+
19
+ // Create a metadata
20
+ const metadata: UsageMetadata = {
21
+ organizationId: "org-azure-responses",
22
+ productId: "prod-azure-responses",
23
+ };
24
+
25
+ try {
26
+ const response = await client.responses().create(
27
+ {
28
+ model: "gpt-5-mini-2", // Your Azure deployment name
29
+ input: "What is the capital of France?",
30
+ },
31
+ metadata
32
+ );
33
+
34
+ // Display response
35
+ console.log("Assistant:", response.output_text);
36
+ console.log("\nUsage data sent to Revenium! Check your dashboard");
37
+ } catch (error) {
38
+ console.error("Error:", (error as Error).message);
39
+ console.log(
40
+ "\nNote: Responses API is experimental and may not be available in all OpenAI SDK versions"
41
+ );
42
+ }
43
+ }
44
+
45
+ main().catch(console.error);
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Azure Responses API Streaming Example
3
+ *
4
+ * Demonstrates streaming usage of the OpenAI Responses API with Azure OpenAI (stateful API).
5
+ * The Responses API is experimental and may not be available in all SDK versions.
6
+ *
7
+ * Reference: https://platform.openai.com/docs/api-reference/responses
8
+ */
9
+
10
+ import { Initialize, GetClient, UsageMetadata } from "@revenium/openai";
11
+
12
+ async function main() {
13
+ // Initialize middleware
14
+ Initialize();
15
+
16
+ // Get client
17
+ const client = GetClient();
18
+
19
+ // Create a metadata
20
+ const metadata: UsageMetadata = {
21
+ organizationId: "org-azure-responses-streaming-demo",
22
+ productId: "prod-azure-responses",
23
+ taskType: "creative-writing",
24
+ };
25
+
26
+ try {
27
+ const wrapper = await client.responses().createStreaming(
28
+ {
29
+ // Create a streaming response using the Responses API
30
+ model: "gpt-5-mini-2", // Your Azure deployment name
31
+ input: "Write a short poem about the ocean.",
32
+ stream: true as const,
33
+ },
34
+ metadata
35
+ );
36
+
37
+ // Process the stream
38
+ process.stdout.write("Assistant: ");
39
+ let hasContent = false;
40
+ for await (const chunk of wrapper) {
41
+ // Responses API streaming uses ResponseTextDeltaEvent
42
+ if (chunk.type === "response.output_text.delta" && chunk.delta) {
43
+ hasContent = true;
44
+ process.stdout.write(chunk.delta);
45
+ }
46
+ }
47
+ if (!hasContent) {
48
+ console.log("(no content received)");
49
+ }
50
+
51
+ console.log("\n");
52
+ console.log("\nUsage data sent to Revenium! Check your dashboard");
53
+ } catch (error) {
54
+ console.error("Error:", (error as Error).message);
55
+ console.log(
56
+ "\nNote: Responses API is experimental and may not be available in all OpenAI SDK versions"
57
+ );
58
+ }
59
+ }
60
+
61
+ main().catch(console.error);
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Azure Streaming Example
3
+ * Demonstrates streaming chat completions with Azure OpenAI and Revenium tracking.
4
+ */
5
+
6
+ import { Initialize, GetClient, UsageMetadata } from "@revenium/openai";
7
+
8
+ async function main() {
9
+ // Initialize middleware
10
+ Initialize();
11
+
12
+ // Get client
13
+ const client = GetClient();
14
+
15
+ // Create a metadata
16
+ const metadata: UsageMetadata = {
17
+ organizationId: "org-azure-streaming",
18
+ productId: "prod-azure-integration",
19
+ taskType: "creative-writing",
20
+ agent: "azure-poet",
21
+ };
22
+ const wrapper = await client
23
+ .chat()
24
+ .completions()
25
+ .createStreaming(
26
+ {
27
+ model: "gpt-5-mini-2", // Your Azure deployment name
28
+ messages: [
29
+ {
30
+ role: "system" as const,
31
+ content: "You are a creative poet.",
32
+ },
33
+ {
34
+ role: "user" as const,
35
+ content:
36
+ "Write a short poem about artificial intelligence and its impact on humanity.",
37
+ },
38
+ ],
39
+ max_completion_tokens: 2000,
40
+ stream: true as const,
41
+ },
42
+ metadata
43
+ );
44
+
45
+ // Process the stream
46
+ process.stdout.write("Assistant: ");
47
+ for await (const chunk of wrapper) {
48
+ if (chunk.choices.length > 0 && chunk.choices[0].delta.content) {
49
+ process.stdout.write(chunk.choices[0].delta.content);
50
+ }
51
+ }
52
+ console.log("\n");
53
+ console.log("\nUsage data sent to Revenium! Check your dashboard");
54
+ }
55
+
56
+ main().catch(console.error);
@@ -1,54 +1,42 @@
1
- import 'dotenv/config';
2
- import { initializeReveniumFromEnv, patchOpenAIInstance } from '@revenium/openai';
3
- import OpenAI from 'openai';
1
+ /**
2
+ * Getting Started Example
3
+ *
4
+ * This is the simplest way to get started with Revenium OpenAI middleware.
5
+ * Just initialize and start making requests!
6
+ * Note: .env files are loaded automatically by the middleware.
7
+ */
8
+
9
+ import { Initialize, GetClient } from "@revenium/openai";
4
10
 
5
11
  async function main() {
6
- const initResult = initializeReveniumFromEnv();
7
- if (!initResult.success) {
8
- console.error('Failed to initialize Revenium:', initResult.message);
9
- process.exit(1);
10
- }
12
+ // Initialize middleware
13
+ Initialize();
11
14
 
12
- const openai = patchOpenAIInstance(new OpenAI());
15
+ // Get client
16
+ const client = GetClient();
13
17
 
14
- const response = await openai.chat.completions.create({
15
- model: 'gpt-4o-mini',
16
- messages: [
17
- { role: 'system', content: 'You are a helpful assistant.' },
18
- { role: 'user', content: 'Please verify you are ready to assist me.' }
19
- ],
18
+ // Create metadata
19
+ const metadata = {
20
+ organizationId: "org-getting-started-demo",
21
+ productId: "prod-getting-started",
22
+ };
20
23
 
21
- /* Optional metadata for advanced reporting, lineage tracking, and cost allocation
22
- usageMetadata: {
23
- // User identification
24
- subscriber: {
25
- id: 'user-123',
26
- email: 'user@example.com',
27
- credential: {
28
- name: 'api-key-prod',
29
- value: 'key-abc-123'
30
- }
24
+ // Make request
25
+ const params = {
26
+ model: "gpt-4",
27
+ messages: [
28
+ {
29
+ role: "user" as const,
30
+ content: "Hello! Introduce yourself in one sentence.",
31
31
  },
32
+ ],
33
+ };
32
34
 
33
- // Organization & billing
34
- organizationId: 'my-customers-name',
35
- subscriptionId: 'plan-enterprise-2024',
36
-
37
- // Product & task tracking
38
- productId: 'my-product',
39
- taskType: 'doc-summary',
40
- agent: 'customer-support',
41
-
42
- // Session tracking
43
- traceId: 'session-' + Date.now(),
44
-
45
- // Quality metrics
46
- responseQualityScore: 0.95 // 0.0-1.0 scale
47
- }
48
- */
49
- });
35
+ const response = await client.chat().completions().create(params, metadata);
50
36
 
51
- console.log('Response:', response.choices[0]?.message?.content);
37
+ // Display response
38
+ console.log(response.choices[0].message.content);
39
+ console.log("\nUsage data sent to Revenium!");
52
40
  }
53
41
 
54
42
  main().catch(console.error);
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Basic Example
3
+ * Demonstrates basic usage of Revenium OpenAI middleware.
4
+ */
5
+
6
+ import { Initialize, GetClient, UsageMetadata } from "@revenium/openai";
7
+
8
+ async function main() {
9
+ // Initialize middleware
10
+ Initialize();
11
+
12
+ // Get client
13
+ const client = GetClient();
14
+ const metadata: UsageMetadata = {
15
+ organizationId: "org-basic-demo",
16
+ productId: "prod-openai-basic",
17
+ };
18
+
19
+ // Create chat completion
20
+ const response = await client
21
+ .chat()
22
+ .completions()
23
+ .create(
24
+ {
25
+ model: "gpt-4",
26
+ messages: [
27
+ {
28
+ role: "user" as const,
29
+ content:
30
+ "Say hello in Spanish and explain why Spanish is a beautiful language in 2-3 sentences.",
31
+ },
32
+ ],
33
+ max_tokens: 1000,
34
+ },
35
+ metadata
36
+ );
37
+
38
+ // Display response
39
+ if (response.choices.length > 0) {
40
+ console.log(`Assistant: ${response.choices[0].message.content}`);
41
+ }
42
+ console.log("\nUsage data sent to Revenium! Check your dashboard");
43
+ }
44
+
45
+ main().catch(console.error);
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Metadata Example
3
+ * Demonstrates basic usage of Revenium OpenAI middleware.
4
+ */
5
+
6
+ import { Initialize, GetClient, UsageMetadata } from "@revenium/openai";
7
+
8
+ async function main() {
9
+ // Initialize middleware
10
+ Initialize();
11
+
12
+ // Get client
13
+ const client = GetClient();
14
+
15
+ // Optional metadata for advanced reporting, lineage tracking, and cost allocation
16
+ const metadata: UsageMetadata = {
17
+ // Organization & billing
18
+ organizationId: "org-metadata-demo",
19
+ subscriptionId: "plan-premium-2025",
20
+
21
+ // Product & task tracking
22
+ productId: "ai-assistant",
23
+ taskType: "explanation-request",
24
+ agent: "openai-metadata-chat-node",
25
+
26
+ // Session tracking
27
+ traceId: "session-" + Date.now(),
28
+
29
+ // Quality metrics
30
+ responseQualityScore: 0.95, // 0.0-1.0 scale
31
+
32
+ // User tracking
33
+ subscriber: {
34
+ id: "user-12345",
35
+ email: "developer@company.com",
36
+ credential: {
37
+ name: "api-key-prod",
38
+ value: "key-abc-123",
39
+ },
40
+ },
41
+ };
42
+ const response = await client
43
+ .chat()
44
+ .completions()
45
+ .create(
46
+ {
47
+ model: "gpt-4",
48
+ messages: [
49
+ {
50
+ role: "user" as const,
51
+ content:
52
+ "Say hello in Spanish and explain why Spanish is a beautiful language in 2-3 sentences.",
53
+ },
54
+ ],
55
+ max_tokens: 1000,
56
+ },
57
+ metadata
58
+ );
59
+
60
+ // Display response
61
+ if (response.choices.length > 0) {
62
+ console.log(`Assistant: ${response.choices[0].message.content}`);
63
+ }
64
+ console.log("\nUsage data sent to Revenium! Check your dashboard");
65
+ }
66
+
67
+ main().catch(console.error);
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Responses API + Basic Example
3
+ *
4
+ * Demonstrates usage of the OpenAI Responses API (stateful API).
5
+ * The Responses API is experimental and may not be available in all SDK versions.
6
+ * Reference: https://platform.openai.com/docs/api-reference/responses
7
+ */
8
+
9
+ import { Initialize, GetClient, UsageMetadata } from "@revenium/openai";
10
+
11
+ async function main() {
12
+ // Initialize middleware
13
+ Initialize();
14
+
15
+ // Get client
16
+ const client = GetClient();
17
+
18
+ // Create with metadata
19
+ const metadata: UsageMetadata = {
20
+ organizationId: "org-responses-basic-demo",
21
+ productId: "prod-openai-responses-basic",
22
+ };
23
+
24
+ try {
25
+ const response = await client.responses().create(
26
+ {
27
+ model: "gpt-4",
28
+ input: "What is the capital of France?",
29
+ },
30
+ metadata
31
+ );
32
+
33
+ // Display response
34
+ console.log("Assistant:", response.output_text);
35
+ console.log("\nUsage data sent to Revenium! Check your dashboard");
36
+ } catch (error) {
37
+ console.error("Error:", (error as Error).message);
38
+ console.log(
39
+ "\nNote: Responses API is experimental and may not be available in all OpenAI SDK versions"
40
+ );
41
+ }
42
+ }
43
+
44
+ main().catch(console.error);
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Responses API + Embeddings Example
3
+ * Demonstrates basic embeddings usage with Revenium OpenAI middleware.
4
+ */
5
+
6
+ import { Initialize, GetClient, UsageMetadata } from "@revenium/openai";
7
+ async function main() {
8
+ // Initialize middleware
9
+ Initialize();
10
+
11
+ // Get client
12
+ const client = GetClient();
13
+
14
+ // Create with metadata
15
+ const metadata: UsageMetadata = {
16
+ organizationId: "org-responses-embed-demo",
17
+ productId: "prod-openai-responses-embed",
18
+ };
19
+
20
+ const embedding = await client.embeddings().create(
21
+ {
22
+ model: "text-embedding-3-small",
23
+ input: "Hello world",
24
+ },
25
+ metadata
26
+ );
27
+
28
+ console.log("Model:", embedding.model);
29
+ console.log("Usage:", embedding.usage);
30
+ console.log("Embedding dimensions:", embedding.data[0]?.embedding.length);
31
+ console.log("\nUsage data sent to Revenium! Check your dashboard");
32
+ }
33
+
34
+ main().catch(console.error);
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Responses API + Streaming Example
3
+ *
4
+ * Demonstrates streaming usage of the OpenAI Responses API (stateful API).
5
+ * The Responses API is experimental and may not be available in all SDK versions.
6
+ *
7
+ * Reference: https://platform.openai.com/docs/api-reference/responses
8
+ */
9
+
10
+ import { Initialize, GetClient, UsageMetadata } from "@revenium/openai";
11
+
12
+ async function main() {
13
+ // Initialize middleware
14
+ Initialize();
15
+
16
+ // Get client
17
+ const client = GetClient();
18
+
19
+ // Create a metadata
20
+ const metadata: UsageMetadata = {
21
+ organizationId: "org-responses-streaming-demo",
22
+ productId: "prod-openai-responses",
23
+ taskType: "creative-writing",
24
+ };
25
+
26
+ try {
27
+ console.log("Creating streaming response with Responses API...");
28
+ const wrapper = await client.responses().createStreaming(
29
+ {
30
+ model: "gpt-4",
31
+ input: "Write a short poem about the ocean.",
32
+ stream: true as const,
33
+ },
34
+ metadata
35
+ );
36
+
37
+ // Process the stream
38
+ process.stdout.write("Assistant: ");
39
+ let hasContent = false;
40
+ for await (const chunk of wrapper) {
41
+ // Responses API streaming uses ResponseTextDeltaEvent
42
+ if (chunk.type === "response.output_text.delta" && chunk.delta) {
43
+ hasContent = true;
44
+ process.stdout.write(chunk.delta);
45
+ }
46
+ }
47
+
48
+ if (!hasContent) {
49
+ console.log("\nNo content received from stream");
50
+ }
51
+
52
+ console.log("\n");
53
+ console.log("\nUsage data sent to Revenium! Check your dashboard");
54
+ } catch (error) {
55
+ console.error("Error:", (error as Error).message);
56
+ console.error("Stack:", (error as Error).stack);
57
+ console.log(
58
+ "\nNote: Responses API is experimental and may not be available in all OpenAI SDK versions"
59
+ );
60
+ }
61
+ }
62
+
63
+ main().catch(console.error);
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Streaming Example
3
+ *
4
+ * Demonstrates streaming chat completions with Revenium tracking.
5
+ */
6
+
7
+ import { Initialize, GetClient, UsageMetadata } from "@revenium/openai";
8
+
9
+ async function main() {
10
+ // Initialize middleware
11
+ Initialize();
12
+
13
+ // Get client
14
+ const client = GetClient();
15
+
16
+ // Create a metadata
17
+ const metadata: UsageMetadata = {
18
+ organizationId: "org-streaming-demo",
19
+ productId: "prod-openai-streaming",
20
+ taskType: "creative-writing",
21
+ agent: "story-generator",
22
+ };
23
+
24
+ const wrapper = await client
25
+ .chat()
26
+ .completions()
27
+ .createStreaming(
28
+ {
29
+ model: "gpt-4",
30
+ messages: [
31
+ {
32
+ role: "system" as const,
33
+ content: "You are a creative poet.",
34
+ },
35
+ {
36
+ role: "user" as const,
37
+ content:
38
+ "Write a short poem about artificial intelligence and its impact on humanity.",
39
+ },
40
+ ],
41
+ max_tokens: 1000,
42
+ stream: true as const,
43
+ },
44
+ metadata
45
+ );
46
+
47
+ // Process the stream
48
+ process.stdout.write("Assistant: ");
49
+ for await (const chunk of wrapper) {
50
+ if (chunk.choices.length > 0 && chunk.choices[0].delta.content) {
51
+ process.stdout.write(chunk.choices[0].delta.content);
52
+ }
53
+ }
54
+
55
+ console.log("\n");
56
+ console.log("\nUsage data sent to Revenium! Check your dashboard");
57
+ }
58
+
59
+ main().catch(console.error);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revenium/openai",
3
- "version": "1.0.13",
3
+ "version": "1.0.14",
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,15 +25,18 @@
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
- "example:openai-basic": "npm run build && npx ts-node examples/openai-basic.ts",
29
- "example:openai-streaming": "npm run build && npx ts-node examples/openai-streaming.ts",
30
- "example:azure-basic": "npm run build && npx ts-node examples/azure-basic.ts",
31
- "example:azure-streaming": "npm run build && npx ts-node examples/azure-streaming.ts",
32
- "example": "npm run example:openai-basic",
33
- "example:openai-responses-basic": "npm run build && npx ts-node examples/openai-responses-basic.ts",
34
- "example:openai-responses-streaming": "npm run build && npx ts-node examples/openai-responses-streaming.ts",
35
- "example:azure-responses-basic": "npm run build && npx ts-node examples/azure-responses-basic.ts",
36
- "example:azure-responses-streaming": "npm run build && npx ts-node examples/azure-responses-streaming.ts"
28
+ "example:getting-started": "npm run build && npx tsx examples/getting_started.ts",
29
+ "example:openai-basic": "npm run build && npx tsx examples/openai/basic.ts",
30
+ "example:openai-metadata": "npm run build && npx tsx examples/openai/metadata.ts",
31
+ "example:openai-stream": "npm run build && npx tsx examples/openai/streaming.ts",
32
+ "example:openai-res-basic": "npm run build && npx tsx examples/openai/responses-basic.ts",
33
+ "example:openai-res-embed": "npm run build && npx tsx examples/openai/responses-embed.ts",
34
+ "example:openai-res-stream": "npm run build && npx tsx examples/openai/responses-streaming.ts",
35
+ "example:azure-basic": "npm run build && npx tsx examples/azure/basic.ts",
36
+ "example:azure-stream": "npm run build && npx tsx examples/azure/stream.ts",
37
+ "example:azure-res-basic": "npm run build && npx tsx examples/azure/responses-basic.ts",
38
+ "example:azure-res-stream": "npm run build && npx tsx examples/azure/responses-stream.ts",
39
+ "example": "npm run example:getting-started"
37
40
  },
38
41
  "keywords": [
39
42
  "openai",
@@ -68,14 +71,18 @@
68
71
  },
69
72
  "files": [
70
73
  "dist/**/*",
71
- "src/**/*",
72
74
  "examples/**/*",
75
+ "!examples/.claude/**",
76
+ "!examples/**/*.log",
73
77
  ".env.example",
74
78
  "README.md",
75
79
  "CHANGELOG.md",
76
- "LICENSE"
80
+ "LICENSE",
81
+ "CONTRIBUTING.md",
82
+ "SECURITY.md",
83
+ "CODE_OF_CONDUCT.md"
77
84
  ],
78
85
  "engines": {
79
- "node": ">=16.0.0"
86
+ "node": ">=18.0.0"
80
87
  }
81
88
  }
@@ -1,15 +0,0 @@
1
- "use strict";
2
- /**
3
- * Wrapper module - Main exports
4
- *
5
- * This module provides a clean interface for OpenAI client wrapping,
6
- * separating concerns into focused sub-modules.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.getProviderInfo = exports.patchOpenAIInstance = exports.patchOpenAI = void 0;
10
- // Re-export all wrapper functionality
11
- var instance_patcher_js_1 = require("./instance-patcher.js");
12
- Object.defineProperty(exports, "patchOpenAI", { enumerable: true, get: function () { return instance_patcher_js_1.patchOpenAI; } });
13
- Object.defineProperty(exports, "patchOpenAIInstance", { enumerable: true, get: function () { return instance_patcher_js_1.patchOpenAIInstance; } });
14
- Object.defineProperty(exports, "getProviderInfo", { enumerable: true, get: function () { return instance_patcher_js_1.getProviderInfo; } });
15
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/wrapper/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,sCAAsC;AACtC,6DAA0F;AAAjF,kHAAA,WAAW,OAAA;AAAE,0HAAA,mBAAmB,OAAA;AAAE,sHAAA,eAAe,OAAA"}