langtrain 0.2.0 → 0.2.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.mts CHANGED
@@ -16,6 +16,23 @@ interface ClientConfig {
16
16
  timeout?: number;
17
17
  /** Maximum number of retries on transient errors (default: 2). */
18
18
  maxRetries?: number;
19
+ /** Max requests per second (client-side rate limiting, default: 10). */
20
+ maxRequestsPerSecond?: number;
21
+ /** Enable debug logging to stderr (default: false). */
22
+ debug?: boolean;
23
+ /** Optional callback invoked on every request for observability. */
24
+ onRequest?: (event: RequestEvent) => void;
25
+ }
26
+ /** Emitted for every API request (success or failure). */
27
+ interface RequestEvent {
28
+ method: string;
29
+ path: string;
30
+ status?: number;
31
+ latencyMs: number;
32
+ attempt: number;
33
+ error?: LangtrainError;
34
+ rateLimitRemaining?: number;
35
+ rateLimitReset?: number;
19
36
  }
20
37
  declare class LangtrainError extends Error {
21
38
  /** HTTP status code, if available. */
@@ -24,10 +41,13 @@ declare class LangtrainError extends Error {
24
41
  readonly code?: string;
25
42
  /** The original error, if any. */
26
43
  readonly cause?: Error;
44
+ /** Seconds until rate limit resets (from Retry-After header). */
45
+ readonly retryAfter?: number;
27
46
  constructor(message: string, options?: {
28
47
  status?: number;
29
48
  code?: string;
30
49
  cause?: Error;
50
+ retryAfter?: number;
31
51
  });
32
52
  /** True if the error was a network/timeout issue (retryable). */
33
53
  get isTransient(): boolean;
@@ -41,24 +61,32 @@ declare class LangtrainError extends Error {
41
61
  /**
42
62
  * BaseClient — abstract foundation for all Langtrain SDK clients.
43
63
  *
44
- * Provides:
64
+ * Features:
45
65
  * - Shared axios instance with API key auth
46
66
  * - Configurable timeouts
47
67
  * - Automatic retry with exponential backoff on transient errors
68
+ * - Client-side token-bucket rate limiting
69
+ * - Retry-After header respect on 429s
48
70
  * - Structured error wrapping (LangtrainError)
71
+ * - Debug logging and request event hooks
49
72
  */
50
73
  declare abstract class BaseClient {
51
74
  protected readonly http: AxiosInstance;
52
75
  protected readonly maxRetries: number;
76
+ private readonly rateLimiter;
77
+ private readonly debug;
78
+ private readonly onRequest?;
53
79
  constructor(config: ClientConfig);
54
80
  /**
55
- * Execute a request with automatic retry and error wrapping.
81
+ * Execute a request with rate limiting, automatic retry, and error wrapping.
56
82
  */
57
83
  protected request<T>(fn: () => Promise<T>): Promise<T>;
58
84
  /**
59
85
  * Wrap any thrown error into a structured LangtrainError.
60
86
  */
61
87
  private wrapError;
88
+ private log;
89
+ private emitEvent;
62
90
  private sleep;
63
91
  }
64
92
 
package/dist/index.d.ts CHANGED
@@ -16,6 +16,23 @@ interface ClientConfig {
16
16
  timeout?: number;
17
17
  /** Maximum number of retries on transient errors (default: 2). */
18
18
  maxRetries?: number;
19
+ /** Max requests per second (client-side rate limiting, default: 10). */
20
+ maxRequestsPerSecond?: number;
21
+ /** Enable debug logging to stderr (default: false). */
22
+ debug?: boolean;
23
+ /** Optional callback invoked on every request for observability. */
24
+ onRequest?: (event: RequestEvent) => void;
25
+ }
26
+ /** Emitted for every API request (success or failure). */
27
+ interface RequestEvent {
28
+ method: string;
29
+ path: string;
30
+ status?: number;
31
+ latencyMs: number;
32
+ attempt: number;
33
+ error?: LangtrainError;
34
+ rateLimitRemaining?: number;
35
+ rateLimitReset?: number;
19
36
  }
20
37
  declare class LangtrainError extends Error {
21
38
  /** HTTP status code, if available. */
@@ -24,10 +41,13 @@ declare class LangtrainError extends Error {
24
41
  readonly code?: string;
25
42
  /** The original error, if any. */
26
43
  readonly cause?: Error;
44
+ /** Seconds until rate limit resets (from Retry-After header). */
45
+ readonly retryAfter?: number;
27
46
  constructor(message: string, options?: {
28
47
  status?: number;
29
48
  code?: string;
30
49
  cause?: Error;
50
+ retryAfter?: number;
31
51
  });
32
52
  /** True if the error was a network/timeout issue (retryable). */
33
53
  get isTransient(): boolean;
@@ -41,24 +61,32 @@ declare class LangtrainError extends Error {
41
61
  /**
42
62
  * BaseClient — abstract foundation for all Langtrain SDK clients.
43
63
  *
44
- * Provides:
64
+ * Features:
45
65
  * - Shared axios instance with API key auth
46
66
  * - Configurable timeouts
47
67
  * - Automatic retry with exponential backoff on transient errors
68
+ * - Client-side token-bucket rate limiting
69
+ * - Retry-After header respect on 429s
48
70
  * - Structured error wrapping (LangtrainError)
71
+ * - Debug logging and request event hooks
49
72
  */
50
73
  declare abstract class BaseClient {
51
74
  protected readonly http: AxiosInstance;
52
75
  protected readonly maxRetries: number;
76
+ private readonly rateLimiter;
77
+ private readonly debug;
78
+ private readonly onRequest?;
53
79
  constructor(config: ClientConfig);
54
80
  /**
55
- * Execute a request with automatic retry and error wrapping.
81
+ * Execute a request with rate limiting, automatic retry, and error wrapping.
56
82
  */
57
83
  protected request<T>(fn: () => Promise<T>): Promise<T>;
58
84
  /**
59
85
  * Wrap any thrown error into a structured LangtrainError.
60
86
  */
61
87
  private wrapError;
88
+ private log;
89
+ private emitEvent;
62
90
  private sleep;
63
91
  }
64
92
 
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var chunkZN3AO753_js=require('./chunk-ZN3AO753.js');Object.defineProperty(exports,"AgentClient",{enumerable:true,get:function(){return chunkZN3AO753_js.d}});Object.defineProperty(exports,"AgentTypes",{enumerable:true,get:function(){return chunkZN3AO753_js.e}});Object.defineProperty(exports,"BaseClient",{enumerable:true,get:function(){return chunkZN3AO753_js.c}});Object.defineProperty(exports,"FileClient",{enumerable:true,get:function(){return chunkZN3AO753_js.f}});Object.defineProperty(exports,"GuardrailClient",{enumerable:true,get:function(){return chunkZN3AO753_js.m}});Object.defineProperty(exports,"LangtrainError",{enumerable:true,get:function(){return chunkZN3AO753_js.b}});Object.defineProperty(exports,"Langtune",{enumerable:true,get:function(){return chunkZN3AO753_js.r}});Object.defineProperty(exports,"Langvision",{enumerable:true,get:function(){return chunkZN3AO753_js.q}});Object.defineProperty(exports,"ModelClient",{enumerable:true,get:function(){return chunkZN3AO753_js.i}});Object.defineProperty(exports,"ModelTypes",{enumerable:true,get:function(){return chunkZN3AO753_js.j}});Object.defineProperty(exports,"SecretClient",{enumerable:true,get:function(){return chunkZN3AO753_js.k}});Object.defineProperty(exports,"SecretTypes",{enumerable:true,get:function(){return chunkZN3AO753_js.l}});Object.defineProperty(exports,"SubscriptionClient",{enumerable:true,get:function(){return chunkZN3AO753_js.h}});Object.defineProperty(exports,"Text",{enumerable:true,get:function(){return chunkZN3AO753_js.p}});Object.defineProperty(exports,"TrainingClient",{enumerable:true,get:function(){return chunkZN3AO753_js.g}});Object.defineProperty(exports,"UsageClient",{enumerable:true,get:function(){return chunkZN3AO753_js.n}});Object.defineProperty(exports,"Vision",{enumerable:true,get:function(){return chunkZN3AO753_js.o}});//# sourceMappingURL=index.js.map
1
+ 'use strict';var chunkK5LXUJ4G_js=require('./chunk-K5LXUJ4G.js');Object.defineProperty(exports,"AgentClient",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.d}});Object.defineProperty(exports,"AgentTypes",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.e}});Object.defineProperty(exports,"BaseClient",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.c}});Object.defineProperty(exports,"FileClient",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.f}});Object.defineProperty(exports,"GuardrailClient",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.m}});Object.defineProperty(exports,"LangtrainError",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.b}});Object.defineProperty(exports,"Langtune",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.r}});Object.defineProperty(exports,"Langvision",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.q}});Object.defineProperty(exports,"ModelClient",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.i}});Object.defineProperty(exports,"ModelTypes",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.j}});Object.defineProperty(exports,"SecretClient",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.k}});Object.defineProperty(exports,"SecretTypes",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.l}});Object.defineProperty(exports,"SubscriptionClient",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.h}});Object.defineProperty(exports,"Text",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.p}});Object.defineProperty(exports,"TrainingClient",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.g}});Object.defineProperty(exports,"UsageClient",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.n}});Object.defineProperty(exports,"Vision",{enumerable:true,get:function(){return chunkK5LXUJ4G_js.o}});//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- export{d as AgentClient,e as AgentTypes,c as BaseClient,f as FileClient,m as GuardrailClient,b as LangtrainError,r as Langtune,q as Langvision,i as ModelClient,j as ModelTypes,k as SecretClient,l as SecretTypes,h as SubscriptionClient,p as Text,g as TrainingClient,n as UsageClient,o as Vision}from'./chunk-36QS5AXY.mjs';//# sourceMappingURL=index.mjs.map
1
+ export{d as AgentClient,e as AgentTypes,c as BaseClient,f as FileClient,m as GuardrailClient,b as LangtrainError,r as Langtune,q as Langvision,i as ModelClient,j as ModelTypes,k as SecretClient,l as SecretTypes,h as SubscriptionClient,p as Text,g as TrainingClient,n as UsageClient,o as Vision}from'./chunk-A7PMJDMV.mjs';//# sourceMappingURL=index.mjs.map
2
2
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "langtrain",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Unified JavaScript SDK for Langtrain Ecosystem",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
package/src/lib/base.ts CHANGED
@@ -1,4 +1,4 @@
1
- import axios, { AxiosInstance, AxiosError, AxiosRequestConfig } from 'axios';
1
+ import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';
2
2
 
