@revenium/openai 1.0.13 → 1.0.15

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 (240) hide show
  1. package/.env.example +10 -15
  2. package/CHANGELOG.md +65 -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 +21 -0
  22. package/dist/cjs/core/middleware/index.js.map +1 -0
  23. package/dist/cjs/core/middleware/interfaces.js +454 -0
  24. package/dist/cjs/core/middleware/interfaces.js.map +1 -0
  25. package/dist/cjs/core/middleware/revenium-client.js +152 -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 +21 -14
  32. package/dist/cjs/core/tracking/api-client.js.map +1 -1
  33. package/dist/cjs/core/tracking/index.js +5 -1
  34. package/dist/cjs/core/tracking/index.js.map +1 -1
  35. package/dist/cjs/core/tracking/payload-builder.js +143 -25
  36. package/dist/cjs/core/tracking/payload-builder.js.map +1 -1
  37. package/dist/cjs/core/tracking/usage-tracker.js +111 -18
  38. package/dist/cjs/core/tracking/usage-tracker.js.map +1 -1
  39. package/dist/cjs/index.js +39 -202
  40. package/dist/cjs/index.js.map +1 -1
  41. package/dist/cjs/types/index.js +0 -8
  42. package/dist/cjs/types/index.js.map +1 -1
  43. package/dist/cjs/types/openai-augmentation.js +0 -49
  44. package/dist/cjs/types/openai-augmentation.js.map +1 -1
  45. package/dist/cjs/utils/constants.js +17 -20
  46. package/dist/cjs/utils/constants.js.map +1 -1
  47. package/dist/cjs/utils/error-handler.js +18 -14
  48. package/dist/cjs/utils/error-handler.js.map +1 -1
  49. package/dist/cjs/utils/metadata-builder.js +17 -16
  50. package/dist/cjs/utils/metadata-builder.js.map +1 -1
  51. package/dist/cjs/utils/provider-detection.js +25 -28
  52. package/dist/cjs/utils/provider-detection.js.map +1 -1
  53. package/dist/cjs/utils/trace-fields.js +115 -0
  54. package/dist/cjs/utils/trace-fields.js.map +1 -0
  55. package/dist/esm/core/client/index.js +6 -0
  56. package/dist/esm/core/client/index.js.map +1 -0
  57. package/dist/esm/core/client/manager.js +102 -0
  58. package/dist/esm/core/client/manager.js.map +1 -0
  59. package/dist/esm/core/config/azure-config.js +6 -18
  60. package/dist/esm/core/config/azure-config.js.map +1 -1
  61. package/dist/esm/core/config/index.js +5 -4
  62. package/dist/esm/core/config/index.js.map +1 -1
  63. package/dist/esm/core/config/loader.js +33 -13
  64. package/dist/esm/core/config/loader.js.map +1 -1
  65. package/dist/esm/core/config/manager.js +13 -7
  66. package/dist/esm/core/config/manager.js.map +1 -1
  67. package/dist/esm/core/config/validator.js +3 -44
  68. package/dist/esm/core/config/validator.js.map +1 -1
  69. package/dist/esm/core/middleware/index.js +8 -0
  70. package/dist/esm/core/middleware/index.js.map +1 -0
  71. package/dist/esm/core/middleware/interfaces.js +442 -0
  72. package/dist/esm/core/middleware/interfaces.js.map +1 -0
  73. package/dist/esm/core/middleware/revenium-client.js +115 -0
  74. package/dist/esm/core/middleware/revenium-client.js.map +1 -0
  75. package/dist/esm/core/providers/detector.js +43 -22
  76. package/dist/esm/core/providers/detector.js.map +1 -1
  77. package/dist/esm/core/providers/index.js +2 -2
  78. package/dist/esm/core/providers/index.js.map +1 -1
  79. package/dist/esm/core/tracking/api-client.js +20 -13
  80. package/dist/esm/core/tracking/api-client.js.map +1 -1
  81. package/dist/esm/core/tracking/index.js +4 -4
  82. package/dist/esm/core/tracking/index.js.map +1 -1
  83. package/dist/esm/core/tracking/payload-builder.js +142 -26
  84. package/dist/esm/core/tracking/payload-builder.js.map +1 -1
  85. package/dist/esm/core/tracking/usage-tracker.js +78 -20
  86. package/dist/esm/core/tracking/usage-tracker.js.map +1 -1
  87. package/dist/esm/index.js +9 -177
  88. package/dist/esm/index.js.map +1 -1
  89. package/dist/esm/types/index.js +2 -10
  90. package/dist/esm/types/index.js.map +1 -1
  91. package/dist/esm/types/openai-augmentation.js +0 -49
  92. package/dist/esm/types/openai-augmentation.js.map +1 -1
  93. package/dist/esm/utils/constants.js +16 -19
  94. package/dist/esm/utils/constants.js.map +1 -1
  95. package/dist/esm/utils/error-handler.js +19 -15
  96. package/dist/esm/utils/error-handler.js.map +1 -1
  97. package/dist/esm/utils/metadata-builder.js +17 -16
  98. package/dist/esm/utils/metadata-builder.js.map +1 -1
  99. package/dist/esm/utils/provider-detection.js +26 -29
  100. package/dist/esm/utils/provider-detection.js.map +1 -1
  101. package/dist/esm/utils/trace-fields.js +100 -0
  102. package/dist/esm/utils/trace-fields.js.map +1 -0
  103. package/dist/types/core/client/index.d.ts +6 -0
  104. package/dist/types/core/client/index.d.ts.map +1 -0
  105. package/dist/types/core/client/manager.d.ts +32 -0
  106. package/dist/types/core/client/manager.d.ts.map +1 -0
  107. package/dist/types/core/config/azure-config.d.ts +2 -2
  108. package/dist/types/core/config/azure-config.d.ts.map +1 -1
  109. package/dist/types/core/config/index.d.ts +4 -4
  110. package/dist/types/core/config/index.d.ts.map +1 -1
  111. package/dist/types/core/config/loader.d.ts +3 -1
  112. package/dist/types/core/config/loader.d.ts.map +1 -1
  113. package/dist/types/core/config/manager.d.ts +1 -1
  114. package/dist/types/core/config/manager.d.ts.map +1 -1
  115. package/dist/types/core/config/validator.d.ts +1 -12
  116. package/dist/types/core/config/validator.d.ts.map +1 -1
  117. package/dist/types/core/middleware/index.d.ts +8 -0
  118. package/dist/types/core/middleware/index.d.ts.map +1 -0
  119. package/dist/types/core/middleware/interfaces.d.ts +104 -0
  120. package/dist/types/core/middleware/interfaces.d.ts.map +1 -0
  121. package/dist/types/core/middleware/revenium-client.d.ts +64 -0
  122. package/dist/types/core/middleware/revenium-client.d.ts.map +1 -0
  123. package/dist/types/core/providers/detector.d.ts +9 -2
  124. package/dist/types/core/providers/detector.d.ts.map +1 -1
  125. package/dist/types/core/providers/index.d.ts +2 -2
  126. package/dist/types/core/providers/index.d.ts.map +1 -1
  127. package/dist/types/core/tracking/api-client.d.ts +1 -1
  128. package/dist/types/core/tracking/api-client.d.ts.map +1 -1
  129. package/dist/types/core/tracking/index.d.ts +4 -4
  130. package/dist/types/core/tracking/index.d.ts.map +1 -1
  131. package/dist/types/core/tracking/payload-builder.d.ts +5 -3
  132. package/dist/types/core/tracking/payload-builder.d.ts.map +1 -1
  133. package/dist/types/core/tracking/usage-tracker.d.ts +4 -2
  134. package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -1
  135. package/dist/types/index.d.ts +11 -135
  136. package/dist/types/index.d.ts.map +1 -1
  137. package/dist/types/types/function-parameters.d.ts +91 -23
  138. package/dist/types/types/function-parameters.d.ts.map +1 -1
  139. package/dist/types/types/index.d.ts +53 -108
  140. package/dist/types/types/index.d.ts.map +1 -1
  141. package/dist/types/types/openai-augmentation.d.ts +4 -138
  142. package/dist/types/types/openai-augmentation.d.ts.map +1 -1
  143. package/dist/types/utils/constants.d.ts +7 -1
  144. package/dist/types/utils/constants.d.ts.map +1 -1
  145. package/dist/types/utils/error-handler.d.ts +2 -2
  146. package/dist/types/utils/error-handler.d.ts.map +1 -1
  147. package/dist/types/utils/metadata-builder.d.ts +2 -2
  148. package/dist/types/utils/metadata-builder.d.ts.map +1 -1
  149. package/dist/types/utils/provider-detection.d.ts +3 -3
  150. package/dist/types/utils/provider-detection.d.ts.map +1 -1
  151. package/dist/types/utils/trace-fields.d.ts +11 -0
  152. package/dist/types/utils/trace-fields.d.ts.map +1 -0
  153. package/examples/README.md +282 -198
  154. package/examples/azure/basic.ts +62 -0
  155. package/examples/azure/responses-basic.ts +45 -0
  156. package/examples/azure/responses-stream.ts +61 -0
  157. package/examples/azure/stream.ts +56 -0
  158. package/examples/getting_started.ts +31 -43
  159. package/examples/openai/basic.ts +45 -0
  160. package/examples/openai/metadata.ts +67 -0
  161. package/examples/openai/responses-basic.ts +44 -0
  162. package/examples/openai/responses-embed.ts +34 -0
  163. package/examples/openai/responses-streaming.ts +63 -0
  164. package/examples/openai/streaming.ts +59 -0
  165. package/package.json +23 -13
  166. package/dist/cjs/core/wrapper/index.js +0 -15
  167. package/dist/cjs/core/wrapper/index.js.map +0 -1
  168. package/dist/cjs/core/wrapper/instance-patcher.js +0 -202
  169. package/dist/cjs/core/wrapper/instance-patcher.js.map +0 -1
  170. package/dist/cjs/core/wrapper/request-handler.js +0 -317
  171. package/dist/cjs/core/wrapper/request-handler.js.map +0 -1
  172. package/dist/cjs/core/wrapper/stream-wrapper.js +0 -82
  173. package/dist/cjs/core/wrapper/stream-wrapper.js.map +0 -1
  174. package/dist/cjs/utils/azure-model-resolver.js +0 -211
  175. package/dist/cjs/utils/azure-model-resolver.js.map +0 -1
  176. package/dist/cjs/utils/request-handler-factory.js +0 -185
  177. package/dist/cjs/utils/request-handler-factory.js.map +0 -1
  178. package/dist/esm/core/wrapper/index.js +0 -9
  179. package/dist/esm/core/wrapper/index.js.map +0 -1
  180. package/dist/esm/core/wrapper/instance-patcher.js +0 -199
  181. package/dist/esm/core/wrapper/instance-patcher.js.map +0 -1
  182. package/dist/esm/core/wrapper/request-handler.js +0 -310
  183. package/dist/esm/core/wrapper/request-handler.js.map +0 -1
  184. package/dist/esm/core/wrapper/stream-wrapper.js +0 -79
  185. package/dist/esm/core/wrapper/stream-wrapper.js.map +0 -1
  186. package/dist/esm/utils/azure-model-resolver.js +0 -204
  187. package/dist/esm/utils/azure-model-resolver.js.map +0 -1
  188. package/dist/esm/utils/request-handler-factory.js +0 -146
  189. package/dist/esm/utils/request-handler-factory.js.map +0 -1
  190. package/dist/types/core/wrapper/index.d.ts +0 -8
  191. package/dist/types/core/wrapper/index.d.ts.map +0 -1
  192. package/dist/types/core/wrapper/instance-patcher.d.ts +0 -33
  193. package/dist/types/core/wrapper/instance-patcher.d.ts.map +0 -1
  194. package/dist/types/core/wrapper/request-handler.d.ts +0 -29
  195. package/dist/types/core/wrapper/request-handler.d.ts.map +0 -1
  196. package/dist/types/core/wrapper/stream-wrapper.d.ts +0 -13
  197. package/dist/types/core/wrapper/stream-wrapper.d.ts.map +0 -1
  198. package/dist/types/utils/azure-model-resolver.d.ts +0 -41
  199. package/dist/types/utils/azure-model-resolver.d.ts.map +0 -1
  200. package/dist/types/utils/request-handler-factory.d.ts +0 -81
  201. package/dist/types/utils/request-handler-factory.d.ts.map +0 -1
  202. package/examples/azure-basic.ts +0 -206
  203. package/examples/azure-responses-basic.ts +0 -233
  204. package/examples/azure-responses-streaming.ts +0 -255
  205. package/examples/azure-streaming.ts +0 -209
  206. package/examples/openai-basic.ts +0 -147
  207. package/examples/openai-function-calling.ts +0 -259
  208. package/examples/openai-responses-basic.ts +0 -212
  209. package/examples/openai-responses-streaming.ts +0 -232
  210. package/examples/openai-streaming.ts +0 -172
  211. package/examples/openai-vision.ts +0 -289
  212. package/src/core/config/azure-config.ts +0 -72
  213. package/src/core/config/index.ts +0 -23
  214. package/src/core/config/loader.ts +0 -66
  215. package/src/core/config/manager.ts +0 -95
  216. package/src/core/config/validator.ts +0 -89
  217. package/src/core/providers/detector.ts +0 -159
  218. package/src/core/providers/index.ts +0 -16
  219. package/src/core/tracking/api-client.ts +0 -78
  220. package/src/core/tracking/index.ts +0 -21
  221. package/src/core/tracking/payload-builder.ts +0 -137
  222. package/src/core/tracking/usage-tracker.ts +0 -189
  223. package/src/core/wrapper/index.ts +0 -9
  224. package/src/core/wrapper/instance-patcher.ts +0 -288
  225. package/src/core/wrapper/request-handler.ts +0 -423
  226. package/src/core/wrapper/stream-wrapper.ts +0 -100
  227. package/src/index.ts +0 -360
  228. package/src/types/function-parameters.ts +0 -251
  229. package/src/types/index.ts +0 -310
  230. package/src/types/openai-augmentation.ts +0 -232
  231. package/src/types/responses-api.ts +0 -308
  232. package/src/utils/azure-model-resolver.ts +0 -220
  233. package/src/utils/constants.ts +0 -21
  234. package/src/utils/error-handler.ts +0 -251
  235. package/src/utils/metadata-builder.ts +0 -228
  236. package/src/utils/provider-detection.ts +0 -257
  237. package/src/utils/request-handler-factory.ts +0 -285
  238. package/src/utils/stop-reason-mapper.ts +0 -78
  239. package/src/utils/type-guards.ts +0 -202
  240. 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.15",
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,21 @@
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"
87
+ },
88
+ "dependencies": {
89
+ "axios": "^1.13.2"
80
90
  }
81
91
  }
@@ -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"}