@agentgov/sdk 0.1.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.
@@ -0,0 +1,198 @@
1
+ /** Error thrown when API request fails */
2
+ export class AgentGovAPIError extends Error {
3
+ statusCode;
4
+ retryable;
5
+ constructor(message, statusCode, retryable) {
6
+ super(message);
7
+ this.statusCode = statusCode;
8
+ this.retryable = retryable;
9
+ this.name = 'AgentGovAPIError';
10
+ }
11
+ }
12
+ /** Safely serialize data, handling circular references */
13
+ export function safeStringify(data) {
14
+ try {
15
+ return JSON.stringify(data);
16
+ }
17
+ catch {
18
+ return JSON.stringify({ error: 'Failed to serialize data' });
19
+ }
20
+ }
21
+ export class FetchClient {
22
+ baseUrl;
23
+ headers;
24
+ projectId;
25
+ debug;
26
+ maxRetries;
27
+ retryDelay;
28
+ timeout;
29
+ constructor(config) {
30
+ this.baseUrl = config.baseUrl.replace(/\/$/, '');
31
+ this.projectId = config.projectId;
32
+ this.debug = config.debug ?? false;
33
+ this.maxRetries = config.maxRetries ?? 3;
34
+ this.retryDelay = config.retryDelay ?? 1000;
35
+ this.timeout = config.timeout ?? 30000;
36
+ this.headers = {
37
+ 'Content-Type': 'application/json',
38
+ 'Authorization': `Bearer ${config.apiKey}`
39
+ };
40
+ }
41
+ /**
42
+ * Sanitize data for logging - removes sensitive fields
43
+ */
44
+ sanitize(data) {
45
+ if (typeof data !== 'object' || data === null) {
46
+ return data;
47
+ }
48
+ const sensitiveKeys = ['apiKey', 'password', 'secret', 'token', 'authorization', 'input', 'output'];
49
+ const obj = data;
50
+ const sanitized = {};
51
+ for (const [key, value] of Object.entries(obj)) {
52
+ if (sensitiveKeys.some(k => key.toLowerCase().includes(k))) {
53
+ sanitized[key] = '[REDACTED]';
54
+ }
55
+ else if (typeof value === 'object' && value !== null) {
56
+ sanitized[key] = this.sanitize(value);
57
+ }
58
+ else {
59
+ sanitized[key] = value;
60
+ }
61
+ }
62
+ return sanitized;
63
+ }
64
+ log(message, data) {
65
+ if (this.debug) {
66
+ const sanitizedData = data ? this.sanitize(data) : undefined;
67
+ console.log('[AgentGov]', message, sanitizedData ?? '');
68
+ }
69
+ }
70
+ /**
71
+ * Check if error is retryable based on status code
72
+ */
73
+ isRetryable(status) {
74
+ // Retry on: 408 (timeout), 429 (rate limit), 5xx (server errors)
75
+ return status === 408 || status === 429 || status >= 500;
76
+ }
77
+ /**
78
+ * Calculate delay with exponential backoff and jitter
79
+ */
80
+ calculateDelay(attempt, retryAfter) {
81
+ if (retryAfter !== undefined && !isNaN(retryAfter) && retryAfter > 0) {
82
+ return retryAfter * 1000;
83
+ }
84
+ // Exponential backoff with jitter: baseDelay * 2^attempt * (0.5 to 1.5)
85
+ const exponentialDelay = this.retryDelay * Math.pow(2, attempt);
86
+ const jitter = 0.5 + Math.random();
87
+ return Math.min(exponentialDelay * jitter, 30000); // Cap at 30s
88
+ }
89
+ /**
90
+ * Sleep for specified duration
91
+ */
92
+ sleep(ms) {
93
+ return new Promise(resolve => setTimeout(resolve, ms));
94
+ }
95
+ async request(method, path, body) {
96
+ const url = `${this.baseUrl}${path}`;
97
+ let lastError = null;
98
+ for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
99
+ try {
100
+ this.log(`${method} ${url}${attempt > 0 ? ` (retry ${attempt})` : ''}`, body);
101
+ // Create abort controller for timeout
102
+ const controller = new AbortController();
103
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
104
+ try {
105
+ const response = await fetch(url, {
106
+ method,
107
+ headers: this.headers,
108
+ body: body ? safeStringify(body) : undefined,
109
+ signal: controller.signal
110
+ });
111
+ clearTimeout(timeoutId);
112
+ if (!response.ok) {
113
+ const errorText = await response.text();
114
+ const retryable = this.isRetryable(response.status);
115
+ // If retryable and we have retries left, try again
116
+ if (retryable && attempt < this.maxRetries) {
117
+ const retryAfterRaw = response.headers.get('Retry-After');
118
+ const retryAfterParsed = retryAfterRaw ? parseInt(retryAfterRaw, 10) : NaN;
119
+ const delay = this.calculateDelay(attempt, !isNaN(retryAfterParsed) && retryAfterParsed > 0 ? retryAfterParsed : undefined);
120
+ this.log(`Retryable error (${response.status}), waiting ${delay}ms before retry`);
121
+ await this.sleep(delay);
122
+ lastError = new AgentGovAPIError(`AgentGov API error: ${response.status} ${errorText}`, response.status, true);
123
+ continue;
124
+ }
125
+ throw new AgentGovAPIError(`AgentGov API error: ${response.status} ${errorText}`, response.status, retryable);
126
+ }
127
+ // Handle 204 No Content
128
+ if (response.status === 204) {
129
+ return undefined;
130
+ }
131
+ const data = await response.json();
132
+ this.log('Response:', data);
133
+ return data;
134
+ }
135
+ finally {
136
+ clearTimeout(timeoutId);
137
+ }
138
+ }
139
+ catch (error) {
140
+ // Handle abort (timeout)
141
+ if (error instanceof Error && error.name === 'AbortError') {
142
+ lastError = new AgentGovAPIError(`Request timeout after ${this.timeout}ms`, 408, true);
143
+ if (attempt < this.maxRetries) {
144
+ const delay = this.calculateDelay(attempt);
145
+ this.log(`Request timed out, waiting ${delay}ms before retry`);
146
+ await this.sleep(delay);
147
+ continue;
148
+ }
149
+ }
150
+ // Handle network errors
151
+ if (error instanceof TypeError && error.message.includes('fetch')) {
152
+ lastError = new AgentGovAPIError(`Network error: ${error.message}`, 0, true);
153
+ if (attempt < this.maxRetries) {
154
+ const delay = this.calculateDelay(attempt);
155
+ this.log(`Network error, waiting ${delay}ms before retry`);
156
+ await this.sleep(delay);
157
+ continue;
158
+ }
159
+ }
160
+ // Re-throw AgentGovAPIError or wrap other errors
161
+ if (error instanceof AgentGovAPIError) {
162
+ throw error;
163
+ }
164
+ throw error;
165
+ }
166
+ }
167
+ // Should not reach here, but throw last error if we do
168
+ throw lastError || new Error('Unexpected error in request');
169
+ }
170
+ // ============================================
171
+ // Traces
172
+ // ============================================
173
+ async createTrace(input) {
174
+ return this.request('POST', '/v1/traces', {
175
+ ...input,
176
+ projectId: this.projectId
177
+ });
178
+ }
179
+ async updateTrace(traceId, update) {
180
+ return this.request('PATCH', `/v1/traces/${traceId}`, update);
181
+ }
182
+ async getTrace(traceId) {
183
+ return this.request('GET', `/v1/traces/${traceId}`);
184
+ }
185
+ // ============================================
186
+ // Spans
187
+ // ============================================
188
+ async createSpan(input) {
189
+ return this.request('POST', '/v1/spans', input);
190
+ }
191
+ async updateSpan(spanId, update) {
192
+ return this.request('PATCH', `/v1/spans/${spanId}`, update);
193
+ }
194
+ async getSpan(spanId) {
195
+ return this.request('GET', `/v1/spans/${spanId}`);
196
+ }
197
+ }
198
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Calculate duration in milliseconds
3
+ */
4
+ export declare function calculateDuration(startTime: number): number;
5
+ /**
6
+ * Estimate cost based on model and tokens
7
+ * Prices as of January 2026 (approximate)
8
+ */
9
+ export declare function estimateCost(model: string, inputTokens: number, outputTokens: number): number;
10
+ //# sourceMappingURL=timing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/utils/timing.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3D;AAUD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,CAiER"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Calculate duration in milliseconds
3
+ */
4
+ export function calculateDuration(startTime) {
5
+ return Date.now() - startTime;
6
+ }
7
+ /**
8
+ * Estimate cost based on model and tokens
9
+ * Prices as of January 2026 (approximate)
10
+ */
11
+ export function estimateCost(model, inputTokens, outputTokens) {
12
+ // Pricing per 1M tokens - Updated January 2026
13
+ const pricing = {
14
+ // OpenAI - GPT-5 Series (Flagship)
15
+ 'gpt-5.2-pro': { inputPrice: 21.00, outputPrice: 168.00 },
16
+ 'gpt-5.2': { inputPrice: 1.75, outputPrice: 14.00 },
17
+ 'gpt-5': { inputPrice: 1.25, outputPrice: 10.00 },
18
+ // OpenAI - GPT-4 Series
19
+ 'gpt-4.1': { inputPrice: 2.00, outputPrice: 8.00 },
20
+ 'gpt-4.1-mini': { inputPrice: 0.40, outputPrice: 1.60 },
21
+ 'gpt-4o': { inputPrice: 2.50, outputPrice: 10.00 },
22
+ 'gpt-4o-mini': { inputPrice: 0.15, outputPrice: 0.60 },
23
+ // OpenAI - o-Series (Reasoning)
24
+ 'o4-mini': { inputPrice: 1.10, outputPrice: 4.40 },
25
+ 'o3-pro': { inputPrice: 20.00, outputPrice: 80.00 },
26
+ 'o3': { inputPrice: 10.00, outputPrice: 40.00 },
27
+ 'o3-mini': { inputPrice: 1.10, outputPrice: 4.40 },
28
+ 'o1': { inputPrice: 15.00, outputPrice: 60.00 },
29
+ 'o1-mini': { inputPrice: 3.00, outputPrice: 12.00 },
30
+ // OpenAI - Legacy
31
+ 'gpt-4-turbo': { inputPrice: 10.00, outputPrice: 30.00 },
32
+ 'gpt-4': { inputPrice: 30.00, outputPrice: 60.00 },
33
+ 'gpt-3.5-turbo': { inputPrice: 0.50, outputPrice: 1.50 },
34
+ // Anthropic
35
+ 'claude-sonnet-4': { inputPrice: 3.00, outputPrice: 15.00 },
36
+ 'claude-3.5-sonnet': { inputPrice: 3.00, outputPrice: 15.00 },
37
+ 'claude-3.5-haiku': { inputPrice: 0.80, outputPrice: 4.00 },
38
+ 'claude-3-opus': { inputPrice: 15.00, outputPrice: 75.00 },
39
+ 'claude-3-sonnet': { inputPrice: 3.00, outputPrice: 15.00 },
40
+ 'claude-3-haiku': { inputPrice: 0.25, outputPrice: 1.25 },
41
+ // Embeddings (no output tokens)
42
+ 'text-embedding-3-small': { inputPrice: 0.02, outputPrice: 0 },
43
+ 'text-embedding-3-large': { inputPrice: 0.13, outputPrice: 0 },
44
+ 'text-embedding-ada-002': { inputPrice: 0.10, outputPrice: 0 },
45
+ // Default fallback
46
+ 'default': { inputPrice: 1.00, outputPrice: 2.00 }
47
+ };
48
+ // Find matching pricing (partial match)
49
+ // Sort keys by length descending so more specific matches come first
50
+ // e.g., "gpt-4o-mini" should match before "gpt-4o"
51
+ let { inputPrice, outputPrice } = pricing['default'];
52
+ const sortedKeys = Object.keys(pricing)
53
+ .filter(k => k !== 'default')
54
+ .sort((a, b) => b.length - a.length);
55
+ for (const key of sortedKeys) {
56
+ if (model.toLowerCase().includes(key.toLowerCase())) {
57
+ ;
58
+ ({ inputPrice, outputPrice } = pricing[key]);
59
+ break;
60
+ }
61
+ }
62
+ // Calculate cost (prices are per 1M tokens)
63
+ const inputCost = (inputTokens / 1_000_000) * inputPrice;
64
+ const outputCost = (outputTokens / 1_000_000) * outputPrice;
65
+ return Number((inputCost + outputCost).toFixed(6));
66
+ }
67
+ //# sourceMappingURL=timing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/utils/timing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { ChatCompletion, ChatCompletionChunk, ChatCompletionCreateParamsBase } from 'openai/resources/chat/completions';
2
+ import type { EmbeddingCreateParams, CreateEmbeddingResponse } from 'openai/resources/embeddings';
3
+ import type { FetchClient } from '../utils/fetch.js';
4
+ import type { TraceContext } from '../types.js';
5
+ export type { ChatCompletion, ChatCompletionChunk };
6
+ export type { EmbeddingCreateParams, CreateEmbeddingResponse };
7
+ export interface OpenAIClient {
8
+ chat: {
9
+ completions: {
10
+ create(params: ChatCompletionCreateParamsBase): Promise<ChatCompletion | AsyncIterable<ChatCompletionChunk>>;
11
+ };
12
+ };
13
+ embeddings?: {
14
+ create(params: EmbeddingCreateParams): Promise<CreateEmbeddingResponse>;
15
+ };
16
+ }
17
+ export type WrappedStream<T> = AsyncIterable<T>;
18
+ export interface WrapOpenAIOptions {
19
+ /** Custom trace name prefix */
20
+ traceNamePrefix?: string;
21
+ /** Auto-create trace for each call (default: true) */
22
+ autoTrace?: boolean;
23
+ /** Include full prompts in trace (default: true) */
24
+ captureInput?: boolean;
25
+ /** Include full responses in trace (default: true) */
26
+ captureOutput?: boolean;
27
+ /** Create separate spans for tool calls (default: true) */
28
+ traceToolCalls?: boolean;
29
+ /** Enable debug logging for span errors (default: false) */
30
+ debug?: boolean;
31
+ }
32
+ /**
33
+ * Wrap OpenAI client to automatically trace all calls
34
+ */
35
+ export declare function wrapOpenAI<T extends OpenAIClient>(client: T, fetchClient: FetchClient, getContext: () => TraceContext | null, options?: WrapOpenAIOptions): T;
36
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/wrappers/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACnB,8BAA8B,EAE/B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,EACV,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,6BAA6B,CAAA;AACpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI/C,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAA;AACnD,YAAY,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,CAAA;AAI9D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE;QACJ,WAAW,EAAE;YACX,MAAM,CAAC,MAAM,EAAE,8BAA8B,GAAG,OAAO,CAAC,cAAc,GAAG,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAA;SAC7G,CAAA;KACF,CAAA;IACD,UAAU,CAAC,EAAE;QACX,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;KACxE,CAAA;CACF;AAGD,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAA;AAQ/C,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,oDAAoD;IACpD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,sDAAsD;IACtD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,YAAY,EAC/C,MAAM,EAAE,CAAC,EACT,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM,YAAY,GAAG,IAAI,EACrC,OAAO,GAAE,iBAAsB,GAC9B,CAAC,CA2DH"}