3
3
  // ── Shared Configuration ───────────────────────────────────────────────────
4
4
 
@@ -12,11 +12,30 @@ export interface ClientConfig {
12
12
  timeout?: number;
13
13
  /** Maximum number of retries on transient errors (default: 2). */
14
14
  maxRetries?: number;
15
+ /** Max requests per second (client-side rate limiting, default: 10). */
16
+ maxRequestsPerSecond?: number;
17
+ /** Enable debug logging to stderr (default: false). */
18
+ debug?: boolean;
19
+ /** Optional callback invoked on every request for observability. */
20
+ onRequest?: (event: RequestEvent) => void;
21
+ }
22
+
23
+ /** Emitted for every API request (success or failure). */
24
+ export interface RequestEvent {
25
+ method: string;
26
+ path: string;
27
+ status?: number;
28
+ latencyMs: number;
29
+ attempt: number;
30
+ error?: LangtrainError;
31
+ rateLimitRemaining?: number;
32
+ rateLimitReset?: number;
15
33
  }
16
34
 
17
35
  const DEFAULT_BASE_URL = 'https://api.langtrain.ai/api/v1';
18
36
  const DEFAULT_TIMEOUT = 30_000;
19
37
  const DEFAULT_MAX_RETRIES = 2;
38
+ const DEFAULT_MAX_RPS = 10;
20
39
  const RETRYABLE_STATUS_CODES = [408, 429, 500, 502, 503, 504];
21
40
 
22
41
  // ── Custom Error ───────────────────────────────────────────────────────────
