@revenium/openai 1.0.16 → 1.1.1
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/CHANGELOG.md +20 -0
- package/README.md +159 -18
- package/dist/cjs/core/config/loader.js +27 -1
- package/dist/cjs/core/config/loader.js.map +1 -1
- package/dist/cjs/core/middleware/interfaces.js +70 -32
- package/dist/cjs/core/middleware/interfaces.js.map +1 -1
- package/dist/cjs/core/tracking/index.js +3 -1
- package/dist/cjs/core/tracking/index.js.map +1 -1
- package/dist/cjs/core/tracking/payload-builder.js +34 -5
- package/dist/cjs/core/tracking/payload-builder.js.map +1 -1
- package/dist/cjs/core/tracking/summary-printer.js +196 -0
- package/dist/cjs/core/tracking/summary-printer.js.map +1 -0
- package/dist/cjs/core/tracking/usage-tracker.js +37 -5
- package/dist/cjs/core/tracking/usage-tracker.js.map +1 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/utils/metadata-builder.js +21 -9
- package/dist/cjs/utils/metadata-builder.js.map +1 -1
- package/dist/cjs/utils/prompt-extraction.js +231 -0
- package/dist/cjs/utils/prompt-extraction.js.map +1 -0
- package/dist/esm/core/config/loader.js +27 -1
- package/dist/esm/core/config/loader.js.map +1 -1
- package/dist/esm/core/middleware/interfaces.js +70 -32
- package/dist/esm/core/middleware/interfaces.js.map +1 -1
- package/dist/esm/core/tracking/index.js +1 -0
- package/dist/esm/core/tracking/index.js.map +1 -1
- package/dist/esm/core/tracking/payload-builder.js +34 -5
- package/dist/esm/core/tracking/payload-builder.js.map +1 -1
- package/dist/esm/core/tracking/summary-printer.js +193 -0
- package/dist/esm/core/tracking/summary-printer.js.map +1 -0
- package/dist/esm/core/tracking/usage-tracker.js +37 -5
- package/dist/esm/core/tracking/usage-tracker.js.map +1 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/utils/metadata-builder.js +21 -9
- package/dist/esm/utils/metadata-builder.js.map +1 -1
- package/dist/esm/utils/prompt-extraction.js +225 -0
- package/dist/esm/utils/prompt-extraction.js.map +1 -0
- package/dist/types/core/config/loader.d.ts.map +1 -1
- package/dist/types/core/middleware/interfaces.d.ts +4 -1
- package/dist/types/core/middleware/interfaces.d.ts.map +1 -1
- package/dist/types/core/tracking/index.d.ts +1 -0
- package/dist/types/core/tracking/index.d.ts.map +1 -1
- package/dist/types/core/tracking/payload-builder.d.ts.map +1 -1
- package/dist/types/core/tracking/summary-printer.d.ts +9 -0
- package/dist/types/core/tracking/summary-printer.d.ts.map +1 -0
- package/dist/types/core/tracking/usage-tracker.d.ts +2 -0
- package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +39 -4
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/utils/metadata-builder.d.ts +3 -0
- package/dist/types/utils/metadata-builder.d.ts.map +1 -1
- package/dist/types/utils/prompt-extraction.d.ts +29 -0
- package/dist/types/utils/prompt-extraction.d.ts.map +1 -0
- package/examples/README.md +2 -2
- package/examples/azure/basic.ts +3 -3
- package/examples/azure/responses-basic.ts +4 -4
- package/examples/azure/responses-stream.ts +4 -4
- package/examples/azure/stream.ts +3 -3
- package/examples/getting_started.ts +2 -2
- package/examples/openai/basic.ts +3 -3
- package/examples/openai/metadata.ts +4 -4
- package/examples/openai/prompt-capture.ts +95 -0
- package/examples/openai/responses-basic.ts +4 -4
- package/examples/openai/responses-embed.ts +3 -3
- package/examples/openai/responses-streaming.ts +4 -4
- package/examples/openai/streaming.ts +3 -3
- package/package.json +1 -1
|
@@ -15,11 +15,11 @@ async function main() {
|
|
|
15
15
|
// Optional metadata for advanced reporting, lineage tracking, and cost allocation
|
|
16
16
|
const metadata: UsageMetadata = {
|
|
17
17
|
// Organization & billing
|
|
18
|
-
|
|
18
|
+
organizationName: "org-metadata-demo",
|
|
19
19
|
subscriptionId: "plan-premium-2025",
|
|
20
20
|
|
|
21
21
|
// Product & task tracking
|
|
22
|
-
|
|
22
|
+
productName: "ai-assistant",
|
|
23
23
|
taskType: "explanation-request",
|
|
24
24
|
agent: "openai-metadata-chat-node",
|
|
25
25
|
|
|
@@ -27,7 +27,7 @@ async function main() {
|
|
|
27
27
|
traceId: "session-" + Date.now(),
|
|
28
28
|
|
|
29
29
|
// Quality metrics
|
|
30
|
-
responseQualityScore: 0.95,
|
|
30
|
+
responseQualityScore: 0.95,
|
|
31
31
|
|
|
32
32
|
// User tracking
|
|
33
33
|
subscriber: {
|
|
@@ -54,7 +54,7 @@ async function main() {
|
|
|
54
54
|
],
|
|
55
55
|
max_tokens: 1000,
|
|
56
56
|
},
|
|
57
|
-
metadata
|
|
57
|
+
metadata,
|
|
58
58
|
);
|
|
59
59
|
|
|
60
60
|
// Display response
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import OpenAI from "openai";
|
|
2
|
+
import { configure } from "../../src/index.js";
|
|
3
|
+
|
|
4
|
+
async function main() {
|
|
5
|
+
console.log("=== OpenAI Prompt Capture Example ===\n");
|
|
6
|
+
|
|
7
|
+
configure({
|
|
8
|
+
reveniumApiKey: process.env.REVENIUM_METERING_API_KEY || "test-key",
|
|
9
|
+
reveniumBaseUrl: process.env.REVENIUM_METERING_BASE_URL,
|
|
10
|
+
capturePrompts: true,
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const openai = new OpenAI({
|
|
14
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
console.log("Example 1: Prompt capture enabled via config");
|
|
18
|
+
console.log("Making request with prompt capture enabled...\n");
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const response = await openai.chat.completions.create({
|
|
22
|
+
model: "gpt-4o-mini",
|
|
23
|
+
max_tokens: 100,
|
|
24
|
+
messages: [
|
|
25
|
+
{
|
|
26
|
+
role: "system",
|
|
27
|
+
content: "You are a helpful assistant that provides concise answers.",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
role: "user",
|
|
31
|
+
content: "What is the capital of France?",
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
usageMetadata: {
|
|
35
|
+
organizationName: "org-prompt-capture-demo",
|
|
36
|
+
productName: "prod-openai-prompt-capture",
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
console.log("Response:", response.choices[0]?.message?.content);
|
|
41
|
+
console.log("\nPrompts captured and sent to Revenium API!");
|
|
42
|
+
} catch (error) {
|
|
43
|
+
console.error(
|
|
44
|
+
"Error:",
|
|
45
|
+
error instanceof Error ? error.message : String(error),
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
console.log("\n" + "=".repeat(50) + "\n");
|
|
50
|
+
console.log("Example 2: Prompt capture disabled via metadata override");
|
|
51
|
+
console.log("Making request with prompt capture disabled...\n");
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
const response2 = await openai.chat.completions.create({
|
|
55
|
+
model: "gpt-4o-mini",
|
|
56
|
+
max_tokens: 100,
|
|
57
|
+
messages: [
|
|
58
|
+
{
|
|
59
|
+
role: "system",
|
|
60
|
+
content: "You are a helpful assistant.",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
role: "user",
|
|
64
|
+
content: "What is 2+2?",
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
usageMetadata: {
|
|
68
|
+
organizationName: "org-prompt-capture-demo",
|
|
69
|
+
productName: "prod-openai-prompt-capture",
|
|
70
|
+
capturePrompts: false,
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
console.log("Response:", response2.choices[0]?.message?.content);
|
|
75
|
+
console.log("\nPrompts NOT captured (overridden via metadata)!");
|
|
76
|
+
} catch (error) {
|
|
77
|
+
console.error(
|
|
78
|
+
"Error:",
|
|
79
|
+
error instanceof Error ? error.message : String(error),
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
console.log("\n" + "=".repeat(50) + "\n");
|
|
84
|
+
console.log("Example 3: Prompt capture with environment variable");
|
|
85
|
+
console.log("Set REVENIUM_CAPTURE_PROMPTS=true in your .env file\n");
|
|
86
|
+
|
|
87
|
+
console.log("Prompt capture examples completed!");
|
|
88
|
+
console.log("\nConfiguration hierarchy:");
|
|
89
|
+
console.log("1. Per-call metadata (highest priority)");
|
|
90
|
+
console.log("2. Global config");
|
|
91
|
+
console.log("3. Environment variable REVENIUM_CAPTURE_PROMPTS");
|
|
92
|
+
console.log("4. Default: false (lowest priority)");
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
main().catch(console.error);
|
|
@@ -17,8 +17,8 @@ async function main() {
|
|
|
17
17
|
|
|
18
18
|
// Create with metadata
|
|
19
19
|
const metadata: UsageMetadata = {
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
organizationName: "org-responses-basic-demo",
|
|
21
|
+
productName: "prod-openai-responses-basic",
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
try {
|
|
@@ -27,7 +27,7 @@ async function main() {
|
|
|
27
27
|
model: "gpt-4",
|
|
28
28
|
input: "What is the capital of France?",
|
|
29
29
|
},
|
|
30
|
-
metadata
|
|
30
|
+
metadata,
|
|
31
31
|
);
|
|
32
32
|
|
|
33
33
|
// Display response
|
|
@@ -36,7 +36,7 @@ async function main() {
|
|
|
36
36
|
} catch (error) {
|
|
37
37
|
console.error("Error:", (error as Error).message);
|
|
38
38
|
console.log(
|
|
39
|
-
"\nNote: Responses API is experimental and may not be available in all OpenAI SDK versions"
|
|
39
|
+
"\nNote: Responses API is experimental and may not be available in all OpenAI SDK versions",
|
|
40
40
|
);
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -13,8 +13,8 @@ async function main() {
|
|
|
13
13
|
|
|
14
14
|
// Create with metadata
|
|
15
15
|
const metadata: UsageMetadata = {
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
organizationName: "org-responses-embed-demo",
|
|
17
|
+
productName: "prod-openai-responses-embed",
|
|
18
18
|
};
|
|
19
19
|
|
|
20
20
|
const embedding = await client.embeddings().create(
|
|
@@ -22,7 +22,7 @@ async function main() {
|
|
|
22
22
|
model: "text-embedding-3-small",
|
|
23
23
|
input: "Hello world",
|
|
24
24
|
},
|
|
25
|
-
metadata
|
|
25
|
+
metadata,
|
|
26
26
|
);
|
|
27
27
|
|
|
28
28
|
console.log("Model:", embedding.model);
|
|
@@ -18,8 +18,8 @@ async function main() {
|
|
|
18
18
|
|
|
19
19
|
// Create a metadata
|
|
20
20
|
const metadata: UsageMetadata = {
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
organizationName: "org-responses-streaming-demo",
|
|
22
|
+
productName: "prod-openai-responses",
|
|
23
23
|
taskType: "creative-writing",
|
|
24
24
|
};
|
|
25
25
|
|
|
@@ -31,7 +31,7 @@ async function main() {
|
|
|
31
31
|
input: "Write a short poem about the ocean.",
|
|
32
32
|
stream: true as const,
|
|
33
33
|
},
|
|
34
|
-
metadata
|
|
34
|
+
metadata,
|
|
35
35
|
);
|
|
36
36
|
|
|
37
37
|
// Process the stream
|
|
@@ -55,7 +55,7 @@ async function main() {
|
|
|
55
55
|
console.error("Error:", (error as Error).message);
|
|
56
56
|
console.error("Stack:", (error as Error).stack);
|
|
57
57
|
console.log(
|
|
58
|
-
"\nNote: Responses API is experimental and may not be available in all OpenAI SDK versions"
|
|
58
|
+
"\nNote: Responses API is experimental and may not be available in all OpenAI SDK versions",
|
|
59
59
|
);
|
|
60
60
|
}
|
|
61
61
|
}
|
|
@@ -15,8 +15,8 @@ async function main() {
|
|
|
15
15
|
|
|
16
16
|
// Create a metadata
|
|
17
17
|
const metadata: UsageMetadata = {
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
organizationName: "org-streaming-demo",
|
|
19
|
+
productName: "prod-openai-streaming",
|
|
20
20
|
taskType: "creative-writing",
|
|
21
21
|
agent: "story-generator",
|
|
22
22
|
};
|
|
@@ -41,7 +41,7 @@ async function main() {
|
|
|
41
41
|
max_tokens: 1000,
|
|
42
42
|
stream: true as const,
|
|
43
43
|
},
|
|
44
|
-
metadata
|
|
44
|
+
metadata,
|
|
45
45
|
);
|
|
46
46
|
|
|
47
47
|
// Process the stream
|
package/package.json
CHANGED