@agent-ledger/sdk-ts 0.0.1
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/index.d.ts +55 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/package.json +17 -0
- package/src/index.ts +181 -0
- package/tsconfig.build.json +9 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export type EventType = "llm_call" | "tool_call" | "tool_result" | "session_start" | "session_end";
|
|
2
|
+
export interface AgentLedgerClientOptions {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
}
|
|
6
|
+
export type BudgetGuardrailDetails = {
|
|
7
|
+
agentName: string;
|
|
8
|
+
dailyLimitUsd: number;
|
|
9
|
+
spentTodayUsd: number;
|
|
10
|
+
attemptedCostUsd: number;
|
|
11
|
+
projectedCostUsd: number;
|
|
12
|
+
remainingBudgetUsd: number;
|
|
13
|
+
};
|
|
14
|
+
export declare class BudgetGuardrailError extends Error {
|
|
15
|
+
readonly details: BudgetGuardrailDetails;
|
|
16
|
+
constructor(message: string, details: BudgetGuardrailDetails);
|
|
17
|
+
}
|
|
18
|
+
export declare class AgentLedgerClient {
|
|
19
|
+
private apiKey;
|
|
20
|
+
private baseUrl;
|
|
21
|
+
constructor(opts: AgentLedgerClientOptions);
|
|
22
|
+
startSession(agentName: string): Promise<string>;
|
|
23
|
+
endSession(sessionId: string, status: "success" | "error", opts?: {
|
|
24
|
+
errorMessage?: string;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
logEvents(sessionId: string, events: any[]): Promise<void>;
|
|
27
|
+
logLLMCall(sessionId: string, e: Omit<LlmCallEvent, "type">): Promise<void>;
|
|
28
|
+
logToolCall(sessionId: string, e: Omit<ToolCallEvent, "type">): Promise<void>;
|
|
29
|
+
logToolResult(sessionId: string, e: Omit<ToolResultEvent, "type">): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
export type LlmCallEvent = {
|
|
32
|
+
type: "llm_call";
|
|
33
|
+
stepIndex: number;
|
|
34
|
+
model: string;
|
|
35
|
+
provider: string;
|
|
36
|
+
prompt: string;
|
|
37
|
+
response: string;
|
|
38
|
+
tokensIn: number;
|
|
39
|
+
tokensOut: number;
|
|
40
|
+
latencyMs: number;
|
|
41
|
+
};
|
|
42
|
+
export type ToolCallEvent = {
|
|
43
|
+
type: "tool_call";
|
|
44
|
+
stepIndex: number;
|
|
45
|
+
toolName: string;
|
|
46
|
+
toolInput: any;
|
|
47
|
+
};
|
|
48
|
+
export type ToolResultEvent = {
|
|
49
|
+
type: "tool_result";
|
|
50
|
+
stepIndex: number;
|
|
51
|
+
toolName: string;
|
|
52
|
+
toolOutput: any;
|
|
53
|
+
latencyMs: number;
|
|
54
|
+
};
|
|
55
|
+
export type AnyEvent = LlmCallEvent | ToolCallEvent | ToolResultEvent;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
const PROD_BASE_URL = "https://agent-ledger-api.azurewebsites.net";
|
|
2
|
+
const DEV_BASE_URL = "http://localhost:3000";
|
|
3
|
+
const nodeProcess = typeof globalThis !== "undefined" && globalThis.process ? globalThis.process : undefined;
|
|
4
|
+
function resolveBaseUrl(explicit) {
|
|
5
|
+
if (explicit)
|
|
6
|
+
return explicit;
|
|
7
|
+
const envVars = nodeProcess?.env;
|
|
8
|
+
if (envVars) {
|
|
9
|
+
if (envVars.AGENT_LEDGER_BASE_URL) {
|
|
10
|
+
return envVars.AGENT_LEDGER_BASE_URL;
|
|
11
|
+
}
|
|
12
|
+
const env = envVars.NODE_ENV;
|
|
13
|
+
if (env && env !== "development") {
|
|
14
|
+
return PROD_BASE_URL;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return DEV_BASE_URL;
|
|
18
|
+
}
|
|
19
|
+
export class BudgetGuardrailError extends Error {
|
|
20
|
+
constructor(message, details) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = "BudgetGuardrailError";
|
|
23
|
+
this.details = details;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class AgentLedgerClient {
|
|
27
|
+
constructor(opts) {
|
|
28
|
+
this.apiKey = opts.apiKey;
|
|
29
|
+
const resolvedBaseUrl = resolveBaseUrl(opts.baseUrl).trim();
|
|
30
|
+
this.baseUrl = resolvedBaseUrl.replace(/\/$/, "");
|
|
31
|
+
}
|
|
32
|
+
async startSession(agentName) {
|
|
33
|
+
const res = await fetch(`${this.baseUrl}/v1/sessions`, {
|
|
34
|
+
method: "POST",
|
|
35
|
+
headers: {
|
|
36
|
+
"Content-Type": "application/json",
|
|
37
|
+
"x-api-key": this.apiKey
|
|
38
|
+
},
|
|
39
|
+
body: JSON.stringify({ agentName })
|
|
40
|
+
});
|
|
41
|
+
if (!res.ok) {
|
|
42
|
+
const text = await res.text();
|
|
43
|
+
throw new Error(text || `Failed to start session: ${res.statusText}`);
|
|
44
|
+
}
|
|
45
|
+
const data = await res.json();
|
|
46
|
+
return data.id;
|
|
47
|
+
}
|
|
48
|
+
async endSession(sessionId, status, opts) {
|
|
49
|
+
const res = await fetch(`${this.baseUrl}/v1/sessions/${sessionId}/end`, {
|
|
50
|
+
method: "POST",
|
|
51
|
+
headers: {
|
|
52
|
+
"Content-Type": "application/json",
|
|
53
|
+
"x-api-key": this.apiKey
|
|
54
|
+
},
|
|
55
|
+
body: JSON.stringify({ status, errorMessage: opts?.errorMessage ?? null })
|
|
56
|
+
});
|
|
57
|
+
if (!res.ok) {
|
|
58
|
+
const text = await res.text();
|
|
59
|
+
throw new Error(text || `Failed to end session: ${res.statusText}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async logEvents(sessionId, events) {
|
|
63
|
+
const res = await fetch(`${this.baseUrl}/v1/events`, {
|
|
64
|
+
method: "POST",
|
|
65
|
+
headers: {
|
|
66
|
+
"Content-Type": "application/json",
|
|
67
|
+
"x-api-key": this.apiKey
|
|
68
|
+
},
|
|
69
|
+
body: JSON.stringify({ sessionId, events })
|
|
70
|
+
});
|
|
71
|
+
if (!res.ok) {
|
|
72
|
+
const text = await res.text();
|
|
73
|
+
let payload = null;
|
|
74
|
+
try {
|
|
75
|
+
payload = text ? JSON.parse(text) : null;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
payload = null;
|
|
79
|
+
}
|
|
80
|
+
if (res.status === 429 && payload?.details) {
|
|
81
|
+
throw new BudgetGuardrailError(payload?.error ?? "Budget limit exceeded", payload.details);
|
|
82
|
+
}
|
|
83
|
+
const message = payload?.error || text || "Failed to log events";
|
|
84
|
+
throw new Error(message);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async logLLMCall(sessionId, e) {
|
|
88
|
+
const event = { type: "llm_call", ...e };
|
|
89
|
+
return this.logEvents(sessionId, [event]);
|
|
90
|
+
}
|
|
91
|
+
async logToolCall(sessionId, e) {
|
|
92
|
+
const event = { type: "tool_call", ...e };
|
|
93
|
+
return this.logEvents(sessionId, [event]);
|
|
94
|
+
}
|
|
95
|
+
async logToolResult(sessionId, e) {
|
|
96
|
+
const event = { type: "tool_result", ...e };
|
|
97
|
+
return this.logEvents(sessionId, [event]);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agent-ledger/sdk-ts",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"dependencies": {},
|
|
10
|
+
"devDependencies": {
|
|
11
|
+
"typescript": "^5.6.0"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc -p tsconfig.build.json",
|
|
15
|
+
"dev": "tsc -w -p tsconfig.build.json"
|
|
16
|
+
}
|
|
17
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
export type EventType =
|
|
2
|
+
| "llm_call"
|
|
3
|
+
| "tool_call"
|
|
4
|
+
| "tool_result"
|
|
5
|
+
| "session_start"
|
|
6
|
+
| "session_end";
|
|
7
|
+
|
|
8
|
+
export interface AgentLedgerClientOptions {
|
|
9
|
+
apiKey: string;
|
|
10
|
+
baseUrl?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const PROD_BASE_URL = "https://agent-ledger-api.azurewebsites.net";
|
|
14
|
+
const DEV_BASE_URL = "http://localhost:3000";
|
|
15
|
+
const nodeProcess: { env?: Record<string, string | undefined>; } | undefined =
|
|
16
|
+
typeof globalThis !== "undefined" && (globalThis as any).process ? (globalThis as any).process : undefined;
|
|
17
|
+
|
|
18
|
+
function resolveBaseUrl(explicit?: string) {
|
|
19
|
+
if (explicit) return explicit;
|
|
20
|
+
const envVars = nodeProcess?.env;
|
|
21
|
+
if (envVars) {
|
|
22
|
+
if (envVars.AGENT_LEDGER_BASE_URL) {
|
|
23
|
+
return envVars.AGENT_LEDGER_BASE_URL;
|
|
24
|
+
}
|
|
25
|
+
const env = envVars.NODE_ENV;
|
|
26
|
+
if (env && env !== "development") {
|
|
27
|
+
return PROD_BASE_URL;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return DEV_BASE_URL;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type BudgetGuardrailDetails = {
|
|
34
|
+
agentName: string;
|
|
35
|
+
dailyLimitUsd: number;
|
|
36
|
+
spentTodayUsd: number;
|
|
37
|
+
attemptedCostUsd: number;
|
|
38
|
+
projectedCostUsd: number;
|
|
39
|
+
remainingBudgetUsd: number;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export class BudgetGuardrailError extends Error {
|
|
43
|
+
readonly details: BudgetGuardrailDetails;
|
|
44
|
+
|
|
45
|
+
constructor(message: string, details: BudgetGuardrailDetails) {
|
|
46
|
+
super(message);
|
|
47
|
+
this.name = "BudgetGuardrailError";
|
|
48
|
+
this.details = details;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export class AgentLedgerClient {
|
|
53
|
+
private apiKey: string;
|
|
54
|
+
private baseUrl: string;
|
|
55
|
+
|
|
56
|
+
constructor(opts: AgentLedgerClientOptions) {
|
|
57
|
+
this.apiKey = opts.apiKey;
|
|
58
|
+
const resolvedBaseUrl = resolveBaseUrl(opts.baseUrl).trim();
|
|
59
|
+
this.baseUrl = resolvedBaseUrl.replace(/\/$/, "");
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async startSession(agentName: string): Promise<string> {
|
|
63
|
+
const res = await fetch(`${this.baseUrl}/v1/sessions`, {
|
|
64
|
+
method: "POST",
|
|
65
|
+
headers: {
|
|
66
|
+
"Content-Type": "application/json",
|
|
67
|
+
"x-api-key": this.apiKey
|
|
68
|
+
},
|
|
69
|
+
body: JSON.stringify({ agentName })
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
if (!res.ok) {
|
|
73
|
+
const text = await res.text();
|
|
74
|
+
throw new Error(text || `Failed to start session: ${res.statusText}`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const data = await res.json();
|
|
78
|
+
return data.id as string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async endSession(
|
|
82
|
+
sessionId: string,
|
|
83
|
+
status: "success" | "error",
|
|
84
|
+
opts?: { errorMessage?: string }
|
|
85
|
+
) {
|
|
86
|
+
const res = await fetch(`${this.baseUrl}/v1/sessions/${sessionId}/end`, {
|
|
87
|
+
method: "POST",
|
|
88
|
+
headers: {
|
|
89
|
+
"Content-Type": "application/json",
|
|
90
|
+
"x-api-key": this.apiKey
|
|
91
|
+
},
|
|
92
|
+
body: JSON.stringify({ status, errorMessage: opts?.errorMessage ?? null })
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
if (!res.ok) {
|
|
96
|
+
const text = await res.text();
|
|
97
|
+
throw new Error(text || `Failed to end session: ${res.statusText}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async logEvents(sessionId: string, events: any[]) {
|
|
102
|
+
const res = await fetch(`${this.baseUrl}/v1/events`, {
|
|
103
|
+
method: "POST",
|
|
104
|
+
headers: {
|
|
105
|
+
"Content-Type": "application/json",
|
|
106
|
+
"x-api-key": this.apiKey
|
|
107
|
+
},
|
|
108
|
+
body: JSON.stringify({ sessionId, events })
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
if (!res.ok) {
|
|
112
|
+
const text = await res.text();
|
|
113
|
+
let payload: any = null;
|
|
114
|
+
try {
|
|
115
|
+
payload = text ? JSON.parse(text) : null;
|
|
116
|
+
} catch {
|
|
117
|
+
payload = null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (res.status === 429 && payload?.details) {
|
|
121
|
+
throw new BudgetGuardrailError(payload?.error ?? "Budget limit exceeded", payload.details);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const message = payload?.error || text || "Failed to log events";
|
|
125
|
+
throw new Error(message);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async logLLMCall(
|
|
130
|
+
sessionId: string,
|
|
131
|
+
e: Omit<LlmCallEvent, "type">
|
|
132
|
+
) {
|
|
133
|
+
const event: LlmCallEvent = { type: "llm_call", ...e };
|
|
134
|
+
return this.logEvents(sessionId, [event]);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async logToolCall(
|
|
138
|
+
sessionId: string,
|
|
139
|
+
e: Omit<ToolCallEvent, "type">
|
|
140
|
+
) {
|
|
141
|
+
const event: ToolCallEvent = { type: "tool_call", ...e };
|
|
142
|
+
return this.logEvents(sessionId, [event]);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async logToolResult(
|
|
146
|
+
sessionId: string,
|
|
147
|
+
e: Omit<ToolResultEvent, "type">
|
|
148
|
+
) {
|
|
149
|
+
const event: ToolResultEvent = { type: "tool_result", ...e };
|
|
150
|
+
return this.logEvents(sessionId, [event]);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export type LlmCallEvent = {
|
|
155
|
+
type: "llm_call";
|
|
156
|
+
stepIndex: number;
|
|
157
|
+
model: string;
|
|
158
|
+
provider: string;
|
|
159
|
+
prompt: string;
|
|
160
|
+
response: string;
|
|
161
|
+
tokensIn: number;
|
|
162
|
+
tokensOut: number;
|
|
163
|
+
latencyMs: number;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
export type ToolCallEvent = {
|
|
167
|
+
type: "tool_call";
|
|
168
|
+
stepIndex: number;
|
|
169
|
+
toolName: string;
|
|
170
|
+
toolInput: any;
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
export type ToolResultEvent = {
|
|
174
|
+
type: "tool_result";
|
|
175
|
+
stepIndex: number;
|
|
176
|
+
toolName: string;
|
|
177
|
+
toolOutput: any;
|
|
178
|
+
latencyMs: number;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
export type AnyEvent = LlmCallEvent | ToolCallEvent | ToolResultEvent;
|