@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.
- package/.env.example +10 -15
- package/CHANGELOG.md +59 -0
- package/CODE_OF_CONDUCT.md +57 -0
- package/CONTRIBUTING.md +38 -0
- package/README.md +109 -515
- 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 +12 -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 +17 -0
- package/dist/cjs/core/middleware/index.js.map +1 -0
- package/dist/cjs/core/middleware/interfaces.js +361 -0
- package/dist/cjs/core/middleware/interfaces.js.map +1 -0
- package/dist/cjs/core/middleware/revenium-client.js +142 -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 +14 -13
- package/dist/cjs/core/tracking/api-client.js.map +1 -1
- package/dist/cjs/core/tracking/payload-builder.js +30 -35
- package/dist/cjs/core/tracking/payload-builder.js.map +1 -1
- package/dist/cjs/core/tracking/usage-tracker.js +22 -18
- package/dist/cjs/core/tracking/usage-tracker.js.map +1 -1
- package/dist/cjs/index.js +26 -174
- 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 +27 -19
- 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/stop-reason-mapper.js +4 -0
- package/dist/cjs/utils/stop-reason-mapper.js.map +1 -1
- package/dist/cjs/utils/url-builder.js +3 -3
- 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 +14 -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 +353 -0
- package/dist/esm/core/middleware/interfaces.js.map +1 -0
- package/dist/esm/core/middleware/revenium-client.js +105 -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 +13 -12
- package/dist/esm/core/tracking/api-client.js.map +1 -1
- package/dist/esm/core/tracking/payload-builder.js +31 -36
- package/dist/esm/core/tracking/payload-builder.js.map +1 -1
- package/dist/esm/core/tracking/usage-tracker.js +24 -20
- package/dist/esm/core/tracking/usage-tracker.js.map +1 -1
- package/dist/esm/index.js +9 -157
- 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 +27 -19
- 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/stop-reason-mapper.js +4 -0
- package/dist/esm/utils/stop-reason-mapper.js.map +1 -1
- package/dist/esm/utils/url-builder.js +3 -3
- 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 +74 -0
- package/dist/types/core/middleware/interfaces.d.ts.map +1 -0
- package/dist/types/core/middleware/revenium-client.d.ts +58 -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/payload-builder.d.ts +3 -3
- package/dist/types/core/tracking/payload-builder.d.ts.map +1 -1
- package/dist/types/core/tracking/usage-tracker.d.ts +2 -2
- package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -1
- package/dist/types/index.d.ts +11 -114
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types/function-parameters.d.ts +2 -23
- package/dist/types/types/function-parameters.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +17 -115
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/types/openai-augmentation.d.ts +4 -139
- 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 +4 -3
- 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/stop-reason-mapper.d.ts.map +1 -1
- package/dist/types/utils/url-builder.d.ts +3 -3
- package/examples/README.md +270 -224
- 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 +20 -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 -94
- 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 -132
- 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 -336
- package/src/types/function-parameters.ts +0 -251
- package/src/types/index.ts +0 -313
- package/src/types/openai-augmentation.ts +0 -233
- 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 -219
- 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 -74
- package/src/utils/type-guards.ts +0 -202
- 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
|
-
|
|
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
|
|
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.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:
|
|
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,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": ">=
|
|
86
|
+
"node": ">=18.0.0"
|
|
80
87
|
}
|
|
81
88
|
}
|