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.
Files changed (55) hide show
  1. package/.env.example +12 -0
  2. package/README.md +235 -0
  3. package/dist/index.d.ts +7 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +29 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/tests/logs.test.d.ts +7 -0
  8. package/dist/tests/logs.test.d.ts.map +1 -0
  9. package/dist/tests/logs.test.js +163 -0
  10. package/dist/tests/logs.test.js.map +1 -0
  11. package/dist/tests/providers.test.d.ts +7 -0
  12. package/dist/tests/providers.test.d.ts.map +1 -0
  13. package/dist/tests/providers.test.js +99 -0
  14. package/dist/tests/providers.test.js.map +1 -0
  15. package/dist/tests/tags.test.d.ts +7 -0
  16. package/dist/tests/tags.test.d.ts.map +1 -0
  17. package/dist/tests/tags.test.js +220 -0
  18. package/dist/tests/tags.test.js.map +1 -0
  19. package/dist/tests/template-run-load.test.d.ts +11 -0
  20. package/dist/tests/template-run-load.test.d.ts.map +1 -0
  21. package/dist/tests/template-run-load.test.js +245 -0
  22. package/dist/tests/template-run-load.test.js.map +1 -0
  23. package/dist/tests/templates.test.d.ts +7 -0
  24. package/dist/tests/templates.test.d.ts.map +1 -0
  25. package/dist/tests/templates.test.js +152 -0
  26. package/dist/tests/templates.test.js.map +1 -0
  27. package/dist/tests/traceable.test.d.ts +7 -0
  28. package/dist/tests/traceable.test.d.ts.map +1 -0
  29. package/dist/tests/traceable.test.js +300 -0
  30. package/dist/tests/traceable.test.js.map +1 -0
  31. package/dist/tests/traces.test.d.ts +7 -0
  32. package/dist/tests/traces.test.d.ts.map +1 -0
  33. package/dist/tests/traces.test.js +264 -0
  34. package/dist/tests/traces.test.js.map +1 -0
  35. package/dist/tests/versions.test.d.ts +7 -0
  36. package/dist/tests/versions.test.d.ts.map +1 -0
  37. package/dist/tests/versions.test.js +145 -0
  38. package/dist/tests/versions.test.js.map +1 -0
  39. package/dist/utils/logger.d.ts +26 -0
  40. package/dist/utils/logger.d.ts.map +1 -0
  41. package/dist/utils/logger.js +79 -0
  42. package/dist/utils/logger.js.map +1 -0
  43. package/package.json +36 -0
  44. package/sample-project-plan.md +316 -0
  45. package/src/index.ts +36 -0
  46. package/src/tests/logs.test.ts +180 -0
  47. package/src/tests/providers.test.ts +99 -0
  48. package/src/tests/tags.test.ts +237 -0
  49. package/src/tests/template-run-load.test.ts +332 -0
  50. package/src/tests/templates.test.ts +154 -0
  51. package/src/tests/traceable.test.ts +290 -0
  52. package/src/tests/traces.test.ts +298 -0
  53. package/src/tests/versions.test.ts +155 -0
  54. package/src/utils/logger.ts +91 -0
  55. 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":";;AACA;;;GAGG;;AAEH,yBAAuB;AACvB,4CAAmD;AACnD,4CAAuD;AAEvD,MAAM,EAAE,GAAG,IAAI,mBAAa,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAsB;CAC3C,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,eAAe,CAAC;AAC7E,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AAEpD,wDAAwD;AACxD,IAAI,gBAAgB,GAAkB,IAAI,CAAC;AAE3C,MAAM,KAAK,GAAG;IACZ;QACE,IAAI,EAAE,mBAAmB;QACzB,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,eAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACvD,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACnD,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC;YAC/B,eAAM,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YACvC,eAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/C,eAAM,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1C,eAAM,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;KACF;IAED;QACE,IAAI,EAAE,+CAA+C;QACrD,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACnD,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC;YAC/B,eAAM,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YACvC,eAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/C,eAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC;KACF;IAED;QACE,IAAI,EAAE,4BAA4B;QAClC,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,SAAS,GAAG,eAAe,IAAI,gBAAgB,CAAC;YACtD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,eAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE;gBAC9C,SAAS,EAAE;oBACT,KAAK,EAAE,aAAa;iBACrB;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YAC3C,eAAM,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAC7C,eAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,eAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;YAC7C,eAAM,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACrD,eAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACrD,CAAC;KACF;IAED;QACE,IAAI,EAAE,oCAAoC;QAC1C,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,SAAS,GAAG,eAAe,IAAI,gBAAgB,CAAC;YACtD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,eAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE;gBAC9C,SAAS,EAAE;oBACT,KAAK,EAAE,yBAAyB;iBACjC;gBACD,UAAU,EAAE;oBACV,WAAW,EAAE,GAAG;oBAChB,UAAU,EAAE,GAAG;iBAChB;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YAC3C,eAAM,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAC7C,eAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,eAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACjE,CAAC;KACF;IAED;QACE,IAAI,EAAE,0BAA0B;QAChC,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,SAAS,GAAG,eAAe,IAAI,gBAAgB,CAAC;YACtD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,eAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE;gBAC9C,SAAS,EAAE;oBACT,KAAK,EAAE,WAAW;iBACnB;gBACD,OAAO,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,gBAAgB,CAAC;aACrD,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YAC3C,eAAM,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAC7C,eAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,eAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAEjC,8BAA8B;YAC9B,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpD,eAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,eAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;KACF;IAED;QACE,IAAI,EAAE,yBAAyB;QAC/B,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,SAAS,GAAG,eAAe,IAAI,gBAAgB,CAAC;YACtD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,eAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE;gBACzD,QAAQ,EAAE;oBACR,UAAU,EAAE,oBAAoB;oBAChC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,cAAc;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YACtD,eAAM,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;YAC9C,eAAM,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC;KACF;CACF,CAAC;AAEF,IAAA,qBAAY,EAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC"}
@@ -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);