@revenium/openai 1.0.12 → 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 (236) hide show
  1. package/.env.example +10 -15
  2. package/CHANGELOG.md +59 -0
  3. package/CODE_OF_CONDUCT.md +57 -0
  4. package/CONTRIBUTING.md +38 -0
  5. package/README.md +109 -515
  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 +12 -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 +30 -35
  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 -174
  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 +27 -19
  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/cjs/utils/stop-reason-mapper.js +4 -0
  52. package/dist/cjs/utils/stop-reason-mapper.js.map +1 -1
  53. package/dist/cjs/utils/url-builder.js +3 -3
  54. package/dist/esm/core/client/index.js +6 -0
  55. package/dist/esm/core/client/index.js.map +1 -0
  56. package/dist/esm/core/client/manager.js +102 -0
  57. package/dist/esm/core/client/manager.js.map +1 -0
  58. package/dist/esm/core/config/azure-config.js +6 -18
  59. package/dist/esm/core/config/azure-config.js.map +1 -1
  60. package/dist/esm/core/config/index.js +5 -4
  61. package/dist/esm/core/config/index.js.map +1 -1
  62. package/dist/esm/core/config/loader.js +33 -13
  63. package/dist/esm/core/config/loader.js.map +1 -1
  64. package/dist/esm/core/config/manager.js +14 -7
  65. package/dist/esm/core/config/manager.js.map +1 -1
  66. package/dist/esm/core/config/validator.js +3 -44
  67. package/dist/esm/core/config/validator.js.map +1 -1
  68. package/dist/esm/core/middleware/index.js +8 -0
  69. package/dist/esm/core/middleware/index.js.map +1 -0
  70. package/dist/esm/core/middleware/interfaces.js +353 -0
  71. package/dist/esm/core/middleware/interfaces.js.map +1 -0
  72. package/dist/esm/core/middleware/revenium-client.js +105 -0
  73. package/dist/esm/core/middleware/revenium-client.js.map +1 -0
  74. package/dist/esm/core/providers/detector.js +43 -22
  75. package/dist/esm/core/providers/detector.js.map +1 -1
  76. package/dist/esm/core/providers/index.js +2 -2
  77. package/dist/esm/core/providers/index.js.map +1 -1
  78. package/dist/esm/core/tracking/api-client.js +13 -12
  79. package/dist/esm/core/tracking/api-client.js.map +1 -1
  80. package/dist/esm/core/tracking/payload-builder.js +31 -36
  81. package/dist/esm/core/tracking/payload-builder.js.map +1 -1
  82. package/dist/esm/core/tracking/usage-tracker.js +24 -20
  83. package/dist/esm/core/tracking/usage-tracker.js.map +1 -1
  84. package/dist/esm/index.js +9 -157
  85. package/dist/esm/index.js.map +1 -1
  86. package/dist/esm/types/index.js +2 -10
  87. package/dist/esm/types/index.js.map +1 -1
  88. package/dist/esm/types/openai-augmentation.js +0 -49
  89. package/dist/esm/types/openai-augmentation.js.map +1 -1
  90. package/dist/esm/utils/constants.js +16 -19
  91. package/dist/esm/utils/constants.js.map +1 -1
  92. package/dist/esm/utils/error-handler.js +19 -15
  93. package/dist/esm/utils/error-handler.js.map +1 -1
  94. package/dist/esm/utils/metadata-builder.js +27 -19
  95. package/dist/esm/utils/metadata-builder.js.map +1 -1
  96. package/dist/esm/utils/provider-detection.js +26 -29
  97. package/dist/esm/utils/provider-detection.js.map +1 -1
  98. package/dist/esm/utils/stop-reason-mapper.js +4 -0
  99. package/dist/esm/utils/stop-reason-mapper.js.map +1 -1
  100. package/dist/esm/utils/url-builder.js +3 -3
  101. package/dist/types/core/client/index.d.ts +6 -0
  102. package/dist/types/core/client/index.d.ts.map +1 -0
  103. package/dist/types/core/client/manager.d.ts +32 -0
  104. package/dist/types/core/client/manager.d.ts.map +1 -0
  105. package/dist/types/core/config/azure-config.d.ts +2 -2
  106. package/dist/types/core/config/azure-config.d.ts.map +1 -1
  107. package/dist/types/core/config/index.d.ts +4 -4
  108. package/dist/types/core/config/index.d.ts.map +1 -1
  109. package/dist/types/core/config/loader.d.ts +3 -1
  110. package/dist/types/core/config/loader.d.ts.map +1 -1
  111. package/dist/types/core/config/manager.d.ts +1 -1
  112. package/dist/types/core/config/manager.d.ts.map +1 -1
  113. package/dist/types/core/config/validator.d.ts +1 -12
  114. package/dist/types/core/config/validator.d.ts.map +1 -1
  115. package/dist/types/core/middleware/index.d.ts +8 -0
  116. package/dist/types/core/middleware/index.d.ts.map +1 -0
  117. package/dist/types/core/middleware/interfaces.d.ts +74 -0
  118. package/dist/types/core/middleware/interfaces.d.ts.map +1 -0
  119. package/dist/types/core/middleware/revenium-client.d.ts +58 -0
  120. package/dist/types/core/middleware/revenium-client.d.ts.map +1 -0
  121. package/dist/types/core/providers/detector.d.ts +9 -2
  122. package/dist/types/core/providers/detector.d.ts.map +1 -1
  123. package/dist/types/core/providers/index.d.ts +2 -2
  124. package/dist/types/core/providers/index.d.ts.map +1 -1
  125. package/dist/types/core/tracking/api-client.d.ts +1 -1
  126. package/dist/types/core/tracking/api-client.d.ts.map +1 -1
  127. package/dist/types/core/tracking/payload-builder.d.ts +3 -3
  128. package/dist/types/core/tracking/payload-builder.d.ts.map +1 -1
  129. package/dist/types/core/tracking/usage-tracker.d.ts +2 -2
  130. package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -1
  131. package/dist/types/index.d.ts +11 -114
  132. package/dist/types/index.d.ts.map +1 -1
  133. package/dist/types/types/function-parameters.d.ts +2 -23
  134. package/dist/types/types/function-parameters.d.ts.map +1 -1
  135. package/dist/types/types/index.d.ts +17 -115
  136. package/dist/types/types/index.d.ts.map +1 -1
  137. package/dist/types/types/openai-augmentation.d.ts +4 -139
  138. package/dist/types/types/openai-augmentation.d.ts.map +1 -1
  139. package/dist/types/utils/constants.d.ts +7 -1
  140. package/dist/types/utils/constants.d.ts.map +1 -1
  141. package/dist/types/utils/error-handler.d.ts +2 -2
  142. package/dist/types/utils/error-handler.d.ts.map +1 -1
  143. package/dist/types/utils/metadata-builder.d.ts +4 -3
  144. package/dist/types/utils/metadata-builder.d.ts.map +1 -1
  145. package/dist/types/utils/provider-detection.d.ts +3 -3
  146. package/dist/types/utils/provider-detection.d.ts.map +1 -1
  147. package/dist/types/utils/stop-reason-mapper.d.ts.map +1 -1
  148. package/dist/types/utils/url-builder.d.ts +3 -3
  149. package/examples/README.md +270 -224
  150. package/examples/azure/basic.ts +62 -0
  151. package/examples/azure/responses-basic.ts +45 -0
  152. package/examples/azure/responses-stream.ts +61 -0
  153. package/examples/azure/stream.ts +56 -0
  154. package/examples/getting_started.ts +31 -43
  155. package/examples/openai/basic.ts +45 -0
  156. package/examples/openai/metadata.ts +67 -0
  157. package/examples/openai/responses-basic.ts +44 -0
  158. package/examples/openai/responses-embed.ts +34 -0
  159. package/examples/openai/responses-streaming.ts +63 -0
  160. package/examples/openai/streaming.ts +59 -0
  161. package/package.json +20 -13
  162. package/dist/cjs/core/wrapper/index.js +0 -15
  163. package/dist/cjs/core/wrapper/index.js.map +0 -1
  164. package/dist/cjs/core/wrapper/instance-patcher.js +0 -202
  165. package/dist/cjs/core/wrapper/instance-patcher.js.map +0 -1
  166. package/dist/cjs/core/wrapper/request-handler.js +0 -317
  167. package/dist/cjs/core/wrapper/request-handler.js.map +0 -1
  168. package/dist/cjs/core/wrapper/stream-wrapper.js +0 -82
  169. package/dist/cjs/core/wrapper/stream-wrapper.js.map +0 -1
  170. package/dist/cjs/utils/azure-model-resolver.js +0 -211
  171. package/dist/cjs/utils/azure-model-resolver.js.map +0 -1
  172. package/dist/cjs/utils/request-handler-factory.js +0 -185
  173. package/dist/cjs/utils/request-handler-factory.js.map +0 -1
  174. package/dist/esm/core/wrapper/index.js +0 -9
  175. package/dist/esm/core/wrapper/index.js.map +0 -1
  176. package/dist/esm/core/wrapper/instance-patcher.js +0 -199
  177. package/dist/esm/core/wrapper/instance-patcher.js.map +0 -1
  178. package/dist/esm/core/wrapper/request-handler.js +0 -310
  179. package/dist/esm/core/wrapper/request-handler.js.map +0 -1
  180. package/dist/esm/core/wrapper/stream-wrapper.js +0 -79
  181. package/dist/esm/core/wrapper/stream-wrapper.js.map +0 -1
  182. package/dist/esm/utils/azure-model-resolver.js +0 -204
  183. package/dist/esm/utils/azure-model-resolver.js.map +0 -1
  184. package/dist/esm/utils/request-handler-factory.js +0 -146
  185. package/dist/esm/utils/request-handler-factory.js.map +0 -1
  186. package/dist/types/core/wrapper/index.d.ts +0 -8
  187. package/dist/types/core/wrapper/index.d.ts.map +0 -1
  188. package/dist/types/core/wrapper/instance-patcher.d.ts +0 -33
  189. package/dist/types/core/wrapper/instance-patcher.d.ts.map +0 -1
  190. package/dist/types/core/wrapper/request-handler.d.ts +0 -29
  191. package/dist/types/core/wrapper/request-handler.d.ts.map +0 -1
  192. package/dist/types/core/wrapper/stream-wrapper.d.ts +0 -13
  193. package/dist/types/core/wrapper/stream-wrapper.d.ts.map +0 -1
  194. package/dist/types/utils/azure-model-resolver.d.ts +0 -41
  195. package/dist/types/utils/azure-model-resolver.d.ts.map +0 -1
  196. package/dist/types/utils/request-handler-factory.d.ts +0 -81
  197. package/dist/types/utils/request-handler-factory.d.ts.map +0 -1
  198. package/examples/azure-basic.ts +0 -206
  199. package/examples/azure-responses-basic.ts +0 -233
  200. package/examples/azure-responses-streaming.ts +0 -255
  201. package/examples/azure-streaming.ts +0 -209
  202. package/examples/openai-basic.ts +0 -147
  203. package/examples/openai-function-calling.ts +0 -259
  204. package/examples/openai-responses-basic.ts +0 -212
  205. package/examples/openai-responses-streaming.ts +0 -232
  206. package/examples/openai-streaming.ts +0 -172
  207. package/examples/openai-vision.ts +0 -289
  208. package/src/core/config/azure-config.ts +0 -72
  209. package/src/core/config/index.ts +0 -23
  210. package/src/core/config/loader.ts +0 -66
  211. package/src/core/config/manager.ts +0 -94
  212. package/src/core/config/validator.ts +0 -89
  213. package/src/core/providers/detector.ts +0 -159
  214. package/src/core/providers/index.ts +0 -16
  215. package/src/core/tracking/api-client.ts +0 -78
  216. package/src/core/tracking/index.ts +0 -21
  217. package/src/core/tracking/payload-builder.ts +0 -132
  218. package/src/core/tracking/usage-tracker.ts +0 -189
  219. package/src/core/wrapper/index.ts +0 -9
  220. package/src/core/wrapper/instance-patcher.ts +0 -288
  221. package/src/core/wrapper/request-handler.ts +0 -423
  222. package/src/core/wrapper/stream-wrapper.ts +0 -100
  223. package/src/index.ts +0 -336
  224. package/src/types/function-parameters.ts +0 -251
  225. package/src/types/index.ts +0 -313
  226. package/src/types/openai-augmentation.ts +0 -233
  227. package/src/types/responses-api.ts +0 -308
  228. package/src/utils/azure-model-resolver.ts +0 -220
  229. package/src/utils/constants.ts +0 -21
  230. package/src/utils/error-handler.ts +0 -251
  231. package/src/utils/metadata-builder.ts +0 -219
  232. package/src/utils/provider-detection.ts +0 -257
  233. package/src/utils/request-handler-factory.ts +0 -285
  234. package/src/utils/stop-reason-mapper.ts +0 -74
  235. package/src/utils/type-guards.ts +0 -202
  236. package/src/utils/url-builder.ts +0 -68
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Azure OpenAI Example
3
+ * Demonstrates usage with Azure OpenAI.
4
+ */
5
+
6
+ import { Initialize, GetClient, UsageMetadata } from "@revenium/openai";
7
+
8
+ async function main() {
9
+ // Initialize the middleware
10
+ Initialize();
11
+
12
+ // Get the client
13
+ const client = GetClient();
14
+
15
+ // Create a metadata
16
+ const metadata: UsageMetadata = {
17
+ organizationId: "org-azure-demo",
18
+ productId: "prod-azure-integration",
19
+ taskType: "question-answering",
20
+ agent: "azure-assistant",
21
+ };
22
+
23
+ // Create a chat completion
24
+ // IMPORTANT: For Azure OpenAI, the Model parameter must be your DEPLOYMENT NAME
25
+ // This is the name you gave to your deployment in Azure Portal, NOT the OpenAI model name
26
+ // Example: If you created a deployment called "gpt-5-mini-2" in Azure, use that name here
27
+ //
28
+
29
+ const response = await client
30
+ .chat()
31
+ .completions()
32
+ .create(
33
+ {
34
+ // NOTE: Make sure REVENIUM_AZURE_DISABLE=0 in your .env file to enable Azure
35
+ // If Azure is disabled, this will fail because "gpt-5-mini-2" is not a valid OpenAI model name
36
+ model: "gpt-5-mini-2", // Your Azure deployment name (requires REVENIUM_AZURE_DISABLE=0)
37
+ messages: [
38
+ {
39
+ role: "system" as const,
40
+ content:
41
+ "You are a helpful assistant that explains cloud computing concepts.",
42
+ },
43
+ {
44
+ role: "user" as const,
45
+ content:
46
+ "Explain the difference between Azure OpenAI and OpenAI native API in 2-3 sentences.",
47
+ },
48
+ ],
49
+ max_completion_tokens: 2000, // Increased for reasoning models (gpt-5-mini uses reasoning tokens)
50
+ // Note: Reasoning models like gpt-5-mini only support default temperature (1.0)
51
+ },
52
+ metadata
53
+ );
54
+
55
+ // Display the response
56
+ if (response.choices.length > 0) {
57
+ console.log(`Assistant: ${response.choices[0].message.content}`);
58
+ }
59
+ console.log("\nUsage data sent to Revenium! Check your dashboard");
60
+ }
61
+
62
+ main().catch(console.error);
@@ -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
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.12",
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
  }