@synova-cloud/sdk 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -72,6 +72,9 @@ var NetworkSynovaError = class extends SynovaError {
72
72
  }
73
73
  };
74
74
 
75
+ // src/version.ts
76
+ var SDK_VERSION = "1.4.0" ;
77
+
75
78
  // src/utils/http.ts
76
79
  var HttpClient = class {
77
80
  config;
@@ -142,7 +145,7 @@ var HttpClient = class {
142
145
  headers: {
143
146
  Authorization: `Bearer ${this.config.apiKey}`,
144
147
  "Content-Type": "application/json",
145
- "User-Agent": "synova-cloud-sdk-node/0.1.0"
148
+ "User-Agent": `synova-cloud-sdk-node/${SDK_VERSION}`
146
149
  },
147
150
  body: options.body ? JSON.stringify(options.body) : void 0,
148
151
  signal: controller.signal
@@ -177,7 +180,7 @@ var HttpClient = class {
177
180
  method: "POST",
178
181
  headers: {
179
182
  Authorization: `Bearer ${this.config.apiKey}`,
180
- "User-Agent": "synova-cloud-sdk-node/0.1.0"
183
+ "User-Agent": `synova-cloud-sdk-node/${SDK_VERSION}`
181
184
  // Note: Content-Type is not set for FormData - browser/node sets it with boundary
182
185
  },
183
186
  body: formData,
@@ -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 * 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"]}
1
+ {"version":3,"sources":["../src/errors/index.ts","../src/version.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":";;;AAKO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EACrC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAMO,IAAM,cAAA,GAAN,cAA6B,WAAA,CAAY;AAAA,EACrC,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,QAAA,EAA6B;AACvC,IAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACtB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,QAAA,CAAS,IAAA;AACrB,IAAA,IAAA,CAAK,WAAW,QAAA,CAAS,QAAA;AACzB,IAAA,IAAA,CAAK,YAAY,QAAA,CAAS,SAAA;AAC1B,IAAA,IAAA,CAAK,YAAY,QAAA,CAAS,SAAA;AAC1B,IAAA,IAAA,CAAK,OAAO,QAAA,CAAS,IAAA;AACrB,IAAA,IAAA,CAAK,SAAS,QAAA,CAAS,MAAA;AACvB,IAAA,IAAA,CAAK,UAAU,QAAA,CAAS,OAAA;AAAA,EAC1B;AACF;AAKO,IAAM,eAAA,GAAN,cAA8B,cAAA,CAAe;AAAA,EAClD,YAAY,QAAA,EAA6B;AACvC,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAKO,IAAM,mBAAA,GAAN,cAAkC,cAAA,CAAe;AAAA,EACtD,YAAY,QAAA,EAA6B;AACvC,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAKO,IAAM,oBAAA,GAAN,cAAmC,cAAA,CAAe;AAAA,EAC9C,YAAA;AAAA,EAET,WAAA,CAAY,UAA6B,YAAA,EAAuB;AAC9D,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AAAA,EACtB;AACF;AAKO,IAAM,iBAAA,GAAN,cAAgC,cAAA,CAAe;AAAA,EAC3C,SAAA,GAAqB,IAAA;AAAA,EAE9B,YAAY,QAAA,EAA6B;AACvC,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAKO,IAAM,kBAAA,GAAN,cAAiC,WAAA,CAAY;AAAA,EACzC,SAAA;AAAA,EAET,YAAY,SAAA,EAAmB;AAC7B,IAAA,KAAA,CAAM,CAAA,wBAAA,EAA2B,SAAS,CAAA,EAAA,CAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AACF;AAKO,IAAM,kBAAA,GAAN,cAAiC,WAAA,CAAY;AAAA,EACzC,KAAA;AAAA,EAET,WAAA,CAAY,SAAiB,KAAA,EAAe;AAC1C,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF;;;AC1GO,IAAM,WAAA,GAAuD,OAAA,CAAkB;;;ACuC/E,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EAEjB,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,QAAW,OAAA,EAAsC;AACrD,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM,QAAQ,KAAK,CAAA;AACrD,IAAA,MAAM,EAAE,UAAA,EAAW,GAAI,IAAA,CAAK,MAAA,CAAO,KAAA;AACnC,IAAA,IAAI,SAAA,GAA0B,IAAA;AAE9B,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,MAAA,IAAI;AACF,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,SAAS,CAAA;AACzD,UAAA,IAAA,CAAK,GAAA;AAAA,YACH,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,OAAA,EAAU,KAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,CAAA;AAAA,WAClG;AACA,UAAA,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,QACxB;AAEA,QAAA,OAAO,MAAM,IAAA,CAAK,WAAA,CAAe,GAAA,EAAK,OAAO,CAAA;AAAA,MAC/C,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,KAAA;AAEZ,QAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,EAAG;AAC5B,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,4BAAA,EAAgC,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,MACpE;AAAA,IACF;AAEA,IAAA,MAAM,SAAA;AAAA,EACR;AAAA,EAEA,MAAM,OAAU,OAAA,EAAqC;AACnD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AACtC,IAAA,MAAM,EAAE,UAAA,EAAW,GAAI,IAAA,CAAK,MAAA,CAAO,KAAA;AACnC,IAAA,IAAI,SAAA,GAA0B,IAAA;AAE9B,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,MAAA,IAAI;AACF,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,SAAS,CAAA;AACzD,UAAA,IAAA,CAAK,GAAA;AAAA,YACH,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,OAAA,EAAU,KAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,CAAA;AAAA,WAClG;AACA,UAAA,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,QACxB;AAEA,QAAA,OAAO,MAAM,IAAA,CAAK,iBAAA,CAAqB,GAAA,EAAK,QAAQ,QAAQ,CAAA;AAAA,MAC9D,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,KAAA;AAEZ,QAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,EAAG;AAC5B,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,2BAAA,EAA+B,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,MACnE;AAAA,IACF;AAEA,IAAA,MAAM,SAAA;AAAA,EACR;AAAA,EAEA,MAAc,WAAA,CAAe,GAAA,EAAa,OAAA,EAAsC;AAC9E,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAE1E,IAAA,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAEnC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,UAC3C,cAAA,EAAgB,kBAAA;AAAA,UAChB,YAAA,EAAc,yBAAyB,WAAW,CAAA;AAAA,SACpD;AAAA,QACA,MAAM,OAAA,CAAQ,IAAA,GAAO,KAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,QACpD,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAA,CAAK,oBAAoB,QAAQ,CAAA;AAAA,MACzC;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,UAAA,EAAa,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AACvC,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAAA,MAClD;AAEA,MAAA,IACE,KAAA,YAAiB,kBACjB,KAAA,YAAiB,eAAA,IACjB,iBAAiB,mBAAA,IACjB,KAAA,YAAiB,oBAAA,IACjB,KAAA,YAAiB,iBAAA,EACjB;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,CAAA,wBAAA,EAA4B,MAAgB,OAAO,CAAA,CAAA;AAAA,QACnD;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iBAAA,CAAqB,GAAA,EAAa,QAAA,EAAgC;AAC9E,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAE1E,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAE,CAAA;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,UAC3C,YAAA,EAAc,yBAAyB,WAAW,CAAA;AAAA;AAAA,SAEpD;AAAA,QACA,IAAA,EAAM,QAAA;AAAA,QACN,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAA,CAAK,oBAAoB,QAAQ,CAAA;AAAA,MACzC;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,UAAA,EAAa,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AACvC,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAAA,MAClD;AAEA,MAAA,IACE,KAAA,YAAiB,kBACjB,KAAA,YAAiB,eAAA,IACjB,iBAAiB,mBAAA,IACjB,KAAA,YAAiB,oBAAA,IACjB,KAAA,YAAiB,iBAAA,EACjB;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,CAAA,uBAAA,EAA2B,MAAgB,OAAO,CAAA,CAAA;AAAA,QAClD;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,QAAA,EAAoC;AACpE,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AAGxB,IAAA,IAAI,SAAA,GAAsC,IAAA;AAC1C,IAAA,IAAI;AACF,MAAA,SAAA,GAAa,MAAM,SAAS,IAAA,EAAK;AAAA,IACnC,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,MAAM,gBAAA,GAAsC;AAAA,MAC1C,IAAA,EAAM,eAAA;AAAA,MACN,QAAA,EAAU,MAAA;AAAA,MACV,SAAS,SAAA,EAAW,OAAA,IAAW,QAAQ,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA,CAAA;AAAA,MACrE,SAAA,EAAW,WAAW,SAAA,IAAa,SAAA;AAAA,MACnC,WAAW,SAAA,EAAW,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,MAC1D,MAAM,SAAA,EAAW,IAAA;AAAA,MACjB,QAAQ,SAAA,EAAW,MAAA;AAAA,MACnB,SAAS,SAAA,EAAW;AAAA,KACtB;AAEA,IAAA,MAAM,OAAO,SAAA,IAAa,gBAAA;AAE1B,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,MAAM,IAAI,gBAAgB,IAAI,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,MAAM,IAAI,oBAAoB,IAAI,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACrD,MAAA,MAAM,eAAe,UAAA,GAAa,QAAA,CAAS,UAAA,EAAY,EAAE,IAAI,GAAA,GAAO,MAAA;AACpE,MAAA,MAAM,IAAI,oBAAA,CAAqB,IAAA,EAAM,YAAY,CAAA;AAAA,IACnD;AAEA,IAAA,IAAI,UAAU,GAAA,EAAK;AACjB,MAAA,MAAM,IAAI,kBAAkB,IAAI,CAAA;AAAA,IAClC;AAEA,IAAA,MAAM,IAAI,eAAe,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEQ,QAAA,CAAS,MAAc,KAAA,EAAoD;AACjF,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,OAAO,OAAO,CAAA;AAE7C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA,EAEQ,YAAY,KAAA,EAAyB;AAC3C,IAAA,IAAI,KAAA,YAAiB,sBAAsB,OAAO,IAAA;AAClD,IAAA,IAAI,KAAA,YAAiB,mBAAmB,OAAO,IAAA;AAC/C,IAAA,IAAI,KAAA,YAAiB,oBAAoB,OAAO,IAAA;AAChD,IAAA,IAAI,KAAA,YAAiB,oBAAoB,OAAO,IAAA;AAChD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,mBAAA,CAAoB,SAAiB,KAAA,EAA6B;AACxE,IAAA,MAAM,EAAE,QAAA,EAAU,cAAA,EAAgB,YAAY,iBAAA,EAAkB,GAAI,KAAK,MAAA,CAAO,KAAA;AAGhF,IAAA,IAAI,KAAA,YAAiB,oBAAA,IAAwB,KAAA,CAAM,YAAA,EAAc;AAC/D,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,UAAU,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,SAAA;AAEJ,IAAA,IAAI,aAAa,QAAA,EAAU;AAEzB,MAAA,SAAA,GAAY,cAAA,GAAiB,OAAA;AAAA,IAC/B,CAAA,MAAO;AAEL,MAAA,SAAA,GAAY,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,iBAAA,EAAmB,UAAU,CAAC,CAAA;AAAA,IACtE;AAGA,IAAA,MAAM,SAAS,SAAA,GAAY,GAAA,IAAO,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAA,CAAA;AACtD,IAAA,MAAM,QAAQ,SAAA,GAAY,MAAA;AAE1B,IAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,EAAO,CAAC,GAAG,UAAU,CAAA;AAAA,EAChD;AAAA,EAEQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AAAA,EAEQ,IAAI,OAAA,EAAuB;AACjC,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IACpD;AAAA,EACF;AACF,CAAA;;;ACxTO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBhD,MAAM,GAAA,CAAI,QAAA,EAAkB,OAAA,EAA2D;AAErF,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAuB;AAAA,QACtC,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,UAAA,EAAa,QAAQ,OAAO,CAAA;AAAA,OAC9D,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,GAAA,GAAM,SAAS,GAAA,IAAO,QAAA;AAC5B,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAuB;AAAA,QACtC,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAM,mBAAmB,QAAQ,CAAA;AAAA,OAClC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAuB;AAAA,MACtC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,MAAA,EAAS,GAAG,CAAA;AAAA,KAC9C,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCA,MAAM,OAAA,CAAQ,QAAA,EAAkB,OAAA,EAAiE;AAC/F,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,OAAO,OAAA,CAAQ;AAAA,KACjB;AAGA,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAW,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AAC9D,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,MAAA,EAAW,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA;AAClD,IAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AAC1D,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,UAAA,KAAe,MAAA,EAAW,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAChE,IAAA,IAAI,OAAA,CAAQ,cAAA,KAAmB,MAAA,EAAW,IAAA,CAAK,iBAAiB,OAAA,CAAQ,cAAA;AAExE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAgC;AAAA,MAC/C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,mBAAmB,QAAQ,CAAA,IAAA,CAAA;AAAA,MACjC;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,YAAA,CACJ,QAAA,EACA,GAAA,EACA,OAAA,EACiC;AACjC,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAgC;AAAA,MAC/C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,mBAAmB,QAAQ,CAAA,IAAA,CAAA;AAAA,MACjC,IAAA,EAAM;AAAA,QACJ,GAAA;AAAA,QACA,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,YAAY,OAAA,CAAQ;AAAA;AACtB,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,gBAAA,CACJ,QAAA,EACA,OAAA,EACA,OAAA,EACiC;AACjC,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAgC;AAAA,MAC/C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,mBAAmB,QAAQ,CAAA,IAAA,CAAA;AAAA,MACjC,IAAA,EAAM;AAAA,QACJ,OAAA;AAAA,QACA,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,YAAY,OAAA,CAAQ;AAAA;AACtB,KACD,CAAA;AAAA,EACH;AACF,CAAA;;;AChLO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBhD,MAAM,KAAK,OAAA,EAAoE;AAC7E,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAA+B;AAAA,MAC9C,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,MAAM,OAAA,EAAS,IAAA;AAAA,QACf,YAAY,OAAA,EAAS,UAAA;AAAA,QACrB,UAAU,OAAA,EAAS;AAAA;AACrB,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,cAAc,QAAA,EAA2C;AAC7D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAiC;AAAA,MAChE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,kBAAkB,QAAQ,CAAA;AAAA,KACjC,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,GAAA,CAAI,QAAA,EAAkB,KAAA,EAAsC;AAChE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAsB;AAAA,MACrC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,eAAA,EAAkB,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,KAC1C,CAAA;AAAA,EACH;AACF,CAAA;;;ACjFO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiChD,MAAM,MAAA,CACJ,KAAA,EACA,OAAA,EACgC;AAChC,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAE9B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,QAAA,CAAS,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,IAC/B;AAEA,IAAA,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa,OAAA,CAAQ,SAAS,CAAA;AAE9C,IAAA,OAAO,IAAA,CAAK,KAAK,MAAA,CAA8B;AAAA,MAC7C,IAAA,EAAM,sBAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;;;AC/CO,IAAM,0BAAN,MAA8B;AAAA,EACnC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBhD,MAAM,IAAA,GAAmD;AACvD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAA2C;AAAA,MAC1D,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,IAAI,EAAA,EAA4C;AACpD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAA+B;AAAA,MAC9C,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,6BAA6B,EAAE,CAAA;AAAA,KACtC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BA,MAAM,OAAO,OAAA,EAA6E;AACxF,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAA+B;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,2BAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,WAAW,EAAA,EAA4C;AAC3D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAA+B;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,6BAA6B,EAAE,CAAA,YAAA;AAAA,KACtC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,KAAK,OAAA,CAAc;AAAA,MAC5B,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,6BAA6B,EAAE,CAAA;AAAA,KACtC,CAAA;AAAA,EACH;AACF,CAAA;;;ACpHA,IAAM,gBAAA,GAAmB,0BAAA;AACzB,IAAM,eAAA,GAAkB,GAAA;AAExB,IAAM,aAAA,GAA+B;AAAA,EACnC,UAAA,EAAY,CAAA;AAAA,EACZ,QAAA,EAAU,aAAA;AAAA,EACV,cAAA,EAAgB,GAAA;AAAA,EAChB,UAAA,EAAY,GAAA;AAAA,EACZ,iBAAA,EAAmB;AACrB,CAAA;AAEA,IAAM,cAAA,GAAgC;AAAA,EACpC,KAAA,EAAO,CAAC,OAAA,EAAA,GAAY,IAAA,KAAS,QAAQ,KAAA,CAAM,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC3D,IAAA,EAAM,CAAC,OAAA,EAAA,GAAY,IAAA,KAAS,QAAQ,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EACzD,IAAA,EAAM,CAAC,OAAA,EAAA,GAAY,IAAA,KAAS,QAAQ,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EACzD,KAAA,EAAO,CAAC,cAAA,EAAA,GAAmB,IAAA,KAAS,QAAQ,KAAA,CAAM,cAAA,EAAgB,GAAG,IAAI;AAC3E,CAAA;AA6CO,IAAM,iBAAN,MAAqB;AAAA,EACjB,OAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA;AAAA,EAEQ,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjB,WAAA,CAAY,QAAgB,MAAA,EAAwB;AAClD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAEA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW;AAAA,MACzB,OAAA,EAAS,QAAQ,OAAA,IAAW,gBAAA;AAAA,MAC5B,MAAA;AAAA,MACA,OAAA,EAAS,QAAQ,OAAA,IAAW,eAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,UAAA,IAAc,aAAA,CAAc,UAAA;AAAA,QACvD,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,QAAA,IAAY,aAAA,CAAc,QAAA;AAAA,QACnD,cAAA,EAAgB,MAAA,EAAQ,KAAA,EAAO,cAAA,IAAkB,aAAA,CAAc,cAAA;AAAA,QAC/D,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,UAAA,IAAc,aAAA,CAAc,UAAA;AAAA,QACvD,iBAAA,EAAmB,MAAA,EAAQ,KAAA,EAAO,iBAAA,IAAqB,aAAA,CAAc;AAAA,OACvE;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,KAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,KAC3B,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,uBAAA,CAAwB,IAAA,CAAK,IAAI,CAAA;AAAA,EAC9D;AACF","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","declare const __SDK_VERSION__: string;\n\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'dev';\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';\nimport { SDK_VERSION } from '../version';\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/${SDK_VERSION}`,\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/${SDK_VERSION}`,\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
@@ -2,6 +2,23 @@ type TSynovaMessageRole = 'system' | 'user' | 'assistant' | 'tool';
2
2
  type TSynovaResponseType = 'message' | 'tool_calls' | 'image' | 'audio' | 'error';
3
3
  type TSynovaModelType = 'text' | 'image';
4
4
  type TSynovaUsageType = 'tokens' | 'images' | 'time';
5
+ type TSynovaJsonSchemaType = 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array';
6
+ interface ISynovaJsonSchema {
7
+ /** Schema type */
8
+ type?: TSynovaJsonSchemaType;
9
+ /** Description of the field */
10
+ description?: string;
11
+ /** Allowed values (for enum-like fields) */
12
+ enum?: (string | number | boolean | null)[];
13
+ /** Schema for array items (when type='array') */
14
+ items?: ISynovaJsonSchema;
15
+ /** Object properties (when type='object') */
16
+ properties?: Record<string, ISynovaJsonSchema>;
17
+ /** Required property names (when type='object') */
18
+ required?: string[];
19
+ /** Whether additional properties are allowed (when type='object') */
20
+ additionalProperties?: boolean;
21
+ }
5
22
  interface ISynovaLogger {
6
23
  debug: (message: string, ...args: unknown[]) => void;
7
24
  info: (message: string, ...args: unknown[]) => void;
@@ -100,7 +117,7 @@ interface ISynovaExecuteOptions {
100
117
  /** Model parameters (temperature, maxTokens, topP, topK, etc.) */
101
118
  parameters?: Record<string, unknown>;
102
119
  /** JSON Schema for structured output */
103
- responseSchema?: Record<string, unknown>;
120
+ responseSchema?: ISynovaJsonSchema;
104
121
  }
105
122
  interface ISynovaExecutionUsage {
106
123
  /** Usage type: 'tokens' for LLM, 'images' for image generation, 'time' for time-based billing */
package/dist/index.d.ts CHANGED
@@ -2,6 +2,23 @@ type TSynovaMessageRole = 'system' | 'user' | 'assistant' | 'tool';
2
2
  type TSynovaResponseType = 'message' | 'tool_calls' | 'image' | 'audio' | 'error';
3
3
  type TSynovaModelType = 'text' | 'image';
4
4
  type TSynovaUsageType = 'tokens' | 'images' | 'time';
5
+ type TSynovaJsonSchemaType = 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array';
6
+ interface ISynovaJsonSchema {
7
+ /** Schema type */
8
+ type?: TSynovaJsonSchemaType;
9
+ /** Description of the field */
10
+ description?: string;
11
+ /** Allowed values (for enum-like fields) */
12
+ enum?: (string | number | boolean | null)[];
13
+ /** Schema for array items (when type='array') */
14
+ items?: ISynovaJsonSchema;
15
+ /** Object properties (when type='object') */
16
+ properties?: Record<string, ISynovaJsonSchema>;
17
+ /** Required property names (when type='object') */
18
+ required?: string[];
19
+ /** Whether additional properties are allowed (when type='object') */
20
+ additionalProperties?: boolean;
21
+ }
5
22
  interface ISynovaLogger {
6
23
  debug: (message: string, ...args: unknown[]) => void;
7
24
  info: (message: string, ...args: unknown[]) => void;
@@ -100,7 +117,7 @@ interface ISynovaExecuteOptions {
100
117
  /** Model parameters (temperature, maxTokens, topP, topK, etc.) */
101
118
  parameters?: Record<string, unknown>;
102
119
  /** JSON Schema for structured output */
103
- responseSchema?: Record<string, unknown>;
120
+ responseSchema?: ISynovaJsonSchema;
104
121
  }
105
122
  interface ISynovaExecutionUsage {
106
123
  /** Usage type: 'tokens' for LLM, 'images' for image generation, 'time' for time-based billing */
package/dist/index.js CHANGED
@@ -70,6 +70,9 @@ var NetworkSynovaError = class extends SynovaError {
70
70
  }
71
71
  };
72
72
 
73
+ // src/version.ts
74
+ var SDK_VERSION = "1.4.0" ;
75
+
73
76
  // src/utils/http.ts
74
77
  var HttpClient = class {
75
78
  config;
@@ -140,7 +143,7 @@ var HttpClient = class {
140
143
  headers: {
141
144
  Authorization: `Bearer ${this.config.apiKey}`,
142
145
  "Content-Type": "application/json",
143
- "User-Agent": "synova-cloud-sdk-node/0.1.0"
146
+ "User-Agent": `synova-cloud-sdk-node/${SDK_VERSION}`
144
147
  },
145
148
  body: options.body ? JSON.stringify(options.body) : void 0,
146
149
  signal: controller.signal
@@ -175,7 +178,7 @@ var HttpClient = class {
175
178
  method: "POST",
176
179
  headers: {
177
180
  Authorization: `Bearer ${this.config.apiKey}`,
178
- "User-Agent": "synova-cloud-sdk-node/0.1.0"
181
+ "User-Agent": `synova-cloud-sdk-node/${SDK_VERSION}`
179
182
  // Note: Content-Type is not set for FormData - browser/node sets it with boundary
180
183
  },
181
184
  body: formData,
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 * 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"]}
1
+ {"version":3,"sources":["../src/errors/index.ts","../src/version.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","declare const __SDK_VERSION__: string;\n\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'dev';\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';\nimport { SDK_VERSION } from '../version';\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/${SDK_VERSION}`,\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/${SDK_VERSION}`,\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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synova-cloud/sdk",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Official Node.js SDK for Synova Cloud API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",