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,145 @@
|
|
|
1
|
+
#!/usr/bin/env ts-node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Versions Test Suite
|
|
5
|
+
* Tests all version-related SDK operations
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
require("dotenv/config");
|
|
9
|
+
const sdk_1 = require("@promptmetrics/sdk");
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
const pm = new sdk_1.PromptMetrics({
|
|
12
|
+
apiKey: process.env.PROMPTMETRICS_API_KEY,
|
|
13
|
+
});
|
|
14
|
+
const TEST_TEMPLATE_NAME = process.env.TEST_TEMPLATE_NAME || "test-template";
|
|
15
|
+
const TEST_VERSION_ID = process.env.TEST_VERSION_ID;
|
|
16
|
+
// Store version ID from first test for subsequent tests
|
|
17
|
+
let fetchedVersionId = null;
|
|
18
|
+
const tests = [
|
|
19
|
+
{
|
|
20
|
+
name: "Get version by ID",
|
|
21
|
+
fn: async () => {
|
|
22
|
+
if (!TEST_VERSION_ID) {
|
|
23
|
+
logger_1.logger.info("Skipped - TEST_VERSION_ID not set");
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const version = await pm.versions.get(TEST_VERSION_ID);
|
|
27
|
+
if (!version)
|
|
28
|
+
throw new Error("Version not found");
|
|
29
|
+
fetchedVersionId = version._id;
|
|
30
|
+
logger_1.logger.data("Version ID", version._id);
|
|
31
|
+
logger_1.logger.data("Version Number", version.version);
|
|
32
|
+
logger_1.logger.data("Model ID", version.model_id);
|
|
33
|
+
logger_1.logger.data("Env Label", version.env_label);
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: "Get version by template name + version number",
|
|
38
|
+
fn: async () => {
|
|
39
|
+
const version = await pm.versions.get(TEST_TEMPLATE_NAME, 1);
|
|
40
|
+
if (!version)
|
|
41
|
+
throw new Error("Version not found");
|
|
42
|
+
fetchedVersionId = version._id;
|
|
43
|
+
logger_1.logger.data("Version ID", version._id);
|
|
44
|
+
logger_1.logger.data("Version Number", version.version);
|
|
45
|
+
logger_1.logger.data("Messages Count", version.messages?.length || 0);
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "Run version with variables",
|
|
50
|
+
fn: async () => {
|
|
51
|
+
const versionId = TEST_VERSION_ID || fetchedVersionId;
|
|
52
|
+
if (!versionId) {
|
|
53
|
+
logger_1.logger.info("Skipped - No version ID available");
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const result = await pm.versions.run(versionId, {
|
|
57
|
+
variables: {
|
|
58
|
+
topic: "SDK Testing",
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
if (!result)
|
|
62
|
+
throw new Error("Run failed");
|
|
63
|
+
logger_1.logger.data("Request ID", result.request_id);
|
|
64
|
+
logger_1.logger.data("Status", result.status);
|
|
65
|
+
logger_1.logger.data("Latency", `${result.latency}s`);
|
|
66
|
+
logger_1.logger.data("Total Tokens", result.llm_total_tokens);
|
|
67
|
+
logger_1.logger.data("Total Cost", `$${result.total_cost}`);
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: "Run version with custom parameters",
|
|
72
|
+
fn: async () => {
|
|
73
|
+
const versionId = TEST_VERSION_ID || fetchedVersionId;
|
|
74
|
+
if (!versionId) {
|
|
75
|
+
logger_1.logger.info("Skipped - No version ID available");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const result = await pm.versions.run(versionId, {
|
|
79
|
+
variables: {
|
|
80
|
+
topic: "Parameter Override Test",
|
|
81
|
+
},
|
|
82
|
+
parameters: {
|
|
83
|
+
temperature: 0.5,
|
|
84
|
+
max_tokens: 100,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
if (!result)
|
|
88
|
+
throw new Error("Run failed");
|
|
89
|
+
logger_1.logger.data("Request ID", result.request_id);
|
|
90
|
+
logger_1.logger.data("Status", result.status);
|
|
91
|
+
logger_1.logger.data("Completion Tokens", result.llm_completion_tokens);
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: "Run version with pm_tags",
|
|
96
|
+
fn: async () => {
|
|
97
|
+
const versionId = TEST_VERSION_ID || fetchedVersionId;
|
|
98
|
+
if (!versionId) {
|
|
99
|
+
logger_1.logger.info("Skipped - No version ID available");
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const result = await pm.versions.run(versionId, {
|
|
103
|
+
variables: {
|
|
104
|
+
topic: "Tags Test",
|
|
105
|
+
},
|
|
106
|
+
pm_tags: ["sdk-test", "automated", "sample-project"],
|
|
107
|
+
});
|
|
108
|
+
if (!result)
|
|
109
|
+
throw new Error("Run failed");
|
|
110
|
+
logger_1.logger.data("Request ID", result.request_id);
|
|
111
|
+
logger_1.logger.data("Status", result.status);
|
|
112
|
+
logger_1.logger.data("Tags", result.tags);
|
|
113
|
+
// Verify tags are in response
|
|
114
|
+
if (result.tags && result.tags.includes("sdk-test")) {
|
|
115
|
+
logger_1.logger.success("Tags verified in response!");
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
logger_1.logger.info("Tags may not be returned in response yet");
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: "Update version metadata",
|
|
124
|
+
fn: async () => {
|
|
125
|
+
const versionId = TEST_VERSION_ID || fetchedVersionId;
|
|
126
|
+
if (!versionId) {
|
|
127
|
+
logger_1.logger.info("Skipped - No version ID available");
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const updatedVersion = await pm.versions.update(versionId, {
|
|
131
|
+
metadata: {
|
|
132
|
+
tested_via: "SDK Sample Project",
|
|
133
|
+
tested_at: new Date().toISOString(),
|
|
134
|
+
test_run: true,
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
if (!updatedVersion)
|
|
138
|
+
throw new Error("Update failed");
|
|
139
|
+
logger_1.logger.data("Version ID", updatedVersion._id);
|
|
140
|
+
logger_1.logger.data("Metadata", updatedVersion.metadata);
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
];
|
|
144
|
+
(0, logger_1.runTestSuite)("Versions Test Suite", tests);
|
|
145
|
+
//# sourceMappingURL=versions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.test.js","sourceRoot":"","sources":["../../src/tests/versions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Logger Utility
|
|
3
|
+
* Provides consistent logging for test output
|
|
4
|
+
*/
|
|
5
|
+
export declare const logger: {
|
|
6
|
+
test: (name: string) => void;
|
|
7
|
+
success: (message: string) => void;
|
|
8
|
+
error: (message: string) => void;
|
|
9
|
+
info: (message: string) => void;
|
|
10
|
+
data: (label: string, value: unknown) => void;
|
|
11
|
+
separator: () => void;
|
|
12
|
+
header: (title: string) => void;
|
|
13
|
+
summary: (passed: number, failed: number) => void;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Test runner helper
|
|
17
|
+
*/
|
|
18
|
+
export declare function runTest(name: string, testFn: () => Promise<void>): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Run multiple tests and report summary
|
|
21
|
+
*/
|
|
22
|
+
export declare function runTestSuite(suiteName: string, tests: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
fn: () => Promise<void>;
|
|
25
|
+
}>): Promise<void>;
|
|
26
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,MAAM;iBACJ,MAAM;uBAIA,MAAM;qBAIR,MAAM;oBAIP,MAAM;kBAIR,MAAM,SAAS,OAAO;;oBAQpB,MAAM;sBAMJ,MAAM,UAAU,MAAM;CAKzC,CAAC;AAEF;;GAEG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAC1B,OAAO,CAAC,OAAO,CAAC,CAalB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,GACtD,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Test Logger Utility
|
|
4
|
+
* Provides consistent logging for test output
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.logger = void 0;
|
|
8
|
+
exports.runTest = runTest;
|
|
9
|
+
exports.runTestSuite = runTestSuite;
|
|
10
|
+
exports.logger = {
|
|
11
|
+
test: (name) => {
|
|
12
|
+
console.log(`\n๐งช Testing: ${name}...`);
|
|
13
|
+
},
|
|
14
|
+
success: (message) => {
|
|
15
|
+
console.log(` โ
${message}`);
|
|
16
|
+
},
|
|
17
|
+
error: (message) => {
|
|
18
|
+
console.log(` โ ${message}`);
|
|
19
|
+
},
|
|
20
|
+
info: (message) => {
|
|
21
|
+
console.log(` โน๏ธ ${message}`);
|
|
22
|
+
},
|
|
23
|
+
data: (label, value) => {
|
|
24
|
+
console.log(` ๐ ${label}:`, value);
|
|
25
|
+
},
|
|
26
|
+
separator: () => {
|
|
27
|
+
console.log("\n" + "โ".repeat(60) + "\n");
|
|
28
|
+
},
|
|
29
|
+
header: (title) => {
|
|
30
|
+
console.log("\n" + "โ".repeat(60));
|
|
31
|
+
console.log(` ${title}`);
|
|
32
|
+
console.log("โ".repeat(60) + "\n");
|
|
33
|
+
},
|
|
34
|
+
summary: (passed, failed) => {
|
|
35
|
+
console.log("\n" + "โ".repeat(60));
|
|
36
|
+
console.log(` ๐ Summary: ${passed} passed, ${failed} failed`);
|
|
37
|
+
console.log("โ".repeat(60) + "\n");
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Test runner helper
|
|
42
|
+
*/
|
|
43
|
+
async function runTest(name, testFn) {
|
|
44
|
+
exports.logger.test(name);
|
|
45
|
+
try {
|
|
46
|
+
await testFn();
|
|
47
|
+
exports.logger.success("Passed");
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
exports.logger.error(`Failed: ${error.message}`);
|
|
52
|
+
if (process.env.DEBUG === "true") {
|
|
53
|
+
console.error(error);
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Run multiple tests and report summary
|
|
60
|
+
*/
|
|
61
|
+
async function runTestSuite(suiteName, tests) {
|
|
62
|
+
exports.logger.header(suiteName);
|
|
63
|
+
let passed = 0;
|
|
64
|
+
let failed = 0;
|
|
65
|
+
for (const test of tests) {
|
|
66
|
+
const result = await runTest(test.name, test.fn);
|
|
67
|
+
if (result) {
|
|
68
|
+
passed++;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
failed++;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.logger.summary(passed, failed);
|
|
75
|
+
if (failed > 0) {
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "promptmetrics-sample",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"build": "tsc",
|
|
7
|
+
"start": "ts-node src/index.ts",
|
|
8
|
+
"test:templates": "ts-node src/tests/templates.test.ts",
|
|
9
|
+
"test:load": "ts-node src/tests/template-run-load.test.ts",
|
|
10
|
+
"test:versions": "ts-node src/tests/versions.test.ts",
|
|
11
|
+
"test:logs": "ts-node src/tests/logs.test.ts",
|
|
12
|
+
"test:providers": "ts-node src/tests/providers.test.ts",
|
|
13
|
+
"test:traces": "ts-node src/tests/traces.test.ts",
|
|
14
|
+
"test:traceable": "ts-node src/tests/traceable.test.ts",
|
|
15
|
+
"test:tags": "ts-node src/tests/tags.test.ts",
|
|
16
|
+
"test:all": "npm run test:templates && npm run test:versions && npm run test:logs && npm run test:providers && npm run test:traces && npm run test:traceable && npm run test:tags"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"promptmetrics",
|
|
20
|
+
"sdk",
|
|
21
|
+
"testing",
|
|
22
|
+
"llm"
|
|
23
|
+
],
|
|
24
|
+
"author": "",
|
|
25
|
+
"license": "ISC",
|
|
26
|
+
"description": "Sample project to test PromptMetrics SDK functionality",
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^25.0.3",
|
|
29
|
+
"dotenv": "^17.2.3",
|
|
30
|
+
"ts-node": "^10.9.2",
|
|
31
|
+
"typescript": "^5.9.3"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@promptmetrics/sdk": "^1.0.0"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
# PromptMetrics SDK Sample Project Plan
|
|
2
|
+
|
|
3
|
+
A sample Node.js/TypeScript project to test all SDK functionality by linking the `@promptmetrics/sdk` package via npm.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Project Overview
|
|
8
|
+
|
|
9
|
+
**Goal:** Create a comprehensive test project that validates all SDK features work correctly when installed as an npm package.
|
|
10
|
+
|
|
11
|
+
**Tech Stack:**
|
|
12
|
+
|
|
13
|
+
- Node.js 18+
|
|
14
|
+
- TypeScript
|
|
15
|
+
- npm (for package management)
|
|
16
|
+
- dotenv (for environment variables)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Project Structure
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
promptmetrics-sample/
|
|
24
|
+
โโโ src/
|
|
25
|
+
โ โโโ index.ts # Main entry point
|
|
26
|
+
โ โโโ tests/
|
|
27
|
+
โ โ โโโ templates.test.ts # Template operations tests
|
|
28
|
+
โ โ โโโ versions.test.ts # Version operations tests
|
|
29
|
+
โ โ โโโ logs.test.ts # Log operations tests
|
|
30
|
+
โ โ โโโ providers.test.ts # Provider operations tests
|
|
31
|
+
โ โ โโโ traces.test.ts # Trace operations tests
|
|
32
|
+
โ โ โโโ traceable.test.ts # @traceable decorator tests
|
|
33
|
+
โ โ โโโ tags.test.ts # pl_tags feature tests
|
|
34
|
+
โ โโโ utils/
|
|
35
|
+
โ โโโ logger.ts # Test logging utility
|
|
36
|
+
โโโ .env # Environment variables
|
|
37
|
+
โโโ .env.example # Example env file
|
|
38
|
+
โโโ package.json
|
|
39
|
+
โโโ tsconfig.json
|
|
40
|
+
โโโ README.md
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Setup Steps
|
|
46
|
+
|
|
47
|
+
### Step 1: Initialize Project
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
mkdir promptmetrics-sample
|
|
51
|
+
cd promptmetrics-sample
|
|
52
|
+
npm init -y
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Step 2: Install Dependencies
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# Install SDK (link locally for development or install from npm)
|
|
59
|
+
npm link ../promptmetrics-sdk # For local development
|
|
60
|
+
# OR
|
|
61
|
+
npm install @promptmetrics/sdk # For production
|
|
62
|
+
|
|
63
|
+
# Install dev dependencies
|
|
64
|
+
npm install -D typescript ts-node @types/node dotenv
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Step 3: Configure TypeScript
|
|
68
|
+
|
|
69
|
+
Create `tsconfig.json`:
|
|
70
|
+
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"compilerOptions": {
|
|
74
|
+
"target": "ES2020",
|
|
75
|
+
"module": "commonjs",
|
|
76
|
+
"lib": ["ES2020"],
|
|
77
|
+
"outDir": "./dist",
|
|
78
|
+
"rootDir": "./src",
|
|
79
|
+
"strict": true,
|
|
80
|
+
"esModuleInterop": true,
|
|
81
|
+
"skipLibCheck": true,
|
|
82
|
+
"forceConsistentCasingInFileNames": true,
|
|
83
|
+
"experimentalDecorators": true,
|
|
84
|
+
"emitDecoratorMetadata": true,
|
|
85
|
+
"resolveJsonModule": true
|
|
86
|
+
},
|
|
87
|
+
"include": ["src/**/*"],
|
|
88
|
+
"exclude": ["node_modules", "dist"]
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Step 4: Configure Environment
|
|
93
|
+
|
|
94
|
+
Create `.env`:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# Required
|
|
98
|
+
BASE_URL=http://localhost:3000
|
|
99
|
+
|
|
100
|
+
# Required
|
|
101
|
+
PROMPTMETRICS_API_KEY=pm_your_workspace_api_key
|
|
102
|
+
|
|
103
|
+
# Test data (update with your actual IDs)
|
|
104
|
+
TEST_TEMPLATE_NAME=test-template
|
|
105
|
+
TEST_VERSION_ID=your_version_id
|
|
106
|
+
TEST_TEMPLATE_ID=your_template_id
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Test Cases to Implement
|
|
112
|
+
|
|
113
|
+
### 1. Templates (`templates.test.ts`)
|
|
114
|
+
|
|
115
|
+
| Test | Description |
|
|
116
|
+
| ------------------------- | ------------------------------------------------------------ |
|
|
117
|
+
| `getTemplateByName` | Get template by name |
|
|
118
|
+
| `getTemplateById` | Get template by ID |
|
|
119
|
+
| `getTemplateWithVersion` | Get template with specific version number |
|
|
120
|
+
| `getTemplateWithEnvLabel` | Get template with env_label (production/staging/development) |
|
|
121
|
+
| `listTemplates` | List all templates with pagination |
|
|
122
|
+
| `listTemplatesWithSearch` | List templates with search filter |
|
|
123
|
+
|
|
124
|
+
### 2. Versions (`versions.test.ts`)
|
|
125
|
+
|
|
126
|
+
| Test | Description |
|
|
127
|
+
| ------------------------------- | ---------------------------------------------------- |
|
|
128
|
+
| `getVersionById` | Get version by ID |
|
|
129
|
+
| `getVersionByTemplateAndNumber` | Get version by template name + version number |
|
|
130
|
+
| `runVersion` | Run a version with variables |
|
|
131
|
+
| `runVersionWithParameters` | Run with custom parameters (temperature, max_tokens) |
|
|
132
|
+
| `runVersionWithModel` | Run with model override |
|
|
133
|
+
| `runVersionWithTags` | Run with pl_tags (new feature) |
|
|
134
|
+
| `updateVersionMetadata` | Update version metadata |
|
|
135
|
+
| `updateVersionEnvLabel` | Promote version to production |
|
|
136
|
+
|
|
137
|
+
### 3. Logs (`logs.test.ts`)
|
|
138
|
+
|
|
139
|
+
| Test | Description |
|
|
140
|
+
| --------------------- | -------------------------------------------------------- |
|
|
141
|
+
| `listLogs` | List all logs |
|
|
142
|
+
| `listLogsWithFilters` | List logs with template_id, status, date filters |
|
|
143
|
+
| `getLogById` | Get specific log by ID |
|
|
144
|
+
| `verifyLogHasTags` | Verify tags are stored in log (after runVersionWithTags) |
|
|
145
|
+
|
|
146
|
+
### 4. Providers (`providers.test.ts`)
|
|
147
|
+
|
|
148
|
+
| Test | Description |
|
|
149
|
+
| ------------------- | -------------------------------- |
|
|
150
|
+
| `listProviders` | List all LLM providers |
|
|
151
|
+
| `getProviderModels` | Get models for specific provider |
|
|
152
|
+
|
|
153
|
+
### 5. Traces (`traces.test.ts`)
|
|
154
|
+
|
|
155
|
+
| Test | Description |
|
|
156
|
+
| ------------------- | ------------------------------- |
|
|
157
|
+
| `createTrace` | Create a manual trace |
|
|
158
|
+
| `createBatchTraces` | Create multiple traces in batch |
|
|
159
|
+
| `getTraceBySpanId` | Get trace by span ID |
|
|
160
|
+
| `getTraceTree` | Get full trace tree by trace_id |
|
|
161
|
+
| `getTraceGroup` | Get traces by group_id |
|
|
162
|
+
| `listTraces` | List traces with filters |
|
|
163
|
+
| `addScore` | Add score to a trace |
|
|
164
|
+
| `updateMetadata` | Update trace metadata |
|
|
165
|
+
| `getAnalytics` | Get trace analytics |
|
|
166
|
+
|
|
167
|
+
### 6. Traceable Decorator (`traceable.test.ts`)
|
|
168
|
+
|
|
169
|
+
| Test | Description |
|
|
170
|
+
| ----------------------- | ------------------------------------------ |
|
|
171
|
+
| `basicTraceable` | Basic @traceable decorator usage |
|
|
172
|
+
| `traceableWithMetadata` | @traceable with static metadata |
|
|
173
|
+
| `traceableWithTags` | @traceable with tags |
|
|
174
|
+
| `nestedTraceable` | Nested @traceable functions (parent-child) |
|
|
175
|
+
| `traceableWithLLMCall` | @traceable with pm.versions.run inside |
|
|
176
|
+
| `trackMetadata` | pm.track.metadata() inside traced function |
|
|
177
|
+
| `trackScore` | pm.track.score() inside traced function |
|
|
178
|
+
| `trackGroup` | pm.track.group() for conversation grouping |
|
|
179
|
+
|
|
180
|
+
### 7. Tags Feature (`tags.test.ts`)
|
|
181
|
+
|
|
182
|
+
| Test | Description |
|
|
183
|
+
| --------------------- | ---------------------------------------------------------- |
|
|
184
|
+
| `runWithPlTags` | Run version with pl_tags array |
|
|
185
|
+
| `verifyTagsInLog` | Verify tags are stored in prompt log |
|
|
186
|
+
| `runWithoutTags` | Run without pl_tags (should inherit from template) |
|
|
187
|
+
| `verifyInheritedTags` | Verify template tags are inherited when pl_tags not passed |
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Implementation Plan
|
|
192
|
+
|
|
193
|
+
### Phase 1: Project Setup (Day 1)
|
|
194
|
+
|
|
195
|
+
- [ ] Create project directory structure
|
|
196
|
+
- [ ] Initialize npm and install dependencies
|
|
197
|
+
- [ ] Configure TypeScript
|
|
198
|
+
- [ ] Set up environment variables
|
|
199
|
+
- [ ] Create logger utility
|
|
200
|
+
|
|
201
|
+
### Phase 2: Core Tests (Day 2)
|
|
202
|
+
|
|
203
|
+
- [ ] Implement templates.test.ts
|
|
204
|
+
- [ ] Implement versions.test.ts
|
|
205
|
+
- [ ] Implement logs.test.ts
|
|
206
|
+
- [ ] Implement providers.test.ts
|
|
207
|
+
|
|
208
|
+
### Phase 3: Tracing Tests (Day 3)
|
|
209
|
+
|
|
210
|
+
- [ ] Implement traces.test.ts
|
|
211
|
+
- [ ] Implement traceable.test.ts
|
|
212
|
+
|
|
213
|
+
### Phase 4: New Features (Day 4)
|
|
214
|
+
|
|
215
|
+
- [ ] Implement tags.test.ts (pl_tags feature)
|
|
216
|
+
- [ ] Add comprehensive error handling tests
|
|
217
|
+
- [ ] Add edge case tests
|
|
218
|
+
|
|
219
|
+
### Phase 5: Documentation & Cleanup (Day 5)
|
|
220
|
+
|
|
221
|
+
- [ ] Write README with usage instructions
|
|
222
|
+
- [ ] Add npm scripts for running tests
|
|
223
|
+
- [ ] Clean up and finalize
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## npm Scripts
|
|
228
|
+
|
|
229
|
+
Add to `package.json`:
|
|
230
|
+
|
|
231
|
+
```json
|
|
232
|
+
{
|
|
233
|
+
"scripts": {
|
|
234
|
+
"build": "tsc",
|
|
235
|
+
"start": "ts-node src/index.ts",
|
|
236
|
+
"test:templates": "ts-node src/tests/templates.test.ts",
|
|
237
|
+
"test:versions": "ts-node src/tests/versions.test.ts",
|
|
238
|
+
"test:logs": "ts-node src/tests/logs.test.ts",
|
|
239
|
+
"test:providers": "ts-node src/tests/providers.test.ts",
|
|
240
|
+
"test:traces": "ts-node src/tests/traces.test.ts",
|
|
241
|
+
"test:traceable": "ts-node src/tests/traceable.test.ts",
|
|
242
|
+
"test:tags": "ts-node src/tests/tags.test.ts",
|
|
243
|
+
"test:all": "npm run test:templates && npm run test:versions && npm run test:logs && npm run test:providers && npm run test:traces && npm run test:traceable && npm run test:tags"
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Sample Test Implementation
|
|
251
|
+
|
|
252
|
+
### Example: `src/tests/versions.test.ts`
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
import "dotenv/config";
|
|
256
|
+
import { PromptMetrics } from "@promptmetrics/sdk";
|
|
257
|
+
|
|
258
|
+
const pm = new PromptMetrics({
|
|
259
|
+
apiKey: process.env.PROMPTMETRICS_API_KEY!,
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
async function testRunVersionWithTags() {
|
|
263
|
+
console.log("๐งช Testing: Run version with pl_tags...");
|
|
264
|
+
|
|
265
|
+
const result = await pm.versions.run(process.env.TEST_VERSION_ID!, {
|
|
266
|
+
variables: {
|
|
267
|
+
topic: "AI Testing",
|
|
268
|
+
},
|
|
269
|
+
pl_tags: ["sdk-test", "automated", "sample-project"],
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
console.log("โ
Success!");
|
|
273
|
+
console.log(" Request ID:", result.request_id);
|
|
274
|
+
console.log(" Tags:", result.tags);
|
|
275
|
+
console.log(" Status:", result.status);
|
|
276
|
+
|
|
277
|
+
// Verify tags are in response
|
|
278
|
+
if (result.tags?.includes("sdk-test")) {
|
|
279
|
+
console.log(" โ
Tags verified in response!");
|
|
280
|
+
} else {
|
|
281
|
+
console.log(" โ Tags not found in response");
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
async function main() {
|
|
286
|
+
try {
|
|
287
|
+
await testRunVersionWithTags();
|
|
288
|
+
} catch (error) {
|
|
289
|
+
console.error("โ Test failed:", error);
|
|
290
|
+
process.exit(1);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
main();
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## Success Criteria
|
|
300
|
+
|
|
301
|
+
- [ ] All SDK methods can be called without errors
|
|
302
|
+
- [ ] Templates can be fetched by name, ID, version, and env_label
|
|
303
|
+
- [ ] Versions can be run with variables, parameters, model overrides, and tags
|
|
304
|
+
- [ ] Logs are created and can be retrieved with correct data
|
|
305
|
+
- [ ] Traces are created via @traceable decorator and manual API
|
|
306
|
+
- [ ] LLM calls inside @traceable are automatically correlated
|
|
307
|
+
- [ ] pl_tags are stored in prompt logs correctly
|
|
308
|
+
- [ ] Error handling works as expected (authentication, validation, not found)
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Notes
|
|
313
|
+
|
|
314
|
+
- Make sure backend is running at `BASE_URL` before running tests
|
|
315
|
+
- Create test templates/versions in the UI before running tests
|
|
316
|
+
- Update `.env` with actual IDs from your workspace
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env ts-node
|
|
2
|
+
/**
|
|
3
|
+
* PromptMetrics SDK Sample Project
|
|
4
|
+
* Main entry point - runs all test suites
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import "dotenv/config";
|
|
8
|
+
import { logger } from "./utils/logger";
|
|
9
|
+
|
|
10
|
+
async function main() {
|
|
11
|
+
logger.header("PromptMetrics SDK Sample Project");
|
|
12
|
+
|
|
13
|
+
console.log("This project tests all SDK functionality.\n");
|
|
14
|
+
console.log("Available test commands:");
|
|
15
|
+
console.log(" npm run test:templates - Test template operations");
|
|
16
|
+
console.log(" npm run test:versions - Test version operations");
|
|
17
|
+
console.log(" npm run test:logs - Test log operations");
|
|
18
|
+
console.log(" npm run test:providers - Test provider operations");
|
|
19
|
+
console.log(" npm run test:traces - Test trace operations");
|
|
20
|
+
console.log(" npm run test:traceable - Test @traceable decorator");
|
|
21
|
+
console.log(" npm run test:tags - Test pm_tags feature");
|
|
22
|
+
console.log(" npm run test:all - Run all tests");
|
|
23
|
+
console.log("\nConfiguration:");
|
|
24
|
+
console.log(` BASE_URL: ${process.env.BASE_URL || "NOT SET"}`);
|
|
25
|
+
console.log(
|
|
26
|
+
` API_KEY: ${
|
|
27
|
+
process.env.PROMPTMETRICS_API_KEY ? "SET (pm_***)" : "NOT SET"
|
|
28
|
+
}`
|
|
29
|
+
);
|
|
30
|
+
console.log(
|
|
31
|
+
` TEST_TEMPLATE_NAME: ${process.env.TEST_TEMPLATE_NAME || "NOT SET"}`
|
|
32
|
+
);
|
|
33
|
+
console.log(` TEST_VERSION_ID: ${process.env.TEST_VERSION_ID || "NOT SET"}`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
main().catch(console.error);
|