@thinkhive/sdk 3.1.1 → 4.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.
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ /**
3
+ * ThinkHive SDK v3.0 - Deterministic Graders API
4
+ *
5
+ * API for running deterministic (code-based) evaluations
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.deterministicGraders = void 0;
9
+ exports.createRegexRule = createRegexRule;
10
+ exports.createContainsRule = createContainsRule;
11
+ exports.createLengthRule = createLengthRule;
12
+ exports.createJsonSchemaRule = createJsonSchemaRule;
13
+ exports.allRulesPassed = allRulesPassed;
14
+ exports.getFailedRules = getFailedRules;
15
+ exports.calculateAverageScore = calculateAverageScore;
16
+ const client_1 = require("../core/client");
17
+ // ============================================================================
18
+ // DETERMINISTIC GRADERS API CLIENT
19
+ // ============================================================================
20
+ /**
21
+ * Deterministic Graders API client for code-based evaluations
22
+ */
23
+ exports.deterministicGraders = {
24
+ /**
25
+ * Run deterministic evaluation on a single trace
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const result = await deterministicGraders.evaluate({
30
+ * traceId: 'trace_123',
31
+ * criterionId: 'criterion_456',
32
+ * });
33
+ * console.log(`Passed: ${result.passed}, Score: ${result.score}`);
34
+ * ```
35
+ */
36
+ async evaluate(options) {
37
+ return (0, client_1.apiRequestWithData)('/deterministic-graders/evaluate', {
38
+ method: 'POST',
39
+ body: options,
40
+ apiVersion: 'none',
41
+ });
42
+ },
43
+ /**
44
+ * Run deterministic evaluations on multiple traces
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const { results, summary } = await deterministicGraders.bulkEvaluate({
49
+ * evaluations: [
50
+ * { traceId: 'trace_1', criterionId: 'criterion_456' },
51
+ * { traceId: 'trace_2', criterionId: 'criterion_456' },
52
+ * { traceId: 'trace_3', criterionId: 'criterion_456' },
53
+ * ],
54
+ * });
55
+ * console.log(`Pass rate: ${summary.passRate * 100}%`);
56
+ * ```
57
+ */
58
+ async bulkEvaluate(options) {
59
+ return (0, client_1.apiRequestWithData)('/deterministic-graders/bulk-evaluate', {
60
+ method: 'POST',
61
+ body: options,
62
+ apiVersion: 'none',
63
+ });
64
+ },
65
+ /**
66
+ * Get available rule types with descriptions
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * const ruleTypes = await deterministicGraders.getRuleTypes();
71
+ * for (const type of ruleTypes) {
72
+ * console.log(`${type.name}: ${type.description}`);
73
+ * }
74
+ * ```
75
+ */
76
+ async getRuleTypes() {
77
+ return (0, client_1.apiRequestWithData)('/deterministic-graders/rule-types', { apiVersion: 'none' });
78
+ },
79
+ /**
80
+ * Get rule templates
81
+ *
82
+ * @example
83
+ * ```typescript
84
+ * const templates = await deterministicGraders.getTemplates();
85
+ * const noPiiTemplate = templates.find(t => t.id === 'no_pii');
86
+ * ```
87
+ */
88
+ async getTemplates() {
89
+ return (0, client_1.apiRequestWithData)('/deterministic-graders/templates', { apiVersion: 'none' });
90
+ },
91
+ };
92
+ // ============================================================================
93
+ // HELPER FUNCTIONS
94
+ // ============================================================================
95
+ /**
96
+ * Create a regex rule configuration
97
+ *
98
+ * @param pattern - Regular expression pattern
99
+ * @param flags - Regex flags (default: 'gi')
100
+ * @returns Rule configuration object
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * const config = createRegexRule('\\b(error|fail)\\b', 'gi');
105
+ * ```
106
+ */
107
+ function createRegexRule(pattern, flags = 'gi') {
108
+ return { pattern, flags };
109
+ }
110
+ /**
111
+ * Create a contains rule configuration
112
+ *
113
+ * @param values - Strings to check for
114
+ * @param caseSensitive - Whether comparison is case-sensitive
115
+ * @returns Rule configuration object
116
+ *
117
+ * @example
118
+ * ```typescript
119
+ * const config = createContainsRule(['hello', 'hi', 'hey'], false);
120
+ * ```
121
+ */
122
+ function createContainsRule(values, caseSensitive = false) {
123
+ return { values, caseSensitive };
124
+ }
125
+ /**
126
+ * Create a length rule configuration
127
+ *
128
+ * @param min - Minimum length (optional)
129
+ * @param max - Maximum length (optional)
130
+ * @returns Rule configuration object
131
+ *
132
+ * @example
133
+ * ```typescript
134
+ * const config = createLengthRule(50, 1000);
135
+ * ```
136
+ */
137
+ function createLengthRule(min, max) {
138
+ return { min, max };
139
+ }
140
+ /**
141
+ * Create a JSON schema rule configuration
142
+ *
143
+ * @param schema - JSON Schema object
144
+ * @returns Rule configuration object
145
+ *
146
+ * @example
147
+ * ```typescript
148
+ * const config = createJsonSchemaRule({
149
+ * type: 'object',
150
+ * required: ['name', 'email'],
151
+ * properties: {
152
+ * name: { type: 'string' },
153
+ * email: { type: 'string', format: 'email' },
154
+ * },
155
+ * });
156
+ * ```
157
+ */
158
+ function createJsonSchemaRule(schema) {
159
+ return { schema };
160
+ }
161
+ /**
162
+ * Check if all rule results passed
163
+ *
164
+ * @param results - Array of rule results
165
+ * @returns Whether all rules passed
166
+ */
167
+ function allRulesPassed(results) {
168
+ return results.every(r => r.passed);
169
+ }
170
+ /**
171
+ * Get failed rules from results
172
+ *
173
+ * @param results - Array of rule results
174
+ * @returns Array of failed rule results
175
+ */
176
+ function getFailedRules(results) {
177
+ return results.filter(r => !r.passed);
178
+ }
179
+ /**
180
+ * Calculate average score from rule results
181
+ *
182
+ * @param results - Array of rule results
183
+ * @returns Average score (0-100)
184
+ */
185
+ function calculateAverageScore(results) {
186
+ if (results.length === 0)
187
+ return 0;
188
+ const sum = results.reduce((acc, r) => acc + r.score, 0);
189
+ return sum / results.length;
190
+ }
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZXJtaW5pc3RpYy1ncmFkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9kZXRlcm1pbmlzdGljLWdyYWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQXNMSCwwQ0FFQztBQWNELGdEQUtDO0FBY0QsNENBRUM7QUFvQkQsb0RBRUM7QUFRRCx3Q0FFQztBQVFELHdDQUVDO0FBUUQsc0RBSUM7QUEvUUQsMkNBQW9EO0FBOEVwRCwrRUFBK0U7QUFDL0UsbUNBQW1DO0FBQ25DLCtFQUErRTtBQUUvRTs7R0FFRztBQUNVLFFBQUEsb0JBQW9CLEdBQUc7SUFDbEM7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQXdCO1FBQ3JDLE9BQU8sSUFBQSwyQkFBa0IsRUFBMEIsaUNBQWlDLEVBQUU7WUFDcEYsTUFBTSxFQUFFLE1BQU07WUFDZCxJQUFJLEVBQUUsT0FBTztZQUNiLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBNEI7UUFDN0MsT0FBTyxJQUFBLDJCQUFrQixFQUFxQixzQ0FBc0MsRUFBRTtZQUNwRixNQUFNLEVBQUUsTUFBTTtZQUNkLElBQUksRUFBRSxPQUFPO1lBQ2IsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsWUFBWTtRQUNoQixPQUFPLElBQUEsMkJBQWtCLEVBQ3ZCLG1DQUFtQyxFQUNuQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxZQUFZO1FBQ2hCLE9BQU8sSUFBQSwyQkFBa0IsRUFDdkIsa0NBQWtDLEVBQ2xDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUN2QixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUM7QUFFRiwrRUFBK0U7QUFDL0UsbUJBQW1CO0FBQ25CLCtFQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxPQUFlLEVBQUUsS0FBSyxHQUFHLElBQUk7SUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUM1QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FDaEMsTUFBZ0IsRUFDaEIsYUFBYSxHQUFHLEtBQUs7SUFFckIsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxHQUFZLEVBQUUsR0FBWTtJQUN6RCxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxNQUErQjtJQUNsRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLE9BQXFCO0lBQ2xELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixjQUFjLENBQUMsT0FBcUI7SUFDbEQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsT0FBcUI7SUFDekQsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekQsT0FBTyxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlua0hpdmUgU0RLIHYzLjAgLSBEZXRlcm1pbmlzdGljIEdyYWRlcnMgQVBJXG4gKlxuICogQVBJIGZvciBydW5uaW5nIGRldGVybWluaXN0aWMgKGNvZGUtYmFzZWQpIGV2YWx1YXRpb25zXG4gKi9cblxuaW1wb3J0IHsgYXBpUmVxdWVzdFdpdGhEYXRhIH0gZnJvbSAnLi4vY29yZS9jbGllbnQnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSBSdWxlVHlwZSA9XG4gIHwgJ3JlZ2V4J1xuICB8ICdjb250YWlucydcbiAgfCAnbm90X2NvbnRhaW5zJ1xuICB8ICdqc29uX3ZhbGlkJ1xuICB8ICdqc29uX3NjaGVtYSdcbiAgfCAnbGVuZ3RoJ1xuICB8ICdwaWlfY2hlY2snXG4gIHwgJ3NlbnRpbWVudCdcbiAgfCAnbGF0ZW5jeSdcbiAgfCAndG9rZW5fY291bnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERldGVybWluaXN0aWNFdmFsUmVzdWx0IHtcbiAgcGFzc2VkOiBib29sZWFuO1xuICBzY29yZTogbnVtYmVyO1xuICByZWFzb25pbmc6IHN0cmluZztcbiAgcnVsZVJlc3VsdHM/OiBSdWxlUmVzdWx0W107XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZVJlc3VsdCB7XG4gIHJ1bGVJZDogc3RyaW5nO1xuICBydWxlTmFtZTogc3RyaW5nO1xuICBydWxlVHlwZTogUnVsZVR5cGU7XG4gIHBhc3NlZDogYm9vbGVhbjtcbiAgc2NvcmU6IG51bWJlcjtcbiAgZGV0YWlscz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFdmFsdWF0ZU9wdGlvbnMge1xuICB0cmFjZUlkOiBzdHJpbmc7XG4gIGNyaXRlcmlvbklkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVsa0V2YWx1YXRlT3B0aW9ucyB7XG4gIGV2YWx1YXRpb25zOiBBcnJheTx7XG4gICAgdHJhY2VJZDogc3RyaW5nO1xuICAgIGNyaXRlcmlvbklkOiBzdHJpbmc7XG4gIH0+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1bGtFdmFsdWF0ZVJlc3VsdCB7XG4gIHJlc3VsdHM6IEFycmF5PHtcbiAgICB0cmFjZUlkOiBzdHJpbmc7XG4gICAgY3JpdGVyaW9uSWQ6IHN0cmluZztcbiAgICBwYXNzZWQ6IGJvb2xlYW47XG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICBlcnJvcj86IHN0cmluZztcbiAgfT47XG4gIHN1bW1hcnk6IHtcbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIHBhc3NlZDogbnVtYmVyO1xuICAgIGZhaWxlZDogbnVtYmVyO1xuICAgIHBhc3NSYXRlOiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZVR5cGVJbmZvIHtcbiAgaWQ6IFJ1bGVUeXBlO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNvbmZpZ0ZpZWxkczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZVRlbXBsYXRlIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBydWxlVHlwZTogUnVsZVR5cGU7XG4gIGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERFVEVSTUlOSVNUSUMgR1JBREVSUyBBUEkgQ0xJRU5UXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRGV0ZXJtaW5pc3RpYyBHcmFkZXJzIEFQSSBjbGllbnQgZm9yIGNvZGUtYmFzZWQgZXZhbHVhdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGRldGVybWluaXN0aWNHcmFkZXJzID0ge1xuICAvKipcbiAgICogUnVuIGRldGVybWluaXN0aWMgZXZhbHVhdGlvbiBvbiBhIHNpbmdsZSB0cmFjZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRldGVybWluaXN0aWNHcmFkZXJzLmV2YWx1YXRlKHtcbiAgICogICB0cmFjZUlkOiAndHJhY2VfMTIzJyxcbiAgICogICBjcml0ZXJpb25JZDogJ2NyaXRlcmlvbl80NTYnLFxuICAgKiB9KTtcbiAgICogY29uc29sZS5sb2coYFBhc3NlZDogJHtyZXN1bHQucGFzc2VkfSwgU2NvcmU6ICR7cmVzdWx0LnNjb3JlfWApO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGV2YWx1YXRlKG9wdGlvbnM6IEV2YWx1YXRlT3B0aW9ucyk6IFByb21pc2U8RGV0ZXJtaW5pc3RpY0V2YWxSZXN1bHQ+IHtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPERldGVybWluaXN0aWNFdmFsUmVzdWx0PignL2RldGVybWluaXN0aWMtZ3JhZGVycy9ldmFsdWF0ZScsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgIGFwaVZlcnNpb246ICdub25lJyxcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogUnVuIGRldGVybWluaXN0aWMgZXZhbHVhdGlvbnMgb24gbXVsdGlwbGUgdHJhY2VzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyByZXN1bHRzLCBzdW1tYXJ5IH0gPSBhd2FpdCBkZXRlcm1pbmlzdGljR3JhZGVycy5idWxrRXZhbHVhdGUoe1xuICAgKiAgIGV2YWx1YXRpb25zOiBbXG4gICAqICAgICB7IHRyYWNlSWQ6ICd0cmFjZV8xJywgY3JpdGVyaW9uSWQ6ICdjcml0ZXJpb25fNDU2JyB9LFxuICAgKiAgICAgeyB0cmFjZUlkOiAndHJhY2VfMicsIGNyaXRlcmlvbklkOiAnY3JpdGVyaW9uXzQ1NicgfSxcbiAgICogICAgIHsgdHJhY2VJZDogJ3RyYWNlXzMnLCBjcml0ZXJpb25JZDogJ2NyaXRlcmlvbl80NTYnIH0sXG4gICAqICAgXSxcbiAgICogfSk7XG4gICAqIGNvbnNvbGUubG9nKGBQYXNzIHJhdGU6ICR7c3VtbWFyeS5wYXNzUmF0ZSAqIDEwMH0lYCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYnVsa0V2YWx1YXRlKG9wdGlvbnM6IEJ1bGtFdmFsdWF0ZU9wdGlvbnMpOiBQcm9taXNlPEJ1bGtFdmFsdWF0ZVJlc3VsdD4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8QnVsa0V2YWx1YXRlUmVzdWx0PignL2RldGVybWluaXN0aWMtZ3JhZGVycy9idWxrLWV2YWx1YXRlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgYXZhaWxhYmxlIHJ1bGUgdHlwZXMgd2l0aCBkZXNjcmlwdGlvbnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBydWxlVHlwZXMgPSBhd2FpdCBkZXRlcm1pbmlzdGljR3JhZGVycy5nZXRSdWxlVHlwZXMoKTtcbiAgICogZm9yIChjb25zdCB0eXBlIG9mIHJ1bGVUeXBlcykge1xuICAgKiAgIGNvbnNvbGUubG9nKGAke3R5cGUubmFtZX06ICR7dHlwZS5kZXNjcmlwdGlvbn1gKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldFJ1bGVUeXBlcygpOiBQcm9taXNlPFJ1bGVUeXBlSW5mb1tdPiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxSdWxlVHlwZUluZm9bXT4oXG4gICAgICAnL2RldGVybWluaXN0aWMtZ3JhZGVycy9ydWxlLXR5cGVzJyxcbiAgICAgIHsgYXBpVmVyc2lvbjogJ25vbmUnIH1cbiAgICApO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgcnVsZSB0ZW1wbGF0ZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCBkZXRlcm1pbmlzdGljR3JhZGVycy5nZXRUZW1wbGF0ZXMoKTtcbiAgICogY29uc3Qgbm9QaWlUZW1wbGF0ZSA9IHRlbXBsYXRlcy5maW5kKHQgPT4gdC5pZCA9PT0gJ25vX3BpaScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldFRlbXBsYXRlcygpOiBQcm9taXNlPFJ1bGVUZW1wbGF0ZVtdPiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxSdWxlVGVtcGxhdGVbXT4oXG4gICAgICAnL2RldGVybWluaXN0aWMtZ3JhZGVycy90ZW1wbGF0ZXMnLFxuICAgICAgeyBhcGlWZXJzaW9uOiAnbm9uZScgfVxuICAgICk7XG4gIH0sXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVnZXggcnVsZSBjb25maWd1cmF0aW9uXG4gKlxuICogQHBhcmFtIHBhdHRlcm4gLSBSZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVyblxuICogQHBhcmFtIGZsYWdzIC0gUmVnZXggZmxhZ3MgKGRlZmF1bHQ6ICdnaScpXG4gKiBAcmV0dXJucyBSdWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNvbmZpZyA9IGNyZWF0ZVJlZ2V4UnVsZSgnXFxcXGIoZXJyb3J8ZmFpbClcXFxcYicsICdnaScpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWdleFJ1bGUocGF0dGVybjogc3RyaW5nLCBmbGFncyA9ICdnaScpOiB7IHBhdHRlcm46IHN0cmluZzsgZmxhZ3M6IHN0cmluZyB9IHtcbiAgcmV0dXJuIHsgcGF0dGVybiwgZmxhZ3MgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBjb250YWlucyBydWxlIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcGFyYW0gdmFsdWVzIC0gU3RyaW5ncyB0byBjaGVjayBmb3JcbiAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlIC0gV2hldGhlciBjb21wYXJpc29uIGlzIGNhc2Utc2Vuc2l0aXZlXG4gKiBAcmV0dXJucyBSdWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNvbmZpZyA9IGNyZWF0ZUNvbnRhaW5zUnVsZShbJ2hlbGxvJywgJ2hpJywgJ2hleSddLCBmYWxzZSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5zUnVsZShcbiAgdmFsdWVzOiBzdHJpbmdbXSxcbiAgY2FzZVNlbnNpdGl2ZSA9IGZhbHNlXG4pOiB7IHZhbHVlczogc3RyaW5nW107IGNhc2VTZW5zaXRpdmU6IGJvb2xlYW4gfSB7XG4gIHJldHVybiB7IHZhbHVlcywgY2FzZVNlbnNpdGl2ZSB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGxlbmd0aCBydWxlIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcGFyYW0gbWluIC0gTWluaW11bSBsZW5ndGggKG9wdGlvbmFsKVxuICogQHBhcmFtIG1heCAtIE1heGltdW0gbGVuZ3RoIChvcHRpb25hbClcbiAqIEByZXR1cm5zIFJ1bGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29uZmlnID0gY3JlYXRlTGVuZ3RoUnVsZSg1MCwgMTAwMCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxlbmd0aFJ1bGUobWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIpOiB7IG1pbj86IG51bWJlcjsgbWF4PzogbnVtYmVyIH0ge1xuICByZXR1cm4geyBtaW4sIG1heCB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIEpTT04gc2NoZW1hIHJ1bGUgY29uZmlndXJhdGlvblxuICpcbiAqIEBwYXJhbSBzY2hlbWEgLSBKU09OIFNjaGVtYSBvYmplY3RcbiAqIEByZXR1cm5zIFJ1bGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29uZmlnID0gY3JlYXRlSnNvblNjaGVtYVJ1bGUoe1xuICogICB0eXBlOiAnb2JqZWN0JyxcbiAqICAgcmVxdWlyZWQ6IFsnbmFtZScsICdlbWFpbCddLFxuICogICBwcm9wZXJ0aWVzOiB7XG4gKiAgICAgbmFtZTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICogICAgIGVtYWlsOiB7IHR5cGU6ICdzdHJpbmcnLCBmb3JtYXQ6ICdlbWFpbCcgfSxcbiAqICAgfSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKc29uU2NoZW1hUnVsZShzY2hlbWE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogeyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0ge1xuICByZXR1cm4geyBzY2hlbWEgfTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbGwgcnVsZSByZXN1bHRzIHBhc3NlZFxuICpcbiAqIEBwYXJhbSByZXN1bHRzIC0gQXJyYXkgb2YgcnVsZSByZXN1bHRzXG4gKiBAcmV0dXJucyBXaGV0aGVyIGFsbCBydWxlcyBwYXNzZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFsbFJ1bGVzUGFzc2VkKHJlc3VsdHM6IFJ1bGVSZXN1bHRbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVzdWx0cy5ldmVyeShyID0+IHIucGFzc2VkKTtcbn1cblxuLyoqXG4gKiBHZXQgZmFpbGVkIHJ1bGVzIGZyb20gcmVzdWx0c1xuICpcbiAqIEBwYXJhbSByZXN1bHRzIC0gQXJyYXkgb2YgcnVsZSByZXN1bHRzXG4gKiBAcmV0dXJucyBBcnJheSBvZiBmYWlsZWQgcnVsZSByZXN1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGYWlsZWRSdWxlcyhyZXN1bHRzOiBSdWxlUmVzdWx0W10pOiBSdWxlUmVzdWx0W10ge1xuICByZXR1cm4gcmVzdWx0cy5maWx0ZXIociA9PiAhci5wYXNzZWQpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBhdmVyYWdlIHNjb3JlIGZyb20gcnVsZSByZXN1bHRzXG4gKlxuICogQHBhcmFtIHJlc3VsdHMgLSBBcnJheSBvZiBydWxlIHJlc3VsdHNcbiAqIEByZXR1cm5zIEF2ZXJhZ2Ugc2NvcmUgKDAtMTAwKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlQXZlcmFnZVNjb3JlKHJlc3VsdHM6IFJ1bGVSZXN1bHRbXSk6IG51bWJlciB7XG4gIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gIGNvbnN0IHN1bSA9IHJlc3VsdHMucmVkdWNlKChhY2MsIHIpID0+IGFjYyArIHIuc2NvcmUsIDApO1xuICByZXR1cm4gc3VtIC8gcmVzdWx0cy5sZW5ndGg7XG59XG4iXX0=
@@ -0,0 +1,250 @@
1
+ /**
2
+ * ThinkHive SDK v3.0 - Evaluation Health API
3
+ *
4
+ * API for eval saturation monitoring, regression detection, and health reports
5
+ */
6
+ export type SaturationType = 'ceiling' | 'floor' | 'healthy';
7
+ export type HealthStatus = 'healthy' | 'warning' | 'critical';
8
+ export type RegressionSeverity = 'minor' | 'moderate' | 'severe';
9
+ export interface EvalHealthSnapshot {
10
+ id: string;
11
+ companyId: string;
12
+ agentId: string;
13
+ criterionId?: string;
14
+ snapshotDate: string;
15
+ passRate?: string;
16
+ evalCount?: number;
17
+ meanScore?: string;
18
+ saturationType?: SaturationType;
19
+ daysAtSaturation?: number;
20
+ trendDirection?: string;
21
+ trendStrength?: string;
22
+ healthStatus?: HealthStatus;
23
+ healthScore?: string;
24
+ createdAt: string;
25
+ }
26
+ export interface EvalRegression {
27
+ id: string;
28
+ companyId: string;
29
+ agentId: string;
30
+ criterionId?: string;
31
+ severity: RegressionSeverity;
32
+ baselinePassRate: string;
33
+ currentPassRate: string;
34
+ delta: string;
35
+ deltaPercent?: string;
36
+ baselinePeriodStart: string;
37
+ baselinePeriodEnd: string;
38
+ currentPeriodStart: string;
39
+ currentPeriodEnd: string;
40
+ baselineEvalCount?: number;
41
+ currentEvalCount?: number;
42
+ suspectedCauses?: unknown[];
43
+ isSignificant?: boolean;
44
+ isResolved: boolean;
45
+ isAcknowledged: boolean;
46
+ resolvedAt?: string;
47
+ resolvedBy?: string;
48
+ resolutionType?: string;
49
+ resolutionNotes?: string;
50
+ acknowledgedAt?: string;
51
+ acknowledgedBy?: string;
52
+ detectedAt: string;
53
+ createdAt: string;
54
+ }
55
+ export interface HealthReport {
56
+ agentId: string;
57
+ generatedAt: string;
58
+ overallHealth: HealthStatus;
59
+ overallScore: number;
60
+ passRate: number;
61
+ evalCount: number;
62
+ saturationStatus: {
63
+ type: SaturationType;
64
+ daysAtSaturation: number;
65
+ recommendation: string;
66
+ };
67
+ regressionCount: number;
68
+ activeRegressions: EvalRegression[];
69
+ trend: {
70
+ direction: 'improving' | 'stable' | 'declining';
71
+ strength: number;
72
+ description: string;
73
+ };
74
+ recommendations: string[];
75
+ }
76
+ export interface CreateSnapshotOptions {
77
+ agentId: string;
78
+ criterionId?: string;
79
+ snapshotDate: string;
80
+ passRate?: string;
81
+ evalCount?: number;
82
+ meanScore?: string;
83
+ saturationType?: SaturationType;
84
+ daysAtSaturation?: number;
85
+ trendDirection?: string;
86
+ trendStrength?: string;
87
+ healthStatus?: HealthStatus;
88
+ healthScore?: string;
89
+ }
90
+ export interface CreateRegressionOptions {
91
+ agentId: string;
92
+ criterionId?: string;
93
+ severity: RegressionSeverity;
94
+ baselinePassRate: string;
95
+ currentPassRate: string;
96
+ delta: string;
97
+ deltaPercent?: string;
98
+ baselinePeriodStart: string;
99
+ baselinePeriodEnd: string;
100
+ currentPeriodStart: string;
101
+ currentPeriodEnd: string;
102
+ baselineEvalCount?: number;
103
+ currentEvalCount?: number;
104
+ suspectedCauses?: unknown[];
105
+ isSignificant?: boolean;
106
+ detectedAt?: string;
107
+ }
108
+ export interface ResolveRegressionOptions {
109
+ resolutionType: string;
110
+ notes?: string;
111
+ }
112
+ export interface GetSnapshotsOptions {
113
+ agentId: string;
114
+ criterionId?: string;
115
+ startDate?: string;
116
+ endDate?: string;
117
+ }
118
+ /**
119
+ * Evaluation Health API client for monitoring eval quality and detecting regressions
120
+ */
121
+ export declare const evalHealth: {
122
+ /**
123
+ * Get comprehensive health report for an agent
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * const report = await evalHealth.getReport('agent_123');
128
+ * console.log(`Overall health: ${report.overallHealth}`);
129
+ * console.log(`Active regressions: ${report.regressionCount}`);
130
+ * ```
131
+ */
132
+ getReport(agentId: string): Promise<HealthReport>;
133
+ /**
134
+ * Get historical health snapshots
135
+ *
136
+ * @example
137
+ * ```typescript
138
+ * const snapshots = await evalHealth.getSnapshots({
139
+ * agentId: 'agent_123',
140
+ * startDate: '2024-01-01T00:00:00Z',
141
+ * endDate: '2024-01-31T23:59:59Z',
142
+ * });
143
+ * ```
144
+ */
145
+ getSnapshots(options: GetSnapshotsOptions): Promise<EvalHealthSnapshot[]>;
146
+ /**
147
+ * Get latest health snapshot
148
+ *
149
+ * @example
150
+ * ```typescript
151
+ * const snapshot = await evalHealth.getLatestSnapshot('agent_123');
152
+ * ```
153
+ */
154
+ getLatestSnapshot(agentId: string, criterionId?: string): Promise<EvalHealthSnapshot | null>;
155
+ /**
156
+ * Record a health snapshot
157
+ *
158
+ * @example
159
+ * ```typescript
160
+ * const snapshot = await evalHealth.recordSnapshot({
161
+ * agentId: 'agent_123',
162
+ * snapshotDate: new Date().toISOString(),
163
+ * passRate: '0.85',
164
+ * evalCount: 150,
165
+ * healthStatus: 'healthy',
166
+ * });
167
+ * ```
168
+ */
169
+ recordSnapshot(options: CreateSnapshotOptions): Promise<EvalHealthSnapshot>;
170
+ /**
171
+ * Get unresolved regressions for an agent
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * const regressions = await evalHealth.getRegressions('agent_123');
176
+ * for (const regression of regressions) {
177
+ * console.log(`${regression.severity}: ${regression.delta}% drop`);
178
+ * }
179
+ * ```
180
+ */
181
+ getRegressions(agentId: string): Promise<EvalRegression[]>;
182
+ /**
183
+ * Record a new regression
184
+ *
185
+ * @example
186
+ * ```typescript
187
+ * const regression = await evalHealth.recordRegression({
188
+ * agentId: 'agent_123',
189
+ * severity: 'moderate',
190
+ * baselinePassRate: '0.92',
191
+ * currentPassRate: '0.78',
192
+ * delta: '-0.14',
193
+ * baselinePeriodStart: '2024-01-01T00:00:00Z',
194
+ * baselinePeriodEnd: '2024-01-15T23:59:59Z',
195
+ * currentPeriodStart: '2024-01-16T00:00:00Z',
196
+ * currentPeriodEnd: '2024-01-31T23:59:59Z',
197
+ * });
198
+ * ```
199
+ */
200
+ recordRegression(options: CreateRegressionOptions): Promise<EvalRegression>;
201
+ /**
202
+ * Resolve a regression
203
+ *
204
+ * @example
205
+ * ```typescript
206
+ * await evalHealth.resolveRegression('regression_123', {
207
+ * resolutionType: 'fixed',
208
+ * notes: 'Updated prompt template to address quality issues',
209
+ * });
210
+ * ```
211
+ */
212
+ resolveRegression(regressionId: string, options: ResolveRegressionOptions): Promise<void>;
213
+ /**
214
+ * Acknowledge a regression
215
+ *
216
+ * @example
217
+ * ```typescript
218
+ * await evalHealth.acknowledgeRegression('regression_123');
219
+ * ```
220
+ */
221
+ acknowledgeRegression(regressionId: string): Promise<void>;
222
+ };
223
+ /**
224
+ * Check if health status indicates an issue
225
+ *
226
+ * @param status - Health status to check
227
+ * @returns Whether the status indicates a problem
228
+ */
229
+ export declare function hasHealthIssue(status: HealthStatus): boolean;
230
+ /**
231
+ * Get severity level as numeric value for sorting
232
+ *
233
+ * @param severity - Regression severity
234
+ * @returns Numeric severity (1-3, higher is worse)
235
+ */
236
+ export declare function getSeverityLevel(severity: RegressionSeverity): number;
237
+ /**
238
+ * Check if evaluation is saturated
239
+ *
240
+ * @param snapshot - Health snapshot to check
241
+ * @returns Whether evaluation is at ceiling or floor
242
+ */
243
+ export declare function isSaturated(snapshot: EvalHealthSnapshot): boolean;
244
+ /**
245
+ * Get recommendation for saturation type
246
+ *
247
+ * @param saturationType - Type of saturation
248
+ * @returns Recommendation string
249
+ */
250
+ export declare function getSaturationRecommendation(saturationType: SaturationType): string;