@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.
- package/.env.example +10 -15
- package/CHANGELOG.md +65 -11
- package/CODE_OF_CONDUCT.md +57 -0
- package/CONTRIBUTING.md +38 -0
- package/README.md +104 -216
- package/SECURITY.md +34 -0
- package/dist/cjs/core/client/index.js +14 -0
- package/dist/cjs/core/client/index.js.map +1 -0
- package/dist/cjs/core/client/manager.js +109 -0
- package/dist/cjs/core/client/manager.js.map +1 -0
- package/dist/cjs/core/config/azure-config.js +5 -17
- package/dist/cjs/core/config/azure-config.js.map +1 -1
- package/dist/cjs/core/config/index.js +2 -2
- package/dist/cjs/core/config/index.js.map +1 -1
- package/dist/cjs/core/config/loader.js +34 -14
- package/dist/cjs/core/config/loader.js.map +1 -1
- package/dist/cjs/core/config/manager.js +11 -5
- package/dist/cjs/core/config/manager.js.map +1 -1
- package/dist/cjs/core/config/validator.js +3 -45
- package/dist/cjs/core/config/validator.js.map +1 -1
- package/dist/cjs/core/middleware/index.js +21 -0
- package/dist/cjs/core/middleware/index.js.map +1 -0
- package/dist/cjs/core/middleware/interfaces.js +454 -0
- package/dist/cjs/core/middleware/interfaces.js.map +1 -0
- package/dist/cjs/core/middleware/revenium-client.js +152 -0
- package/dist/cjs/core/middleware/revenium-client.js.map +1 -0
- package/dist/cjs/core/providers/detector.js +45 -23
- package/dist/cjs/core/providers/detector.js.map +1 -1
- package/dist/cjs/core/providers/index.js +2 -1
- package/dist/cjs/core/providers/index.js.map +1 -1
- package/dist/cjs/core/tracking/api-client.js +21 -14
- package/dist/cjs/core/tracking/api-client.js.map +1 -1
- package/dist/cjs/core/tracking/index.js +5 -1
- package/dist/cjs/core/tracking/index.js.map +1 -1
- package/dist/cjs/core/tracking/payload-builder.js +143 -25
- package/dist/cjs/core/tracking/payload-builder.js.map +1 -1
- package/dist/cjs/core/tracking/usage-tracker.js +111 -18
- package/dist/cjs/core/tracking/usage-tracker.js.map +1 -1
- package/dist/cjs/index.js +39 -202
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/index.js +0 -8
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/openai-augmentation.js +0 -49
- package/dist/cjs/types/openai-augmentation.js.map +1 -1
- package/dist/cjs/utils/constants.js +17 -20
- package/dist/cjs/utils/constants.js.map +1 -1
- package/dist/cjs/utils/error-handler.js +18 -14
- package/dist/cjs/utils/error-handler.js.map +1 -1
- package/dist/cjs/utils/metadata-builder.js +17 -16
- package/dist/cjs/utils/metadata-builder.js.map +1 -1
- package/dist/cjs/utils/provider-detection.js +25 -28
- package/dist/cjs/utils/provider-detection.js.map +1 -1
- package/dist/cjs/utils/trace-fields.js +115 -0
- package/dist/cjs/utils/trace-fields.js.map +1 -0
- package/dist/esm/core/client/index.js +6 -0
- package/dist/esm/core/client/index.js.map +1 -0
- package/dist/esm/core/client/manager.js +102 -0
- package/dist/esm/core/client/manager.js.map +1 -0
- package/dist/esm/core/config/azure-config.js +6 -18
- package/dist/esm/core/config/azure-config.js.map +1 -1
- package/dist/esm/core/config/index.js +5 -4
- package/dist/esm/core/config/index.js.map +1 -1
- package/dist/esm/core/config/loader.js +33 -13
- package/dist/esm/core/config/loader.js.map +1 -1
- package/dist/esm/core/config/manager.js +13 -7
- package/dist/esm/core/config/manager.js.map +1 -1
- package/dist/esm/core/config/validator.js +3 -44
- package/dist/esm/core/config/validator.js.map +1 -1
- package/dist/esm/core/middleware/index.js +8 -0
- package/dist/esm/core/middleware/index.js.map +1 -0
- package/dist/esm/core/middleware/interfaces.js +442 -0
- package/dist/esm/core/middleware/interfaces.js.map +1 -0
- package/dist/esm/core/middleware/revenium-client.js +115 -0
- package/dist/esm/core/middleware/revenium-client.js.map +1 -0
- package/dist/esm/core/providers/detector.js +43 -22
- package/dist/esm/core/providers/detector.js.map +1 -1
- package/dist/esm/core/providers/index.js +2 -2
- package/dist/esm/core/providers/index.js.map +1 -1
- package/dist/esm/core/tracking/api-client.js +20 -13
- package/dist/esm/core/tracking/api-client.js.map +1 -1
- package/dist/esm/core/tracking/index.js +4 -4
- package/dist/esm/core/tracking/index.js.map +1 -1
- package/dist/esm/core/tracking/payload-builder.js +142 -26
- package/dist/esm/core/tracking/payload-builder.js.map +1 -1
- package/dist/esm/core/tracking/usage-tracker.js +78 -20
- package/dist/esm/core/tracking/usage-tracker.js.map +1 -1
- package/dist/esm/index.js +9 -177
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/index.js +2 -10
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/openai-augmentation.js +0 -49
- package/dist/esm/types/openai-augmentation.js.map +1 -1
- package/dist/esm/utils/constants.js +16 -19
- package/dist/esm/utils/constants.js.map +1 -1
- package/dist/esm/utils/error-handler.js +19 -15
- package/dist/esm/utils/error-handler.js.map +1 -1
- package/dist/esm/utils/metadata-builder.js +17 -16
- package/dist/esm/utils/metadata-builder.js.map +1 -1
- package/dist/esm/utils/provider-detection.js +26 -29
- package/dist/esm/utils/provider-detection.js.map +1 -1
- package/dist/esm/utils/trace-fields.js +100 -0
- package/dist/esm/utils/trace-fields.js.map +1 -0
- package/dist/types/core/client/index.d.ts +6 -0
- package/dist/types/core/client/index.d.ts.map +1 -0
- package/dist/types/core/client/manager.d.ts +32 -0
- package/dist/types/core/client/manager.d.ts.map +1 -0
- package/dist/types/core/config/azure-config.d.ts +2 -2
- package/dist/types/core/config/azure-config.d.ts.map +1 -1
- package/dist/types/core/config/index.d.ts +4 -4
- package/dist/types/core/config/index.d.ts.map +1 -1
- package/dist/types/core/config/loader.d.ts +3 -1
- package/dist/types/core/config/loader.d.ts.map +1 -1
- package/dist/types/core/config/manager.d.ts +1 -1
- package/dist/types/core/config/manager.d.ts.map +1 -1
- package/dist/types/core/config/validator.d.ts +1 -12
- package/dist/types/core/config/validator.d.ts.map +1 -1
- package/dist/types/core/middleware/index.d.ts +8 -0
- package/dist/types/core/middleware/index.d.ts.map +1 -0
- package/dist/types/core/middleware/interfaces.d.ts +104 -0
- package/dist/types/core/middleware/interfaces.d.ts.map +1 -0
- package/dist/types/core/middleware/revenium-client.d.ts +64 -0
- package/dist/types/core/middleware/revenium-client.d.ts.map +1 -0
- package/dist/types/core/providers/detector.d.ts +9 -2
- package/dist/types/core/providers/detector.d.ts.map +1 -1
- package/dist/types/core/providers/index.d.ts +2 -2
- package/dist/types/core/providers/index.d.ts.map +1 -1
- package/dist/types/core/tracking/api-client.d.ts +1 -1
- package/dist/types/core/tracking/api-client.d.ts.map +1 -1
- package/dist/types/core/tracking/index.d.ts +4 -4
- package/dist/types/core/tracking/index.d.ts.map +1 -1
- package/dist/types/core/tracking/payload-builder.d.ts +5 -3
- package/dist/types/core/tracking/payload-builder.d.ts.map +1 -1
- package/dist/types/core/tracking/usage-tracker.d.ts +4 -2
- package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -1
- package/dist/types/index.d.ts +11 -135
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types/function-parameters.d.ts +91 -23
- package/dist/types/types/function-parameters.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +53 -108
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/types/openai-augmentation.d.ts +4 -138
- package/dist/types/types/openai-augmentation.d.ts.map +1 -1
- package/dist/types/utils/constants.d.ts +7 -1
- package/dist/types/utils/constants.d.ts.map +1 -1
- package/dist/types/utils/error-handler.d.ts +2 -2
- package/dist/types/utils/error-handler.d.ts.map +1 -1
- package/dist/types/utils/metadata-builder.d.ts +2 -2
- package/dist/types/utils/metadata-builder.d.ts.map +1 -1
- package/dist/types/utils/provider-detection.d.ts +3 -3
- package/dist/types/utils/provider-detection.d.ts.map +1 -1
- package/dist/types/utils/trace-fields.d.ts +11 -0
- package/dist/types/utils/trace-fields.d.ts.map +1 -0
- package/examples/README.md +282 -198
- package/examples/azure/basic.ts +62 -0
- package/examples/azure/responses-basic.ts +45 -0
- package/examples/azure/responses-stream.ts +61 -0
- package/examples/azure/stream.ts +56 -0
- package/examples/getting_started.ts +31 -43
- package/examples/openai/basic.ts +45 -0
- package/examples/openai/metadata.ts +67 -0
- package/examples/openai/responses-basic.ts +44 -0
- package/examples/openai/responses-embed.ts +34 -0
- package/examples/openai/responses-streaming.ts +63 -0
- package/examples/openai/streaming.ts +59 -0
- package/package.json +23 -13
- package/dist/cjs/core/wrapper/index.js +0 -15
- package/dist/cjs/core/wrapper/index.js.map +0 -1
- package/dist/cjs/core/wrapper/instance-patcher.js +0 -202
- package/dist/cjs/core/wrapper/instance-patcher.js.map +0 -1
- package/dist/cjs/core/wrapper/request-handler.js +0 -317
- package/dist/cjs/core/wrapper/request-handler.js.map +0 -1
- package/dist/cjs/core/wrapper/stream-wrapper.js +0 -82
- package/dist/cjs/core/wrapper/stream-wrapper.js.map +0 -1
- package/dist/cjs/utils/azure-model-resolver.js +0 -211
- package/dist/cjs/utils/azure-model-resolver.js.map +0 -1
- package/dist/cjs/utils/request-handler-factory.js +0 -185
- package/dist/cjs/utils/request-handler-factory.js.map +0 -1
- package/dist/esm/core/wrapper/index.js +0 -9
- package/dist/esm/core/wrapper/index.js.map +0 -1
- package/dist/esm/core/wrapper/instance-patcher.js +0 -199
- package/dist/esm/core/wrapper/instance-patcher.js.map +0 -1
- package/dist/esm/core/wrapper/request-handler.js +0 -310
- package/dist/esm/core/wrapper/request-handler.js.map +0 -1
- package/dist/esm/core/wrapper/stream-wrapper.js +0 -79
- package/dist/esm/core/wrapper/stream-wrapper.js.map +0 -1
- package/dist/esm/utils/azure-model-resolver.js +0 -204
- package/dist/esm/utils/azure-model-resolver.js.map +0 -1
- package/dist/esm/utils/request-handler-factory.js +0 -146
- package/dist/esm/utils/request-handler-factory.js.map +0 -1
- package/dist/types/core/wrapper/index.d.ts +0 -8
- package/dist/types/core/wrapper/index.d.ts.map +0 -1
- package/dist/types/core/wrapper/instance-patcher.d.ts +0 -33
- package/dist/types/core/wrapper/instance-patcher.d.ts.map +0 -1
- package/dist/types/core/wrapper/request-handler.d.ts +0 -29
- package/dist/types/core/wrapper/request-handler.d.ts.map +0 -1
- package/dist/types/core/wrapper/stream-wrapper.d.ts +0 -13
- package/dist/types/core/wrapper/stream-wrapper.d.ts.map +0 -1
- package/dist/types/utils/azure-model-resolver.d.ts +0 -41
- package/dist/types/utils/azure-model-resolver.d.ts.map +0 -1
- package/dist/types/utils/request-handler-factory.d.ts +0 -81
- package/dist/types/utils/request-handler-factory.d.ts.map +0 -1
- package/examples/azure-basic.ts +0 -206
- package/examples/azure-responses-basic.ts +0 -233
- package/examples/azure-responses-streaming.ts +0 -255
- package/examples/azure-streaming.ts +0 -209
- package/examples/openai-basic.ts +0 -147
- package/examples/openai-function-calling.ts +0 -259
- package/examples/openai-responses-basic.ts +0 -212
- package/examples/openai-responses-streaming.ts +0 -232
- package/examples/openai-streaming.ts +0 -172
- package/examples/openai-vision.ts +0 -289
- package/src/core/config/azure-config.ts +0 -72
- package/src/core/config/index.ts +0 -23
- package/src/core/config/loader.ts +0 -66
- package/src/core/config/manager.ts +0 -95
- package/src/core/config/validator.ts +0 -89
- package/src/core/providers/detector.ts +0 -159
- package/src/core/providers/index.ts +0 -16
- package/src/core/tracking/api-client.ts +0 -78
- package/src/core/tracking/index.ts +0 -21
- package/src/core/tracking/payload-builder.ts +0 -137
- package/src/core/tracking/usage-tracker.ts +0 -189
- package/src/core/wrapper/index.ts +0 -9
- package/src/core/wrapper/instance-patcher.ts +0 -288
- package/src/core/wrapper/request-handler.ts +0 -423
- package/src/core/wrapper/stream-wrapper.ts +0 -100
- package/src/index.ts +0 -360
- package/src/types/function-parameters.ts +0 -251
- package/src/types/index.ts +0 -310
- package/src/types/openai-augmentation.ts +0 -232
- package/src/types/responses-api.ts +0 -308
- package/src/utils/azure-model-resolver.ts +0 -220
- package/src/utils/constants.ts +0 -21
- package/src/utils/error-handler.ts +0 -251
- package/src/utils/metadata-builder.ts +0 -228
- package/src/utils/provider-detection.ts +0 -257
- package/src/utils/request-handler-factory.ts +0 -285
- package/src/utils/stop-reason-mapper.ts +0 -78
- package/src/utils/type-guards.ts +0 -202
- 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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
console.error('Failed to initialize Revenium:', initResult.message);
|
|
9
|
-
process.exit(1);
|
|
10
|
-
}
|
|
12
|
+
// Initialize middleware
|
|
13
|
+
Initialize();
|
|
11
14
|
|
|
12
|
-
|
|
15
|
+
// Get client
|
|
16
|
+
const client = GetClient();
|
|
13
17
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
],
|
|
18
|
+
// Create metadata
|
|
19
|
+
const metadata = {
|
|
20
|
+
organizationId: "org-getting-started-demo",
|
|
21
|
+
productId: "prod-getting-started",
|
|
22
|
+
};
|
|
20
23
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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:
|
|
29
|
-
"example:openai-
|
|
30
|
-
"example:
|
|
31
|
-
"example:
|
|
32
|
-
"example": "npm run
|
|
33
|
-
"example:openai-
|
|
34
|
-
"example:openai-
|
|
35
|
-
"example:azure-
|
|
36
|
-
"example:azure-
|
|
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": ">=
|
|
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"}
|