@synova-cloud/sdk 1.2.0 → 1.3.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/README.md +131 -8
- package/dist/index.cjs +41 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -22
- package/dist/index.d.ts +28 -22
- package/dist/index.js +41 -37
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -243,21 +243,107 @@ const response = await client.prompts.execute('prm_vision123', {
|
|
|
243
243
|
console.log(response.content);
|
|
244
244
|
```
|
|
245
245
|
|
|
246
|
+
### LLM Provider Keys
|
|
247
|
+
|
|
248
|
+
Manage API keys for LLM providers (OpenAI, Anthropic, Google, Azure, etc.).
|
|
249
|
+
|
|
250
|
+
#### List Keys
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
const { items, total } = await client.llmProviderKeys.list();
|
|
254
|
+
|
|
255
|
+
for (const key of items) {
|
|
256
|
+
console.log(`${key.provider}: ${key.maskedKey} (default: ${key.isDefault})`);
|
|
257
|
+
if (key.label) {
|
|
258
|
+
console.log(` Label: ${key.label}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
#### Get Key by ID
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
const key = await client.llmProviderKeys.get('lpk_abc123');
|
|
267
|
+
|
|
268
|
+
console.log(`Provider: ${key.provider}`);
|
|
269
|
+
console.log(`Default: ${key.isDefault}`);
|
|
270
|
+
console.log(`Label: ${key.label}`);
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
#### Create Key
|
|
274
|
+
|
|
275
|
+
```typescript
|
|
276
|
+
// Create OpenAI key
|
|
277
|
+
const key = await client.llmProviderKeys.create({
|
|
278
|
+
provider: 'openai',
|
|
279
|
+
apiKey: 'sk-...',
|
|
280
|
+
label: 'Production Key',
|
|
281
|
+
defaultModel: 'gpt-4o',
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
// Create Azure OpenAI key
|
|
285
|
+
const azureKey = await client.llmProviderKeys.create({
|
|
286
|
+
provider: 'azure_openai',
|
|
287
|
+
apiKey: 'your-azure-key',
|
|
288
|
+
azure: {
|
|
289
|
+
endpoint: 'https://my-resource.openai.azure.com',
|
|
290
|
+
},
|
|
291
|
+
label: 'Azure Production',
|
|
292
|
+
});
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
The first key created for a provider is automatically set as the default.
|
|
296
|
+
|
|
297
|
+
#### Set Default Key
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
// Set a different key as the default for its provider
|
|
301
|
+
const key = await client.llmProviderKeys.setDefault('lpk_abc123');
|
|
302
|
+
console.log(`${key.id} is now the default for ${key.provider}`);
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
#### Delete Key
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
await client.llmProviderKeys.delete('lpk_abc123');
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
If you delete the default key and other keys exist for that provider, the next key becomes the new default.
|
|
312
|
+
|
|
313
|
+
#### Use Specific Key in Execution
|
|
314
|
+
|
|
315
|
+
```typescript
|
|
316
|
+
// Execute with a specific API key
|
|
317
|
+
const response = await client.prompts.execute('prm_abc123', {
|
|
318
|
+
provider: 'openai',
|
|
319
|
+
model: 'gpt-4o',
|
|
320
|
+
apiKeyId: 'lpk_abc123', // Use this specific key
|
|
321
|
+
variables: { name: 'World' },
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
// Or omit apiKeyId to use the default key for the provider
|
|
325
|
+
const response = await client.prompts.execute('prm_abc123', {
|
|
326
|
+
provider: 'openai',
|
|
327
|
+
model: 'gpt-4o',
|
|
328
|
+
variables: { name: 'World' },
|
|
329
|
+
});
|
|
330
|
+
```
|
|
331
|
+
|
|
246
332
|
## Error Handling
|
|
247
333
|
|
|
248
|
-
The SDK provides typed errors for different failure scenarios:
|
|
334
|
+
The SDK provides typed errors for different failure scenarios. All API errors extend `ApiSynovaError` and include full error details:
|
|
249
335
|
|
|
250
336
|
```typescript
|
|
251
337
|
import {
|
|
252
338
|
SynovaCloudSdk,
|
|
253
339
|
SynovaError,
|
|
340
|
+
ApiSynovaError,
|
|
254
341
|
AuthSynovaError,
|
|
255
342
|
NotFoundSynovaError,
|
|
256
343
|
RateLimitSynovaError,
|
|
344
|
+
ServerSynovaError,
|
|
257
345
|
TimeoutSynovaError,
|
|
258
346
|
NetworkSynovaError,
|
|
259
|
-
ServerSynovaError,
|
|
260
|
-
ApiSynovaError,
|
|
261
347
|
} from '@synova-cloud/sdk';
|
|
262
348
|
|
|
263
349
|
try {
|
|
@@ -270,19 +356,50 @@ try {
|
|
|
270
356
|
if (error instanceof AuthSynovaError) {
|
|
271
357
|
console.error('Invalid API key');
|
|
272
358
|
} else if (error instanceof NotFoundSynovaError) {
|
|
273
|
-
console.error(
|
|
359
|
+
console.error('Resource not found');
|
|
274
360
|
} else if (error instanceof RateLimitSynovaError) {
|
|
275
361
|
console.error(`Rate limited. Retry after: ${error.retryAfterMs}ms`);
|
|
362
|
+
} else if (error instanceof ServerSynovaError) {
|
|
363
|
+
console.error(`Server error: ${error.message}`);
|
|
276
364
|
} else if (error instanceof TimeoutSynovaError) {
|
|
277
365
|
console.error(`Request timed out after ${error.timeoutMs}ms`);
|
|
278
366
|
} else if (error instanceof NetworkSynovaError) {
|
|
279
367
|
console.error(`Network error: ${error.message}`);
|
|
280
|
-
} else if (error instanceof ServerSynovaError) {
|
|
281
|
-
console.error(`Server error ${error.httpCode}: ${error.message}`);
|
|
282
368
|
} else if (error instanceof ApiSynovaError) {
|
|
369
|
+
// All API errors have these properties:
|
|
283
370
|
console.error(`API error [${error.code}]: ${error.message}`);
|
|
284
|
-
|
|
285
|
-
console.error(`
|
|
371
|
+
console.error(`Request ID: ${error.requestId}`);
|
|
372
|
+
console.error(`Details:`, error.details);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### Error Properties
|
|
378
|
+
|
|
379
|
+
All API errors (`AuthSynovaError`, `NotFoundSynovaError`, `RateLimitSynovaError`, `ServerSynovaError`, and `ApiSynovaError`) include:
|
|
380
|
+
|
|
381
|
+
| Property | Type | Description |
|
|
382
|
+
|----------|------|-------------|
|
|
383
|
+
| `code` | `string` | Error code (e.g., `"common.validation"`) |
|
|
384
|
+
| `httpCode` | `number` | HTTP status code |
|
|
385
|
+
| `message` | `string` | Human-readable error message |
|
|
386
|
+
| `requestId` | `string` | Request ID for debugging |
|
|
387
|
+
| `timestamp` | `string` | When the error occurred |
|
|
388
|
+
| `path` | `string?` | API endpoint path |
|
|
389
|
+
| `method` | `string?` | HTTP method |
|
|
390
|
+
| `details` | `unknown?` | Additional details (e.g., validation errors) |
|
|
391
|
+
|
|
392
|
+
### Validation Errors
|
|
393
|
+
|
|
394
|
+
When validation fails, `details` contains an array of field errors:
|
|
395
|
+
|
|
396
|
+
```typescript
|
|
397
|
+
try {
|
|
398
|
+
await client.llmProviderKeys.create({ provider: 'invalid' as any, apiKey: '' });
|
|
399
|
+
} catch (error) {
|
|
400
|
+
if (error instanceof ApiSynovaError && error.code === 'common.validation') {
|
|
401
|
+
console.log('Validation errors:', error.details);
|
|
402
|
+
// [{ field: "provider", message: "must be a valid enum value", code: "FIELD_PROVIDER_INVALID" }]
|
|
286
403
|
}
|
|
287
404
|
}
|
|
288
405
|
```
|
|
@@ -381,6 +498,12 @@ import type {
|
|
|
381
498
|
ISynovaModelsResponse,
|
|
382
499
|
ISynovaListModelsOptions,
|
|
383
500
|
TSynovaModelType,
|
|
501
|
+
// LLM Provider Keys
|
|
502
|
+
TSynovaLlmProvider,
|
|
503
|
+
ISynovaAzureConfig,
|
|
504
|
+
ISynovaLlmProviderKey,
|
|
505
|
+
ISynovaLlmProviderKeyListResponse,
|
|
506
|
+
ISynovaCreateLlmProviderKeyOptions,
|
|
384
507
|
} from '@synova-cloud/sdk';
|
|
385
508
|
```
|
|
386
509
|
|
package/dist/index.cjs
CHANGED
|
@@ -13,6 +13,9 @@ var ApiSynovaError = class extends SynovaError {
|
|
|
13
13
|
httpCode;
|
|
14
14
|
requestId;
|
|
15
15
|
timestamp;
|
|
16
|
+
path;
|
|
17
|
+
method;
|
|
18
|
+
details;
|
|
16
19
|
constructor(response) {
|
|
17
20
|
super(response.message);
|
|
18
21
|
this.name = "ApiSynovaError";
|
|
@@ -20,32 +23,38 @@ var ApiSynovaError = class extends SynovaError {
|
|
|
20
23
|
this.httpCode = response.httpCode;
|
|
21
24
|
this.requestId = response.requestId;
|
|
22
25
|
this.timestamp = response.timestamp;
|
|
26
|
+
this.path = response.path;
|
|
27
|
+
this.method = response.method;
|
|
28
|
+
this.details = response.details;
|
|
23
29
|
}
|
|
24
30
|
};
|
|
25
|
-
var AuthSynovaError = class extends
|
|
26
|
-
constructor(
|
|
27
|
-
super(
|
|
31
|
+
var AuthSynovaError = class extends ApiSynovaError {
|
|
32
|
+
constructor(response) {
|
|
33
|
+
super(response);
|
|
28
34
|
this.name = "AuthSynovaError";
|
|
29
35
|
}
|
|
30
36
|
};
|
|
31
|
-
var NotFoundSynovaError = class extends
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
constructor(resourceType, resourceId) {
|
|
35
|
-
super(`${resourceType} not found: ${resourceId}`);
|
|
37
|
+
var NotFoundSynovaError = class extends ApiSynovaError {
|
|
38
|
+
constructor(response) {
|
|
39
|
+
super(response);
|
|
36
40
|
this.name = "NotFoundSynovaError";
|
|
37
|
-
this.resourceType = resourceType;
|
|
38
|
-
this.resourceId = resourceId;
|
|
39
41
|
}
|
|
40
42
|
};
|
|
41
|
-
var RateLimitSynovaError = class extends
|
|
43
|
+
var RateLimitSynovaError = class extends ApiSynovaError {
|
|
42
44
|
retryAfterMs;
|
|
43
|
-
constructor(
|
|
44
|
-
super(
|
|
45
|
+
constructor(response, retryAfterMs) {
|
|
46
|
+
super(response);
|
|
45
47
|
this.name = "RateLimitSynovaError";
|
|
46
48
|
this.retryAfterMs = retryAfterMs;
|
|
47
49
|
}
|
|
48
50
|
};
|
|
51
|
+
var ServerSynovaError = class extends ApiSynovaError {
|
|
52
|
+
retryable = true;
|
|
53
|
+
constructor(response) {
|
|
54
|
+
super(response);
|
|
55
|
+
this.name = "ServerSynovaError";
|
|
56
|
+
}
|
|
57
|
+
};
|
|
49
58
|
var TimeoutSynovaError = class extends SynovaError {
|
|
50
59
|
timeoutMs;
|
|
51
60
|
constructor(timeoutMs) {
|
|
@@ -62,16 +71,6 @@ var NetworkSynovaError = class extends SynovaError {
|
|
|
62
71
|
this.cause = cause;
|
|
63
72
|
}
|
|
64
73
|
};
|
|
65
|
-
var ServerSynovaError = class extends SynovaError {
|
|
66
|
-
httpCode;
|
|
67
|
-
retryable;
|
|
68
|
-
constructor(httpCode, message) {
|
|
69
|
-
super(message || `Server error: ${httpCode}`);
|
|
70
|
-
this.name = "ServerSynovaError";
|
|
71
|
-
this.httpCode = httpCode;
|
|
72
|
-
this.retryable = true;
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
74
|
|
|
76
75
|
// src/utils/http.ts
|
|
77
76
|
var HttpClient = class {
|
|
@@ -212,30 +211,32 @@ var HttpClient = class {
|
|
|
212
211
|
errorBody = await response.json();
|
|
213
212
|
} catch {
|
|
214
213
|
}
|
|
214
|
+
const defaultErrorBody = {
|
|
215
|
+
code: "UNKNOWN_ERROR",
|
|
216
|
+
httpCode: status,
|
|
217
|
+
message: errorBody?.message || `HTTP ${status}: ${response.statusText}`,
|
|
218
|
+
requestId: errorBody?.requestId || "unknown",
|
|
219
|
+
timestamp: errorBody?.timestamp || (/* @__PURE__ */ new Date()).toISOString(),
|
|
220
|
+
path: errorBody?.path,
|
|
221
|
+
method: errorBody?.method,
|
|
222
|
+
details: errorBody?.details
|
|
223
|
+
};
|
|
224
|
+
const body = errorBody || defaultErrorBody;
|
|
215
225
|
if (status === 401) {
|
|
216
|
-
throw new AuthSynovaError(
|
|
226
|
+
throw new AuthSynovaError(body);
|
|
217
227
|
}
|
|
218
228
|
if (status === 404) {
|
|
219
|
-
throw new NotFoundSynovaError(
|
|
229
|
+
throw new NotFoundSynovaError(body);
|
|
220
230
|
}
|
|
221
231
|
if (status === 429) {
|
|
222
232
|
const retryAfter = response.headers.get("Retry-After");
|
|
223
233
|
const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1e3 : void 0;
|
|
224
|
-
throw new RateLimitSynovaError(
|
|
234
|
+
throw new RateLimitSynovaError(body, retryAfterMs);
|
|
225
235
|
}
|
|
226
236
|
if (status >= 500) {
|
|
227
|
-
throw new ServerSynovaError(
|
|
237
|
+
throw new ServerSynovaError(body);
|
|
228
238
|
}
|
|
229
|
-
|
|
230
|
-
throw new ApiSynovaError(errorBody);
|
|
231
|
-
}
|
|
232
|
-
throw new ApiSynovaError({
|
|
233
|
-
code: "UNKNOWN_ERROR",
|
|
234
|
-
httpCode: status,
|
|
235
|
-
message: `HTTP ${status}: ${response.statusText}`,
|
|
236
|
-
requestId: "unknown",
|
|
237
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
238
|
-
});
|
|
239
|
+
throw new ApiSynovaError(body);
|
|
239
240
|
}
|
|
240
241
|
buildUrl(path, query) {
|
|
241
242
|
const url = new URL(path, this.config.baseUrl);
|
|
@@ -359,6 +360,7 @@ var PromptsResource = class {
|
|
|
359
360
|
provider: options.provider,
|
|
360
361
|
model: options.model
|
|
361
362
|
};
|
|
363
|
+
if (options.apiKeyId !== void 0) body.apiKeyId = options.apiKeyId;
|
|
362
364
|
if (options.variables !== void 0) body.variables = options.variables;
|
|
363
365
|
if (options.messages !== void 0) body.messages = options.messages;
|
|
364
366
|
if (options.tag !== void 0) body.tag = options.tag;
|
|
@@ -397,6 +399,7 @@ var PromptsResource = class {
|
|
|
397
399
|
tag,
|
|
398
400
|
provider: options.provider,
|
|
399
401
|
model: options.model,
|
|
402
|
+
apiKeyId: options.apiKeyId,
|
|
400
403
|
variables: options.variables,
|
|
401
404
|
messages: options.messages,
|
|
402
405
|
metadata: options.metadata,
|
|
@@ -429,6 +432,7 @@ var PromptsResource = class {
|
|
|
429
432
|
version,
|
|
430
433
|
provider: options.provider,
|
|
431
434
|
model: options.model,
|
|
435
|
+
apiKeyId: options.apiKeyId,
|
|
432
436
|
variables: options.variables,
|
|
433
437
|
messages: options.messages,
|
|
434
438
|
metadata: options.metadata,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/index.ts","../src/utils/http.ts","../src/resources/prompts.ts","../src/resources/models.ts","../src/resources/files.ts","../src/resources/llm-provider-keys.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { IApiErrorResponse } from '../types';\n\n/**\n * Base error class for all Synova SDK errors\n */\nexport class SynovaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SynovaError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when API returns an error response\n */\nexport class ApiSynovaError extends SynovaError {\n readonly code: string;\n readonly httpCode: number;\n readonly requestId: string;\n readonly timestamp: string;\n\n constructor(response: IApiErrorResponse) {\n super(response.message);\n this.name = 'ApiSynovaError';\n this.code = response.code;\n this.httpCode = response.httpCode;\n this.requestId = response.requestId;\n this.timestamp = response.timestamp;\n }\n}\n\n/**\n * Error thrown when authentication fails\n */\nexport class AuthSynovaError extends SynovaError {\n constructor(message = 'Invalid or missing API key') {\n super(message);\n this.name = 'AuthSynovaError';\n }\n}\n\n/**\n * Error thrown when resource is not found\n */\nexport class NotFoundSynovaError extends SynovaError {\n readonly resourceType: string;\n readonly resourceId: string;\n\n constructor(resourceType: string, resourceId: string) {\n super(`${resourceType} not found: ${resourceId}`);\n this.name = 'NotFoundSynovaError';\n this.resourceType = resourceType;\n this.resourceId = resourceId;\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded\n */\nexport class RateLimitSynovaError extends SynovaError {\n readonly retryAfterMs?: number;\n\n constructor(message = 'Rate limit exceeded', retryAfterMs?: number) {\n super(message);\n this.name = 'RateLimitSynovaError';\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/**\n * Error thrown when request times out\n */\nexport class TimeoutSynovaError extends SynovaError {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = 'TimeoutSynovaError';\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Error thrown when network request fails\n */\nexport class NetworkSynovaError extends SynovaError {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = 'NetworkSynovaError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when server returns 5xx error\n */\nexport class ServerSynovaError extends SynovaError {\n readonly httpCode: number;\n readonly retryable: boolean;\n\n constructor(httpCode: number, message?: string) {\n super(message || `Server error: ${httpCode}`);\n this.name = 'ServerSynovaError';\n this.httpCode = httpCode;\n this.retryable = true;\n }\n}\n","import type { IApiErrorResponse, ISynovaLogger, TSynovaRetryStrategy } from '../types';\nimport {\n ApiSynovaError,\n AuthSynovaError,\n NetworkSynovaError,\n NotFoundSynovaError,\n RateLimitSynovaError,\n ServerSynovaError,\n TimeoutSynovaError,\n} from '../errors';\n\nexport interface IRetryOptions {\n maxRetries: number;\n strategy: TSynovaRetryStrategy;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffMultiplier: number;\n}\n\nexport interface IHttpClientConfig {\n baseUrl: string;\n apiKey: string;\n timeout: number;\n retry: IRetryOptions;\n debug: boolean;\n logger: ISynovaLogger;\n}\n\nexport interface IRequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | undefined>;\n}\n\nexport interface IUploadOptions {\n path: string;\n formData: FormData;\n}\n\nexport class HttpClient {\n private readonly config: IHttpClientConfig;\n\n constructor(config: IHttpClientConfig) {\n this.config = config;\n }\n\n async request<T>(options: IRequestOptions): Promise<T> {\n const url = this.buildUrl(options.path, options.query);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeRequest<T>(url, options);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Request failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n async upload<T>(options: IUploadOptions): Promise<T> {\n const url = this.buildUrl(options.path);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeUploadRequest<T>(url, options.formData);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Upload failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n private async makeRequest<T>(url: string, options: IRequestOptions): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`${options.method} ${url}`);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'synova-cloud-sdk-node/0.1.0',\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Network request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async makeUploadRequest<T>(url: string, formData: FormData): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`POST (upload) ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'User-Agent': 'synova-cloud-sdk-node/0.1.0',\n // Note: Content-Type is not set for FormData - browser/node sets it with boundary\n },\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Upload request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n const status = response.status;\n\n // Try to parse error body\n let errorBody: IApiErrorResponse | null = null;\n try {\n errorBody = (await response.json()) as IApiErrorResponse;\n } catch {\n // Ignore JSON parse errors\n }\n\n if (status === 401) {\n throw new AuthSynovaError(errorBody?.message);\n }\n\n if (status === 404) {\n throw new NotFoundSynovaError('Resource', errorBody?.message || 'unknown');\n }\n\n if (status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined;\n throw new RateLimitSynovaError(errorBody?.message, retryAfterMs);\n }\n\n if (status >= 500) {\n throw new ServerSynovaError(status, errorBody?.message);\n }\n\n if (errorBody) {\n throw new ApiSynovaError(errorBody);\n }\n\n throw new ApiSynovaError({\n code: 'UNKNOWN_ERROR',\n httpCode: status,\n message: `HTTP ${status}: ${response.statusText}`,\n requestId: 'unknown',\n timestamp: new Date().toISOString(),\n });\n }\n\n private buildUrl(path: string, query?: Record<string, string | undefined>): string {\n const url = new URL(path, this.config.baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n }\n\n return url.toString();\n }\n\n private isRetryable(error: unknown): boolean {\n if (error instanceof RateLimitSynovaError) return true;\n if (error instanceof ServerSynovaError) return true;\n if (error instanceof NetworkSynovaError) return true;\n if (error instanceof TimeoutSynovaError) return true;\n return false;\n }\n\n private calculateRetryDelay(attempt: number, error: Error | null): number {\n const { strategy, initialDelayMs, maxDelayMs, backoffMultiplier } = this.config.retry;\n\n // Use Retry-After header if available (takes priority)\n if (error instanceof RateLimitSynovaError && error.retryAfterMs) {\n return Math.min(error.retryAfterMs, maxDelayMs);\n }\n\n let baseDelay: number;\n\n if (strategy === 'linear') {\n // Linear: initialDelay * attempt (1000, 2000, 3000, ...)\n baseDelay = initialDelayMs * attempt;\n } else {\n // Exponential: initialDelay * multiplier^(attempt-1) (1000, 2000, 4000, ...)\n baseDelay = initialDelayMs * Math.pow(backoffMultiplier, attempt - 1);\n }\n\n // Add jitter (±10%) to prevent thundering herd\n const jitter = baseDelay * 0.1 * (Math.random() * 2 - 1);\n const delay = baseDelay + jitter;\n\n return Math.min(Math.max(delay, 0), maxDelayMs);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(message: string): void {\n if (this.config.debug) {\n this.config.logger.debug(`[Synova SDK] ${message}`);\n }\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaPrompt,\n ISynovaGetPromptOptions,\n ISynovaExecuteOptions,\n ISynovaExecuteResponse,\n} from '../types';\n\nexport class PromptsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get a prompt by ID (returns version with 'latest' tag)\n *\n * @param promptId - The prompt ID (e.g., 'prm_abc123')\n * @param options - Optional settings\n * @returns The prompt data\n *\n * @example\n * ```ts\n * // Get default (latest) version\n * const prompt = await client.prompts.get('prm_abc123');\n *\n * // Get by specific tag\n * const production = await client.prompts.get('prm_abc123', { tag: 'production' });\n *\n * // Get specific version\n * const v2 = await client.prompts.get('prm_abc123', { version: '2.0.0' });\n * ```\n */\n async get(promptId: string, options?: ISynovaGetPromptOptions): Promise<ISynovaPrompt> {\n // Version takes precedence over tag\n if (options?.version) {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/versions/${options.version}`,\n });\n }\n\n // Tag (defaults to 'latest')\n const tag = options?.tag || 'latest';\n if (tag === 'latest') {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}`,\n });\n }\n\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/tags/${tag}`,\n });\n }\n\n /**\n * Execute a prompt with 'latest' tag\n *\n * @param promptId - The prompt ID\n * @param options - Execution options including provider, model and variables\n * @returns The execution response\n *\n * @example\n * ```ts\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * if (result.type === 'message') {\n * console.log(result.content);\n * }\n *\n * // Image generation\n * const imageResult = await client.prompts.execute('prm_image123', {\n * provider: 'google',\n * model: 'gemini-2.0-flash-exp',\n * variables: { style: 'modern' },\n * });\n *\n * if (imageResult.type === 'image') {\n * console.log('Generated images:', imageResult.files);\n * }\n * ```\n */\n async execute(promptId: string, options: ISynovaExecuteOptions): Promise<ISynovaExecuteResponse> {\n const body: Record<string, unknown> = {\n provider: options.provider,\n model: options.model,\n };\n\n // Only add optional fields if they are defined\n if (options.variables !== undefined) body.variables = options.variables;\n if (options.messages !== undefined) body.messages = options.messages;\n if (options.tag !== undefined) body.tag = options.tag;\n if (options.version !== undefined) body.version = options.version;\n if (options.metadata !== undefined) body.metadata = options.metadata;\n if (options.parameters !== undefined) body.parameters = options.parameters;\n if (options.responseSchema !== undefined) body.responseSchema = options.responseSchema;\n\n return this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body,\n });\n }\n\n /**\n * Execute a prompt by tag\n *\n * @param promptId - The prompt ID\n * @param tag - The tag (e.g., 'latest', 'production', 'staging')\n * @param options - Execution options\n * @returns The execution response\n *\n * @example\n * ```ts\n * const result = await client.prompts.executeByTag('prm_abc123', 'production', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n * ```\n */\n async executeByTag(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse> {\n return this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body: {\n tag,\n provider: options.provider,\n model: options.model,\n variables: options.variables,\n messages: options.messages,\n metadata: options.metadata,\n parameters: options.parameters,\n },\n });\n }\n\n /**\n * Execute a prompt by version\n *\n * @param promptId - The prompt ID\n * @param version - The semantic version (e.g., '1.0.0', '2.1.0')\n * @param options - Execution options\n * @returns The execution response\n *\n * @example\n * ```ts\n * const result = await client.prompts.executeByVersion('prm_abc123', '1.2.0', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n * ```\n */\n async executeByVersion(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse> {\n return this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body: {\n version,\n provider: options.provider,\n model: options.model,\n variables: options.variables,\n messages: options.messages,\n metadata: options.metadata,\n parameters: options.parameters,\n },\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaModel, ISynovaModelsResponse, ISynovaListModelsOptions } from '../types';\n\ninterface IProviderModelsResponse {\n models: ISynovaModel[];\n}\n\nexport class ModelsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all available models\n *\n * @param options - Optional filters\n * @returns List of providers with their models\n *\n * @example\n * ```ts\n * // Get all models\n * const { providers } = await client.models.list();\n *\n * // Filter by type\n * const imageModels = await client.models.list({ type: 'image' });\n *\n * // Filter by capability\n * const functionCallingModels = await client.models.list({\n * capability: 'function_calling',\n * });\n *\n * // Filter by provider\n * const openaiModels = await client.models.list({ provider: 'openai' });\n * ```\n */\n async list(options?: ISynovaListModelsOptions): Promise<ISynovaModelsResponse> {\n return this.http.request<ISynovaModelsResponse>({\n method: 'GET',\n path: '/api/v1/models',\n query: {\n type: options?.type,\n capability: options?.capability,\n provider: options?.provider,\n },\n });\n }\n\n /**\n * Get models for a specific provider\n *\n * @param provider - Provider ID (e.g., 'openai', 'anthropic')\n * @returns List of models for the provider\n *\n * @example\n * ```ts\n * const { models } = await client.models.getByProvider('openai');\n * ```\n */\n async getByProvider(provider: string): Promise<ISynovaModel[]> {\n const response = await this.http.request<IProviderModelsResponse>({\n method: 'GET',\n path: `/api/v1/models/${provider}`,\n });\n return response.models;\n }\n\n /**\n * Get a specific model\n *\n * @param provider - Provider ID\n * @param model - Model ID\n * @returns Model details\n *\n * @example\n * ```ts\n * const model = await client.models.get('openai', 'gpt-4o');\n * console.log(model.capabilities);\n * console.log(model.limits);\n * ```\n */\n async get(provider: string, model: string): Promise<ISynovaModel> {\n return this.http.request<ISynovaModel>({\n method: 'GET',\n path: `/api/v1/models/${provider}/${model}`,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaUploadResponse, ISynovaUploadOptions } from '../types';\n\nexport class FilesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Upload files for use in prompt execution\n *\n * @param files - Array of File or Blob objects to upload\n * @param options - Upload options including projectId\n * @returns Upload response with file metadata\n *\n * @example\n * ```ts\n * // Upload files\n * const result = await client.files.upload(\n * [file1, file2],\n * { projectId: 'prj_abc123' }\n * );\n *\n * console.log('Uploaded files:', result.data);\n *\n * // Use uploaded file in prompt execution\n * const response = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * messages: [\n * {\n * role: 'user',\n * content: 'Describe this image',\n * files: [{ fileId: result.data[0].id }],\n * },\n * ],\n * });\n * ```\n */\n async upload(\n files: (File | Blob)[],\n options: ISynovaUploadOptions,\n ): Promise<ISynovaUploadResponse> {\n const formData = new FormData();\n\n for (const file of files) {\n formData.append('files', file);\n }\n\n formData.append('projectId', options.projectId);\n\n return this.http.upload<ISynovaUploadResponse>({\n path: '/api/v1/files/upload',\n formData,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaLlmProviderKey,\n ISynovaLlmProviderKeyListResponse,\n ISynovaCreateLlmProviderKeyOptions,\n} from '../types';\n\nexport class LlmProviderKeysResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all LLM provider keys\n *\n * @returns List of LLM provider keys\n *\n * @example\n * ```ts\n * const { items, total } = await client.llmProviderKeys.list();\n * console.log(`Found ${total} keys`);\n * for (const key of items) {\n * console.log(`${key.provider}: ${key.maskedKey} (default: ${key.isDefault})`);\n * }\n * ```\n */\n async list(): Promise<ISynovaLlmProviderKeyListResponse> {\n return this.http.request<ISynovaLlmProviderKeyListResponse>({\n method: 'GET',\n path: '/api/v1/llm-provider-keys',\n });\n }\n\n /**\n * Get an LLM provider key by ID\n *\n * @param id - Key ID (e.g., 'lpk_abc123')\n * @returns LLM provider key details\n *\n * @example\n * ```ts\n * const key = await client.llmProviderKeys.get('lpk_abc123');\n * console.log(`Provider: ${key.provider}, Default: ${key.isDefault}`);\n * ```\n */\n async get(id: string): Promise<ISynovaLlmProviderKey> {\n return this.http.request<ISynovaLlmProviderKey>({\n method: 'GET',\n path: `/api/v1/llm-provider-keys/${id}`,\n });\n }\n\n /**\n * Create a new LLM provider key\n *\n * The first key created for a provider will automatically be set as the default.\n *\n * @param options - Key creation options\n * @returns Created LLM provider key\n *\n * @example\n * ```ts\n * // Create OpenAI key\n * const key = await client.llmProviderKeys.create({\n * provider: 'openai',\n * apiKey: 'sk-...',\n * label: 'Production Key',\n * defaultModel: 'gpt-4o',\n * });\n *\n * // Create Azure OpenAI key\n * const azureKey = await client.llmProviderKeys.create({\n * provider: 'azure_openai',\n * apiKey: 'your-azure-key',\n * azure: {\n * endpoint: 'https://my-resource.openai.azure.com',\n * },\n * label: 'Azure Production',\n * });\n * ```\n */\n async create(options: ISynovaCreateLlmProviderKeyOptions): Promise<ISynovaLlmProviderKey> {\n return this.http.request<ISynovaLlmProviderKey>({\n method: 'POST',\n path: '/api/v1/llm-provider-keys',\n body: options,\n });\n }\n\n /**\n * Set an LLM provider key as the default for its provider\n *\n * The previous default key for this provider will be unset.\n *\n * @param id - Key ID to set as default\n * @returns Updated LLM provider key\n *\n * @example\n * ```ts\n * const key = await client.llmProviderKeys.setDefault('lpk_abc123');\n * console.log(`${key.id} is now the default for ${key.provider}`);\n * ```\n */\n async setDefault(id: string): Promise<ISynovaLlmProviderKey> {\n return this.http.request<ISynovaLlmProviderKey>({\n method: 'POST',\n path: `/api/v1/llm-provider-keys/${id}/set-default`,\n });\n }\n\n /**\n * Delete an LLM provider key\n *\n * @param id - Key ID to delete\n *\n * @example\n * ```ts\n * await client.llmProviderKeys.delete('lpk_abc123');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.http.request<void>({\n method: 'DELETE',\n path: `/api/v1/llm-provider-keys/${id}`,\n });\n }\n}\n","import type { ISynovaConfig, ISynovaLogger } from './types';\nimport type { IRetryOptions } from './utils/http';\nimport { HttpClient } from './utils/http';\nimport { PromptsResource } from './resources/prompts';\nimport { ModelsResource } from './resources/models';\nimport { FilesResource } from './resources/files';\nimport { LlmProviderKeysResource } from './resources/llm-provider-keys';\n\nconst DEFAULT_BASE_URL = 'https://api.synova.cloud';\nconst DEFAULT_TIMEOUT = 30000;\n\nconst DEFAULT_RETRY: IRetryOptions = {\n maxRetries: 3,\n strategy: 'exponential',\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n};\n\nconst DEFAULT_LOGGER: ISynovaLogger = {\n debug: (message, ...args) => console.debug(message, ...args),\n info: (message, ...args) => console.info(message, ...args),\n warn: (message, ...args) => console.warn(message, ...args),\n error: (messageOrError, ...args) => console.error(messageOrError, ...args),\n};\n\n/**\n * Synova Cloud SDK client\n *\n * @example\n * ```ts\n * import { SynovaCloudSdk } from '@synova-cloud/sdk';\n *\n * const client = new SynovaCloudSdk('your-api-key');\n *\n * // Get a prompt\n * const prompt = await client.prompts.get('prm_abc123');\n *\n * // Execute a prompt\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * // List available models\n * const { providers } = await client.models.list();\n *\n * // Get models for a specific provider\n * const openaiModels = await client.models.getByProvider('openai');\n *\n * // Manage LLM provider keys\n * const { items } = await client.llmProviderKeys.list();\n * const newKey = await client.llmProviderKeys.create({\n * provider: 'openai',\n * apiKey: 'sk-...',\n * label: 'Production',\n * });\n *\n * // With custom retry config\n * const clientWithRetry = new SynovaCloudSdk('your-api-key', {\n * retry: {\n * maxRetries: 5,\n * strategy: 'linear',\n * initialDelayMs: 500,\n * },\n * });\n * ```\n */\nexport class SynovaCloudSdk {\n readonly prompts: PromptsResource;\n readonly models: ModelsResource;\n readonly files: FilesResource;\n readonly llmProviderKeys: LlmProviderKeysResource;\n\n private readonly http: HttpClient;\n\n /**\n * Create a new Synova Cloud SDK client\n *\n * @param apiKey - Your Synova API key\n * @param config - Optional configuration\n */\n constructor(apiKey: string, config?: ISynovaConfig) {\n if (!apiKey) {\n throw new Error('API key is required');\n }\n\n this.http = new HttpClient({\n baseUrl: config?.baseUrl ?? DEFAULT_BASE_URL,\n apiKey,\n timeout: config?.timeout ?? DEFAULT_TIMEOUT,\n retry: {\n maxRetries: config?.retry?.maxRetries ?? DEFAULT_RETRY.maxRetries,\n strategy: config?.retry?.strategy ?? DEFAULT_RETRY.strategy,\n initialDelayMs: config?.retry?.initialDelayMs ?? DEFAULT_RETRY.initialDelayMs,\n maxDelayMs: config?.retry?.maxDelayMs ?? DEFAULT_RETRY.maxDelayMs,\n backoffMultiplier: config?.retry?.backoffMultiplier ?? DEFAULT_RETRY.backoffMultiplier,\n },\n debug: config?.debug ?? false,\n logger: config?.logger ?? DEFAULT_LOGGER,\n });\n\n this.prompts = new PromptsResource(this.http);\n this.models = new ModelsResource(this.http);\n this.files = new FilesResource(this.http);\n this.llmProviderKeys = new LlmProviderKeysResource(this.http);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/index.ts","../src/utils/http.ts","../src/resources/prompts.ts","../src/resources/models.ts","../src/resources/files.ts","../src/resources/llm-provider-keys.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { IApiErrorResponse } from '../types';\n\n/**\n * Base error class for all Synova SDK errors\n */\nexport class SynovaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SynovaError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when API returns an error response.\n * Base class for all API-related errors.\n */\nexport class ApiSynovaError extends SynovaError {\n readonly code: string;\n readonly httpCode: number;\n readonly requestId: string;\n readonly timestamp: string;\n readonly path?: string;\n readonly method?: string;\n readonly details?: unknown;\n\n constructor(response: IApiErrorResponse) {\n super(response.message);\n this.name = 'ApiSynovaError';\n this.code = response.code;\n this.httpCode = response.httpCode;\n this.requestId = response.requestId;\n this.timestamp = response.timestamp;\n this.path = response.path;\n this.method = response.method;\n this.details = response.details;\n }\n}\n\n/**\n * Error thrown when authentication fails (401)\n */\nexport class AuthSynovaError extends ApiSynovaError {\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'AuthSynovaError';\n }\n}\n\n/**\n * Error thrown when resource is not found (404)\n */\nexport class NotFoundSynovaError extends ApiSynovaError {\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'NotFoundSynovaError';\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded (429)\n */\nexport class RateLimitSynovaError extends ApiSynovaError {\n readonly retryAfterMs?: number;\n\n constructor(response: IApiErrorResponse, retryAfterMs?: number) {\n super(response);\n this.name = 'RateLimitSynovaError';\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/**\n * Error thrown when server returns 5xx error\n */\nexport class ServerSynovaError extends ApiSynovaError {\n readonly retryable: boolean = true;\n\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'ServerSynovaError';\n }\n}\n\n/**\n * Error thrown when request times out (client-side)\n */\nexport class TimeoutSynovaError extends SynovaError {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = 'TimeoutSynovaError';\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Error thrown when network request fails (client-side)\n */\nexport class NetworkSynovaError extends SynovaError {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = 'NetworkSynovaError';\n this.cause = cause;\n }\n}\n","import type { IApiErrorResponse, ISynovaLogger, TSynovaRetryStrategy } from '../types';\nimport {\n ApiSynovaError,\n AuthSynovaError,\n NetworkSynovaError,\n NotFoundSynovaError,\n RateLimitSynovaError,\n ServerSynovaError,\n TimeoutSynovaError,\n} from '../errors';\n\nexport interface IRetryOptions {\n maxRetries: number;\n strategy: TSynovaRetryStrategy;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffMultiplier: number;\n}\n\nexport interface IHttpClientConfig {\n baseUrl: string;\n apiKey: string;\n timeout: number;\n retry: IRetryOptions;\n debug: boolean;\n logger: ISynovaLogger;\n}\n\nexport interface IRequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | undefined>;\n}\n\nexport interface IUploadOptions {\n path: string;\n formData: FormData;\n}\n\nexport class HttpClient {\n private readonly config: IHttpClientConfig;\n\n constructor(config: IHttpClientConfig) {\n this.config = config;\n }\n\n async request<T>(options: IRequestOptions): Promise<T> {\n const url = this.buildUrl(options.path, options.query);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeRequest<T>(url, options);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Request failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n async upload<T>(options: IUploadOptions): Promise<T> {\n const url = this.buildUrl(options.path);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeUploadRequest<T>(url, options.formData);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Upload failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n private async makeRequest<T>(url: string, options: IRequestOptions): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`${options.method} ${url}`);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'synova-cloud-sdk-node/0.1.0',\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Network request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async makeUploadRequest<T>(url: string, formData: FormData): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`POST (upload) ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'User-Agent': 'synova-cloud-sdk-node/0.1.0',\n // Note: Content-Type is not set for FormData - browser/node sets it with boundary\n },\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Upload request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n const status = response.status;\n\n // Try to parse error body\n let errorBody: IApiErrorResponse | null = null;\n try {\n errorBody = (await response.json()) as IApiErrorResponse;\n } catch {\n // Ignore JSON parse errors\n }\n\n // Create default error body if parsing failed\n const defaultErrorBody: IApiErrorResponse = {\n code: 'UNKNOWN_ERROR',\n httpCode: status,\n message: errorBody?.message || `HTTP ${status}: ${response.statusText}`,\n requestId: errorBody?.requestId || 'unknown',\n timestamp: errorBody?.timestamp || new Date().toISOString(),\n path: errorBody?.path,\n method: errorBody?.method,\n details: errorBody?.details,\n };\n\n const body = errorBody || defaultErrorBody;\n\n if (status === 401) {\n throw new AuthSynovaError(body);\n }\n\n if (status === 404) {\n throw new NotFoundSynovaError(body);\n }\n\n if (status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined;\n throw new RateLimitSynovaError(body, retryAfterMs);\n }\n\n if (status >= 500) {\n throw new ServerSynovaError(body);\n }\n\n throw new ApiSynovaError(body);\n }\n\n private buildUrl(path: string, query?: Record<string, string | undefined>): string {\n const url = new URL(path, this.config.baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n }\n\n return url.toString();\n }\n\n private isRetryable(error: unknown): boolean {\n if (error instanceof RateLimitSynovaError) return true;\n if (error instanceof ServerSynovaError) return true;\n if (error instanceof NetworkSynovaError) return true;\n if (error instanceof TimeoutSynovaError) return true;\n return false;\n }\n\n private calculateRetryDelay(attempt: number, error: Error | null): number {\n const { strategy, initialDelayMs, maxDelayMs, backoffMultiplier } = this.config.retry;\n\n // Use Retry-After header if available (takes priority)\n if (error instanceof RateLimitSynovaError && error.retryAfterMs) {\n return Math.min(error.retryAfterMs, maxDelayMs);\n }\n\n let baseDelay: number;\n\n if (strategy === 'linear') {\n // Linear: initialDelay * attempt (1000, 2000, 3000, ...)\n baseDelay = initialDelayMs * attempt;\n } else {\n // Exponential: initialDelay * multiplier^(attempt-1) (1000, 2000, 4000, ...)\n baseDelay = initialDelayMs * Math.pow(backoffMultiplier, attempt - 1);\n }\n\n // Add jitter (±10%) to prevent thundering herd\n const jitter = baseDelay * 0.1 * (Math.random() * 2 - 1);\n const delay = baseDelay + jitter;\n\n return Math.min(Math.max(delay, 0), maxDelayMs);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(message: string): void {\n if (this.config.debug) {\n this.config.logger.debug(`[Synova SDK] ${message}`);\n }\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaPrompt,\n ISynovaGetPromptOptions,\n ISynovaExecuteOptions,\n ISynovaExecuteResponse,\n} from '../types';\n\nexport class PromptsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get a prompt by ID (returns version with 'latest' tag)\n *\n * @param promptId - The prompt ID (e.g., 'prm_abc123')\n * @param options - Optional settings\n * @returns The prompt data\n *\n * @example\n * ```ts\n * // Get default (latest) version\n * const prompt = await client.prompts.get('prm_abc123');\n *\n * // Get by specific tag\n * const production = await client.prompts.get('prm_abc123', { tag: 'production' });\n *\n * // Get specific version\n * const v2 = await client.prompts.get('prm_abc123', { version: '2.0.0' });\n * ```\n */\n async get(promptId: string, options?: ISynovaGetPromptOptions): Promise<ISynovaPrompt> {\n // Version takes precedence over tag\n if (options?.version) {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/versions/${options.version}`,\n });\n }\n\n // Tag (defaults to 'latest')\n const tag = options?.tag || 'latest';\n if (tag === 'latest') {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}`,\n });\n }\n\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/tags/${tag}`,\n });\n }\n\n /**\n * Execute a prompt with 'latest' tag\n *\n * @param promptId - The prompt ID\n * @param options - Execution options including provider, model and variables\n * @returns The execution response\n *\n * @example\n * ```ts\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * if (result.type === 'message') {\n * console.log(result.content);\n * }\n *\n * // Image generation\n * const imageResult = await client.prompts.execute('prm_image123', {\n * provider: 'google',\n * model: 'gemini-2.0-flash-exp',\n * variables: { style: 'modern' },\n * });\n *\n * if (imageResult.type === 'image') {\n * console.log('Generated images:', imageResult.files);\n * }\n * ```\n */\n async execute(promptId: string, options: ISynovaExecuteOptions): Promise<ISynovaExecuteResponse> {\n const body: Record<string, unknown> = {\n provider: options.provider,\n model: options.model,\n };\n\n // Only add optional fields if they are defined\n if (options.apiKeyId !== undefined) body.apiKeyId = options.apiKeyId;\n if (options.variables !== undefined) body.variables = options.variables;\n if (options.messages !== undefined) body.messages = options.messages;\n if (options.tag !== undefined) body.tag = options.tag;\n if (options.version !== undefined) body.version = options.version;\n if (options.metadata !== undefined) body.metadata = options.metadata;\n if (options.parameters !== undefined) body.parameters = options.parameters;\n if (options.responseSchema !== undefined) body.responseSchema = options.responseSchema;\n\n return this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body,\n });\n }\n\n /**\n * Execute a prompt by tag\n *\n * @param promptId - The prompt ID\n * @param tag - The tag (e.g., 'latest', 'production', 'staging')\n * @param options - Execution options\n * @returns The execution response\n *\n * @example\n * ```ts\n * const result = await client.prompts.executeByTag('prm_abc123', 'production', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n * ```\n */\n async executeByTag(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse> {\n return this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body: {\n tag,\n provider: options.provider,\n model: options.model,\n apiKeyId: options.apiKeyId,\n variables: options.variables,\n messages: options.messages,\n metadata: options.metadata,\n parameters: options.parameters,\n },\n });\n }\n\n /**\n * Execute a prompt by version\n *\n * @param promptId - The prompt ID\n * @param version - The semantic version (e.g., '1.0.0', '2.1.0')\n * @param options - Execution options\n * @returns The execution response\n *\n * @example\n * ```ts\n * const result = await client.prompts.executeByVersion('prm_abc123', '1.2.0', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n * ```\n */\n async executeByVersion(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse> {\n return this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body: {\n version,\n provider: options.provider,\n model: options.model,\n apiKeyId: options.apiKeyId,\n variables: options.variables,\n messages: options.messages,\n metadata: options.metadata,\n parameters: options.parameters,\n },\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaModel, ISynovaModelsResponse, ISynovaListModelsOptions } from '../types';\n\ninterface IProviderModelsResponse {\n models: ISynovaModel[];\n}\n\nexport class ModelsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all available models\n *\n * @param options - Optional filters\n * @returns List of providers with their models\n *\n * @example\n * ```ts\n * // Get all models\n * const { providers } = await client.models.list();\n *\n * // Filter by type\n * const imageModels = await client.models.list({ type: 'image' });\n *\n * // Filter by capability\n * const functionCallingModels = await client.models.list({\n * capability: 'function_calling',\n * });\n *\n * // Filter by provider\n * const openaiModels = await client.models.list({ provider: 'openai' });\n * ```\n */\n async list(options?: ISynovaListModelsOptions): Promise<ISynovaModelsResponse> {\n return this.http.request<ISynovaModelsResponse>({\n method: 'GET',\n path: '/api/v1/models',\n query: {\n type: options?.type,\n capability: options?.capability,\n provider: options?.provider,\n },\n });\n }\n\n /**\n * Get models for a specific provider\n *\n * @param provider - Provider ID (e.g., 'openai', 'anthropic')\n * @returns List of models for the provider\n *\n * @example\n * ```ts\n * const { models } = await client.models.getByProvider('openai');\n * ```\n */\n async getByProvider(provider: string): Promise<ISynovaModel[]> {\n const response = await this.http.request<IProviderModelsResponse>({\n method: 'GET',\n path: `/api/v1/models/${provider}`,\n });\n return response.models;\n }\n\n /**\n * Get a specific model\n *\n * @param provider - Provider ID\n * @param model - Model ID\n * @returns Model details\n *\n * @example\n * ```ts\n * const model = await client.models.get('openai', 'gpt-4o');\n * console.log(model.capabilities);\n * console.log(model.limits);\n * ```\n */\n async get(provider: string, model: string): Promise<ISynovaModel> {\n return this.http.request<ISynovaModel>({\n method: 'GET',\n path: `/api/v1/models/${provider}/${model}`,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaUploadResponse, ISynovaUploadOptions } from '../types';\n\nexport class FilesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Upload files for use in prompt execution\n *\n * @param files - Array of File or Blob objects to upload\n * @param options - Upload options including projectId\n * @returns Upload response with file metadata\n *\n * @example\n * ```ts\n * // Upload files\n * const result = await client.files.upload(\n * [file1, file2],\n * { projectId: 'prj_abc123' }\n * );\n *\n * console.log('Uploaded files:', result.data);\n *\n * // Use uploaded file in prompt execution\n * const response = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * messages: [\n * {\n * role: 'user',\n * content: 'Describe this image',\n * files: [{ fileId: result.data[0].id }],\n * },\n * ],\n * });\n * ```\n */\n async upload(\n files: (File | Blob)[],\n options: ISynovaUploadOptions,\n ): Promise<ISynovaUploadResponse> {\n const formData = new FormData();\n\n for (const file of files) {\n formData.append('files', file);\n }\n\n formData.append('projectId', options.projectId);\n\n return this.http.upload<ISynovaUploadResponse>({\n path: '/api/v1/files/upload',\n formData,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaLlmProviderKey,\n ISynovaLlmProviderKeyListResponse,\n ISynovaCreateLlmProviderKeyOptions,\n} from '../types';\n\nexport class LlmProviderKeysResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all LLM provider keys\n *\n * @returns List of LLM provider keys\n *\n * @example\n * ```ts\n * const { items, total } = await client.llmProviderKeys.list();\n * console.log(`Found ${total} keys`);\n * for (const key of items) {\n * console.log(`${key.provider}: ${key.maskedKey} (default: ${key.isDefault})`);\n * }\n * ```\n */\n async list(): Promise<ISynovaLlmProviderKeyListResponse> {\n return this.http.request<ISynovaLlmProviderKeyListResponse>({\n method: 'GET',\n path: '/api/v1/llm-provider-keys',\n });\n }\n\n /**\n * Get an LLM provider key by ID\n *\n * @param id - Key ID (e.g., 'lpk_abc123')\n * @returns LLM provider key details\n *\n * @example\n * ```ts\n * const key = await client.llmProviderKeys.get('lpk_abc123');\n * console.log(`Provider: ${key.provider}, Default: ${key.isDefault}`);\n * ```\n */\n async get(id: string): Promise<ISynovaLlmProviderKey> {\n return this.http.request<ISynovaLlmProviderKey>({\n method: 'GET',\n path: `/api/v1/llm-provider-keys/${id}`,\n });\n }\n\n /**\n * Create a new LLM provider key\n *\n * The first key created for a provider will automatically be set as the default.\n *\n * @param options - Key creation options\n * @returns Created LLM provider key\n *\n * @example\n * ```ts\n * // Create OpenAI key\n * const key = await client.llmProviderKeys.create({\n * provider: 'openai',\n * apiKey: 'sk-...',\n * label: 'Production Key',\n * defaultModel: 'gpt-4o',\n * });\n *\n * // Create Azure OpenAI key\n * const azureKey = await client.llmProviderKeys.create({\n * provider: 'azure_openai',\n * apiKey: 'your-azure-key',\n * azure: {\n * endpoint: 'https://my-resource.openai.azure.com',\n * },\n * label: 'Azure Production',\n * });\n * ```\n */\n async create(options: ISynovaCreateLlmProviderKeyOptions): Promise<ISynovaLlmProviderKey> {\n return this.http.request<ISynovaLlmProviderKey>({\n method: 'POST',\n path: '/api/v1/llm-provider-keys',\n body: options,\n });\n }\n\n /**\n * Set an LLM provider key as the default for its provider\n *\n * The previous default key for this provider will be unset.\n *\n * @param id - Key ID to set as default\n * @returns Updated LLM provider key\n *\n * @example\n * ```ts\n * const key = await client.llmProviderKeys.setDefault('lpk_abc123');\n * console.log(`${key.id} is now the default for ${key.provider}`);\n * ```\n */\n async setDefault(id: string): Promise<ISynovaLlmProviderKey> {\n return this.http.request<ISynovaLlmProviderKey>({\n method: 'POST',\n path: `/api/v1/llm-provider-keys/${id}/set-default`,\n });\n }\n\n /**\n * Delete an LLM provider key\n *\n * @param id - Key ID to delete\n *\n * @example\n * ```ts\n * await client.llmProviderKeys.delete('lpk_abc123');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.http.request<void>({\n method: 'DELETE',\n path: `/api/v1/llm-provider-keys/${id}`,\n });\n }\n}\n","import type { ISynovaConfig, ISynovaLogger } from './types';\nimport type { IRetryOptions } from './utils/http';\nimport { HttpClient } from './utils/http';\nimport { PromptsResource } from './resources/prompts';\nimport { ModelsResource } from './resources/models';\nimport { FilesResource } from './resources/files';\nimport { LlmProviderKeysResource } from './resources/llm-provider-keys';\n\nconst DEFAULT_BASE_URL = 'https://api.synova.cloud';\nconst DEFAULT_TIMEOUT = 30000;\n\nconst DEFAULT_RETRY: IRetryOptions = {\n maxRetries: 3,\n strategy: 'exponential',\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n};\n\nconst DEFAULT_LOGGER: ISynovaLogger = {\n debug: (message, ...args) => console.debug(message, ...args),\n info: (message, ...args) => console.info(message, ...args),\n warn: (message, ...args) => console.warn(message, ...args),\n error: (messageOrError, ...args) => console.error(messageOrError, ...args),\n};\n\n/**\n * Synova Cloud SDK client\n *\n * @example\n * ```ts\n * import { SynovaCloudSdk } from '@synova-cloud/sdk';\n *\n * const client = new SynovaCloudSdk('your-api-key');\n *\n * // Get a prompt\n * const prompt = await client.prompts.get('prm_abc123');\n *\n * // Execute a prompt\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * // List available models\n * const { providers } = await client.models.list();\n *\n * // Get models for a specific provider\n * const openaiModels = await client.models.getByProvider('openai');\n *\n * // Manage LLM provider keys\n * const { items } = await client.llmProviderKeys.list();\n * const newKey = await client.llmProviderKeys.create({\n * provider: 'openai',\n * apiKey: 'sk-...',\n * label: 'Production',\n * });\n *\n * // With custom retry config\n * const clientWithRetry = new SynovaCloudSdk('your-api-key', {\n * retry: {\n * maxRetries: 5,\n * strategy: 'linear',\n * initialDelayMs: 500,\n * },\n * });\n * ```\n */\nexport class SynovaCloudSdk {\n readonly prompts: PromptsResource;\n readonly models: ModelsResource;\n readonly files: FilesResource;\n readonly llmProviderKeys: LlmProviderKeysResource;\n\n private readonly http: HttpClient;\n\n /**\n * Create a new Synova Cloud SDK client\n *\n * @param apiKey - Your Synova API key\n * @param config - Optional configuration\n */\n constructor(apiKey: string, config?: ISynovaConfig) {\n if (!apiKey) {\n throw new Error('API key is required');\n }\n\n this.http = new HttpClient({\n baseUrl: config?.baseUrl ?? DEFAULT_BASE_URL,\n apiKey,\n timeout: config?.timeout ?? DEFAULT_TIMEOUT,\n retry: {\n maxRetries: config?.retry?.maxRetries ?? DEFAULT_RETRY.maxRetries,\n strategy: config?.retry?.strategy ?? DEFAULT_RETRY.strategy,\n initialDelayMs: config?.retry?.initialDelayMs ?? DEFAULT_RETRY.initialDelayMs,\n maxDelayMs: config?.retry?.maxDelayMs ?? DEFAULT_RETRY.maxDelayMs,\n backoffMultiplier: config?.retry?.backoffMultiplier ?? DEFAULT_RETRY.backoffMultiplier,\n },\n debug: config?.debug ?? false,\n logger: config?.logger ?? DEFAULT_LOGGER,\n });\n\n this.prompts = new PromptsResource(this.http);\n this.models = new ModelsResource(this.http);\n this.files = new FilesResource(this.http);\n this.llmProviderKeys = new LlmProviderKeysResource(this.http);\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -85,6 +85,8 @@ interface ISynovaExecuteOptions {
|
|
|
85
85
|
provider: string;
|
|
86
86
|
/** LLM model to use (e.g., 'gpt-4o', 'claude-sonnet-4-20250514') */
|
|
87
87
|
model: string;
|
|
88
|
+
/** LLM provider key ID to use (if not provided, uses default key for the provider) */
|
|
89
|
+
apiKeyId?: string;
|
|
88
90
|
/** Variables to substitute in prompt template */
|
|
89
91
|
variables?: Record<string, unknown>;
|
|
90
92
|
/** Previous messages for multi-turn conversation */
|
|
@@ -279,6 +281,9 @@ interface IApiErrorResponse {
|
|
|
279
281
|
message: string;
|
|
280
282
|
requestId: string;
|
|
281
283
|
timestamp: string;
|
|
284
|
+
path?: string;
|
|
285
|
+
method?: string;
|
|
286
|
+
details?: unknown;
|
|
282
287
|
}
|
|
283
288
|
|
|
284
289
|
interface IRetryOptions {
|
|
@@ -661,57 +666,58 @@ declare class SynovaError extends Error {
|
|
|
661
666
|
constructor(message: string);
|
|
662
667
|
}
|
|
663
668
|
/**
|
|
664
|
-
* Error thrown when API returns an error response
|
|
669
|
+
* Error thrown when API returns an error response.
|
|
670
|
+
* Base class for all API-related errors.
|
|
665
671
|
*/
|
|
666
672
|
declare class ApiSynovaError extends SynovaError {
|
|
667
673
|
readonly code: string;
|
|
668
674
|
readonly httpCode: number;
|
|
669
675
|
readonly requestId: string;
|
|
670
676
|
readonly timestamp: string;
|
|
677
|
+
readonly path?: string;
|
|
678
|
+
readonly method?: string;
|
|
679
|
+
readonly details?: unknown;
|
|
671
680
|
constructor(response: IApiErrorResponse);
|
|
672
681
|
}
|
|
673
682
|
/**
|
|
674
|
-
* Error thrown when authentication fails
|
|
683
|
+
* Error thrown when authentication fails (401)
|
|
675
684
|
*/
|
|
676
|
-
declare class AuthSynovaError extends
|
|
677
|
-
constructor(
|
|
685
|
+
declare class AuthSynovaError extends ApiSynovaError {
|
|
686
|
+
constructor(response: IApiErrorResponse);
|
|
678
687
|
}
|
|
679
688
|
/**
|
|
680
|
-
* Error thrown when resource is not found
|
|
689
|
+
* Error thrown when resource is not found (404)
|
|
681
690
|
*/
|
|
682
|
-
declare class NotFoundSynovaError extends
|
|
683
|
-
|
|
684
|
-
readonly resourceId: string;
|
|
685
|
-
constructor(resourceType: string, resourceId: string);
|
|
691
|
+
declare class NotFoundSynovaError extends ApiSynovaError {
|
|
692
|
+
constructor(response: IApiErrorResponse);
|
|
686
693
|
}
|
|
687
694
|
/**
|
|
688
|
-
* Error thrown when rate limit is exceeded
|
|
695
|
+
* Error thrown when rate limit is exceeded (429)
|
|
689
696
|
*/
|
|
690
|
-
declare class RateLimitSynovaError extends
|
|
697
|
+
declare class RateLimitSynovaError extends ApiSynovaError {
|
|
691
698
|
readonly retryAfterMs?: number;
|
|
692
|
-
constructor(
|
|
699
|
+
constructor(response: IApiErrorResponse, retryAfterMs?: number);
|
|
693
700
|
}
|
|
694
701
|
/**
|
|
695
|
-
* Error thrown when
|
|
702
|
+
* Error thrown when server returns 5xx error
|
|
703
|
+
*/
|
|
704
|
+
declare class ServerSynovaError extends ApiSynovaError {
|
|
705
|
+
readonly retryable: boolean;
|
|
706
|
+
constructor(response: IApiErrorResponse);
|
|
707
|
+
}
|
|
708
|
+
/**
|
|
709
|
+
* Error thrown when request times out (client-side)
|
|
696
710
|
*/
|
|
697
711
|
declare class TimeoutSynovaError extends SynovaError {
|
|
698
712
|
readonly timeoutMs: number;
|
|
699
713
|
constructor(timeoutMs: number);
|
|
700
714
|
}
|
|
701
715
|
/**
|
|
702
|
-
* Error thrown when network request fails
|
|
716
|
+
* Error thrown when network request fails (client-side)
|
|
703
717
|
*/
|
|
704
718
|
declare class NetworkSynovaError extends SynovaError {
|
|
705
719
|
readonly cause?: Error;
|
|
706
720
|
constructor(message: string, cause?: Error);
|
|
707
721
|
}
|
|
708
|
-
/**
|
|
709
|
-
* Error thrown when server returns 5xx error
|
|
710
|
-
*/
|
|
711
|
-
declare class ServerSynovaError extends SynovaError {
|
|
712
|
-
readonly httpCode: number;
|
|
713
|
-
readonly retryable: boolean;
|
|
714
|
-
constructor(httpCode: number, message?: string);
|
|
715
|
-
}
|
|
716
722
|
|
|
717
723
|
export { ApiSynovaError, AuthSynovaError, type ISynovaAzureConfig, type ISynovaConfig, type ISynovaCreateLlmProviderKeyOptions, type ISynovaExecuteOptions, type ISynovaExecuteResponse, type ISynovaExecutionError, type ISynovaExecutionUsage, type ISynovaFileAttachment, type ISynovaFileThumbnails, type ISynovaGetPromptOptions, type ISynovaListModelsOptions, type ISynovaLlmProviderKey, type ISynovaLlmProviderKeyListResponse, type ISynovaLogger, type ISynovaMessage, type ISynovaModel, type ISynovaModelCapabilities, type ISynovaModelLimits, type ISynovaModelPricing, type ISynovaModelsResponse, type ISynovaPrompt, type ISynovaPromptVariable, type ISynovaProvider, type ISynovaRetryConfig, type ISynovaToolCall, type ISynovaToolResult, type ISynovaUploadOptions, type ISynovaUploadResponse, type ISynovaUploadedFile, NetworkSynovaError, NotFoundSynovaError, RateLimitSynovaError, ServerSynovaError, SynovaCloudSdk, SynovaError, type TSynovaLlmProvider, type TSynovaMessageRole, type TSynovaModelType, type TSynovaResponseType, type TSynovaRetryStrategy, type TSynovaUsageType, TimeoutSynovaError };
|
package/dist/index.d.ts
CHANGED
|
@@ -85,6 +85,8 @@ interface ISynovaExecuteOptions {
|
|
|
85
85
|
provider: string;
|
|
86
86
|
/** LLM model to use (e.g., 'gpt-4o', 'claude-sonnet-4-20250514') */
|
|
87
87
|
model: string;
|
|
88
|
+
/** LLM provider key ID to use (if not provided, uses default key for the provider) */
|
|
89
|
+
apiKeyId?: string;
|
|
88
90
|
/** Variables to substitute in prompt template */
|
|
89
91
|
variables?: Record<string, unknown>;
|
|
90
92
|
/** Previous messages for multi-turn conversation */
|
|
@@ -279,6 +281,9 @@ interface IApiErrorResponse {
|
|
|
279
281
|
message: string;
|
|
280
282
|
requestId: string;
|
|
281
283
|
timestamp: string;
|
|
284
|
+
path?: string;
|
|
285
|
+
method?: string;
|
|
286
|
+
details?: unknown;
|
|
282
287
|
}
|
|
283
288
|
|
|
284
289
|
interface IRetryOptions {
|
|
@@ -661,57 +666,58 @@ declare class SynovaError extends Error {
|
|
|
661
666
|
constructor(message: string);
|
|
662
667
|
}
|
|
663
668
|
/**
|
|
664
|
-
* Error thrown when API returns an error response
|
|
669
|
+
* Error thrown when API returns an error response.
|
|
670
|
+
* Base class for all API-related errors.
|
|
665
671
|
*/
|
|
666
672
|
declare class ApiSynovaError extends SynovaError {
|
|
667
673
|
readonly code: string;
|
|
668
674
|
readonly httpCode: number;
|
|
669
675
|
readonly requestId: string;
|
|
670
676
|
readonly timestamp: string;
|
|
677
|
+
readonly path?: string;
|
|
678
|
+
readonly method?: string;
|
|
679
|
+
readonly details?: unknown;
|
|
671
680
|
constructor(response: IApiErrorResponse);
|
|
672
681
|
}
|
|
673
682
|
/**
|
|
674
|
-
* Error thrown when authentication fails
|
|
683
|
+
* Error thrown when authentication fails (401)
|
|
675
684
|
*/
|
|
676
|
-
declare class AuthSynovaError extends
|
|
677
|
-
constructor(
|
|
685
|
+
declare class AuthSynovaError extends ApiSynovaError {
|
|
686
|
+
constructor(response: IApiErrorResponse);
|
|
678
687
|
}
|
|
679
688
|
/**
|
|
680
|
-
* Error thrown when resource is not found
|
|
689
|
+
* Error thrown when resource is not found (404)
|
|
681
690
|
*/
|
|
682
|
-
declare class NotFoundSynovaError extends
|
|
683
|
-
|
|
684
|
-
readonly resourceId: string;
|
|
685
|
-
constructor(resourceType: string, resourceId: string);
|
|
691
|
+
declare class NotFoundSynovaError extends ApiSynovaError {
|
|
692
|
+
constructor(response: IApiErrorResponse);
|
|
686
693
|
}
|
|
687
694
|
/**
|
|
688
|
-
* Error thrown when rate limit is exceeded
|
|
695
|
+
* Error thrown when rate limit is exceeded (429)
|
|
689
696
|
*/
|
|
690
|
-
declare class RateLimitSynovaError extends
|
|
697
|
+
declare class RateLimitSynovaError extends ApiSynovaError {
|
|
691
698
|
readonly retryAfterMs?: number;
|
|
692
|
-
constructor(
|
|
699
|
+
constructor(response: IApiErrorResponse, retryAfterMs?: number);
|
|
693
700
|
}
|
|
694
701
|
/**
|
|
695
|
-
* Error thrown when
|
|
702
|
+
* Error thrown when server returns 5xx error
|
|
703
|
+
*/
|
|
704
|
+
declare class ServerSynovaError extends ApiSynovaError {
|
|
705
|
+
readonly retryable: boolean;
|
|
706
|
+
constructor(response: IApiErrorResponse);
|
|
707
|
+
}
|
|
708
|
+
/**
|
|
709
|
+
* Error thrown when request times out (client-side)
|
|
696
710
|
*/
|
|
697
711
|
declare class TimeoutSynovaError extends SynovaError {
|
|
698
712
|
readonly timeoutMs: number;
|
|
699
713
|
constructor(timeoutMs: number);
|
|
700
714
|
}
|
|
701
715
|
/**
|
|
702
|
-
* Error thrown when network request fails
|
|
716
|
+
* Error thrown when network request fails (client-side)
|
|
703
717
|
*/
|
|
704
718
|
declare class NetworkSynovaError extends SynovaError {
|
|
705
719
|
readonly cause?: Error;
|
|
706
720
|
constructor(message: string, cause?: Error);
|
|
707
721
|
}
|
|
708
|
-
/**
|
|
709
|
-
* Error thrown when server returns 5xx error
|
|
710
|
-
*/
|
|
711
|
-
declare class ServerSynovaError extends SynovaError {
|
|
712
|
-
readonly httpCode: number;
|
|
713
|
-
readonly retryable: boolean;
|
|
714
|
-
constructor(httpCode: number, message?: string);
|
|
715
|
-
}
|
|
716
722
|
|
|
717
723
|
export { ApiSynovaError, AuthSynovaError, type ISynovaAzureConfig, type ISynovaConfig, type ISynovaCreateLlmProviderKeyOptions, type ISynovaExecuteOptions, type ISynovaExecuteResponse, type ISynovaExecutionError, type ISynovaExecutionUsage, type ISynovaFileAttachment, type ISynovaFileThumbnails, type ISynovaGetPromptOptions, type ISynovaListModelsOptions, type ISynovaLlmProviderKey, type ISynovaLlmProviderKeyListResponse, type ISynovaLogger, type ISynovaMessage, type ISynovaModel, type ISynovaModelCapabilities, type ISynovaModelLimits, type ISynovaModelPricing, type ISynovaModelsResponse, type ISynovaPrompt, type ISynovaPromptVariable, type ISynovaProvider, type ISynovaRetryConfig, type ISynovaToolCall, type ISynovaToolResult, type ISynovaUploadOptions, type ISynovaUploadResponse, type ISynovaUploadedFile, NetworkSynovaError, NotFoundSynovaError, RateLimitSynovaError, ServerSynovaError, SynovaCloudSdk, SynovaError, type TSynovaLlmProvider, type TSynovaMessageRole, type TSynovaModelType, type TSynovaResponseType, type TSynovaRetryStrategy, type TSynovaUsageType, TimeoutSynovaError };
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,9 @@ var ApiSynovaError = class extends SynovaError {
|
|
|
11
11
|
httpCode;
|
|
12
12
|
requestId;
|
|
13
13
|
timestamp;
|
|
14
|
+
path;
|
|
15
|
+
method;
|
|
16
|
+
details;
|
|
14
17
|
constructor(response) {
|
|
15
18
|
super(response.message);
|
|
16
19
|
this.name = "ApiSynovaError";
|
|
@@ -18,32 +21,38 @@ var ApiSynovaError = class extends SynovaError {
|
|
|
18
21
|
this.httpCode = response.httpCode;
|
|
19
22
|
this.requestId = response.requestId;
|
|
20
23
|
this.timestamp = response.timestamp;
|
|
24
|
+
this.path = response.path;
|
|
25
|
+
this.method = response.method;
|
|
26
|
+
this.details = response.details;
|
|
21
27
|
}
|
|
22
28
|
};
|
|
23
|
-
var AuthSynovaError = class extends
|
|
24
|
-
constructor(
|
|
25
|
-
super(
|
|
29
|
+
var AuthSynovaError = class extends ApiSynovaError {
|
|
30
|
+
constructor(response) {
|
|
31
|
+
super(response);
|
|
26
32
|
this.name = "AuthSynovaError";
|
|
27
33
|
}
|
|
28
34
|
};
|
|
29
|
-
var NotFoundSynovaError = class extends
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
constructor(resourceType, resourceId) {
|
|
33
|
-
super(`${resourceType} not found: ${resourceId}`);
|
|
35
|
+
var NotFoundSynovaError = class extends ApiSynovaError {
|
|
36
|
+
constructor(response) {
|
|
37
|
+
super(response);
|
|
34
38
|
this.name = "NotFoundSynovaError";
|
|
35
|
-
this.resourceType = resourceType;
|
|
36
|
-
this.resourceId = resourceId;
|
|
37
39
|
}
|
|
38
40
|
};
|
|
39
|
-
var RateLimitSynovaError = class extends
|
|
41
|
+
var RateLimitSynovaError = class extends ApiSynovaError {
|
|
40
42
|
retryAfterMs;
|
|
41
|
-
constructor(
|
|
42
|
-
super(
|
|
43
|
+
constructor(response, retryAfterMs) {
|
|
44
|
+
super(response);
|
|
43
45
|
this.name = "RateLimitSynovaError";
|
|
44
46
|
this.retryAfterMs = retryAfterMs;
|
|
45
47
|
}
|
|
46
48
|
};
|
|
49
|
+
var ServerSynovaError = class extends ApiSynovaError {
|
|
50
|
+
retryable = true;
|
|
51
|
+
constructor(response) {
|
|
52
|
+
super(response);
|
|
53
|
+
this.name = "ServerSynovaError";
|
|
54
|
+
}
|
|
55
|
+
};
|
|
47
56
|
var TimeoutSynovaError = class extends SynovaError {
|
|
48
57
|
timeoutMs;
|
|
49
58
|
constructor(timeoutMs) {
|
|
@@ -60,16 +69,6 @@ var NetworkSynovaError = class extends SynovaError {
|
|
|
60
69
|
this.cause = cause;
|
|
61
70
|
}
|
|
62
71
|
};
|
|
63
|
-
var ServerSynovaError = class extends SynovaError {
|
|
64
|
-
httpCode;
|
|
65
|
-
retryable;
|
|
66
|
-
constructor(httpCode, message) {
|
|
67
|
-
super(message || `Server error: ${httpCode}`);
|
|
68
|
-
this.name = "ServerSynovaError";
|
|
69
|
-
this.httpCode = httpCode;
|
|
70
|
-
this.retryable = true;
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
72
|
|
|
74
73
|
// src/utils/http.ts
|
|
75
74
|
var HttpClient = class {
|
|
@@ -210,30 +209,32 @@ var HttpClient = class {
|
|
|
210
209
|
errorBody = await response.json();
|
|
211
210
|
} catch {
|
|
212
211
|
}
|
|
212
|
+
const defaultErrorBody = {
|
|
213
|
+
code: "UNKNOWN_ERROR",
|
|
214
|
+
httpCode: status,
|
|
215
|
+
message: errorBody?.message || `HTTP ${status}: ${response.statusText}`,
|
|
216
|
+
requestId: errorBody?.requestId || "unknown",
|
|
217
|
+
timestamp: errorBody?.timestamp || (/* @__PURE__ */ new Date()).toISOString(),
|
|
218
|
+
path: errorBody?.path,
|
|
219
|
+
method: errorBody?.method,
|
|
220
|
+
details: errorBody?.details
|
|
221
|
+
};
|
|
222
|
+
const body = errorBody || defaultErrorBody;
|
|
213
223
|
if (status === 401) {
|
|
214
|
-
throw new AuthSynovaError(
|
|
224
|
+
throw new AuthSynovaError(body);
|
|
215
225
|
}
|
|
216
226
|
if (status === 404) {
|
|
217
|
-
throw new NotFoundSynovaError(
|
|
227
|
+
throw new NotFoundSynovaError(body);
|
|
218
228
|
}
|
|
219
229
|
if (status === 429) {
|
|
220
230
|
const retryAfter = response.headers.get("Retry-After");
|
|
221
231
|
const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1e3 : void 0;
|
|
222
|
-
throw new RateLimitSynovaError(
|
|
232
|
+
throw new RateLimitSynovaError(body, retryAfterMs);
|
|
223
233
|
}
|
|
224
234
|
if (status >= 500) {
|
|
225
|
-
throw new ServerSynovaError(
|
|
235
|
+
throw new ServerSynovaError(body);
|
|
226
236
|
}
|
|
227
|
-
|
|
228
|
-
throw new ApiSynovaError(errorBody);
|
|
229
|
-
}
|
|
230
|
-
throw new ApiSynovaError({
|
|
231
|
-
code: "UNKNOWN_ERROR",
|
|
232
|
-
httpCode: status,
|
|
233
|
-
message: `HTTP ${status}: ${response.statusText}`,
|
|
234
|
-
requestId: "unknown",
|
|
235
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
236
|
-
});
|
|
237
|
+
throw new ApiSynovaError(body);
|
|
237
238
|
}
|
|
238
239
|
buildUrl(path, query) {
|
|
239
240
|
const url = new URL(path, this.config.baseUrl);
|
|
@@ -357,6 +358,7 @@ var PromptsResource = class {
|
|
|
357
358
|
provider: options.provider,
|
|
358
359
|
model: options.model
|
|
359
360
|
};
|
|
361
|
+
if (options.apiKeyId !== void 0) body.apiKeyId = options.apiKeyId;
|
|
360
362
|
if (options.variables !== void 0) body.variables = options.variables;
|
|
361
363
|
if (options.messages !== void 0) body.messages = options.messages;
|
|
362
364
|
if (options.tag !== void 0) body.tag = options.tag;
|
|
@@ -395,6 +397,7 @@ var PromptsResource = class {
|
|
|
395
397
|
tag,
|
|
396
398
|
provider: options.provider,
|
|
397
399
|
model: options.model,
|
|
400
|
+
apiKeyId: options.apiKeyId,
|
|
398
401
|
variables: options.variables,
|
|
399
402
|
messages: options.messages,
|
|
400
403
|
metadata: options.metadata,
|
|
@@ -427,6 +430,7 @@ var PromptsResource = class {
|
|
|
427
430
|
version,
|
|
428
431
|
provider: options.provider,
|
|
429
432
|
model: options.model,
|
|
433
|
+
apiKeyId: options.apiKeyId,
|
|
430
434
|
variables: options.variables,
|
|
431
435
|
messages: options.messages,
|
|
432
436
|
metadata: options.metadata,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/index.ts","../src/utils/http.ts","../src/resources/prompts.ts","../src/resources/models.ts","../src/resources/files.ts","../src/resources/llm-provider-keys.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { IApiErrorResponse } from '../types';\n\n/**\n * Base error class for all Synova SDK errors\n */\nexport class SynovaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SynovaError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when API returns an error response\n */\nexport class ApiSynovaError extends SynovaError {\n readonly code: string;\n readonly httpCode: number;\n readonly requestId: string;\n readonly timestamp: string;\n\n constructor(response: IApiErrorResponse) {\n super(response.message);\n this.name = 'ApiSynovaError';\n this.code = response.code;\n this.httpCode = response.httpCode;\n this.requestId = response.requestId;\n this.timestamp = response.timestamp;\n }\n}\n\n/**\n * Error thrown when authentication fails\n */\nexport class AuthSynovaError extends SynovaError {\n constructor(message = 'Invalid or missing API key') {\n super(message);\n this.name = 'AuthSynovaError';\n }\n}\n\n/**\n * Error thrown when resource is not found\n */\nexport class NotFoundSynovaError extends SynovaError {\n readonly resourceType: string;\n readonly resourceId: string;\n\n constructor(resourceType: string, resourceId: string) {\n super(`${resourceType} not found: ${resourceId}`);\n this.name = 'NotFoundSynovaError';\n this.resourceType = resourceType;\n this.resourceId = resourceId;\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded\n */\nexport class RateLimitSynovaError extends SynovaError {\n readonly retryAfterMs?: number;\n\n constructor(message = 'Rate limit exceeded', retryAfterMs?: number) {\n super(message);\n this.name = 'RateLimitSynovaError';\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/**\n * Error thrown when request times out\n */\nexport class TimeoutSynovaError extends SynovaError {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = 'TimeoutSynovaError';\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Error thrown when network request fails\n */\nexport class NetworkSynovaError extends SynovaError {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = 'NetworkSynovaError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when server returns 5xx error\n */\nexport class ServerSynovaError extends SynovaError {\n readonly httpCode: number;\n readonly retryable: boolean;\n\n constructor(httpCode: number, message?: string) {\n super(message || `Server error: ${httpCode}`);\n this.name = 'ServerSynovaError';\n this.httpCode = httpCode;\n this.retryable = true;\n }\n}\n","import type { IApiErrorResponse, ISynovaLogger, TSynovaRetryStrategy } from '../types';\nimport {\n ApiSynovaError,\n AuthSynovaError,\n NetworkSynovaError,\n NotFoundSynovaError,\n RateLimitSynovaError,\n ServerSynovaError,\n TimeoutSynovaError,\n} from '../errors';\n\nexport interface IRetryOptions {\n maxRetries: number;\n strategy: TSynovaRetryStrategy;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffMultiplier: number;\n}\n\nexport interface IHttpClientConfig {\n baseUrl: string;\n apiKey: string;\n timeout: number;\n retry: IRetryOptions;\n debug: boolean;\n logger: ISynovaLogger;\n}\n\nexport interface IRequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | undefined>;\n}\n\nexport interface IUploadOptions {\n path: string;\n formData: FormData;\n}\n\nexport class HttpClient {\n private readonly config: IHttpClientConfig;\n\n constructor(config: IHttpClientConfig) {\n this.config = config;\n }\n\n async request<T>(options: IRequestOptions): Promise<T> {\n const url = this.buildUrl(options.path, options.query);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeRequest<T>(url, options);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Request failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n async upload<T>(options: IUploadOptions): Promise<T> {\n const url = this.buildUrl(options.path);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeUploadRequest<T>(url, options.formData);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Upload failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n private async makeRequest<T>(url: string, options: IRequestOptions): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`${options.method} ${url}`);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'synova-cloud-sdk-node/0.1.0',\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Network request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async makeUploadRequest<T>(url: string, formData: FormData): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`POST (upload) ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'User-Agent': 'synova-cloud-sdk-node/0.1.0',\n // Note: Content-Type is not set for FormData - browser/node sets it with boundary\n },\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Upload request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n const status = response.status;\n\n // Try to parse error body\n let errorBody: IApiErrorResponse | null = null;\n try {\n errorBody = (await response.json()) as IApiErrorResponse;\n } catch {\n // Ignore JSON parse errors\n }\n\n if (status === 401) {\n throw new AuthSynovaError(errorBody?.message);\n }\n\n if (status === 404) {\n throw new NotFoundSynovaError('Resource', errorBody?.message || 'unknown');\n }\n\n if (status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined;\n throw new RateLimitSynovaError(errorBody?.message, retryAfterMs);\n }\n\n if (status >= 500) {\n throw new ServerSynovaError(status, errorBody?.message);\n }\n\n if (errorBody) {\n throw new ApiSynovaError(errorBody);\n }\n\n throw new ApiSynovaError({\n code: 'UNKNOWN_ERROR',\n httpCode: status,\n message: `HTTP ${status}: ${response.statusText}`,\n requestId: 'unknown',\n timestamp: new Date().toISOString(),\n });\n }\n\n private buildUrl(path: string, query?: Record<string, string | undefined>): string {\n const url = new URL(path, this.config.baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n }\n\n return url.toString();\n }\n\n private isRetryable(error: unknown): boolean {\n if (error instanceof RateLimitSynovaError) return true;\n if (error instanceof ServerSynovaError) return true;\n if (error instanceof NetworkSynovaError) return true;\n if (error instanceof TimeoutSynovaError) return true;\n return false;\n }\n\n private calculateRetryDelay(attempt: number, error: Error | null): number {\n const { strategy, initialDelayMs, maxDelayMs, backoffMultiplier } = this.config.retry;\n\n // Use Retry-After header if available (takes priority)\n if (error instanceof RateLimitSynovaError && error.retryAfterMs) {\n return Math.min(error.retryAfterMs, maxDelayMs);\n }\n\n let baseDelay: number;\n\n if (strategy === 'linear') {\n // Linear: initialDelay * attempt (1000, 2000, 3000, ...)\n baseDelay = initialDelayMs * attempt;\n } else {\n // Exponential: initialDelay * multiplier^(attempt-1) (1000, 2000, 4000, ...)\n baseDelay = initialDelayMs * Math.pow(backoffMultiplier, attempt - 1);\n }\n\n // Add jitter (±10%) to prevent thundering herd\n const jitter = baseDelay * 0.1 * (Math.random() * 2 - 1);\n const delay = baseDelay + jitter;\n\n return Math.min(Math.max(delay, 0), maxDelayMs);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(message: string): void {\n if (this.config.debug) {\n this.config.logger.debug(`[Synova SDK] ${message}`);\n }\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaPrompt,\n ISynovaGetPromptOptions,\n ISynovaExecuteOptions,\n ISynovaExecuteResponse,\n} from '../types';\n\nexport class PromptsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get a prompt by ID (returns version with 'latest' tag)\n *\n * @param promptId - The prompt ID (e.g., 'prm_abc123')\n * @param options - Optional settings\n * @returns The prompt data\n *\n * @example\n * ```ts\n * // Get default (latest) version\n * const prompt = await client.prompts.get('prm_abc123');\n *\n * // Get by specific tag\n * const production = await client.prompts.get('prm_abc123', { tag: 'production' });\n *\n * // Get specific version\n * const v2 = await client.prompts.get('prm_abc123', { version: '2.0.0' });\n * ```\n */\n async get(promptId: string, options?: ISynovaGetPromptOptions): Promise<ISynovaPrompt> {\n // Version takes precedence over tag\n if (options?.version) {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/versions/${options.version}`,\n });\n }\n\n // Tag (defaults to 'latest')\n const tag = options?.tag || 'latest';\n if (tag === 'latest') {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}`,\n });\n }\n\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/tags/${tag}`,\n });\n }\n\n /**\n * Execute a prompt with 'latest' tag\n *\n * @param promptId - The prompt ID\n * @param options - Execution options including provider, model and variables\n * @returns The execution response\n *\n * @example\n * ```ts\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * if (result.type === 'message') {\n * console.log(result.content);\n * }\n *\n * // Image generation\n * const imageResult = await client.prompts.execute('prm_image123', {\n * provider: 'google',\n * model: 'gemini-2.0-flash-exp',\n * variables: { style: 'modern' },\n * });\n *\n * if (imageResult.type === 'image') {\n * console.log('Generated images:', imageResult.files);\n * }\n * ```\n */\n async execute(promptId: string, options: ISynovaExecuteOptions): Promise<ISynovaExecuteResponse> {\n const body: Record<string, unknown> = {\n provider: options.provider,\n model: options.model,\n };\n\n // Only add optional fields if they are defined\n if (options.variables !== undefined) body.variables = options.variables;\n if (options.messages !== undefined) body.messages = options.messages;\n if (options.tag !== undefined) body.tag = options.tag;\n if (options.version !== undefined) body.version = options.version;\n if (options.metadata !== undefined) body.metadata = options.metadata;\n if (options.parameters !== undefined) body.parameters = options.parameters;\n if (options.responseSchema !== undefined) body.responseSchema = options.responseSchema;\n\n return this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body,\n });\n }\n\n /**\n * Execute a prompt by tag\n *\n * @param promptId - The prompt ID\n * @param tag - The tag (e.g., 'latest', 'production', 'staging')\n * @param options - Execution options\n * @returns The execution response\n *\n * @example\n * ```ts\n * const result = await client.prompts.executeByTag('prm_abc123', 'production', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n * ```\n */\n async executeByTag(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse> {\n return this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body: {\n tag,\n provider: options.provider,\n model: options.model,\n variables: options.variables,\n messages: options.messages,\n metadata: options.metadata,\n parameters: options.parameters,\n },\n });\n }\n\n /**\n * Execute a prompt by version\n *\n * @param promptId - The prompt ID\n * @param version - The semantic version (e.g., '1.0.0', '2.1.0')\n * @param options - Execution options\n * @returns The execution response\n *\n * @example\n * ```ts\n * const result = await client.prompts.executeByVersion('prm_abc123', '1.2.0', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n * ```\n */\n async executeByVersion(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse> {\n return this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body: {\n version,\n provider: options.provider,\n model: options.model,\n variables: options.variables,\n messages: options.messages,\n metadata: options.metadata,\n parameters: options.parameters,\n },\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaModel, ISynovaModelsResponse, ISynovaListModelsOptions } from '../types';\n\ninterface IProviderModelsResponse {\n models: ISynovaModel[];\n}\n\nexport class ModelsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all available models\n *\n * @param options - Optional filters\n * @returns List of providers with their models\n *\n * @example\n * ```ts\n * // Get all models\n * const { providers } = await client.models.list();\n *\n * // Filter by type\n * const imageModels = await client.models.list({ type: 'image' });\n *\n * // Filter by capability\n * const functionCallingModels = await client.models.list({\n * capability: 'function_calling',\n * });\n *\n * // Filter by provider\n * const openaiModels = await client.models.list({ provider: 'openai' });\n * ```\n */\n async list(options?: ISynovaListModelsOptions): Promise<ISynovaModelsResponse> {\n return this.http.request<ISynovaModelsResponse>({\n method: 'GET',\n path: '/api/v1/models',\n query: {\n type: options?.type,\n capability: options?.capability,\n provider: options?.provider,\n },\n });\n }\n\n /**\n * Get models for a specific provider\n *\n * @param provider - Provider ID (e.g., 'openai', 'anthropic')\n * @returns List of models for the provider\n *\n * @example\n * ```ts\n * const { models } = await client.models.getByProvider('openai');\n * ```\n */\n async getByProvider(provider: string): Promise<ISynovaModel[]> {\n const response = await this.http.request<IProviderModelsResponse>({\n method: 'GET',\n path: `/api/v1/models/${provider}`,\n });\n return response.models;\n }\n\n /**\n * Get a specific model\n *\n * @param provider - Provider ID\n * @param model - Model ID\n * @returns Model details\n *\n * @example\n * ```ts\n * const model = await client.models.get('openai', 'gpt-4o');\n * console.log(model.capabilities);\n * console.log(model.limits);\n * ```\n */\n async get(provider: string, model: string): Promise<ISynovaModel> {\n return this.http.request<ISynovaModel>({\n method: 'GET',\n path: `/api/v1/models/${provider}/${model}`,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaUploadResponse, ISynovaUploadOptions } from '../types';\n\nexport class FilesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Upload files for use in prompt execution\n *\n * @param files - Array of File or Blob objects to upload\n * @param options - Upload options including projectId\n * @returns Upload response with file metadata\n *\n * @example\n * ```ts\n * // Upload files\n * const result = await client.files.upload(\n * [file1, file2],\n * { projectId: 'prj_abc123' }\n * );\n *\n * console.log('Uploaded files:', result.data);\n *\n * // Use uploaded file in prompt execution\n * const response = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * messages: [\n * {\n * role: 'user',\n * content: 'Describe this image',\n * files: [{ fileId: result.data[0].id }],\n * },\n * ],\n * });\n * ```\n */\n async upload(\n files: (File | Blob)[],\n options: ISynovaUploadOptions,\n ): Promise<ISynovaUploadResponse> {\n const formData = new FormData();\n\n for (const file of files) {\n formData.append('files', file);\n }\n\n formData.append('projectId', options.projectId);\n\n return this.http.upload<ISynovaUploadResponse>({\n path: '/api/v1/files/upload',\n formData,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaLlmProviderKey,\n ISynovaLlmProviderKeyListResponse,\n ISynovaCreateLlmProviderKeyOptions,\n} from '../types';\n\nexport class LlmProviderKeysResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all LLM provider keys\n *\n * @returns List of LLM provider keys\n *\n * @example\n * ```ts\n * const { items, total } = await client.llmProviderKeys.list();\n * console.log(`Found ${total} keys`);\n * for (const key of items) {\n * console.log(`${key.provider}: ${key.maskedKey} (default: ${key.isDefault})`);\n * }\n * ```\n */\n async list(): Promise<ISynovaLlmProviderKeyListResponse> {\n return this.http.request<ISynovaLlmProviderKeyListResponse>({\n method: 'GET',\n path: '/api/v1/llm-provider-keys',\n });\n }\n\n /**\n * Get an LLM provider key by ID\n *\n * @param id - Key ID (e.g., 'lpk_abc123')\n * @returns LLM provider key details\n *\n * @example\n * ```ts\n * const key = await client.llmProviderKeys.get('lpk_abc123');\n * console.log(`Provider: ${key.provider}, Default: ${key.isDefault}`);\n * ```\n */\n async get(id: string): Promise<ISynovaLlmProviderKey> {\n return this.http.request<ISynovaLlmProviderKey>({\n method: 'GET',\n path: `/api/v1/llm-provider-keys/${id}`,\n });\n }\n\n /**\n * Create a new LLM provider key\n *\n * The first key created for a provider will automatically be set as the default.\n *\n * @param options - Key creation options\n * @returns Created LLM provider key\n *\n * @example\n * ```ts\n * // Create OpenAI key\n * const key = await client.llmProviderKeys.create({\n * provider: 'openai',\n * apiKey: 'sk-...',\n * label: 'Production Key',\n * defaultModel: 'gpt-4o',\n * });\n *\n * // Create Azure OpenAI key\n * const azureKey = await client.llmProviderKeys.create({\n * provider: 'azure_openai',\n * apiKey: 'your-azure-key',\n * azure: {\n * endpoint: 'https://my-resource.openai.azure.com',\n * },\n * label: 'Azure Production',\n * });\n * ```\n */\n async create(options: ISynovaCreateLlmProviderKeyOptions): Promise<ISynovaLlmProviderKey> {\n return this.http.request<ISynovaLlmProviderKey>({\n method: 'POST',\n path: '/api/v1/llm-provider-keys',\n body: options,\n });\n }\n\n /**\n * Set an LLM provider key as the default for its provider\n *\n * The previous default key for this provider will be unset.\n *\n * @param id - Key ID to set as default\n * @returns Updated LLM provider key\n *\n * @example\n * ```ts\n * const key = await client.llmProviderKeys.setDefault('lpk_abc123');\n * console.log(`${key.id} is now the default for ${key.provider}`);\n * ```\n */\n async setDefault(id: string): Promise<ISynovaLlmProviderKey> {\n return this.http.request<ISynovaLlmProviderKey>({\n method: 'POST',\n path: `/api/v1/llm-provider-keys/${id}/set-default`,\n });\n }\n\n /**\n * Delete an LLM provider key\n *\n * @param id - Key ID to delete\n *\n * @example\n * ```ts\n * await client.llmProviderKeys.delete('lpk_abc123');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.http.request<void>({\n method: 'DELETE',\n path: `/api/v1/llm-provider-keys/${id}`,\n });\n }\n}\n","import type { ISynovaConfig, ISynovaLogger } from './types';\nimport type { IRetryOptions } from './utils/http';\nimport { HttpClient } from './utils/http';\nimport { PromptsResource } from './resources/prompts';\nimport { ModelsResource } from './resources/models';\nimport { FilesResource } from './resources/files';\nimport { LlmProviderKeysResource } from './resources/llm-provider-keys';\n\nconst DEFAULT_BASE_URL = 'https://api.synova.cloud';\nconst DEFAULT_TIMEOUT = 30000;\n\nconst DEFAULT_RETRY: IRetryOptions = {\n maxRetries: 3,\n strategy: 'exponential',\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n};\n\nconst DEFAULT_LOGGER: ISynovaLogger = {\n debug: (message, ...args) => console.debug(message, ...args),\n info: (message, ...args) => console.info(message, ...args),\n warn: (message, ...args) => console.warn(message, ...args),\n error: (messageOrError, ...args) => console.error(messageOrError, ...args),\n};\n\n/**\n * Synova Cloud SDK client\n *\n * @example\n * ```ts\n * import { SynovaCloudSdk } from '@synova-cloud/sdk';\n *\n * const client = new SynovaCloudSdk('your-api-key');\n *\n * // Get a prompt\n * const prompt = await client.prompts.get('prm_abc123');\n *\n * // Execute a prompt\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * // List available models\n * const { providers } = await client.models.list();\n *\n * // Get models for a specific provider\n * const openaiModels = await client.models.getByProvider('openai');\n *\n * // Manage LLM provider keys\n * const { items } = await client.llmProviderKeys.list();\n * const newKey = await client.llmProviderKeys.create({\n * provider: 'openai',\n * apiKey: 'sk-...',\n * label: 'Production',\n * });\n *\n * // With custom retry config\n * const clientWithRetry = new SynovaCloudSdk('your-api-key', {\n * retry: {\n * maxRetries: 5,\n * strategy: 'linear',\n * initialDelayMs: 500,\n * },\n * });\n * ```\n */\nexport class SynovaCloudSdk {\n readonly prompts: PromptsResource;\n readonly models: ModelsResource;\n readonly files: FilesResource;\n readonly llmProviderKeys: LlmProviderKeysResource;\n\n private readonly http: HttpClient;\n\n /**\n * Create a new Synova Cloud SDK client\n *\n * @param apiKey - Your Synova API key\n * @param config - Optional configuration\n */\n constructor(apiKey: string, config?: ISynovaConfig) {\n if (!apiKey) {\n throw new Error('API key is required');\n }\n\n this.http = new HttpClient({\n baseUrl: config?.baseUrl ?? DEFAULT_BASE_URL,\n apiKey,\n timeout: config?.timeout ?? DEFAULT_TIMEOUT,\n retry: {\n maxRetries: config?.retry?.maxRetries ?? DEFAULT_RETRY.maxRetries,\n strategy: config?.retry?.strategy ?? DEFAULT_RETRY.strategy,\n initialDelayMs: config?.retry?.initialDelayMs ?? DEFAULT_RETRY.initialDelayMs,\n maxDelayMs: config?.retry?.maxDelayMs ?? DEFAULT_RETRY.maxDelayMs,\n backoffMultiplier: config?.retry?.backoffMultiplier ?? DEFAULT_RETRY.backoffMultiplier,\n },\n debug: config?.debug ?? false,\n logger: config?.logger ?? DEFAULT_LOGGER,\n });\n\n this.prompts = new PromptsResource(this.http);\n this.models = new ModelsResource(this.http);\n this.files = new FilesResource(this.http);\n this.llmProviderKeys = new LlmProviderKeysResource(this.http);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/index.ts","../src/utils/http.ts","../src/resources/prompts.ts","../src/resources/models.ts","../src/resources/files.ts","../src/resources/llm-provider-keys.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { IApiErrorResponse } from '../types';\n\n/**\n * Base error class for all Synova SDK errors\n */\nexport class SynovaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SynovaError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when API returns an error response.\n * Base class for all API-related errors.\n */\nexport class ApiSynovaError extends SynovaError {\n readonly code: string;\n readonly httpCode: number;\n readonly requestId: string;\n readonly timestamp: string;\n readonly path?: string;\n readonly method?: string;\n readonly details?: unknown;\n\n constructor(response: IApiErrorResponse) {\n super(response.message);\n this.name = 'ApiSynovaError';\n this.code = response.code;\n this.httpCode = response.httpCode;\n this.requestId = response.requestId;\n this.timestamp = response.timestamp;\n this.path = response.path;\n this.method = response.method;\n this.details = response.details;\n }\n}\n\n/**\n * Error thrown when authentication fails (401)\n */\nexport class AuthSynovaError extends ApiSynovaError {\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'AuthSynovaError';\n }\n}\n\n/**\n * Error thrown when resource is not found (404)\n */\nexport class NotFoundSynovaError extends ApiSynovaError {\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'NotFoundSynovaError';\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded (429)\n */\nexport class RateLimitSynovaError extends ApiSynovaError {\n readonly retryAfterMs?: number;\n\n constructor(response: IApiErrorResponse, retryAfterMs?: number) {\n super(response);\n this.name = 'RateLimitSynovaError';\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/**\n * Error thrown when server returns 5xx error\n */\nexport class ServerSynovaError extends ApiSynovaError {\n readonly retryable: boolean = true;\n\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'ServerSynovaError';\n }\n}\n\n/**\n * Error thrown when request times out (client-side)\n */\nexport class TimeoutSynovaError extends SynovaError {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = 'TimeoutSynovaError';\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Error thrown when network request fails (client-side)\n */\nexport class NetworkSynovaError extends SynovaError {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = 'NetworkSynovaError';\n this.cause = cause;\n }\n}\n","import type { IApiErrorResponse, ISynovaLogger, TSynovaRetryStrategy } from '../types';\nimport {\n ApiSynovaError,\n AuthSynovaError,\n NetworkSynovaError,\n NotFoundSynovaError,\n RateLimitSynovaError,\n ServerSynovaError,\n TimeoutSynovaError,\n} from '../errors';\n\nexport interface IRetryOptions {\n maxRetries: number;\n strategy: TSynovaRetryStrategy;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffMultiplier: number;\n}\n\nexport interface IHttpClientConfig {\n baseUrl: string;\n apiKey: string;\n timeout: number;\n retry: IRetryOptions;\n debug: boolean;\n logger: ISynovaLogger;\n}\n\nexport interface IRequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | undefined>;\n}\n\nexport interface IUploadOptions {\n path: string;\n formData: FormData;\n}\n\nexport class HttpClient {\n private readonly config: IHttpClientConfig;\n\n constructor(config: IHttpClientConfig) {\n this.config = config;\n }\n\n async request<T>(options: IRequestOptions): Promise<T> {\n const url = this.buildUrl(options.path, options.query);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeRequest<T>(url, options);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Request failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n async upload<T>(options: IUploadOptions): Promise<T> {\n const url = this.buildUrl(options.path);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeUploadRequest<T>(url, options.formData);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Upload failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n private async makeRequest<T>(url: string, options: IRequestOptions): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`${options.method} ${url}`);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'synova-cloud-sdk-node/0.1.0',\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Network request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async makeUploadRequest<T>(url: string, formData: FormData): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`POST (upload) ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'User-Agent': 'synova-cloud-sdk-node/0.1.0',\n // Note: Content-Type is not set for FormData - browser/node sets it with boundary\n },\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Upload request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n const status = response.status;\n\n // Try to parse error body\n let errorBody: IApiErrorResponse | null = null;\n try {\n errorBody = (await response.json()) as IApiErrorResponse;\n } catch {\n // Ignore JSON parse errors\n }\n\n // Create default error body if parsing failed\n const defaultErrorBody: IApiErrorResponse = {\n code: 'UNKNOWN_ERROR',\n httpCode: status,\n message: errorBody?.message || `HTTP ${status}: ${response.statusText}`,\n requestId: errorBody?.requestId || 'unknown',\n timestamp: errorBody?.timestamp || new Date().toISOString(),\n path: errorBody?.path,\n method: errorBody?.method,\n details: errorBody?.details,\n };\n\n const body = errorBody || defaultErrorBody;\n\n if (status === 401) {\n throw new AuthSynovaError(body);\n }\n\n if (status === 404) {\n throw new NotFoundSynovaError(body);\n }\n\n if (status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined;\n throw new RateLimitSynovaError(body, retryAfterMs);\n }\n\n if (status >= 500) {\n throw new ServerSynovaError(body);\n }\n\n throw new ApiSynovaError(body);\n }\n\n private buildUrl(path: string, query?: Record<string, string | undefined>): string {\n const url = new URL(path, this.config.baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n }\n\n return url.toString();\n }\n\n private isRetryable(error: unknown): boolean {\n if (error instanceof RateLimitSynovaError) return true;\n if (error instanceof ServerSynovaError) return true;\n if (error instanceof NetworkSynovaError) return true;\n if (error instanceof TimeoutSynovaError) return true;\n return false;\n }\n\n private calculateRetryDelay(attempt: number, error: Error | null): number {\n const { strategy, initialDelayMs, maxDelayMs, backoffMultiplier } = this.config.retry;\n\n // Use Retry-After header if available (takes priority)\n if (error instanceof RateLimitSynovaError && error.retryAfterMs) {\n return Math.min(error.retryAfterMs, maxDelayMs);\n }\n\n let baseDelay: number;\n\n if (strategy === 'linear') {\n // Linear: initialDelay * attempt (1000, 2000, 3000, ...)\n baseDelay = initialDelayMs * attempt;\n } else {\n // Exponential: initialDelay * multiplier^(attempt-1) (1000, 2000, 4000, ...)\n baseDelay = initialDelayMs * Math.pow(backoffMultiplier, attempt - 1);\n }\n\n // Add jitter (±10%) to prevent thundering herd\n const jitter = baseDelay * 0.1 * (Math.random() * 2 - 1);\n const delay = baseDelay + jitter;\n\n return Math.min(Math.max(delay, 0), maxDelayMs);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(message: string): void {\n if (this.config.debug) {\n this.config.logger.debug(`[Synova SDK] ${message}`);\n }\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaPrompt,\n ISynovaGetPromptOptions,\n ISynovaExecuteOptions,\n ISynovaExecuteResponse,\n} from '../types';\n\nexport class PromptsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get a prompt by ID (returns version with 'latest' tag)\n *\n * @param promptId - The prompt ID (e.g., 'prm_abc123')\n * @param options - Optional settings\n * @returns The prompt data\n *\n * @example\n * ```ts\n * // Get default (latest) version\n * const prompt = await client.prompts.get('prm_abc123');\n *\n * // Get by specific tag\n * const production = await client.prompts.get('prm_abc123', { tag: 'production' });\n *\n * // Get specific version\n * const v2 = await client.prompts.get('prm_abc123', { version: '2.0.0' });\n * ```\n */\n async get(promptId: string, options?: ISynovaGetPromptOptions): Promise<ISynovaPrompt> {\n // Version takes precedence over tag\n if (options?.version) {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/versions/${options.version}`,\n });\n }\n\n // Tag (defaults to 'latest')\n const tag = options?.tag || 'latest';\n if (tag === 'latest') {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}`,\n });\n }\n\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/tags/${tag}`,\n });\n }\n\n /**\n * Execute a prompt with 'latest' tag\n *\n * @param promptId - The prompt ID\n * @param options - Execution options including provider, model and variables\n * @returns The execution response\n *\n * @example\n * ```ts\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * if (result.type === 'message') {\n * console.log(result.content);\n * }\n *\n * // Image generation\n * const imageResult = await client.prompts.execute('prm_image123', {\n * provider: 'google',\n * model: 'gemini-2.0-flash-exp',\n * variables: { style: 'modern' },\n * });\n *\n * if (imageResult.type === 'image') {\n * console.log('Generated images:', imageResult.files);\n * }\n * ```\n */\n async execute(promptId: string, options: ISynovaExecuteOptions): Promise<ISynovaExecuteResponse> {\n const body: Record<string, unknown> = {\n provider: options.provider,\n model: options.model,\n };\n\n // Only add optional fields if they are defined\n if (options.apiKeyId !== undefined) body.apiKeyId = options.apiKeyId;\n if (options.variables !== undefined) body.variables = options.variables;\n if (options.messages !== undefined) body.messages = options.messages;\n if (options.tag !== undefined) body.tag = options.tag;\n if (options.version !== undefined) body.version = options.version;\n if (options.metadata !== undefined) body.metadata = options.metadata;\n if (options.parameters !== undefined) body.parameters = options.parameters;\n if (options.responseSchema !== undefined) body.responseSchema = options.responseSchema;\n\n return this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body,\n });\n }\n\n /**\n * Execute a prompt by tag\n *\n * @param promptId - The prompt ID\n * @param tag - The tag (e.g., 'latest', 'production', 'staging')\n * @param options - Execution options\n * @returns The execution response\n *\n * @example\n * ```ts\n * const result = await client.prompts.executeByTag('prm_abc123', 'production', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n * ```\n */\n async executeByTag(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse> {\n return this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body: {\n tag,\n provider: options.provider,\n model: options.model,\n apiKeyId: options.apiKeyId,\n variables: options.variables,\n messages: options.messages,\n metadata: options.metadata,\n parameters: options.parameters,\n },\n });\n }\n\n /**\n * Execute a prompt by version\n *\n * @param promptId - The prompt ID\n * @param version - The semantic version (e.g., '1.0.0', '2.1.0')\n * @param options - Execution options\n * @returns The execution response\n *\n * @example\n * ```ts\n * const result = await client.prompts.executeByVersion('prm_abc123', '1.2.0', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n * ```\n */\n async executeByVersion(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse> {\n return this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body: {\n version,\n provider: options.provider,\n model: options.model,\n apiKeyId: options.apiKeyId,\n variables: options.variables,\n messages: options.messages,\n metadata: options.metadata,\n parameters: options.parameters,\n },\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaModel, ISynovaModelsResponse, ISynovaListModelsOptions } from '../types';\n\ninterface IProviderModelsResponse {\n models: ISynovaModel[];\n}\n\nexport class ModelsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all available models\n *\n * @param options - Optional filters\n * @returns List of providers with their models\n *\n * @example\n * ```ts\n * // Get all models\n * const { providers } = await client.models.list();\n *\n * // Filter by type\n * const imageModels = await client.models.list({ type: 'image' });\n *\n * // Filter by capability\n * const functionCallingModels = await client.models.list({\n * capability: 'function_calling',\n * });\n *\n * // Filter by provider\n * const openaiModels = await client.models.list({ provider: 'openai' });\n * ```\n */\n async list(options?: ISynovaListModelsOptions): Promise<ISynovaModelsResponse> {\n return this.http.request<ISynovaModelsResponse>({\n method: 'GET',\n path: '/api/v1/models',\n query: {\n type: options?.type,\n capability: options?.capability,\n provider: options?.provider,\n },\n });\n }\n\n /**\n * Get models for a specific provider\n *\n * @param provider - Provider ID (e.g., 'openai', 'anthropic')\n * @returns List of models for the provider\n *\n * @example\n * ```ts\n * const { models } = await client.models.getByProvider('openai');\n * ```\n */\n async getByProvider(provider: string): Promise<ISynovaModel[]> {\n const response = await this.http.request<IProviderModelsResponse>({\n method: 'GET',\n path: `/api/v1/models/${provider}`,\n });\n return response.models;\n }\n\n /**\n * Get a specific model\n *\n * @param provider - Provider ID\n * @param model - Model ID\n * @returns Model details\n *\n * @example\n * ```ts\n * const model = await client.models.get('openai', 'gpt-4o');\n * console.log(model.capabilities);\n * console.log(model.limits);\n * ```\n */\n async get(provider: string, model: string): Promise<ISynovaModel> {\n return this.http.request<ISynovaModel>({\n method: 'GET',\n path: `/api/v1/models/${provider}/${model}`,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaUploadResponse, ISynovaUploadOptions } from '../types';\n\nexport class FilesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Upload files for use in prompt execution\n *\n * @param files - Array of File or Blob objects to upload\n * @param options - Upload options including projectId\n * @returns Upload response with file metadata\n *\n * @example\n * ```ts\n * // Upload files\n * const result = await client.files.upload(\n * [file1, file2],\n * { projectId: 'prj_abc123' }\n * );\n *\n * console.log('Uploaded files:', result.data);\n *\n * // Use uploaded file in prompt execution\n * const response = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * messages: [\n * {\n * role: 'user',\n * content: 'Describe this image',\n * files: [{ fileId: result.data[0].id }],\n * },\n * ],\n * });\n * ```\n */\n async upload(\n files: (File | Blob)[],\n options: ISynovaUploadOptions,\n ): Promise<ISynovaUploadResponse> {\n const formData = new FormData();\n\n for (const file of files) {\n formData.append('files', file);\n }\n\n formData.append('projectId', options.projectId);\n\n return this.http.upload<ISynovaUploadResponse>({\n path: '/api/v1/files/upload',\n formData,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaLlmProviderKey,\n ISynovaLlmProviderKeyListResponse,\n ISynovaCreateLlmProviderKeyOptions,\n} from '../types';\n\nexport class LlmProviderKeysResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all LLM provider keys\n *\n * @returns List of LLM provider keys\n *\n * @example\n * ```ts\n * const { items, total } = await client.llmProviderKeys.list();\n * console.log(`Found ${total} keys`);\n * for (const key of items) {\n * console.log(`${key.provider}: ${key.maskedKey} (default: ${key.isDefault})`);\n * }\n * ```\n */\n async list(): Promise<ISynovaLlmProviderKeyListResponse> {\n return this.http.request<ISynovaLlmProviderKeyListResponse>({\n method: 'GET',\n path: '/api/v1/llm-provider-keys',\n });\n }\n\n /**\n * Get an LLM provider key by ID\n *\n * @param id - Key ID (e.g., 'lpk_abc123')\n * @returns LLM provider key details\n *\n * @example\n * ```ts\n * const key = await client.llmProviderKeys.get('lpk_abc123');\n * console.log(`Provider: ${key.provider}, Default: ${key.isDefault}`);\n * ```\n */\n async get(id: string): Promise<ISynovaLlmProviderKey> {\n return this.http.request<ISynovaLlmProviderKey>({\n method: 'GET',\n path: `/api/v1/llm-provider-keys/${id}`,\n });\n }\n\n /**\n * Create a new LLM provider key\n *\n * The first key created for a provider will automatically be set as the default.\n *\n * @param options - Key creation options\n * @returns Created LLM provider key\n *\n * @example\n * ```ts\n * // Create OpenAI key\n * const key = await client.llmProviderKeys.create({\n * provider: 'openai',\n * apiKey: 'sk-...',\n * label: 'Production Key',\n * defaultModel: 'gpt-4o',\n * });\n *\n * // Create Azure OpenAI key\n * const azureKey = await client.llmProviderKeys.create({\n * provider: 'azure_openai',\n * apiKey: 'your-azure-key',\n * azure: {\n * endpoint: 'https://my-resource.openai.azure.com',\n * },\n * label: 'Azure Production',\n * });\n * ```\n */\n async create(options: ISynovaCreateLlmProviderKeyOptions): Promise<ISynovaLlmProviderKey> {\n return this.http.request<ISynovaLlmProviderKey>({\n method: 'POST',\n path: '/api/v1/llm-provider-keys',\n body: options,\n });\n }\n\n /**\n * Set an LLM provider key as the default for its provider\n *\n * The previous default key for this provider will be unset.\n *\n * @param id - Key ID to set as default\n * @returns Updated LLM provider key\n *\n * @example\n * ```ts\n * const key = await client.llmProviderKeys.setDefault('lpk_abc123');\n * console.log(`${key.id} is now the default for ${key.provider}`);\n * ```\n */\n async setDefault(id: string): Promise<ISynovaLlmProviderKey> {\n return this.http.request<ISynovaLlmProviderKey>({\n method: 'POST',\n path: `/api/v1/llm-provider-keys/${id}/set-default`,\n });\n }\n\n /**\n * Delete an LLM provider key\n *\n * @param id - Key ID to delete\n *\n * @example\n * ```ts\n * await client.llmProviderKeys.delete('lpk_abc123');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.http.request<void>({\n method: 'DELETE',\n path: `/api/v1/llm-provider-keys/${id}`,\n });\n }\n}\n","import type { ISynovaConfig, ISynovaLogger } from './types';\nimport type { IRetryOptions } from './utils/http';\nimport { HttpClient } from './utils/http';\nimport { PromptsResource } from './resources/prompts';\nimport { ModelsResource } from './resources/models';\nimport { FilesResource } from './resources/files';\nimport { LlmProviderKeysResource } from './resources/llm-provider-keys';\n\nconst DEFAULT_BASE_URL = 'https://api.synova.cloud';\nconst DEFAULT_TIMEOUT = 30000;\n\nconst DEFAULT_RETRY: IRetryOptions = {\n maxRetries: 3,\n strategy: 'exponential',\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n};\n\nconst DEFAULT_LOGGER: ISynovaLogger = {\n debug: (message, ...args) => console.debug(message, ...args),\n info: (message, ...args) => console.info(message, ...args),\n warn: (message, ...args) => console.warn(message, ...args),\n error: (messageOrError, ...args) => console.error(messageOrError, ...args),\n};\n\n/**\n * Synova Cloud SDK client\n *\n * @example\n * ```ts\n * import { SynovaCloudSdk } from '@synova-cloud/sdk';\n *\n * const client = new SynovaCloudSdk('your-api-key');\n *\n * // Get a prompt\n * const prompt = await client.prompts.get('prm_abc123');\n *\n * // Execute a prompt\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * // List available models\n * const { providers } = await client.models.list();\n *\n * // Get models for a specific provider\n * const openaiModels = await client.models.getByProvider('openai');\n *\n * // Manage LLM provider keys\n * const { items } = await client.llmProviderKeys.list();\n * const newKey = await client.llmProviderKeys.create({\n * provider: 'openai',\n * apiKey: 'sk-...',\n * label: 'Production',\n * });\n *\n * // With custom retry config\n * const clientWithRetry = new SynovaCloudSdk('your-api-key', {\n * retry: {\n * maxRetries: 5,\n * strategy: 'linear',\n * initialDelayMs: 500,\n * },\n * });\n * ```\n */\nexport class SynovaCloudSdk {\n readonly prompts: PromptsResource;\n readonly models: ModelsResource;\n readonly files: FilesResource;\n readonly llmProviderKeys: LlmProviderKeysResource;\n\n private readonly http: HttpClient;\n\n /**\n * Create a new Synova Cloud SDK client\n *\n * @param apiKey - Your Synova API key\n * @param config - Optional configuration\n */\n constructor(apiKey: string, config?: ISynovaConfig) {\n if (!apiKey) {\n throw new Error('API key is required');\n }\n\n this.http = new HttpClient({\n baseUrl: config?.baseUrl ?? DEFAULT_BASE_URL,\n apiKey,\n timeout: config?.timeout ?? DEFAULT_TIMEOUT,\n retry: {\n maxRetries: config?.retry?.maxRetries ?? DEFAULT_RETRY.maxRetries,\n strategy: config?.retry?.strategy ?? DEFAULT_RETRY.strategy,\n initialDelayMs: config?.retry?.initialDelayMs ?? DEFAULT_RETRY.initialDelayMs,\n maxDelayMs: config?.retry?.maxDelayMs ?? DEFAULT_RETRY.maxDelayMs,\n backoffMultiplier: config?.retry?.backoffMultiplier ?? DEFAULT_RETRY.backoffMultiplier,\n },\n debug: config?.debug ?? false,\n logger: config?.logger ?? DEFAULT_LOGGER,\n });\n\n this.prompts = new PromptsResource(this.http);\n this.models = new ModelsResource(this.http);\n this.files = new FilesResource(this.http);\n this.llmProviderKeys = new LlmProviderKeysResource(this.http);\n }\n}\n"]}
|