promptmetrics-sample 1.0.0
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 +12 -0
- package/README.md +235 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/tests/logs.test.d.ts +7 -0
- package/dist/tests/logs.test.d.ts.map +1 -0
- package/dist/tests/logs.test.js +163 -0
- package/dist/tests/logs.test.js.map +1 -0
- package/dist/tests/providers.test.d.ts +7 -0
- package/dist/tests/providers.test.d.ts.map +1 -0
- package/dist/tests/providers.test.js +99 -0
- package/dist/tests/providers.test.js.map +1 -0
- package/dist/tests/tags.test.d.ts +7 -0
- package/dist/tests/tags.test.d.ts.map +1 -0
- package/dist/tests/tags.test.js +220 -0
- package/dist/tests/tags.test.js.map +1 -0
- package/dist/tests/template-run-load.test.d.ts +11 -0
- package/dist/tests/template-run-load.test.d.ts.map +1 -0
- package/dist/tests/template-run-load.test.js +245 -0
- package/dist/tests/template-run-load.test.js.map +1 -0
- package/dist/tests/templates.test.d.ts +7 -0
- package/dist/tests/templates.test.d.ts.map +1 -0
- package/dist/tests/templates.test.js +152 -0
- package/dist/tests/templates.test.js.map +1 -0
- package/dist/tests/traceable.test.d.ts +7 -0
- package/dist/tests/traceable.test.d.ts.map +1 -0
- package/dist/tests/traceable.test.js +300 -0
- package/dist/tests/traceable.test.js.map +1 -0
- package/dist/tests/traces.test.d.ts +7 -0
- package/dist/tests/traces.test.d.ts.map +1 -0
- package/dist/tests/traces.test.js +264 -0
- package/dist/tests/traces.test.js.map +1 -0
- package/dist/tests/versions.test.d.ts +7 -0
- package/dist/tests/versions.test.d.ts.map +1 -0
- package/dist/tests/versions.test.js +145 -0
- package/dist/tests/versions.test.js.map +1 -0
- package/dist/utils/logger.d.ts +26 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +79 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +36 -0
- package/sample-project-plan.md +316 -0
- package/src/index.ts +36 -0
- package/src/tests/logs.test.ts +180 -0
- package/src/tests/providers.test.ts +99 -0
- package/src/tests/tags.test.ts +237 -0
- package/src/tests/template-run-load.test.ts +332 -0
- package/src/tests/templates.test.ts +154 -0
- package/src/tests/traceable.test.ts +290 -0
- package/src/tests/traces.test.ts +298 -0
- package/src/tests/versions.test.ts +155 -0
- package/src/utils/logger.ts +91 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/usr/bin/env ts-node
|
|
2
|
+
/**
|
|
3
|
+
* Versions Test Suite
|
|
4
|
+
* Tests all version-related SDK operations
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import "dotenv/config";
|
|
8
|
+
import { PromptMetrics } from "@promptmetrics/sdk";
|
|
9
|
+
import { runTestSuite, logger } from "../utils/logger";
|
|
10
|
+
|
|
11
|
+
const pm = new PromptMetrics({
|
|
12
|
+
apiKey: process.env.PROMPTMETRICS_API_KEY!,
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const TEST_TEMPLATE_NAME = process.env.TEST_TEMPLATE_NAME || "test-template";
|
|
16
|
+
const TEST_VERSION_ID = process.env.TEST_VERSION_ID;
|
|
17
|
+
|
|
18
|
+
// Store version ID from first test for subsequent tests
|
|
19
|
+
let fetchedVersionId: string | null = null;
|
|
20
|
+
|
|
21
|
+
const tests = [
|
|
22
|
+
{
|
|
23
|
+
name: "Get version by ID",
|
|
24
|
+
fn: async () => {
|
|
25
|
+
if (!TEST_VERSION_ID) {
|
|
26
|
+
logger.info("Skipped - TEST_VERSION_ID not set");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const version = await pm.versions.get(TEST_VERSION_ID);
|
|
30
|
+
if (!version) throw new Error("Version not found");
|
|
31
|
+
fetchedVersionId = version._id;
|
|
32
|
+
logger.data("Version ID", version._id);
|
|
33
|
+
logger.data("Version Number", version.version);
|
|
34
|
+
logger.data("Model ID", version.model_id);
|
|
35
|
+
logger.data("Env Label", version.env_label);
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
{
|
|
40
|
+
name: "Get version by template name + version number",
|
|
41
|
+
fn: async () => {
|
|
42
|
+
const version = await pm.versions.get(TEST_TEMPLATE_NAME, 1);
|
|
43
|
+
if (!version) throw new Error("Version not found");
|
|
44
|
+
fetchedVersionId = version._id;
|
|
45
|
+
logger.data("Version ID", version._id);
|
|
46
|
+
logger.data("Version Number", version.version);
|
|
47
|
+
logger.data("Messages Count", version.messages?.length || 0);
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
{
|
|
52
|
+
name: "Run version with variables",
|
|
53
|
+
fn: async () => {
|
|
54
|
+
const versionId = TEST_VERSION_ID || fetchedVersionId;
|
|
55
|
+
if (!versionId) {
|
|
56
|
+
logger.info("Skipped - No version ID available");
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const result = await pm.versions.run(versionId, {
|
|
61
|
+
variables: {
|
|
62
|
+
topic: "SDK Testing",
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
if (!result) throw new Error("Run failed");
|
|
67
|
+
logger.data("Request ID", result.request_id);
|
|
68
|
+
logger.data("Status", result.status);
|
|
69
|
+
logger.data("Latency", `${result.latency}s`);
|
|
70
|
+
logger.data("Total Tokens", result.llm_total_tokens);
|
|
71
|
+
logger.data("Total Cost", `$${result.total_cost}`);
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
{
|
|
76
|
+
name: "Run version with custom parameters",
|
|
77
|
+
fn: async () => {
|
|
78
|
+
const versionId = TEST_VERSION_ID || fetchedVersionId;
|
|
79
|
+
if (!versionId) {
|
|
80
|
+
logger.info("Skipped - No version ID available");
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const result = await pm.versions.run(versionId, {
|
|
85
|
+
variables: {
|
|
86
|
+
topic: "Parameter Override Test",
|
|
87
|
+
},
|
|
88
|
+
parameters: {
|
|
89
|
+
temperature: 0.5,
|
|
90
|
+
max_tokens: 100,
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
if (!result) throw new Error("Run failed");
|
|
95
|
+
logger.data("Request ID", result.request_id);
|
|
96
|
+
logger.data("Status", result.status);
|
|
97
|
+
logger.data("Completion Tokens", result.llm_completion_tokens);
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
{
|
|
102
|
+
name: "Run version with pm_tags",
|
|
103
|
+
fn: async () => {
|
|
104
|
+
const versionId = TEST_VERSION_ID || fetchedVersionId;
|
|
105
|
+
if (!versionId) {
|
|
106
|
+
logger.info("Skipped - No version ID available");
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const result = await pm.versions.run(versionId, {
|
|
111
|
+
variables: {
|
|
112
|
+
topic: "Tags Test",
|
|
113
|
+
},
|
|
114
|
+
pm_tags: ["sdk-test", "automated", "sample-project"],
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
if (!result) throw new Error("Run failed");
|
|
118
|
+
logger.data("Request ID", result.request_id);
|
|
119
|
+
logger.data("Status", result.status);
|
|
120
|
+
logger.data("Tags", result.tags);
|
|
121
|
+
|
|
122
|
+
// Verify tags are in response
|
|
123
|
+
if (result.tags && result.tags.includes("sdk-test")) {
|
|
124
|
+
logger.success("Tags verified in response!");
|
|
125
|
+
} else {
|
|
126
|
+
logger.info("Tags may not be returned in response yet");
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
|
|
131
|
+
{
|
|
132
|
+
name: "Update version metadata",
|
|
133
|
+
fn: async () => {
|
|
134
|
+
const versionId = TEST_VERSION_ID || fetchedVersionId;
|
|
135
|
+
if (!versionId) {
|
|
136
|
+
logger.info("Skipped - No version ID available");
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const updatedVersion = await pm.versions.update(versionId, {
|
|
141
|
+
metadata: {
|
|
142
|
+
tested_via: "SDK Sample Project",
|
|
143
|
+
tested_at: new Date().toISOString(),
|
|
144
|
+
test_run: true,
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
if (!updatedVersion) throw new Error("Update failed");
|
|
149
|
+
logger.data("Version ID", updatedVersion._id);
|
|
150
|
+
logger.data("Metadata", updatedVersion.metadata);
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
];
|
|
154
|
+
|
|
155
|
+
runTestSuite("Versions Test Suite", tests);
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Logger Utility
|
|
3
|
+
* Provides consistent logging for test output
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export const logger = {
|
|
7
|
+
test: (name: string) => {
|
|
8
|
+
console.log(`\n๐งช Testing: ${name}...`);
|
|
9
|
+
},
|
|
10
|
+
|
|
11
|
+
success: (message: string) => {
|
|
12
|
+
console.log(` โ
${message}`);
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
error: (message: string) => {
|
|
16
|
+
console.log(` โ ${message}`);
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
info: (message: string) => {
|
|
20
|
+
console.log(` โน๏ธ ${message}`);
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
data: (label: string, value: unknown) => {
|
|
24
|
+
console.log(` ๐ ${label}:`, value);
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
separator: () => {
|
|
28
|
+
console.log("\n" + "โ".repeat(60) + "\n");
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
header: (title: string) => {
|
|
32
|
+
console.log("\n" + "โ".repeat(60));
|
|
33
|
+
console.log(` ${title}`);
|
|
34
|
+
console.log("โ".repeat(60) + "\n");
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
summary: (passed: number, failed: number) => {
|
|
38
|
+
console.log("\n" + "โ".repeat(60));
|
|
39
|
+
console.log(` ๐ Summary: ${passed} passed, ${failed} failed`);
|
|
40
|
+
console.log("โ".repeat(60) + "\n");
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Test runner helper
|
|
46
|
+
*/
|
|
47
|
+
export async function runTest(
|
|
48
|
+
name: string,
|
|
49
|
+
testFn: () => Promise<void>
|
|
50
|
+
): Promise<boolean> {
|
|
51
|
+
logger.test(name);
|
|
52
|
+
try {
|
|
53
|
+
await testFn();
|
|
54
|
+
logger.success("Passed");
|
|
55
|
+
return true;
|
|
56
|
+
} catch (error) {
|
|
57
|
+
logger.error(`Failed: ${(error as Error).message}`);
|
|
58
|
+
if (process.env.DEBUG === "true") {
|
|
59
|
+
console.error(error);
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Run multiple tests and report summary
|
|
67
|
+
*/
|
|
68
|
+
export async function runTestSuite(
|
|
69
|
+
suiteName: string,
|
|
70
|
+
tests: Array<{ name: string; fn: () => Promise<void> }>
|
|
71
|
+
): Promise<void> {
|
|
72
|
+
logger.header(suiteName);
|
|
73
|
+
|
|
74
|
+
let passed = 0;
|
|
75
|
+
let failed = 0;
|
|
76
|
+
|
|
77
|
+
for (const test of tests) {
|
|
78
|
+
const result = await runTest(test.name, test.fn);
|
|
79
|
+
if (result) {
|
|
80
|
+
passed++;
|
|
81
|
+
} else {
|
|
82
|
+
failed++;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
logger.summary(passed, failed);
|
|
87
|
+
|
|
88
|
+
if (failed > 0) {
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"lib": ["ES2020"],
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
"rootDir": "./src",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"experimentalDecorators": true,
|
|
13
|
+
"emitDecoratorMetadata": true,
|
|
14
|
+
"resolveJsonModule": true,
|
|
15
|
+
"declaration": true,
|
|
16
|
+
"declarationMap": true,
|
|
17
|
+
"sourceMap": true
|
|
18
|
+
},
|
|
19
|
+
"include": ["src/**/*"],
|
|
20
|
+
"exclude": ["node_modules", "dist"]
|
|
21
|
+
}
|