@@ -28,13 +47,21 @@ export class LangtrainError extends Error {
28
47
  readonly code?: string;
29
48
  /** The original error, if any. */
30
49
  readonly cause?: Error;
50
+ /** Seconds until rate limit resets (from Retry-After header). */
51
+ readonly retryAfter?: number;
31
52
 
32
- constructor(message: string, options?: { status?: number; code?: string; cause?: Error }) {
53
+ constructor(message: string, options?: {
54
+ status?: number;
55
+ code?: string;
56
+ cause?: Error;
57
+ retryAfter?: number;
58
+ }) {
33
59
  super(message);
34
60
  this.name = 'LangtrainError';
35
61
  this.status = options?.status;
36
62
  this.code = options?.code;
37
63
  this.cause = options?.cause;
64
+ this.retryAfter = options?.retryAfter;
38
65
  }
39
66
 
40
67
  /** True if the error was a network/timeout issue (retryable). */
@@ -59,23 +86,85 @@ export class LangtrainError extends Error {
59
86
  }
60
87
  }
61
88
 
89
+ // ── Token Bucket Rate Limiter ──────────────────────────────────────────────
90
+
91
+ /**
92
+ * Simple token-bucket rate limiter.
93
+ * Allows bursting up to `capacity` requests, refills at `refillRate` tokens/sec.
94
+ */
95
+ class RateLimiter {
96
+ private tokens: number;
97
+ private lastRefill: number;
98
+
99
+ constructor(
100
+ private readonly capacity: number,
101
+ private readonly refillRate: number,
102
+ ) {
103
+ this.tokens = capacity;
104
+ this.lastRefill = Date.now();
105
+ }
106
+
107
+ /** Wait until a token is available, then consume it. */
108
+ async acquire(): Promise<void> {
109
+ this.refill();
110
+
111
+ if (this.tokens >= 1) {
112
+ this.tokens -= 1;
113
+ return;
114
+ }
115
+
116
+ // Wait for next token
117
+ const waitMs = ((1 - this.tokens) / this.refillRate) * 1000;
118
+ await this.sleep(Math.ceil(waitMs));
119
+ this.refill();
120
+ this.tokens -= 1;
121
+ }
122
+
123
+ /** Pause for `seconds` (e.g. from Retry-After header). */
124
+ async waitFor(seconds: number): Promise<void> {
125
+ await this.sleep(seconds * 1000);
126
+ }
127
+
128
+ private refill(): void {
129
+ const now = Date.now();
130
+ const elapsed = (now - this.lastRefill) / 1000;
131
+ this.tokens = Math.min(this.capacity, this.tokens + elapsed * this.refillRate);
132
+ this.lastRefill = now;
133
+ }
134
+
135
+ private sleep(ms: number): Promise<void> {
136
+ return new Promise(resolve => setTimeout(resolve, ms));
137
+ }
138
+ }
139
+
62
140
  // ── Base Client ────────────────────────────────────────────────────────────
63
141
 
64
142
  /**
65
143
  * BaseClient — abstract foundation for all Langtrain SDK clients.
66
144
  *
67
- * Provides:
145
+ * Features:
68
146
  * - Shared axios instance with API key auth
69
147
  * - Configurable timeouts
70
148
  * - Automatic retry with exponential backoff on transient errors
149
+ * - Client-side token-bucket rate limiting
150
+ * - Retry-After header respect on 429s
71
151
  * - Structured error wrapping (LangtrainError)
152
+ * - Debug logging and request event hooks
72
153
  */
73
154
  export abstract class BaseClient {
74
155
  protected readonly http: AxiosInstance;
75
156
  protected readonly maxRetries: number;
157
+ private readonly rateLimiter: RateLimiter;
158
+ private readonly debug: boolean;
159
+ private readonly onRequest?: (event: RequestEvent) => void;
76
160
 
77
161
  constructor(config: ClientConfig) {
78
162
  this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;
163
+ this.debug = config.debug ?? false;
164
+ this.onRequest = config.onRequest;
165
+
166
+ const maxRps = config.maxRequestsPerSecond ?? DEFAULT_MAX_RPS;
167
+ this.rateLimiter = new RateLimiter(maxRps, maxRps);
79
168
 
80
169
  this.http = axios.create({
81
170
  baseURL: config.baseUrl || DEFAULT_BASE_URL,
@@ -83,30 +172,61 @@ export abstract class BaseClient {
83
172
  headers: {
84
173
  'X-API-Key': config.apiKey,
85
174
  'Content-Type': 'application/json',
175
+ 'User-Agent': 'langtrain-sdk/0.2.x',
86
176
  },
87
177
  });
88
178
  }
89
179
 
90
180
  /**
91
- * Execute a request with automatic retry and error wrapping.
181
+ * Execute a request with rate limiting, automatic retry, and error wrapping.
92
182
  */
93
183
  protected async request<T>(fn: () => Promise<T>): Promise<T> {
94
184
  let lastError: LangtrainError | undefined;
95
185
 
96
186
  for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
187
+ // Acquire a rate limiter token before each attempt
188
+ await this.rateLimiter.acquire();
189
+
190
+ const start = Date.now();
191
+
97
192
  try {
98
- return await fn();
193
+ const result = await fn();
194
+ const latencyMs = Date.now() - start;
195
+
196
+ this.log(`✓ request succeeded (${latencyMs}ms, attempt ${attempt + 1})`);
197
+ this.emitEvent({ method: '', path: '', status: 200, latencyMs, attempt });
198
+
199
+ return result;
99
200
  } catch (error) {
201
+ const latencyMs = Date.now() - start;
100
202
  lastError = this.wrapError(error);
101
203
 
102
- // Only retry on transient errors, and not on the last attempt
204
+ this.log(`✗ request failed: ${lastError.message} (${latencyMs}ms, attempt ${attempt + 1})`);
205
+ this.emitEvent({
206
+ method: '', path: '',
207
+ status: lastError.status,
208
+ latencyMs,
209
+ attempt,
210
+ error: lastError,
211
+ rateLimitRemaining: lastError.isRateLimited ? 0 : undefined,
212
+ rateLimitReset: lastError.retryAfter,
213
+ });
214
+
215
+ // Don't retry non-transient errors or on last attempt
103
216
  if (!lastError.isTransient || attempt === this.maxRetries) {
104
217
  throw lastError;
105
218
  }
106
219
 
107
- // Exponential backoff: 500ms, 1000ms, 2000ms...
108
- const delay = Math.min(500 * Math.pow(2, attempt), 5000);
109
- await this.sleep(delay);
220
+ // If rate-limited with Retry-After, respect it
221
+ if (lastError.isRateLimited && lastError.retryAfter) {
222
+ this.log(`⏳ rate limited, waiting ${lastError.retryAfter}s (Retry-After)`);
223
+ await this.rateLimiter.waitFor(lastError.retryAfter);
224
+ } else {
225
+ // Exponential backoff: 500ms, 1000ms, 2000ms...
226
+ const delay = Math.min(500 * Math.pow(2, attempt), 5000);
227
+ this.log(`↻ retrying in ${delay}ms...`);
228
+ await this.sleep(delay);
229
+ }
110
230
  }
111
231
  }
112
232
 
@@ -121,21 +241,35 @@ export abstract class BaseClient {
121
241
 
122
242
  if (error instanceof AxiosError) {
123
243
  const status = error.response?.status;
244
+ const headers = error.response?.headers;
124
245
  const data = error.response?.data as Record<string, unknown> | undefined;
125
246
  const serverMessage = data?.detail ?? data?.message ?? data?.error;
126
247
 
248
+ // Parse Retry-After header (seconds or HTTP date)
249
+ let retryAfter: number | undefined;
250
+ const retryHeader = headers?.['retry-after'];
251
+ if (retryHeader) {
252
+ const parsed = Number(retryHeader);
253
+ retryAfter = isNaN(parsed)
254
+ ? Math.max(0, Math.ceil((new Date(retryHeader).getTime() - Date.now()) / 1000))
255
+ : parsed;
256
+ }
257
+
127
258
  const message = serverMessage
128
259
  ? String(serverMessage)
129
260
  : error.code === 'ECONNABORTED'
130
261
  ? `Request timed out`
131
- : status
132
- ? `API request failed with status ${status}`
133
- : `Network error: ${error.message}`;
262
+ : status === 429
263
+ ? `Rate limited${retryAfter ? ` retry in ${retryAfter}s` : ''}`
264
+ : status
265
+ ? `API request failed with status ${status}`
266
+ : `Network error: ${error.message}`;
134
267
 
135
268
  return new LangtrainError(message, {
136
269
  status,
137
270
  code: error.code,
138
271
  cause: error,
272
+ retryAfter,
139
273
  });
140
274
  }
141
275
 
@@ -146,6 +280,22 @@ export abstract class BaseClient {
146
280
  return new LangtrainError(String(error));
147
281
  }
148
282
 
283
+ private log(msg: string): void {
284
+ if (this.debug) {
285
+ process.stderr.write(`[langtrain] ${msg}\n`);
286
+ }
287
+ }
288
+
289
+ private emitEvent(event: RequestEvent): void {
290
+ if (this.onRequest) {
291
+ try {
292
+ this.onRequest(event);
293
+ } catch {
294
+ // Never let user callbacks crash the SDK
295
+ }
296
+ }
297
+ }
298
+
149
299
  private sleep(ms: number): Promise<void> {
150
300
  return new Promise(resolve => setTimeout(resolve, ms));
151
301
  }
@@ -1,3 +0,0 @@
1
- import w,{AxiosError}from'axios';import k from'form-data';import y from'fs';import*as langvision from'langvision';export{langvision as o };export{Langvision as q}from'langvision';import*as langtune from'langtune';export{langtune as p };export{Langtune as r}from'langtune';var C=Object.defineProperty;var q=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var p=(n,e)=>{for(var t in e)C(n,t,{get:e[t],enumerable:true});};var T="https://api.langtrain.ai/api/v1",A=3e4,P=2,F=[408,429,500,502,503,504],a=class extends Error{constructor(e,t){super(e),this.name="LangtrainError",this.status=t?.status,this.code=t?.code,this.cause=t?.cause;}get isTransient(){return this.code==="ECONNABORTED"||this.code==="NETWORK_ERROR"||this.status!==void 0&&F.includes(this.status)}get isAuthError(){return this.status===401||this.status===403}get isNotFound(){return this.status===404}get isRateLimited(){return this.status===429}},s=class{constructor(e){this.maxRetries=e.maxRetries??P,this.http=w.create({baseURL:e.baseUrl||T,timeout:e.timeout??A,headers:{"X-API-Key":e.apiKey,"Content-Type":"application/json"}});}async request(e){let t;for(let r=0;r<=this.maxRetries;r++)try{return await e()}catch(i){if(t=this.wrapError(i),!t.isTransient||r===this.maxRetries)throw t;let o=Math.min(500*Math.pow(2,r),5e3);await this.sleep(o);}throw t}wrapError(e){if(e instanceof a)return e;if(e instanceof AxiosError){let t=e.response?.status,r=e.response?.data,i=r?.detail??r?.message??r?.error,o=i?String(i):e.code==="ECONNABORTED"?"Request timed out":t?`API request failed with status ${t}`:`Network error: ${e.message}`;return new a(o,{status:t,code:e.code,cause:e})}return e instanceof Error?new a(e.message,{cause:e}):new a(String(e))}sleep(e){return new Promise(t=>setTimeout(t,e))}};var b={};p(b,{AgentClient:()=>u});var u=class extends s{constructor(e){super(e);}async list(e){return this.request(async()=>{let t={};return e&&(t.workspace_id=e),(await this.http.get("/agents",{params:t})).data.agents})}async get(e){return this.request(async()=>(await this.http.get(`/agents/${e}`)).data)}async create(e){return this.request(async()=>(await this.http.post("/agents/",e)).data)}async delete(e){return this.request(async()=>{await this.http.delete(`/agents/${e}`);})}async execute(e,t,r=[],i){return this.request(async()=>(await this.http.post(`/agents/${e}/execute`,{input:t,messages:r,conversation_id:i})).data)}async logs(e,t=100){return this.request(async()=>(await this.http.get(`/agents/${e}/logs`,{params:{limit:t}})).data.logs)}};var d=class extends s{constructor(e){super(e);}async upload(e,t,r="fine-tune"){if(!y.existsSync(e))throw new Error(`File not found: ${e}`);return this.request(async()=>{let i=new k;return i.append("file",y.createReadStream(e)),t&&i.append("workspace_id",t),i.append("purpose",r),(await this.http.post("/files",i,{headers:i.getHeaders(),maxContentLength:1/0,maxBodyLength:1/0})).data})}async list(e,t){return this.request(async()=>{let r={workspace_id:e};return t&&(r.purpose=t),(await this.http.get("/files",{params:r})).data.data})}async delete(e){return this.request(async()=>{await this.http.delete(`/files/${e}`);})}};var l=class extends s{constructor(e){super(e);}async createJob(e){return this.request(async()=>(await this.http.post("/finetune/jobs",e)).data)}async listJobs(e,t=10){return this.request(async()=>(await this.http.get("/finetune/jobs",{params:{workspace_id:e,limit:t}})).data)}async getJob(e){return this.request(async()=>(await this.http.get(`/finetune/jobs/${e}`)).data)}async cancelJob(e){return this.request(async()=>(await this.http.post(`/finetune/jobs/${e}/cancel`)).data)}};var m=class extends s{constructor(e){super(e);}async getStatus(){return this.request(async()=>(await this.http.get("/subscription/status")).data)}async checkFeature(e){return this.request(async()=>(await this.http.get(`/subscription/check/${e}`)).data)}async getLimits(){return this.request(async()=>(await this.http.get("/subscription/analytics")).data)}};var _={};p(_,{ModelClient:()=>c});var c=class extends s{constructor(e){super(e);}async list(e){return this.request(async()=>{let t={};return e&&(t.task=e),(await this.http.get("/models",{params:t})).data.data})}async get(e){return this.request(async()=>(await this.http.get(`/models/${e}`)).data)}};var x={};p(x,{SecretClient:()=>g});var g=class extends s{constructor(e){super(e);}async list(e){return this.request(async()=>{let t={};return e&&(t.workspace_id=e),(await this.http.get("/secrets",{params:t})).data.secrets})}async set(e,t,r){return this.request(async()=>(await this.http.post("/secrets",{key:e,value:t,workspace_id:r})).data)}async delete(e,t){return this.request(async()=>{let r={};t&&(r.workspace_id=t),await this.http.delete(`/secrets/${e}`,{params:r});})}};var h=class extends s{constructor(e){super(e);}async list(e){return this.request(async()=>{let t={};return e&&(t.workspace_id=e),(await this.http.get("/guardrails/",{params:t})).data})}async get(e){return this.request(async()=>(await this.http.get(`/guardrails/${e}`)).data)}async create(e){return this.request(async()=>(await this.http.post("/guardrails/",e)).data)}async delete(e){return this.request(async()=>{await this.http.delete(`/guardrails/${e}`);})}async apply(e,t){return this.request(async()=>(await this.http.post("/guardrails/apply",{dataset_id:e,guardrail_id:t})).data)}};var f=class extends s{constructor(e){super(e);}async getSummary(e){return this.request(async()=>(await this.http.get("/usage",{params:{workspace_id:e}})).data)}async getHistory(e,t=30){return this.request(async()=>(await this.http.get("/usage/history",{params:{workspace_id:e,days:t}})).data.history)}};
2
- export{q as a,a as b,s as c,u as d,b as e,d as f,l as g,m as h,c as i,_ as j,g as k,x as l,h as m,f as n};//# sourceMappingURL=chunk-36QS5AXY.mjs.map
3
- //# sourceMappingURL=chunk-36QS5AXY.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/base.ts","../src/lib/agent.ts","../src/lib/files.ts","../src/lib/training.ts","../src/lib/subscription.ts","../src/lib/models.ts","../src/lib/secrets.ts","../src/lib/guardrails.ts","../src/lib/usage.ts"],"names":["DEFAULT_BASE_URL","DEFAULT_TIMEOUT","DEFAULT_MAX_RETRIES","RETRYABLE_STATUS_CODES","LangtrainError","message","options","BaseClient","config","axios","fn","lastError","attempt","error","delay","AxiosError","status","data","serverMessage","ms","resolve","agent_exports","__export","AgentClient","workspaceId","params","agentId","agent","input","messages","conversationId","limit","FileClient","filePath","purpose","fs","form","FormData","fileId","TrainingClient","job","jobId","SubscriptionClient","feature","models_exports","ModelClient","task","modelId","secrets_exports","SecretClient","key","value","GuardrailClient","guardrailId","datasetId","UsageClient","days"],"mappings":"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","file":"chunk-36QS5AXY.mjs","sourcesContent":["import axios, { AxiosInstance, AxiosError, AxiosRequestConfig } from 'axios';\n\n// ── Shared Configuration ───────────────────────────────────────────────────\n\n/** Configuration for all Langtrain SDK clients. */\nexport interface ClientConfig {\n /** Your Langtrain API key. */\n apiKey: string;\n /** Override the default API base URL. */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000). */\n timeout?: number;\n /** Maximum number of retries on transient errors (default: 2). */\n maxRetries?: number;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.langtrain.ai/api/v1';\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst RETRYABLE_STATUS_CODES = [408, 429, 500, 502, 503, 504];\n\n// ── Custom Error ───────────────────────────────────────────────────────────\n\nexport class LangtrainError extends Error {\n /** HTTP status code, if available. */\n readonly status?: number;\n /** Raw error code from the API. */\n readonly code?: string;\n /** The original error, if any. */\n readonly cause?: Error;\n\n constructor(message: string, options?: { status?: number; code?: string; cause?: Error }) {\n super(message);\n this.name = 'LangtrainError';\n this.status = options?.status;\n this.code = options?.code;\n this.cause = options?.cause;\n }\n\n /** True if the error was a network/timeout issue (retryable). */\n get isTransient(): boolean {\n return this.code === 'ECONNABORTED' || this.code === 'NETWORK_ERROR' ||\n (this.status !== undefined && RETRYABLE_STATUS_CODES.includes(this.status));\n }\n\n /** True if the API key was invalid or expired. */\n get isAuthError(): boolean {\n return this.status === 401 || this.status === 403;\n }\n\n /** True if a resource was not found. */\n get isNotFound(): boolean {\n return this.status === 404;\n }\n\n /** True if rate-limited. */\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n}\n\n// ── Base Client ────────────────────────────────────────────────────────────\n\n/**\n * BaseClient — abstract foundation for all Langtrain SDK clients.\n *\n * Provides:\n * - Shared axios instance with API key auth\n * - Configurable timeouts\n * - Automatic retry with exponential backoff on transient errors\n * - Structured error wrapping (LangtrainError)\n */\nexport abstract class BaseClient {\n protected readonly http: AxiosInstance;\n protected readonly maxRetries: number;\n\n constructor(config: ClientConfig) {\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n\n this.http = axios.create({\n baseURL: config.baseUrl || DEFAULT_BASE_URL,\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n headers: {\n 'X-API-Key': config.apiKey,\n 'Content-Type': 'application/json',\n },\n });\n }\n\n /**\n * Execute a request with automatic retry and error wrapping.\n */\n protected async request<T>(fn: () => Promise<T>): Promise<T> {\n let lastError: LangtrainError | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = this.wrapError(error);\n\n // Only retry on transient errors, and not on the last attempt\n if (!lastError.isTransient || attempt === this.maxRetries) {\n throw lastError;\n }\n\n // Exponential backoff: 500ms, 1000ms, 2000ms...\n const delay = Math.min(500 * Math.pow(2, attempt), 5000);\n await this.sleep(delay);\n }\n }\n\n throw lastError!;\n }\n\n /**\n * Wrap any thrown error into a structured LangtrainError.\n */\n private wrapError(error: unknown): LangtrainError {\n if (error instanceof LangtrainError) return error;\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const data = error.response?.data as Record<string, unknown> | undefined;\n const serverMessage = data?.detail ?? data?.message ?? data?.error;\n\n const message = serverMessage\n ? String(serverMessage)\n : error.code === 'ECONNABORTED'\n ? `Request timed out`\n : status\n ? `API request failed with status ${status}`\n : `Network error: ${error.message}`;\n\n return new LangtrainError(message, {\n status,\n code: error.code,\n cause: error,\n });\n }\n\n if (error instanceof Error) {\n return new LangtrainError(error.message, { cause: error });\n }\n\n return new LangtrainError(String(error));\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n","import { BaseClient, ClientConfig } from './base';\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface Agent {\n id: string;\n workspace_id: string;\n name: string;\n description?: string;\n model_id?: string;\n config: AgentConfig;\n is_active: boolean;\n created_at: string;\n updated_at: string;\n}\n\nexport interface AgentConfig {\n system_prompt?: string;\n temperature?: number;\n max_tokens?: number;\n tools?: string[];\n [key: string]: unknown;\n}\n\nexport interface AgentCreate {\n workspace_id: string;\n name: string;\n description?: string;\n model_id?: string;\n config?: AgentConfig;\n}\n\nexport interface AgentRun {\n id: string;\n conversation_id: string;\n success: boolean;\n output?: unknown;\n error?: string;\n latency_ms: number;\n tokens_used: number;\n}\n\n// ── Client ─────────────────────────────────────────────────────────────────\n\n/**\n * Client for managing AI agents — create, execute, and monitor.\n *\n * @example\n * ```ts\n * const agents = new AgentClient({ apiKey: 'lt_...' });\n * const list = await agents.list();\n * const result = await agents.execute(list[0].id, 'Hello!');\n * ```\n */\nexport class AgentClient extends BaseClient {\n constructor(config: ClientConfig) {\n super(config);\n }\n\n /** List all agents, optionally filtered by workspace. */\n async list(workspaceId?: string): Promise<Agent[]> {\n return this.request(async () => {\n const params: Record<string, string> = {};\n if (workspaceId) params.workspace_id = workspaceId;\n const res = await this.http.get<{ agents: Agent[] }>('/agents', { params });\n return res.data.agents;\n });\n }\n\n /** Get a single agent by ID. */\n async get(agentId: string): Promise<Agent> {\n return this.request(async () => {\n const res = await this.http.get<Agent>(`/agents/${agentId}`);\n return res.data;\n });\n }\n\n /** Create a new agent. */\n async create(agent: AgentCreate): Promise<Agent> {\n return this.request(async () => {\n const res = await this.http.post<Agent>('/agents/', agent);\n return res.data;\n });\n }\n\n /** Delete an agent by ID. */\n async delete(agentId: string): Promise<void> {\n return this.request(async () => {\n await this.http.delete(`/agents/${agentId}`);\n });\n }\n\n /** Execute an agent with input and optional conversation context. */\n async execute(agentId: string, input: string, messages: Array<{ role: string; content: string }> = [], conversationId?: string): Promise<AgentRun> {\n return this.request(async () => {\n const res = await this.http.post<AgentRun>(`/agents/${agentId}/execute`, {\n input,\n messages,\n conversation_id: conversationId,\n });\n return res.data;\n });\n }\n\n /** Fetch recent logs for an agent. */\n async logs(agentId: string, limit: number = 100): Promise<string[]> {\n return this.request(async () => {\n const res = await this.http.get<{ logs: string[] }>(`/agents/${agentId}/logs`, {\n params: { limit },\n });\n return res.data.logs;\n });\n }\n}\n","import { BaseClient, ClientConfig } from './base';\nimport FormData from 'form-data';\nimport fs from 'fs';\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface FileResponse {\n id: string;\n filename: string;\n purpose: string;\n bytes: number;\n created_at: string;\n}\n\n// ── Client ─────────────────────────────────────────────────────────────────\n\n/**\n * Client for managing file uploads (datasets for fine-tuning).\n *\n * @example\n * ```ts\n * const files = new FileClient({ apiKey: 'lt_...' });\n * const uploaded = await files.upload('./data.jsonl');\n * ```\n */\nexport class FileClient extends BaseClient {\n constructor(config: ClientConfig) {\n super(config);\n }\n\n /** Upload a file from a local path. */\n async upload(filePath: string, workspaceId?: string, purpose: string = 'fine-tune'): Promise<FileResponse> {\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n return this.request(async () => {\n const form = new FormData();\n form.append('file', fs.createReadStream(filePath));\n if (workspaceId) form.append('workspace_id', workspaceId);\n form.append('purpose', purpose);\n\n const res = await this.http.post<FileResponse>('/files', form, {\n headers: form.getHeaders(),\n maxContentLength: Infinity,\n maxBodyLength: Infinity,\n });\n return res.data;\n });\n }\n\n /** List files in a workspace, optionally filtered by purpose. */\n async list(workspaceId: string, purpose?: string): Promise<FileResponse[]> {\n return this.request(async () => {\n const params: Record<string, string> = { workspace_id: workspaceId };\n if (purpose) params.purpose = purpose;\n const res = await this.http.get<{ data: FileResponse[] }>('/files', { params });\n return res.data.data;\n });\n }\n\n /** Delete a file by ID. */\n async delete(fileId: string): Promise<void> {\n return this.request(async () => {\n await this.http.delete(`/files/${fileId}`);\n });\n }\n}\n","import { BaseClient, ClientConfig } from './base';\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface FineTuneHyperparameters {\n epochs?: number;\n learning_rate?: number;\n batch_size?: number;\n warmup_steps?: number;\n lora_rank?: number;\n lora_alpha?: number;\n weight_decay?: number;\n}\n\nexport interface FineTuneJobCreate {\n name?: string;\n base_model: string;\n model_id?: string;\n dataset_id: string;\n guardrail_id?: string;\n task?: 'text' | 'vision';\n training_method?: 'sft' | 'dpo' | 'rlhf' | 'lora' | 'qlora';\n hyperparameters?: FineTuneHyperparameters;\n}\n\nexport interface FineTuneJobResponse {\n id: string;\n name: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';\n progress: number;\n error_message?: string;\n base_model?: string;\n training_method?: string;\n created_at: string;\n started_at?: string;\n completed_at?: string;\n}\n\nexport interface FineTuneJobList {\n data: FineTuneJobResponse[];\n has_more: boolean;\n}\n\n// ── Client ─────────────────────────────────────────────────────────────────\n\n/**\n * Client for managing fine-tuning training jobs.\n *\n * @example\n * ```ts\n * const training = new TrainingClient({ apiKey: 'lt_...' });\n * const job = await training.createJob({\n * base_model: 'meta-llama/Llama-3.1-8B',\n * dataset_id: 'file_abc123',\n * training_method: 'lora',\n * });\n * ```\n */\nexport class TrainingClient extends BaseClient {\n constructor(config: ClientConfig) {\n super(config);\n }\n\n /** Create a new fine-tuning job. */\n async createJob(job: FineTuneJobCreate): Promise<FineTuneJobResponse> {\n return this.request(async () => {\n const res = await this.http.post<FineTuneJobResponse>('/finetune/jobs', job);\n return res.data;\n });\n }\n\n /** List fine-tuning jobs for a workspace. */\n async listJobs(workspaceId: string, limit: number = 10): Promise<FineTuneJobList> {\n return this.request(async () => {\n const res = await this.http.get<FineTuneJobList>('/finetune/jobs', {\n params: { workspace_id: workspaceId, limit },\n });\n return res.data;\n });\n }\n\n /** Get a specific job by ID. */\n async getJob(jobId: string): Promise<FineTuneJobResponse> {\n return this.request(async () => {\n const res = await this.http.get<FineTuneJobResponse>(`/finetune/jobs/${jobId}`);\n return res.data;\n });\n }\n\n /** Cancel a running job. */\n async cancelJob(jobId: string): Promise<FineTuneJobResponse> {\n return this.request(async () => {\n const res = await this.http.post<FineTuneJobResponse>(`/finetune/jobs/${jobId}/cancel`);\n return res.data;\n });\n }\n}\n","import { BaseClient, ClientConfig } from './base';\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface SubscriptionInfo {\n is_active: boolean;\n plan: string;\n plan_name: string;\n expires_at?: string;\n features: string[];\n limits: Record<string, number>;\n usage?: {\n tokensUsedThisMonth?: number;\n tokenLimit?: number;\n apiCalls?: number;\n };\n}\n\nexport interface FeatureCheck {\n feature: string;\n allowed: boolean;\n limit?: number;\n used?: number;\n}\n\n// ── Client ─────────────────────────────────────────────────────────────────\n\n/**\n * Client for checking subscription status and feature access.\n *\n * @example\n * ```ts\n * const sub = new SubscriptionClient({ apiKey: 'lt_...' });\n * const status = await sub.getStatus();\n * console.log(status.plan); // 'pro'\n * ```\n */\nexport class SubscriptionClient extends BaseClient {\n constructor(config: ClientConfig) {\n super(config);\n }\n\n /** Get current subscription status. */\n async getStatus(): Promise<SubscriptionInfo> {\n return this.request(async () => {\n const res = await this.http.get<SubscriptionInfo>('/subscription/status');\n return res.data;\n });\n }\n\n /** Check if a specific feature is available on the current plan. */\n async checkFeature(feature: string): Promise<FeatureCheck> {\n return this.request(async () => {\n const res = await this.http.get<FeatureCheck>(`/subscription/check/${feature}`);\n return res.data;\n });\n }\n\n /** Get usage analytics for the current subscription. */\n async getLimits(): Promise<Record<string, unknown>> {\n return this.request(async () => {\n const res = await this.http.get('/subscription/analytics');\n return res.data;\n });\n }\n}\n","import { BaseClient, ClientConfig } from './base';\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface Permission {\n id: string;\n object: string;\n created: number;\n allow_create_engine: boolean;\n allow_sampling: boolean;\n allow_logprobs: boolean;\n allow_search_indices: boolean;\n allow_view: boolean;\n allow_fine_tuning: boolean;\n organization: string;\n group: string | null;\n is_blocking: boolean;\n}\n\nexport interface Model {\n id: string;\n object: string;\n created: number;\n owned_by: string;\n permission: Permission[];\n root: string;\n parent: string | null;\n task?: 'text' | 'vision' | 'agent';\n}\n\n// ── Client ─────────────────────────────────────────────────────────────────\n\n/**\n * Client for browsing available base models.\n *\n * @example\n * ```ts\n * const models = new ModelClient({ apiKey: 'lt_...' });\n * const all = await models.list();\n * const textModels = await models.list('text');\n * ```\n */\nexport class ModelClient extends BaseClient {\n constructor(config: ClientConfig) {\n super(config);\n }\n\n /** List available models, optionally filtered by task type. */\n async list(task?: 'text' | 'vision' | 'agent'): Promise<Model[]> {\n return this.request(async () => {\n const params: Record<string, string> = {};\n if (task) params.task = task;\n const res = await this.http.get<{ data: Model[] }>('/models', { params });\n return res.data.data;\n });\n }\n\n /** Get a specific model by ID. */\n async get(modelId: string): Promise<Model> {\n return this.request(async () => {\n const res = await this.http.get<Model>(`/models/${modelId}`);\n return res.data;\n });\n }\n}\n","import { BaseClient, ClientConfig } from './base';\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface Secret {\n key: string;\n created_at: string;\n updated_at: string;\n}\n\n// ── Client ─────────────────────────────────────────────────────────────────\n\n/**\n * Client for managing workspace secrets and environment variables.\n *\n * @example\n * ```ts\n * const secrets = new SecretClient({ apiKey: 'lt_...' });\n * await secrets.set('OPENAI_KEY', 'sk-...');\n * const all = await secrets.list();\n * ```\n */\nexport class SecretClient extends BaseClient {\n constructor(config: ClientConfig) {\n super(config);\n }\n\n /** List all secrets in a workspace. Values are redacted. */\n async list(workspaceId?: string): Promise<Secret[]> {\n return this.request(async () => {\n const params: Record<string, string> = {};\n if (workspaceId) params.workspace_id = workspaceId;\n const res = await this.http.get<{ secrets: Secret[] }>('/secrets', { params });\n return res.data.secrets;\n });\n }\n\n /** Set (create or update) a secret. */\n async set(key: string, value: string, workspaceId?: string): Promise<Secret> {\n return this.request(async () => {\n const res = await this.http.post<Secret>('/secrets', { key, value, workspace_id: workspaceId });\n return res.data;\n });\n }\n\n /** Delete a secret by key. */\n async delete(key: string, workspaceId?: string): Promise<void> {\n return this.request(async () => {\n const params: Record<string, string> = {};\n if (workspaceId) params.workspace_id = workspaceId;\n await this.http.delete(`/secrets/${key}`, { params });\n });\n }\n}\n","import { BaseClient, ClientConfig } from './base';\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface GuardrailConfig {\n pii_enabled: boolean;\n pii_entities?: string[];\n profanity_enabled: boolean;\n profanity_threshold?: number;\n blocked_topics?: string[];\n regex_patterns?: string[];\n min_length?: number;\n max_length?: number;\n}\n\nexport interface Guardrail {\n id: string;\n workspace_id: string;\n name: string;\n description?: string;\n config: GuardrailConfig;\n is_active: boolean;\n created_at: string;\n updated_at: string;\n}\n\nexport interface GuardrailCreate {\n name: string;\n description?: string;\n config: GuardrailConfig;\n}\n\nexport interface GuardrailApplyResult {\n total_rows: number;\n passed: number;\n failed: number;\n violations: Array<{ row: number; rule: string; message: string }>;\n}\n\n// ── Client ─────────────────────────────────────────────────────────────────\n\n/**\n * Client for managing data guardrails (PII, profanity, length, regex).\n *\n * @example\n * ```ts\n * const guardrails = new GuardrailClient({ apiKey: 'lt_...' });\n * const rule = await guardrails.create({\n * name: 'PII Filter',\n * config: { pii_enabled: true, profanity_enabled: false },\n * });\n * ```\n */\nexport class GuardrailClient extends BaseClient {\n constructor(config: ClientConfig) {\n super(config);\n }\n\n /** List guardrails, optionally filtered by workspace. */\n async list(workspaceId?: string): Promise<Guardrail[]> {\n return this.request(async () => {\n const params: Record<string, string> = {};\n if (workspaceId) params.workspace_id = workspaceId;\n const res = await this.http.get<Guardrail[]>('/guardrails/', { params });\n return res.data;\n });\n }\n\n /** Get a guardrail by ID. */\n async get(guardrailId: string): Promise<Guardrail> {\n return this.request(async () => {\n const res = await this.http.get<Guardrail>(`/guardrails/${guardrailId}`);\n return res.data;\n });\n }\n\n /** Create a new guardrail. */\n async create(data: GuardrailCreate): Promise<Guardrail> {\n return this.request(async () => {\n const res = await this.http.post<Guardrail>('/guardrails/', data);\n return res.data;\n });\n }\n\n /** Delete a guardrail by ID. */\n async delete(guardrailId: string): Promise<void> {\n return this.request(async () => {\n await this.http.delete(`/guardrails/${guardrailId}`);\n });\n }\n\n /** Apply a guardrail to a dataset for validation. */\n async apply(datasetId: string, guardrailId: string): Promise<GuardrailApplyResult> {\n return this.request(async () => {\n const res = await this.http.post<GuardrailApplyResult>('/guardrails/apply', {\n dataset_id: datasetId,\n guardrail_id: guardrailId,\n });\n return res.data;\n });\n }\n}\n","import { BaseClient, ClientConfig } from './base';\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface UsageSummary {\n workspace_id: string;\n plan: string;\n quotas: Record<string, number>;\n billing?: {\n plan_id: string;\n tokens_used: number;\n tokens_limit: number;\n period_end: string;\n };\n}\n\nexport interface UsageHistoryPoint {\n date: string;\n tokens: number;\n agent_runs: number;\n cost: number;\n}\n\n// ── Client ─────────────────────────────────────────────────────────────────\n\n/**\n * Client for querying usage metrics and billing data.\n *\n * @example\n * ```ts\n * const usage = new UsageClient({ apiKey: 'lt_...' });\n * const summary = await usage.getSummary('ws_abc123');\n * console.log(summary.billing?.tokens_used);\n * ```\n */\nexport class UsageClient extends BaseClient {\n constructor(config: ClientConfig) {\n super(config);\n }\n\n /** Get current usage summary for a workspace. */\n async getSummary(workspaceId: string): Promise<UsageSummary> {\n return this.request(async () => {\n const res = await this.http.get<UsageSummary>('/usage', {\n params: { workspace_id: workspaceId },\n });\n return res.data;\n });\n }\n\n /** Get historical usage data for charts. */\n async getHistory(workspaceId: string, days: number = 30): Promise<UsageHistoryPoint[]> {\n return this.request(async () => {\n const res = await this.http.get<{ history: UsageHistoryPoint[] }>('/usage/history', {\n params: { workspace_id: workspaceId, days },\n });\n return res.data.history;\n });\n }\n}\n"]}
@@ -1,3 +0,0 @@
1
- 'use strict';var w=require('axios'),k=require('form-data'),y=require('fs'),langvision=require('langvision'),langtune=require('langtune');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var w__default=/*#__PURE__*/_interopDefault(w);var k__default=/*#__PURE__*/_interopDefault(k);var y__default=/*#__PURE__*/_interopDefault(y);var langvision__namespace=/*#__PURE__*/_interopNamespace(langvision);var langtune__namespace=/*#__PURE__*/_interopNamespace(langtune);var C=Object.defineProperty;var q=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var p=(n,e)=>{for(var t in e)C(n,t,{get:e[t],enumerable:true});};var T="https://api.langtrain.ai/api/v1",A=3e4,P=2,F=[408,429,500,502,503,504],a=class extends Error{constructor(e,t){super(e),this.name="LangtrainError",this.status=t?.status,this.code=t?.code,this.cause=t?.cause;}get isTransient(){return this.code==="ECONNABORTED"||this.code==="NETWORK_ERROR"||this.status!==void 0&&F.includes(this.status)}get isAuthError(){return this.status===401||this.status===403}get isNotFound(){return this.status===404}get isRateLimited(){return this.status===429}},s=class{constructor(e){this.maxRetries=e.maxRetries??P,this.http=w__default.default.create({baseURL:e.baseUrl||T,timeout:e.timeout??A,headers:{"X-API-Key":e.apiKey,"Content-Type":"application/json"}});}async request(e){let t;for(let r=0;r<=this.maxRetries;r++)try{return await e()}catch(i){if(t=this.wrapError(i),!t.isTransient||r===this.maxRetries)throw t;let o=Math.min(500*Math.pow(2,r),5e3);await this.sleep(o);}throw t}wrapError(e){if(e instanceof a)return e;if(e instanceof w.AxiosError){let t=e.response?.status,r=e.response?.data,i=r?.detail??r?.message??r?.error,o=i?String(i):e.code==="ECONNABORTED"?"Request timed out":t?`API request failed with status ${t}`:`Network error: ${e.message}`;return new a(o,{status:t,code:e.code,cause:e})}return e instanceof Error?new a(e.message,{cause:e}):new a(String(e))}sleep(e){return new Promise(t=>setTimeout(t,e))}};var b={};p(b,{AgentClient:()=>u});var u=class extends s{constructor(e){super(e);}async list(e){return this.request(async()=>{let t={};return e&&(t.workspace_id=e),(await this.http.get("/agents",{params:t})).data.agents})}async get(e){return this.request(async()=>(await this.http.get(`/agents/${e}`)).data)}async create(e){return this.request(async()=>(await this.http.post("/agents/",e)).data)}async delete(e){return this.request(async()=>{await this.http.delete(`/agents/${e}`);})}async execute(e,t,r=[],i){return this.request(async()=>(await this.http.post(`/agents/${e}/execute`,{input:t,messages:r,conversation_id:i})).data)}async logs(e,t=100){return this.request(async()=>(await this.http.get(`/agents/${e}/logs`,{params:{limit:t}})).data.logs)}};var d=class extends s{constructor(e){super(e);}async upload(e,t,r="fine-tune"){if(!y__default.default.existsSync(e))throw new Error(`File not found: ${e}`);return this.request(async()=>{let i=new k__default.default;return i.append("file",y__default.default.createReadStream(e)),t&&i.append("workspace_id",t),i.append("purpose",r),(await this.http.post("/files",i,{headers:i.getHeaders(),maxContentLength:1/0,maxBodyLength:1/0})).data})}async list(e,t){return this.request(async()=>{let r={workspace_id:e};return t&&(r.purpose=t),(await this.http.get("/files",{params:r})).data.data})}async delete(e){return this.request(async()=>{await this.http.delete(`/files/${e}`);})}};var l=class extends s{constructor(e){super(e);}async createJob(e){return this.request(async()=>(await this.http.post("/finetune/jobs",e)).data)}async listJobs(e,t=10){return this.request(async()=>(await this.http.get("/finetune/jobs",{params:{workspace_id:e,limit:t}})).data)}async getJob(e){return this.request(async()=>(await this.http.get(`/finetune/jobs/${e}`)).data)}async cancelJob(e){return this.request(async()=>(await this.http.post(`/finetune/jobs/${e}/cancel`)).data)}};var m=class extends s{constructor(e){super(e);}async getStatus(){return this.request(async()=>(await this.http.get("/subscription/status")).data)}async checkFeature(e){return this.request(async()=>(await this.http.get(`/subscription/check/${e}`)).data)}async getLimits(){return this.request(async()=>(await this.http.get("/subscription/analytics")).data)}};var _={};p(_,{ModelClient:()=>c});var c=class extends s{constructor(e){super(e);}async list(e){return this.request(async()=>{let t={};return e&&(t.task=e),(await this.http.get("/models",{params:t})).data.data})}async get(e){return this.request(async()=>(await this.http.get(`/models/${e}`)).data)}};var x={};p(x,{SecretClient:()=>g});var g=class extends s{constructor(e){super(e);}async list(e){return this.request(async()=>{let t={};return e&&(t.workspace_id=e),(await this.http.get("/secrets",{params:t})).data.secrets})}async set(e,t,r){return this.request(async()=>(await this.http.post("/secrets",{key:e,value:t,workspace_id:r})).data)}async delete(e,t){return this.request(async()=>{let r={};t&&(r.workspace_id=t),await this.http.delete(`/secrets/${e}`,{params:r});})}};var h=class extends s{constructor(e){super(e);}async list(e){return this.request(async()=>{let t={};return e&&(t.workspace_id=e),(await this.http.get("/guardrails/",{params:t})).data})}async get(e){return this.request(async()=>(await this.http.get(`/guardrails/${e}`)).data)}async create(e){return this.request(async()=>(await this.http.post("/guardrails/",e)).data)}async delete(e){return this.request(async()=>{await this.http.delete(`/guardrails/${e}`);})}async apply(e,t){return this.request(async()=>(await this.http.post("/guardrails/apply",{dataset_id:e,guardrail_id:t})).data)}};var f=class extends s{constructor(e){super(e);}async getSummary(e){return this.request(async()=>(await this.http.get("/usage",{params:{workspace_id:e}})).data)}async getHistory(e,t=30){return this.request(async()=>(await this.http.get("/usage/history",{params:{workspace_id:e,days:t}})).data.history)}};
2
- exports.o=langvision__namespace;Object.defineProperty(exports,"q",{enumerable:true,get:function(){return langvision.Langvision}});exports.p=langtune__namespace;Object.defineProperty(exports,"r",{enumerable:true,get:function(){return langtune.Langtune}});exports.a=q;exports.b=a;exports.c=s;exports.d=u;exports.e=b;exports.f=d;exports.g=l;exports.h=m;exports.i=c;exports.j=_;exports.k=g;exports.l=x;exports.m=h;exports.n=f;//# sourceMappingURL=chunk-ZN3AO753.js.map
3
- //# sourceMappingURL=chunk-ZN3AO753.js.map