@thinkhive/sdk 4.1.0 → 4.2.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/dist/api/documents.d.ts +52 -0
- package/dist/api/documents.js +58 -0
- package/dist/api/drift.d.ts +70 -0
- package/dist/api/drift.js +71 -0
- package/dist/api/eval-runs.d.ts +126 -0
- package/dist/api/eval-runs.js +126 -0
- package/dist/api/llm-costs.d.ts +104 -0
- package/dist/api/llm-costs.js +81 -0
- package/dist/api/notifications.d.ts +103 -0
- package/dist/api/notifications.js +110 -0
- package/dist/api/sessions.d.ts +57 -0
- package/dist/api/sessions.js +49 -0
- package/dist/api/shadow-tests.d.ts +78 -0
- package/dist/api/shadow-tests.js +80 -0
- package/dist/api/signals.d.ts +177 -0
- package/dist/api/signals.js +172 -0
- package/dist/core/client.d.ts +2 -0
- package/dist/core/client.js +10 -4
- package/dist/guardrails.d.ts +70 -0
- package/dist/guardrails.js +34 -0
- package/dist/index.d.ts +105 -2
- package/dist/index.js +50 -4
- package/package.json +1 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ThinkHive SDK - Documents API
|
|
3
|
+
*
|
|
4
|
+
* Agent document management for RAG (Retrieval-Augmented Generation)
|
|
5
|
+
*/
|
|
6
|
+
/** An agent document used for RAG */
|
|
7
|
+
export interface Document {
|
|
8
|
+
id: string;
|
|
9
|
+
agentId: string;
|
|
10
|
+
fileName: string;
|
|
11
|
+
fileType: string;
|
|
12
|
+
fileSize: number;
|
|
13
|
+
status: string;
|
|
14
|
+
uploadedAt: string;
|
|
15
|
+
processedAt?: string;
|
|
16
|
+
metadata?: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
/** Upload response with signed URL or document details */
|
|
19
|
+
export interface DocumentUploadResponse {
|
|
20
|
+
document: Document;
|
|
21
|
+
uploadUrl?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Documents API client for managing agent RAG documents
|
|
25
|
+
*/
|
|
26
|
+
export declare const documents: {
|
|
27
|
+
/**
|
|
28
|
+
* List all documents for an agent
|
|
29
|
+
*
|
|
30
|
+
* @param agentId - The agent ID
|
|
31
|
+
* @returns List of documents
|
|
32
|
+
*/
|
|
33
|
+
list(agentId: string): Promise<Document[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Upload a document for an agent
|
|
36
|
+
*
|
|
37
|
+
* @param agentId - The agent ID
|
|
38
|
+
* @param fileName - Name of the file
|
|
39
|
+
* @param fileType - MIME type of the file
|
|
40
|
+
* @param fileSize - Size of the file in bytes
|
|
41
|
+
* @returns Upload response with document details
|
|
42
|
+
*/
|
|
43
|
+
upload(agentId: string, fileName: string, fileType: string, fileSize: number): Promise<DocumentUploadResponse>;
|
|
44
|
+
/**
|
|
45
|
+
* Delete a document from an agent
|
|
46
|
+
*
|
|
47
|
+
* @param agentId - The agent ID
|
|
48
|
+
* @param docId - The document ID to delete
|
|
49
|
+
*/
|
|
50
|
+
remove(agentId: string, docId: string): Promise<void>;
|
|
51
|
+
};
|
|
52
|
+
export { documents as default };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ThinkHive SDK - Documents API
|
|
4
|
+
*
|
|
5
|
+
* Agent document management for RAG (Retrieval-Augmented Generation)
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.default = exports.documents = void 0;
|
|
9
|
+
const client_1 = require("../core/client");
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// DOCUMENTS API CLIENT
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Documents API client for managing agent RAG documents
|
|
15
|
+
*/
|
|
16
|
+
exports.documents = {
|
|
17
|
+
/**
|
|
18
|
+
* List all documents for an agent
|
|
19
|
+
*
|
|
20
|
+
* @param agentId - The agent ID
|
|
21
|
+
* @returns List of documents
|
|
22
|
+
*/
|
|
23
|
+
async list(agentId) {
|
|
24
|
+
return (0, client_1.apiRequestWithData)(`/agents/${agentId}/documents`, {
|
|
25
|
+
apiVersion: 'none',
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
/**
|
|
29
|
+
* Upload a document for an agent
|
|
30
|
+
*
|
|
31
|
+
* @param agentId - The agent ID
|
|
32
|
+
* @param fileName - Name of the file
|
|
33
|
+
* @param fileType - MIME type of the file
|
|
34
|
+
* @param fileSize - Size of the file in bytes
|
|
35
|
+
* @returns Upload response with document details
|
|
36
|
+
*/
|
|
37
|
+
async upload(agentId, fileName, fileType, fileSize) {
|
|
38
|
+
return (0, client_1.apiRequestWithData)(`/agents/${agentId}/documents`, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
body: { fileName, fileType, fileSize },
|
|
41
|
+
apiVersion: 'none',
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
/**
|
|
45
|
+
* Delete a document from an agent
|
|
46
|
+
*
|
|
47
|
+
* @param agentId - The agent ID
|
|
48
|
+
* @param docId - The document ID to delete
|
|
49
|
+
*/
|
|
50
|
+
async remove(agentId, docId) {
|
|
51
|
+
return (0, client_1.apiRequest)(`/agents/${agentId}/documents/${docId}`, {
|
|
52
|
+
method: 'DELETE',
|
|
53
|
+
apiVersion: 'none',
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
exports.default = exports.documents;
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9kb2N1bWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVILDJDQUFnRTtBQXlCaEUsK0VBQStFO0FBQy9FLHVCQUF1QjtBQUN2QiwrRUFBK0U7QUFFL0U7O0dBRUc7QUFDVSxRQUFBLFNBQVMsR0FBRztJQUN2Qjs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBZTtRQUN4QixPQUFPLElBQUEsMkJBQWtCLEVBQWEsV0FBVyxPQUFPLFlBQVksRUFBRTtZQUNwRSxVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUNWLE9BQWUsRUFDZixRQUFnQixFQUNoQixRQUFnQixFQUNoQixRQUFnQjtRQUVoQixPQUFPLElBQUEsMkJBQWtCLEVBQXlCLFdBQVcsT0FBTyxZQUFZLEVBQUU7WUFDaEYsTUFBTSxFQUFFLE1BQU07WUFDZCxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtZQUN0QyxVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQWUsRUFBRSxLQUFhO1FBQ3pDLE9BQU8sSUFBQSxtQkFBVSxFQUFPLFdBQVcsT0FBTyxjQUFjLEtBQUssRUFBRSxFQUFFO1lBQy9ELE1BQU0sRUFBRSxRQUFRO1lBQ2hCLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRixDQUFDO0FBRW9CLGtCQWpEVCxpQkFBUyxDQWlETyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpbmtIaXZlIFNESyAtIERvY3VtZW50cyBBUElcbiAqXG4gKiBBZ2VudCBkb2N1bWVudCBtYW5hZ2VtZW50IGZvciBSQUcgKFJldHJpZXZhbC1BdWdtZW50ZWQgR2VuZXJhdGlvbilcbiAqL1xuXG5pbXBvcnQgeyBhcGlSZXF1ZXN0LCBhcGlSZXF1ZXN0V2l0aERhdGEgfSBmcm9tICcuLi9jb3JlL2NsaWVudCc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBBbiBhZ2VudCBkb2N1bWVudCB1c2VkIGZvciBSQUcgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnQge1xuICBpZDogc3RyaW5nO1xuICBhZ2VudElkOiBzdHJpbmc7XG4gIGZpbGVOYW1lOiBzdHJpbmc7XG4gIGZpbGVUeXBlOiBzdHJpbmc7XG4gIGZpbGVTaXplOiBudW1iZXI7XG4gIHN0YXR1czogc3RyaW5nO1xuICB1cGxvYWRlZEF0OiBzdHJpbmc7XG4gIHByb2Nlc3NlZEF0Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogVXBsb2FkIHJlc3BvbnNlIHdpdGggc2lnbmVkIFVSTCBvciBkb2N1bWVudCBkZXRhaWxzICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50VXBsb2FkUmVzcG9uc2Uge1xuICBkb2N1bWVudDogRG9jdW1lbnQ7XG4gIHVwbG9hZFVybD86IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRE9DVU1FTlRTIEFQSSBDTElFTlRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBEb2N1bWVudHMgQVBJIGNsaWVudCBmb3IgbWFuYWdpbmcgYWdlbnQgUkFHIGRvY3VtZW50c1xuICovXG5leHBvcnQgY29uc3QgZG9jdW1lbnRzID0ge1xuICAvKipcbiAgICogTGlzdCBhbGwgZG9jdW1lbnRzIGZvciBhbiBhZ2VudFxuICAgKlxuICAgKiBAcGFyYW0gYWdlbnRJZCAtIFRoZSBhZ2VudCBJRFxuICAgKiBAcmV0dXJucyBMaXN0IG9mIGRvY3VtZW50c1xuICAgKi9cbiAgYXN5bmMgbGlzdChhZ2VudElkOiBzdHJpbmcpOiBQcm9taXNlPERvY3VtZW50W10+IHtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPERvY3VtZW50W10+KGAvYWdlbnRzLyR7YWdlbnRJZH0vZG9jdW1lbnRzYCwge1xuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBVcGxvYWQgYSBkb2N1bWVudCBmb3IgYW4gYWdlbnRcbiAgICpcbiAgICogQHBhcmFtIGFnZW50SWQgLSBUaGUgYWdlbnQgSURcbiAgICogQHBhcmFtIGZpbGVOYW1lIC0gTmFtZSBvZiB0aGUgZmlsZVxuICAgKiBAcGFyYW0gZmlsZVR5cGUgLSBNSU1FIHR5cGUgb2YgdGhlIGZpbGVcbiAgICogQHBhcmFtIGZpbGVTaXplIC0gU2l6ZSBvZiB0aGUgZmlsZSBpbiBieXRlc1xuICAgKiBAcmV0dXJucyBVcGxvYWQgcmVzcG9uc2Ugd2l0aCBkb2N1bWVudCBkZXRhaWxzXG4gICAqL1xuICBhc3luYyB1cGxvYWQoXG4gICAgYWdlbnRJZDogc3RyaW5nLFxuICAgIGZpbGVOYW1lOiBzdHJpbmcsXG4gICAgZmlsZVR5cGU6IHN0cmluZyxcbiAgICBmaWxlU2l6ZTogbnVtYmVyXG4gICk6IFByb21pc2U8RG9jdW1lbnRVcGxvYWRSZXNwb25zZT4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8RG9jdW1lbnRVcGxvYWRSZXNwb25zZT4oYC9hZ2VudHMvJHthZ2VudElkfS9kb2N1bWVudHNgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHsgZmlsZU5hbWUsIGZpbGVUeXBlLCBmaWxlU2l6ZSB9LFxuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBkb2N1bWVudCBmcm9tIGFuIGFnZW50XG4gICAqXG4gICAqIEBwYXJhbSBhZ2VudElkIC0gVGhlIGFnZW50IElEXG4gICAqIEBwYXJhbSBkb2NJZCAtIFRoZSBkb2N1bWVudCBJRCB0byBkZWxldGVcbiAgICovXG4gIGFzeW5jIHJlbW92ZShhZ2VudElkOiBzdHJpbmcsIGRvY0lkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXBpUmVxdWVzdDx2b2lkPihgL2FnZW50cy8ke2FnZW50SWR9L2RvY3VtZW50cy8ke2RvY0lkfWAsIHtcbiAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICBhcGlWZXJzaW9uOiAnbm9uZScsXG4gICAgfSk7XG4gIH0sXG59O1xuXG5leHBvcnQgeyBkb2N1bWVudHMgYXMgZGVmYXVsdCB9O1xuIl19
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ThinkHive SDK - Drift API
|
|
3
|
+
*
|
|
4
|
+
* Drift detection for monitoring agent behavior changes over time
|
|
5
|
+
*/
|
|
6
|
+
/** Options for drift detection */
|
|
7
|
+
export interface DetectDriftOptions {
|
|
8
|
+
startDate?: string;
|
|
9
|
+
endDate?: string;
|
|
10
|
+
}
|
|
11
|
+
/** A drift detection report */
|
|
12
|
+
export interface DriftReport {
|
|
13
|
+
agentId: string;
|
|
14
|
+
hasDrift: boolean;
|
|
15
|
+
severity: 'none' | 'low' | 'medium' | 'high';
|
|
16
|
+
driftScore: number;
|
|
17
|
+
dimensions: DriftDimension[];
|
|
18
|
+
analyzedFrom: string;
|
|
19
|
+
analyzedTo: string;
|
|
20
|
+
traceCount: number;
|
|
21
|
+
}
|
|
22
|
+
/** A dimension of drift analysis */
|
|
23
|
+
export interface DriftDimension {
|
|
24
|
+
name: string;
|
|
25
|
+
baseline: number;
|
|
26
|
+
current: number;
|
|
27
|
+
change: number;
|
|
28
|
+
changePercent: number;
|
|
29
|
+
isSignificant: boolean;
|
|
30
|
+
}
|
|
31
|
+
/** Result of detect-all operation */
|
|
32
|
+
export interface DetectAllResult {
|
|
33
|
+
reports: DriftReport[];
|
|
34
|
+
agentsAnalyzed: number;
|
|
35
|
+
agentsWithDrift: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Drift API client for monitoring agent behavior changes
|
|
39
|
+
*/
|
|
40
|
+
export declare const drift: {
|
|
41
|
+
/**
|
|
42
|
+
* Detect drift for a specific agent
|
|
43
|
+
*
|
|
44
|
+
* @param agentId - The agent ID to analyze
|
|
45
|
+
* @param opts - Date range options
|
|
46
|
+
* @returns Drift detection report
|
|
47
|
+
*/
|
|
48
|
+
detect(agentId: string, opts?: DetectDriftOptions): Promise<DriftReport>;
|
|
49
|
+
/**
|
|
50
|
+
* Run drift detection across all agents
|
|
51
|
+
*
|
|
52
|
+
* @returns Drift reports for all agents
|
|
53
|
+
*/
|
|
54
|
+
detectAll(): Promise<DetectAllResult>;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Check if a drift report indicates drift was detected
|
|
58
|
+
*
|
|
59
|
+
* @param report - The drift report to check
|
|
60
|
+
* @returns Whether drift was detected
|
|
61
|
+
*/
|
|
62
|
+
export declare function hasDrift(report: DriftReport): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Get the severity level of a drift report
|
|
65
|
+
*
|
|
66
|
+
* @param report - The drift report to check
|
|
67
|
+
* @returns The drift severity level
|
|
68
|
+
*/
|
|
69
|
+
export declare function getDriftSeverity(report: DriftReport): 'none' | 'low' | 'medium' | 'high';
|
|
70
|
+
export { drift as default };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ThinkHive SDK - Drift API
|
|
4
|
+
*
|
|
5
|
+
* Drift detection for monitoring agent behavior changes over time
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.default = exports.drift = void 0;
|
|
9
|
+
exports.hasDrift = hasDrift;
|
|
10
|
+
exports.getDriftSeverity = getDriftSeverity;
|
|
11
|
+
const client_1 = require("../core/client");
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// DRIFT API CLIENT
|
|
14
|
+
// ============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Drift API client for monitoring agent behavior changes
|
|
17
|
+
*/
|
|
18
|
+
exports.drift = {
|
|
19
|
+
/**
|
|
20
|
+
* Detect drift for a specific agent
|
|
21
|
+
*
|
|
22
|
+
* @param agentId - The agent ID to analyze
|
|
23
|
+
* @param opts - Date range options
|
|
24
|
+
* @returns Drift detection report
|
|
25
|
+
*/
|
|
26
|
+
async detect(agentId, opts) {
|
|
27
|
+
const params = new URLSearchParams();
|
|
28
|
+
if (opts?.startDate)
|
|
29
|
+
params.set('startDate', opts.startDate);
|
|
30
|
+
if (opts?.endDate)
|
|
31
|
+
params.set('endDate', opts.endDate);
|
|
32
|
+
const query = params.toString();
|
|
33
|
+
return (0, client_1.apiRequestWithData)(`/drift/${agentId}${query ? `?${query}` : ''}`, {
|
|
34
|
+
apiVersion: 'none',
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
/**
|
|
38
|
+
* Run drift detection across all agents
|
|
39
|
+
*
|
|
40
|
+
* @returns Drift reports for all agents
|
|
41
|
+
*/
|
|
42
|
+
async detectAll() {
|
|
43
|
+
return (0, client_1.apiRequestWithData)('/drift/detect-all', {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
apiVersion: 'none',
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
exports.default = exports.drift;
|
|
50
|
+
// ============================================================================
|
|
51
|
+
// HELPER FUNCTIONS
|
|
52
|
+
// ============================================================================
|
|
53
|
+
/**
|
|
54
|
+
* Check if a drift report indicates drift was detected
|
|
55
|
+
*
|
|
56
|
+
* @param report - The drift report to check
|
|
57
|
+
* @returns Whether drift was detected
|
|
58
|
+
*/
|
|
59
|
+
function hasDrift(report) {
|
|
60
|
+
return report.hasDrift;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get the severity level of a drift report
|
|
64
|
+
*
|
|
65
|
+
* @param report - The drift report to check
|
|
66
|
+
* @returns The drift severity level
|
|
67
|
+
*/
|
|
68
|
+
function getDriftSeverity(report) {
|
|
69
|
+
return report.severity;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpZnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2RyaWZ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOzs7QUE0RkgsNEJBRUM7QUFRRCw0Q0FFQztBQXRHRCwyQ0FBb0Q7QUF5Q3BELCtFQUErRTtBQUMvRSxtQkFBbUI7QUFDbkIsK0VBQStFO0FBRS9FOztHQUVHO0FBQ1UsUUFBQSxLQUFLLEdBQUc7SUFDbkI7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFlLEVBQUUsSUFBeUI7UUFDckQsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNyQyxJQUFJLElBQUksRUFBRSxTQUFTO1lBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdELElBQUksSUFBSSxFQUFFLE9BQU87WUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdkQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sSUFBQSwyQkFBa0IsRUFBYyxVQUFVLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3JGLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFNBQVM7UUFDYixPQUFPLElBQUEsMkJBQWtCLEVBQWtCLG1CQUFtQixFQUFFO1lBQzlELE1BQU0sRUFBRSxNQUFNO1lBQ2QsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGLENBQUM7QUEwQmdCLGtCQXhETCxhQUFLLENBd0RPO0FBeEJ6QiwrRUFBK0U7QUFDL0UsbUJBQW1CO0FBQ25CLCtFQUErRTtBQUUvRTs7Ozs7R0FLRztBQUNILFNBQWdCLFFBQVEsQ0FBQyxNQUFtQjtJQUMxQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsTUFBbUI7SUFDbEQsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaW5rSGl2ZSBTREsgLSBEcmlmdCBBUElcbiAqXG4gKiBEcmlmdCBkZXRlY3Rpb24gZm9yIG1vbml0b3JpbmcgYWdlbnQgYmVoYXZpb3IgY2hhbmdlcyBvdmVyIHRpbWVcbiAqL1xuXG5pbXBvcnQgeyBhcGlSZXF1ZXN0V2l0aERhdGEgfSBmcm9tICcuLi9jb3JlL2NsaWVudCc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBPcHRpb25zIGZvciBkcmlmdCBkZXRlY3Rpb24gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGV0ZWN0RHJpZnRPcHRpb25zIHtcbiAgc3RhcnREYXRlPzogc3RyaW5nO1xuICBlbmREYXRlPzogc3RyaW5nO1xufVxuXG4vKiogQSBkcmlmdCBkZXRlY3Rpb24gcmVwb3J0ICovXG5leHBvcnQgaW50ZXJmYWNlIERyaWZ0UmVwb3J0IHtcbiAgYWdlbnRJZDogc3RyaW5nO1xuICBoYXNEcmlmdDogYm9vbGVhbjtcbiAgc2V2ZXJpdHk6ICdub25lJyB8ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCc7XG4gIGRyaWZ0U2NvcmU6IG51bWJlcjtcbiAgZGltZW5zaW9uczogRHJpZnREaW1lbnNpb25bXTtcbiAgYW5hbHl6ZWRGcm9tOiBzdHJpbmc7XG4gIGFuYWx5emVkVG86IHN0cmluZztcbiAgdHJhY2VDb3VudDogbnVtYmVyO1xufVxuXG4vKiogQSBkaW1lbnNpb24gb2YgZHJpZnQgYW5hbHlzaXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHJpZnREaW1lbnNpb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGJhc2VsaW5lOiBudW1iZXI7XG4gIGN1cnJlbnQ6IG51bWJlcjtcbiAgY2hhbmdlOiBudW1iZXI7XG4gIGNoYW5nZVBlcmNlbnQ6IG51bWJlcjtcbiAgaXNTaWduaWZpY2FudDogYm9vbGVhbjtcbn1cblxuLyoqIFJlc3VsdCBvZiBkZXRlY3QtYWxsIG9wZXJhdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXRlY3RBbGxSZXN1bHQge1xuICByZXBvcnRzOiBEcmlmdFJlcG9ydFtdO1xuICBhZ2VudHNBbmFseXplZDogbnVtYmVyO1xuICBhZ2VudHNXaXRoRHJpZnQ6IG51bWJlcjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRFJJRlQgQVBJIENMSUVOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIERyaWZ0IEFQSSBjbGllbnQgZm9yIG1vbml0b3JpbmcgYWdlbnQgYmVoYXZpb3IgY2hhbmdlc1xuICovXG5leHBvcnQgY29uc3QgZHJpZnQgPSB7XG4gIC8qKlxuICAgKiBEZXRlY3QgZHJpZnQgZm9yIGEgc3BlY2lmaWMgYWdlbnRcbiAgICpcbiAgICogQHBhcmFtIGFnZW50SWQgLSBUaGUgYWdlbnQgSUQgdG8gYW5hbHl6ZVxuICAgKiBAcGFyYW0gb3B0cyAtIERhdGUgcmFuZ2Ugb3B0aW9uc1xuICAgKiBAcmV0dXJucyBEcmlmdCBkZXRlY3Rpb24gcmVwb3J0XG4gICAqL1xuICBhc3luYyBkZXRlY3QoYWdlbnRJZDogc3RyaW5nLCBvcHRzPzogRGV0ZWN0RHJpZnRPcHRpb25zKTogUHJvbWlzZTxEcmlmdFJlcG9ydD4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBpZiAob3B0cz8uc3RhcnREYXRlKSBwYXJhbXMuc2V0KCdzdGFydERhdGUnLCBvcHRzLnN0YXJ0RGF0ZSk7XG4gICAgaWYgKG9wdHM/LmVuZERhdGUpIHBhcmFtcy5zZXQoJ2VuZERhdGUnLCBvcHRzLmVuZERhdGUpO1xuXG4gICAgY29uc3QgcXVlcnkgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gYXBpUmVxdWVzdFdpdGhEYXRhPERyaWZ0UmVwb3J0PihgL2RyaWZ0LyR7YWdlbnRJZH0ke3F1ZXJ5ID8gYD8ke3F1ZXJ5fWAgOiAnJ31gLCB7XG4gICAgICBhcGlWZXJzaW9uOiAnbm9uZScsXG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJ1biBkcmlmdCBkZXRlY3Rpb24gYWNyb3NzIGFsbCBhZ2VudHNcbiAgICpcbiAgICogQHJldHVybnMgRHJpZnQgcmVwb3J0cyBmb3IgYWxsIGFnZW50c1xuICAgKi9cbiAgYXN5bmMgZGV0ZWN0QWxsKCk6IFByb21pc2U8RGV0ZWN0QWxsUmVzdWx0PiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxEZXRlY3RBbGxSZXN1bHQ+KCcvZHJpZnQvZGV0ZWN0LWFsbCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENoZWNrIGlmIGEgZHJpZnQgcmVwb3J0IGluZGljYXRlcyBkcmlmdCB3YXMgZGV0ZWN0ZWRcbiAqXG4gKiBAcGFyYW0gcmVwb3J0IC0gVGhlIGRyaWZ0IHJlcG9ydCB0byBjaGVja1xuICogQHJldHVybnMgV2hldGhlciBkcmlmdCB3YXMgZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0RyaWZ0KHJlcG9ydDogRHJpZnRSZXBvcnQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9ydC5oYXNEcmlmdDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNldmVyaXR5IGxldmVsIG9mIGEgZHJpZnQgcmVwb3J0XG4gKlxuICogQHBhcmFtIHJlcG9ydCAtIFRoZSBkcmlmdCByZXBvcnQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRoZSBkcmlmdCBzZXZlcml0eSBsZXZlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHJpZnRTZXZlcml0eShyZXBvcnQ6IERyaWZ0UmVwb3J0KTogJ25vbmUnIHwgJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB7XG4gIHJldHVybiByZXBvcnQuc2V2ZXJpdHk7XG59XG5cbmV4cG9ydCB7IGRyaWZ0IGFzIGRlZmF1bHQgfTtcbiJdfQ==
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ThinkHive SDK - Eval Runs API
|
|
3
|
+
*
|
|
4
|
+
* Evaluation run management for agent quality assessment
|
|
5
|
+
*/
|
|
6
|
+
/** Options for creating an evaluation run */
|
|
7
|
+
export interface CreateEvalRunOptions {
|
|
8
|
+
traceIds?: string[];
|
|
9
|
+
criteriaIds?: string[];
|
|
10
|
+
confidenceLevel?: number;
|
|
11
|
+
useLLM?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/** Options for listing evaluation run results */
|
|
14
|
+
export interface GetEvalRunResultsOptions {
|
|
15
|
+
limit?: number;
|
|
16
|
+
offset?: number;
|
|
17
|
+
passedOnly?: boolean;
|
|
18
|
+
failedOnly?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** Options for listing evaluation runs */
|
|
21
|
+
export interface ListEvalRunsOptions {
|
|
22
|
+
agentId?: string;
|
|
23
|
+
limit?: number;
|
|
24
|
+
}
|
|
25
|
+
/** Options for estimating evaluation cost */
|
|
26
|
+
export interface EstimateCostOptions {
|
|
27
|
+
traceIds?: string[];
|
|
28
|
+
criteriaIds?: string[];
|
|
29
|
+
confidenceLevel?: number;
|
|
30
|
+
useLLM?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** Options for getting trace-level results */
|
|
33
|
+
export interface GetTraceResultsOptions {
|
|
34
|
+
latest?: boolean;
|
|
35
|
+
includeCriteria?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/** An evaluation run */
|
|
38
|
+
export interface EvalRun {
|
|
39
|
+
id: string;
|
|
40
|
+
agentId: string;
|
|
41
|
+
status: string;
|
|
42
|
+
traceCount: number;
|
|
43
|
+
criteriaCount: number;
|
|
44
|
+
createdAt: string;
|
|
45
|
+
completedAt?: string;
|
|
46
|
+
}
|
|
47
|
+
/** A single evaluation result */
|
|
48
|
+
export interface EvalResult {
|
|
49
|
+
id: string;
|
|
50
|
+
runId: string;
|
|
51
|
+
traceId: string;
|
|
52
|
+
criterionId: string;
|
|
53
|
+
passed: boolean;
|
|
54
|
+
score: number;
|
|
55
|
+
reasoning?: string;
|
|
56
|
+
}
|
|
57
|
+
/** Cost estimate for an evaluation run */
|
|
58
|
+
export interface EvalCostEstimate {
|
|
59
|
+
estimatedTraces: number;
|
|
60
|
+
estimatedCriteria: number;
|
|
61
|
+
estimatedCost: number;
|
|
62
|
+
estimatedCredits: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Evaluation runs API client for managing agent evaluation workflows
|
|
66
|
+
*/
|
|
67
|
+
export declare const evalRuns: {
|
|
68
|
+
/**
|
|
69
|
+
* Create a new evaluation run for an agent
|
|
70
|
+
*
|
|
71
|
+
* @param agentId - The agent to evaluate
|
|
72
|
+
* @param opts - Optional configuration for the evaluation run
|
|
73
|
+
* @returns The created evaluation run
|
|
74
|
+
*/
|
|
75
|
+
create(agentId: string, opts?: CreateEvalRunOptions): Promise<EvalRun>;
|
|
76
|
+
/**
|
|
77
|
+
* Get an evaluation run by ID
|
|
78
|
+
*
|
|
79
|
+
* @param runId - The evaluation run ID
|
|
80
|
+
* @returns The evaluation run details
|
|
81
|
+
*/
|
|
82
|
+
get(runId: string): Promise<EvalRun>;
|
|
83
|
+
/**
|
|
84
|
+
* Get results for an evaluation run
|
|
85
|
+
*
|
|
86
|
+
* @param runId - The evaluation run ID
|
|
87
|
+
* @param opts - Pagination and filter options
|
|
88
|
+
* @returns Paginated evaluation results
|
|
89
|
+
*/
|
|
90
|
+
getResults(runId: string, opts?: GetEvalRunResultsOptions): Promise<{
|
|
91
|
+
results: EvalResult[];
|
|
92
|
+
limit: number;
|
|
93
|
+
offset: number;
|
|
94
|
+
hasMore: boolean;
|
|
95
|
+
}>;
|
|
96
|
+
/**
|
|
97
|
+
* List evaluation runs with optional filters
|
|
98
|
+
*
|
|
99
|
+
* @param opts - Filter and pagination options
|
|
100
|
+
* @returns List of evaluation runs
|
|
101
|
+
*/
|
|
102
|
+
list(opts?: ListEvalRunsOptions): Promise<EvalRun[]>;
|
|
103
|
+
/**
|
|
104
|
+
* Estimate the cost of running an evaluation
|
|
105
|
+
*
|
|
106
|
+
* @param agentId - The agent to estimate cost for
|
|
107
|
+
* @param opts - Evaluation configuration for cost estimation
|
|
108
|
+
* @returns Cost estimate details
|
|
109
|
+
*/
|
|
110
|
+
estimateCost(agentId: string, opts?: EstimateCostOptions): Promise<EvalCostEstimate>;
|
|
111
|
+
/**
|
|
112
|
+
* Get evaluation results for a specific trace
|
|
113
|
+
*
|
|
114
|
+
* @param traceId - The trace ID to get results for
|
|
115
|
+
* @param opts - Options for filtering results
|
|
116
|
+
* @returns Evaluation results for the trace
|
|
117
|
+
*/
|
|
118
|
+
getTraceResults(traceId: string, opts?: GetTraceResultsOptions): Promise<EvalResult[]>;
|
|
119
|
+
/**
|
|
120
|
+
* Delete an evaluation run
|
|
121
|
+
*
|
|
122
|
+
* @param runId - The evaluation run ID to delete
|
|
123
|
+
*/
|
|
124
|
+
remove(runId: string): Promise<void>;
|
|
125
|
+
};
|
|
126
|
+
export { evalRuns as default };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ThinkHive SDK - Eval Runs API
|
|
4
|
+
*
|
|
5
|
+
* Evaluation run management for agent quality assessment
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.default = exports.evalRuns = void 0;
|
|
9
|
+
const client_1 = require("../core/client");
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// EVAL RUNS API CLIENT
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Evaluation runs API client for managing agent evaluation workflows
|
|
15
|
+
*/
|
|
16
|
+
exports.evalRuns = {
|
|
17
|
+
/**
|
|
18
|
+
* Create a new evaluation run for an agent
|
|
19
|
+
*
|
|
20
|
+
* @param agentId - The agent to evaluate
|
|
21
|
+
* @param opts - Optional configuration for the evaluation run
|
|
22
|
+
* @returns The created evaluation run
|
|
23
|
+
*/
|
|
24
|
+
async create(agentId, opts) {
|
|
25
|
+
return (0, client_1.apiRequestWithData)('/eval-runs', {
|
|
26
|
+
method: 'POST',
|
|
27
|
+
body: { agentId, ...opts },
|
|
28
|
+
apiVersion: 'none',
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
/**
|
|
32
|
+
* Get an evaluation run by ID
|
|
33
|
+
*
|
|
34
|
+
* @param runId - The evaluation run ID
|
|
35
|
+
* @returns The evaluation run details
|
|
36
|
+
*/
|
|
37
|
+
async get(runId) {
|
|
38
|
+
return (0, client_1.apiRequestWithData)(`/eval-runs/${runId}`, {
|
|
39
|
+
apiVersion: 'none',
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* Get results for an evaluation run
|
|
44
|
+
*
|
|
45
|
+
* @param runId - The evaluation run ID
|
|
46
|
+
* @param opts - Pagination and filter options
|
|
47
|
+
* @returns Paginated evaluation results
|
|
48
|
+
*/
|
|
49
|
+
async getResults(runId, opts) {
|
|
50
|
+
const params = new URLSearchParams();
|
|
51
|
+
if (opts?.limit !== undefined)
|
|
52
|
+
params.set('limit', String(opts.limit));
|
|
53
|
+
if (opts?.offset !== undefined)
|
|
54
|
+
params.set('offset', String(opts.offset));
|
|
55
|
+
if (opts?.passedOnly !== undefined)
|
|
56
|
+
params.set('passedOnly', String(opts.passedOnly));
|
|
57
|
+
if (opts?.failedOnly !== undefined)
|
|
58
|
+
params.set('failedOnly', String(opts.failedOnly));
|
|
59
|
+
const query = params.toString();
|
|
60
|
+
return (0, client_1.apiRequestWithData)(`/eval-runs/${runId}/results${query ? `?${query}` : ''}`, {
|
|
61
|
+
apiVersion: 'none',
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
/**
|
|
65
|
+
* List evaluation runs with optional filters
|
|
66
|
+
*
|
|
67
|
+
* @param opts - Filter and pagination options
|
|
68
|
+
* @returns List of evaluation runs
|
|
69
|
+
*/
|
|
70
|
+
async list(opts) {
|
|
71
|
+
const params = new URLSearchParams();
|
|
72
|
+
if (opts?.agentId)
|
|
73
|
+
params.set('agentId', opts.agentId);
|
|
74
|
+
if (opts?.limit !== undefined)
|
|
75
|
+
params.set('limit', String(opts.limit));
|
|
76
|
+
const query = params.toString();
|
|
77
|
+
return (0, client_1.apiRequestWithData)(`/eval-runs${query ? `?${query}` : ''}`, {
|
|
78
|
+
apiVersion: 'none',
|
|
79
|
+
});
|
|
80
|
+
},
|
|
81
|
+
/**
|
|
82
|
+
* Estimate the cost of running an evaluation
|
|
83
|
+
*
|
|
84
|
+
* @param agentId - The agent to estimate cost for
|
|
85
|
+
* @param opts - Evaluation configuration for cost estimation
|
|
86
|
+
* @returns Cost estimate details
|
|
87
|
+
*/
|
|
88
|
+
async estimateCost(agentId, opts) {
|
|
89
|
+
return (0, client_1.apiRequestWithData)('/eval-runs/estimate-cost', {
|
|
90
|
+
method: 'POST',
|
|
91
|
+
body: { agentId, ...opts },
|
|
92
|
+
apiVersion: 'none',
|
|
93
|
+
});
|
|
94
|
+
},
|
|
95
|
+
/**
|
|
96
|
+
* Get evaluation results for a specific trace
|
|
97
|
+
*
|
|
98
|
+
* @param traceId - The trace ID to get results for
|
|
99
|
+
* @param opts - Options for filtering results
|
|
100
|
+
* @returns Evaluation results for the trace
|
|
101
|
+
*/
|
|
102
|
+
async getTraceResults(traceId, opts) {
|
|
103
|
+
const params = new URLSearchParams();
|
|
104
|
+
if (opts?.latest !== undefined)
|
|
105
|
+
params.set('latest', String(opts.latest));
|
|
106
|
+
if (opts?.includeCriteria !== undefined)
|
|
107
|
+
params.set('includeCriteria', String(opts.includeCriteria));
|
|
108
|
+
const query = params.toString();
|
|
109
|
+
return (0, client_1.apiRequestWithData)(`/eval-runs/trace/${traceId}${query ? `?${query}` : ''}`, {
|
|
110
|
+
apiVersion: 'none',
|
|
111
|
+
});
|
|
112
|
+
},
|
|
113
|
+
/**
|
|
114
|
+
* Delete an evaluation run
|
|
115
|
+
*
|
|
116
|
+
* @param runId - The evaluation run ID to delete
|
|
117
|
+
*/
|
|
118
|
+
async remove(runId) {
|
|
119
|
+
return (0, client_1.apiRequest)(`/eval-runs/${runId}`, {
|
|
120
|
+
method: 'DELETE',
|
|
121
|
+
apiVersion: 'none',
|
|
122
|
+
});
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
exports.default = exports.evalRuns;
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbC1ydW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9ldmFsLXJ1bnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVILDJDQUFnRTtBQXdFaEUsK0VBQStFO0FBQy9FLHVCQUF1QjtBQUN2QiwrRUFBK0U7QUFFL0U7O0dBRUc7QUFDVSxRQUFBLFFBQVEsR0FBRztJQUN0Qjs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQWUsRUFBRSxJQUEyQjtRQUN2RCxPQUFPLElBQUEsMkJBQWtCLEVBQVUsWUFBWSxFQUFFO1lBQy9DLE1BQU0sRUFBRSxNQUFNO1lBQ2QsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFO1lBQzFCLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBYTtRQUNyQixPQUFPLElBQUEsMkJBQWtCLEVBQVUsY0FBYyxLQUFLLEVBQUUsRUFBRTtZQUN4RCxVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFhLEVBQUUsSUFBK0I7UUFNN0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNyQyxJQUFJLElBQUksRUFBRSxLQUFLLEtBQUssU0FBUztZQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN2RSxJQUFJLElBQUksRUFBRSxNQUFNLEtBQUssU0FBUztZQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMxRSxJQUFJLElBQUksRUFB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QW9ITyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpbmtIaXZlIFNESyAtIEV2YWwgUnVucyBBUElcbiAqXG4gKiBFdmFsdWF0aW9uIHJ1biBtYW5hZ2VtZW50IGZvciBhZ2VudCBxdWFsaXR5IGFzc2Vzc21lbnRcbiAqL1xuXG5pbXBvcnQgeyBhcGlSZXF1ZXN0LCBhcGlSZXF1ZXN0V2l0aERhdGEgfSBmcm9tICcuLi9jb3JlL2NsaWVudCc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBPcHRpb25zIGZvciBjcmVhdGluZyBhbiBldmFsdWF0aW9uIHJ1biAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVFdmFsUnVuT3B0aW9ucyB7XG4gIHRyYWNlSWRzPzogc3RyaW5nW107XG4gIGNyaXRlcmlhSWRzPzogc3RyaW5nW107XG4gIGNvbmZpZGVuY2VMZXZlbD86IG51bWJlcjtcbiAgdXNlTExNPzogYm9vbGVhbjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIGxpc3RpbmcgZXZhbHVhdGlvbiBydW4gcmVzdWx0cyAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRFdmFsUnVuUmVzdWx0c09wdGlvbnMge1xuICBsaW1pdD86IG51bWJlcjtcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBwYXNzZWRPbmx5PzogYm9vbGVhbjtcbiAgZmFpbGVkT25seT86IGJvb2xlYW47XG59XG5cbi8qKiBPcHRpb25zIGZvciBsaXN0aW5nIGV2YWx1YXRpb24gcnVucyAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0RXZhbFJ1bnNPcHRpb25zIHtcbiAgYWdlbnRJZD86IHN0cmluZztcbiAgbGltaXQ/OiBudW1iZXI7XG59XG5cbi8qKiBPcHRpb25zIGZvciBlc3RpbWF0aW5nIGV2YWx1YXRpb24gY29zdCAqL1xuZXhwb3J0IGludGVyZmFjZSBFc3RpbWF0ZUNvc3RPcHRpb25zIHtcbiAgdHJhY2VJZHM/OiBzdHJpbmdbXTtcbiAgY3JpdGVyaWFJZHM/OiBzdHJpbmdbXTtcbiAgY29uZmlkZW5jZUxldmVsPzogbnVtYmVyO1xuICB1c2VMTE0/OiBib29sZWFuO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgZ2V0dGluZyB0cmFjZS1sZXZlbCByZXN1bHRzICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFRyYWNlUmVzdWx0c09wdGlvbnMge1xuICBsYXRlc3Q/OiBib29sZWFuO1xuICBpbmNsdWRlQ3JpdGVyaWE/OiBib29sZWFuO1xufVxuXG4vKiogQW4gZXZhbHVhdGlvbiBydW4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZhbFJ1biB7XG4gIGlkOiBzdHJpbmc7XG4gIGFnZW50SWQ6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHRyYWNlQ291bnQ6IG51bWJlcjtcbiAgY3JpdGVyaWFDb3VudDogbnVtYmVyO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgY29tcGxldGVkQXQ/OiBzdHJpbmc7XG59XG5cbi8qKiBBIHNpbmdsZSBldmFsdWF0aW9uIHJlc3VsdCAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmFsUmVzdWx0IHtcbiAgaWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgdHJhY2VJZDogc3RyaW5nO1xuICBjcml0ZXJpb25JZDogc3RyaW5nO1xuICBwYXNzZWQ6IGJvb2xlYW47XG4gIHNjb3JlOiBudW1iZXI7XG4gIHJlYXNvbmluZz86IHN0cmluZztcbn1cblxuLyoqIENvc3QgZXN0aW1hdGUgZm9yIGFuIGV2YWx1YXRpb24gcnVuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2YWxDb3N0RXN0aW1hdGUge1xuICBlc3RpbWF0ZWRUcmFjZXM6IG51bWJlcjtcbiAgZXN0aW1hdGVkQ3JpdGVyaWE6IG51bWJlcjtcbiAgZXN0aW1hdGVkQ29zdDogbnVtYmVyO1xuICBlc3RpbWF0ZWRDcmVkaXRzOiBudW1iZXI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVWQUwgUlVOUyBBUEkgQ0xJRU5UXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRXZhbHVhdGlvbiBydW5zIEFQSSBjbGllbnQgZm9yIG1hbmFnaW5nIGFnZW50IGV2YWx1YXRpb24gd29ya2Zsb3dzXG4gKi9cbmV4cG9ydCBjb25zdCBldmFsUnVucyA9IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBldmFsdWF0aW9uIHJ1biBmb3IgYW4gYWdlbnRcbiAgICpcbiAgICogQHBhcmFtIGFnZW50SWQgLSBUaGUgYWdlbnQgdG8gZXZhbHVhdGVcbiAgICogQHBhcmFtIG9wdHMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgZXZhbHVhdGlvbiBydW5cbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgZXZhbHVhdGlvbiBydW5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZShhZ2VudElkOiBzdHJpbmcsIG9wdHM/OiBDcmVhdGVFdmFsUnVuT3B0aW9ucyk6IFByb21pc2U8RXZhbFJ1bj4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8RXZhbFJ1bj4oJy9ldmFsLXJ1bnMnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHsgYWdlbnRJZCwgLi4ub3B0cyB9LFxuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgYW4gZXZhbHVhdGlvbiBydW4gYnkgSURcbiAgICpcbiAgICogQHBhcmFtIHJ1bklkIC0gVGhlIGV2YWx1YXRpb24gcnVuIElEXG4gICAqIEByZXR1cm5zIFRoZSBldmFsdWF0aW9uIHJ1biBkZXRhaWxzXG4gICAqL1xuICBhc3luYyBnZXQocnVuSWQ6IHN0cmluZyk6IFByb21pc2U8RXZhbFJ1bj4ge1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8RXZhbFJ1bj4oYC9ldmFsLXJ1bnMvJHtydW5JZH1gLCB7XG4gICAgICBhcGlWZXJzaW9uOiAnbm9uZScsXG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCByZXN1bHRzIGZvciBhbiBldmFsdWF0aW9uIHJ1blxuICAgKlxuICAgKiBAcGFyYW0gcnVuSWQgLSBUaGUgZXZhbHVhdGlvbiBydW4gSURcbiAgICogQHBhcmFtIG9wdHMgLSBQYWdpbmF0aW9uIGFuZCBmaWx0ZXIgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBQYWdpbmF0ZWQgZXZhbHVhdGlvbiByZXN1bHRzXG4gICAqL1xuICBhc3luYyBnZXRSZXN1bHRzKHJ1bklkOiBzdHJpbmcsIG9wdHM/OiBHZXRFdmFsUnVuUmVzdWx0c09wdGlvbnMpOiBQcm9taXNlPHtcbiAgICByZXN1bHRzOiBFdmFsUmVzdWx0W107XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgICBvZmZzZXQ6IG51bWJlcjtcbiAgICBoYXNNb3JlOiBib29sZWFuO1xuICB9PiB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIGlmIChvcHRzPy5saW1pdCAhPT0gdW5kZWZpbmVkKSBwYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhvcHRzLmxpbWl0KSk7XG4gICAgaWYgKG9wdHM/Lm9mZnNldCAhPT0gdW5kZWZpbmVkKSBwYXJhbXMuc2V0KCdvZmZzZXQnLCBTdHJpbmcob3B0cy5vZmZzZXQpKTtcbiAgICBpZiAob3B0cz8ucGFzc2VkT25seSAhPT0gdW5kZWZpbmVkKSBwYXJhbXMuc2V0KCdwYXNzZWRPbmx5JywgU3RyaW5nKG9wdHMucGFzc2VkT25seSkpO1xuICAgIGlmIChvcHRzPy5mYWlsZWRPbmx5ICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ2ZhaWxlZE9ubHknLCBTdHJpbmcob3B0cy5mYWlsZWRPbmx5KSk7XG5cbiAgICBjb25zdCBxdWVyeSA9IHBhcmFtcy50b1N0cmluZygpO1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGEoYC9ldmFsLXJ1bnMvJHtydW5JZH0vcmVzdWx0cyR7cXVlcnkgPyBgPyR7cXVlcnl9YCA6ICcnfWAsIHtcbiAgICAgIGFwaVZlcnNpb246ICdub25lJyxcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogTGlzdCBldmFsdWF0aW9uIHJ1bnMgd2l0aCBvcHRpb25hbCBmaWx0ZXJzXG4gICAqXG4gICAqIEBwYXJhbSBvcHRzIC0gRmlsdGVyIGFuZCBwYWdpbmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybnMgTGlzdCBvZiBldmFsdWF0aW9uIHJ1bnNcbiAgICovXG4gIGFzeW5jIGxpc3Qob3B0cz86IExpc3RFdmFsUnVuc09wdGlvbnMpOiBQcm9taXNlPEV2YWxSdW5bXT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBpZiAob3B0cz8uYWdlbnRJZCkgcGFyYW1zLnNldCgnYWdlbnRJZCcsIG9wdHMuYWdlbnRJZCk7XG4gICAgaWYgKG9wdHM/LmxpbWl0ICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKG9wdHMubGltaXQpKTtcblxuICAgIGNvbnN0IHF1ZXJ5ID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxFdmFsUnVuW10+KGAvZXZhbC1ydW5zJHtxdWVyeSA/IGA/JHtxdWVyeX1gIDogJyd9YCwge1xuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZSB0aGUgY29zdCBvZiBydW5uaW5nIGFuIGV2YWx1YXRpb25cbiAgICpcbiAgICogQHBhcmFtIGFnZW50SWQgLSBUaGUgYWdlbnQgdG8gZXN0aW1hdGUgY29zdCBmb3JcbiAgICogQHBhcmFtIG9wdHMgLSBFdmFsdWF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIGNvc3QgZXN0aW1hdGlvblxuICAgKiBAcmV0dXJucyBDb3N0IGVzdGltYXRlIGRldGFpbHNcbiAgICovXG4gIGFzeW5jIGVzdGltYXRlQ29zdChhZ2VudElkOiBzdHJpbmcsIG9wdHM/OiBFc3RpbWF0ZUNvc3RPcHRpb25zKTogUHJvbWlzZTxFdmFsQ29zdEVzdGltYXRlPiB7XG4gICAgcmV0dXJuIGFwaVJlcXVlc3RXaXRoRGF0YTxFdmFsQ29zdEVzdGltYXRlPignL2V2YWwtcnVucy9lc3RpbWF0ZS1jb3N0Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiB7IGFnZW50SWQsIC4uLm9wdHMgfSxcbiAgICAgIGFwaVZlcnNpb246ICdub25lJyxcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IGV2YWx1YXRpb24gcmVzdWx0cyBmb3IgYSBzcGVjaWZpYyB0cmFjZVxuICAgKlxuICAgKiBAcGFyYW0gdHJhY2VJZCAtIFRoZSB0cmFjZSBJRCB0byBnZXQgcmVzdWx0cyBmb3JcbiAgICogQHBhcmFtIG9wdHMgLSBPcHRpb25zIGZvciBmaWx0ZXJpbmcgcmVzdWx0c1xuICAgKiBAcmV0dXJucyBFdmFsdWF0aW9uIHJlc3VsdHMgZm9yIHRoZSB0cmFjZVxuICAgKi9cbiAgYXN5bmMgZ2V0VHJhY2VSZXN1bHRzKHRyYWNlSWQ6IHN0cmluZywgb3B0cz86IEdldFRyYWNlUmVzdWx0c09wdGlvbnMpOiBQcm9taXNlPEV2YWxSZXN1bHRbXT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBpZiAob3B0cz8ubGF0ZXN0ICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ2xhdGVzdCcsIFN0cmluZyhvcHRzLmxhdGVzdCkpO1xuICAgIGlmIChvcHRzPy5pbmNsdWRlQ3JpdGVyaWEgIT09IHVuZGVmaW5lZCkgcGFyYW1zLnNldCgnaW5jbHVkZUNyaXRlcmlhJywgU3RyaW5nKG9wdHMuaW5jbHVkZUNyaXRlcmlhKSk7XG5cbiAgICBjb25zdCBxdWVyeSA9IHBhcmFtcy50b1N0cmluZygpO1xuICAgIHJldHVybiBhcGlSZXF1ZXN0V2l0aERhdGE8RXZhbFJlc3VsdFtdPihgL2V2YWwtcnVucy90cmFjZS8ke3RyYWNlSWR9JHtxdWVyeSA/IGA/JHtxdWVyeX1gIDogJyd9YCwge1xuICAgICAgYXBpVmVyc2lvbjogJ25vbmUnLFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZXZhbHVhdGlvbiBydW5cbiAgICpcbiAgICogQHBhcmFtIHJ1bklkIC0gVGhlIGV2YWx1YXRpb24gcnVuIElEIHRvIGRlbGV0ZVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlKHJ1bklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXBpUmVxdWVzdDx2b2lkPihgL2V2YWwtcnVucy8ke3J1bklkfWAsIHtcbiAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICBhcGlWZXJzaW9uOiAnbm9uZScsXG4gICAgfSk7XG4gIH0sXG59O1xuXG5leHBvcnQgeyBldmFsUnVucyBhcyBkZWZhdWx0IH07XG4iXX0=
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ThinkHive SDK - LLM Costs API
|
|
3
|
+
*
|
|
4
|
+
* LLM cost tracking and optimization analytics
|
|
5
|
+
*/
|
|
6
|
+
/** Options for cost summary and breakdown */
|
|
7
|
+
export interface CostQueryOptions {
|
|
8
|
+
period?: 'day' | 'week' | 'month' | 'quarter' | 'year';
|
|
9
|
+
}
|
|
10
|
+
/** Cost summary across all agents */
|
|
11
|
+
export interface CostSummary {
|
|
12
|
+
totalCost: number;
|
|
13
|
+
totalTokens: number;
|
|
14
|
+
totalRequests: number;
|
|
15
|
+
period: string;
|
|
16
|
+
breakdown: CostBreakdownItem[];
|
|
17
|
+
}
|
|
18
|
+
/** Cost breakdown item */
|
|
19
|
+
export interface CostBreakdownItem {
|
|
20
|
+
model: string;
|
|
21
|
+
provider: string;
|
|
22
|
+
cost: number;
|
|
23
|
+
tokens: number;
|
|
24
|
+
requests: number;
|
|
25
|
+
inputTokens: number;
|
|
26
|
+
outputTokens: number;
|
|
27
|
+
}
|
|
28
|
+
/** Agent-level cost breakdown */
|
|
29
|
+
export interface AgentCostBreakdown {
|
|
30
|
+
agentId: string;
|
|
31
|
+
totalCost: number;
|
|
32
|
+
totalTokens: number;
|
|
33
|
+
totalRequests: number;
|
|
34
|
+
period: string;
|
|
35
|
+
models: CostBreakdownItem[];
|
|
36
|
+
}
|
|
37
|
+
/** Cost savings data */
|
|
38
|
+
export interface CostSavings {
|
|
39
|
+
totalSaved: number;
|
|
40
|
+
savingsPercent: number;
|
|
41
|
+
optimizations: OptimizationEntry[];
|
|
42
|
+
}
|
|
43
|
+
/** A single optimization entry */
|
|
44
|
+
export interface OptimizationEntry {
|
|
45
|
+
type: string;
|
|
46
|
+
description: string;
|
|
47
|
+
savedAmount: number;
|
|
48
|
+
appliedAt: string;
|
|
49
|
+
}
|
|
50
|
+
/** Optimization statistics */
|
|
51
|
+
export interface OptimizationStats {
|
|
52
|
+
cacheHitRate: number;
|
|
53
|
+
avgTokenReduction: number;
|
|
54
|
+
modelDowngradeCount: number;
|
|
55
|
+
totalOptimizations: number;
|
|
56
|
+
recommendations: OptimizationRecommendation[];
|
|
57
|
+
}
|
|
58
|
+
/** Optimization recommendation */
|
|
59
|
+
export interface OptimizationRecommendation {
|
|
60
|
+
type: string;
|
|
61
|
+
description: string;
|
|
62
|
+
estimatedSavings: number;
|
|
63
|
+
priority: 'low' | 'medium' | 'high';
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* LLM Costs API client for tracking and optimizing LLM spending
|
|
67
|
+
*/
|
|
68
|
+
export declare const llmCosts: {
|
|
69
|
+
/**
|
|
70
|
+
* Get cost summary across all agents
|
|
71
|
+
*
|
|
72
|
+
* @param opts - Period filter option
|
|
73
|
+
* @returns Cost summary with breakdown
|
|
74
|
+
*/
|
|
75
|
+
getSummary(opts?: CostQueryOptions): Promise<CostSummary>;
|
|
76
|
+
/**
|
|
77
|
+
* Get cost breakdown for a specific agent
|
|
78
|
+
*
|
|
79
|
+
* @param agentId - The agent ID
|
|
80
|
+
* @param opts - Period filter option
|
|
81
|
+
* @returns Agent cost breakdown
|
|
82
|
+
*/
|
|
83
|
+
getBreakdown(agentId: string, opts?: CostQueryOptions): Promise<AgentCostBreakdown>;
|
|
84
|
+
/**
|
|
85
|
+
* Get cost savings from optimizations
|
|
86
|
+
*
|
|
87
|
+
* @returns Savings data and optimization history
|
|
88
|
+
*/
|
|
89
|
+
getSavings(): Promise<CostSavings>;
|
|
90
|
+
/**
|
|
91
|
+
* Get optimization statistics and recommendations
|
|
92
|
+
*
|
|
93
|
+
* @returns Optimization stats with recommendations
|
|
94
|
+
*/
|
|
95
|
+
getOptimizationStats(): Promise<OptimizationStats>;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Format a cost amount as a currency string
|
|
99
|
+
*
|
|
100
|
+
* @param amount - The cost amount in dollars
|
|
101
|
+
* @returns Formatted string (e.g., "$12.34")
|
|
102
|
+
*/
|
|
103
|
+
export declare function formatCost(amount: number): string;
|
|
104
|
+
export { llmCosts as default };
|