@tchavi/sdk 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +247 -0
- package/dist/index.cjs +610 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +635 -0
- package/dist/index.d.ts +635 -0
- package/dist/index.js +599 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/auth.ts","../src/errors/TchaviError.ts","../src/errors/TchaviAuthenticationError.ts","../src/errors/TchaviRateLimitError.ts","../src/errors/TchaviInsufficientCreditsError.ts","../src/errors/TchaviAPIError.ts","../src/core/http-client.ts","../src/core/streaming.ts","../src/resources/chat/completions.ts","../src/resources/chat/index.ts","../src/resources/embeddings.ts","../src/resources/images/generations.ts","../src/resources/images/index.ts","../src/resources/credits.ts","../src/resources/api-keys.ts","../src/resources/usage.ts","../src/resources/models.ts","../src/resources/payments.ts","../src/resources/auth-resource.ts","../src/resources/users.ts","../src/tchavi.ts","../src/index.ts"],"names":["body"],"mappings":"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","file":"index.js","sourcesContent":["import type { TchaviClientOptions } from '../types/common.js';\n\nexport type AuthMode = 'api-key' | 'jwt';\n\n/**\n * AuthStrategy holds and refreshes credentials.\n * - API key mode: static header, no state\n * - JWT mode: logs in lazily, stores the access token in memory,\n * refreshes via /auth/refresh cookie when the token expires\n */\nexport class AuthStrategy {\n private mode: AuthMode;\n private apiKey?: string;\n private accessToken?: string;\n private tokenExpiresAt?: number;\n private baseURL: string;\n private email?: string;\n private password?: string;\n\n constructor(options: TchaviClientOptions) {\n this.baseURL = options.baseURL ?? 'http://localhost:3001';\n if (options.apiKey) {\n this.mode = 'api-key';\n this.apiKey = options.apiKey;\n } else if (options.email && options.password) {\n this.mode = 'jwt';\n this.email = options.email;\n this.password = options.password;\n } else {\n throw new Error(\n 'TchaviClientOptions must provide either `apiKey` or both `email` and `password`.',\n );\n }\n }\n\n /**\n * Returns the Authorization header value for the current request.\n * For JWT mode, lazily logs in and refreshes the token as needed.\n */\n async getAuthHeader(): Promise<string> {\n if (this.mode === 'api-key') {\n return `Bearer ${this.apiKey}`;\n }\n\n if (!this.accessToken || this.isTokenExpired()) {\n await this.loginOrRefresh();\n }\n\n return `Bearer ${this.accessToken}`;\n }\n\n /** Store a token (e.g. after explicit login() call from AuthResource) */\n setAccessToken(token: string, expiresInSeconds = 900): void {\n this.accessToken = token;\n this.tokenExpiresAt = Date.now() + (expiresInSeconds - 30) * 1000;\n }\n\n getMode(): AuthMode {\n return this.mode;\n }\n\n private isTokenExpired(): boolean {\n if (!this.tokenExpiresAt) return true;\n return Date.now() >= this.tokenExpiresAt;\n }\n\n private async loginOrRefresh(): Promise<void> {\n const refreshed = await this.tryRefresh();\n if (!refreshed) {\n await this.loginWithPassword();\n }\n }\n\n private async tryRefresh(): Promise<boolean> {\n try {\n const resp = await fetch(`${this.baseURL}/auth/refresh`, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n });\n if (!resp.ok) return false;\n const body = (await resp.json()) as { accessToken: string };\n this.setAccessToken(body.accessToken);\n return true;\n } catch {\n return false;\n }\n }\n\n private async loginWithPassword(): Promise<void> {\n const resp = await fetch(`${this.baseURL}/auth/login`, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: this.email, password: this.password }),\n });\n\n if (!resp.ok) {\n const body = (await resp.json().catch(() => ({}))) as Record<string, unknown>;\n throw new Error(\n `Tchavi auth failed: ${(body['message'] as string | undefined) ?? resp.statusText}`,\n );\n }\n\n const body = (await resp.json()) as { accessToken: string };\n this.setAccessToken(body.accessToken);\n }\n}\n","/**\n * Base error for all Tchavi SDK errors.\n * Catches both network-level and API-level failures.\n */\nexport class TchaviError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TchaviError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviAPIError } from './TchaviAPIError.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\n/** Thrown when the gateway returns 401 (invalid/missing API key or JWT) */\nexport class TchaviAuthenticationError extends TchaviAPIError {\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviAuthenticationError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviAPIError } from './TchaviAPIError.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\n/** Thrown on 429. `retryAfter` is in seconds if provided by the server. */\nexport class TchaviRateLimitError extends TchaviAPIError {\n readonly retryAfter: number | null;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviRateLimitError';\n const details = response.details as Record<string, unknown> | undefined;\n this.retryAfter =\n (details?.retry_after as number | undefined) ??\n (headers['retry-after'] ? parseInt(headers['retry-after'], 10) : null);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviAPIError } from './TchaviAPIError.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\n/** Thrown on 402. `creditsRemaining` reflects your current balance. */\nexport class TchaviInsufficientCreditsError extends TchaviAPIError {\n readonly creditsRemaining: number;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviInsufficientCreditsError';\n const details = response.details as Record<string, unknown> | undefined;\n this.creditsRemaining = (details?.credits_remaining as number | undefined) ?? 0;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviError } from './TchaviError.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\n/**\n * An error returned by the Tchavi API as a JSON response.\n * Maps directly to the server's { error, message, statusCode } shape.\n */\nexport class TchaviAPIError extends TchaviError {\n readonly statusCode: number;\n readonly errorCode: string;\n readonly details?: unknown;\n readonly headers: Record<string, string>;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response.message);\n this.name = 'TchaviAPIError';\n this.statusCode = response.statusCode;\n this.errorCode = response.error;\n this.details = response.details;\n this.headers = headers;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /**\n * Factory: inspect the raw response and construct the most specific subclass.\n */\n static fromResponse(\n response: TchaviErrorResponse,\n headers: Record<string, string>,\n ): TchaviAPIError {\n switch (response.statusCode) {\n case 401:\n return new TchaviAuthenticationError(response, headers);\n case 402:\n return new TchaviInsufficientCreditsError(response, headers);\n case 429:\n return new TchaviRateLimitError(response, headers);\n default:\n return new TchaviAPIError(response, headers);\n }\n }\n}\n\n// Imported at EOF to avoid circular dependency: subclasses extend TchaviAPIError\n// which is defined above, so they must be imported after the class declaration.\nimport { TchaviAuthenticationError } from './TchaviAuthenticationError.js';\nimport { TchaviRateLimitError } from './TchaviRateLimitError.js';\nimport { TchaviInsufficientCreditsError } from './TchaviInsufficientCreditsError.js';\n","import { TchaviAPIError } from '../errors/TchaviAPIError.js';\nimport { TchaviError } from '../errors/TchaviError.js';\nimport type { AuthStrategy } from './auth.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined>;\n /** Skip auth header (used for public endpoints) */\n skipAuth?: boolean;\n /** Override timeout for this specific request */\n timeout?: number;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 502, 503]);\n\n/**\n * Core HTTP client. All resource classes use this.\n *\n * Handles:\n * - Auth header injection\n * - Query string serialization\n * - JSON body serialization\n * - Non-2xx error mapping to typed error classes\n * - Exponential backoff with jitter for retryable responses\n * - AbortController-based timeouts\n */\nexport class HttpClient {\n private baseURL: string;\n private maxRetries: number;\n private defaultTimeout: number;\n private auth: AuthStrategy;\n\n constructor(auth: AuthStrategy, baseURL: string, maxRetries: number, timeout: number) {\n this.auth = auth;\n this.baseURL = baseURL.replace(/\\/$/, '');\n this.maxRetries = maxRetries;\n this.defaultTimeout = timeout;\n }\n\n async request<T>(options: RequestOptions): Promise<T> {\n const response = await this.requestRaw(options);\n return response.json() as Promise<T>;\n }\n\n /**\n * Returns the raw Response — used for streaming so callers can pipe the body.\n */\n async requestRaw(options: RequestOptions): Promise<Response> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n await this.sleep(this.backoffMs(attempt));\n }\n\n const controller = new AbortController();\n const timeout = options.timeout ?? this.defaultTimeout;\n const timerId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const url = this.buildURL(options.path, options.query);\n const authHeader = options.skipAuth ? undefined : await this.auth.getAuthHeader();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (authHeader) {\n headers['Authorization'] = authHeader;\n }\n\n const fetchOptions: RequestInit = {\n method: options.method ?? 'GET',\n headers,\n signal: controller.signal,\n credentials: 'include',\n };\n\n if (options.body !== undefined) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, fetchOptions);\n clearTimeout(timerId);\n\n if (response.ok) {\n return response;\n }\n\n if (RETRYABLE_STATUS.has(response.status) && attempt < this.maxRetries) {\n const retryAfter = response.headers.get('Retry-After');\n if (retryAfter) {\n const seconds = parseInt(retryAfter, 10);\n if (!Number.isNaN(seconds) && seconds > 0) {\n await this.sleep(seconds * 1000);\n }\n }\n lastError = new TchaviError(`HTTP ${response.status} ${response.statusText}`);\n continue;\n }\n\n let errorBody: TchaviErrorResponse;\n try {\n errorBody = (await response.json()) as TchaviErrorResponse;\n } catch {\n errorBody = {\n error: 'unknown_error',\n message: response.statusText,\n statusCode: response.status,\n };\n }\n\n const headersObj: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headersObj[key] = value;\n });\n\n throw TchaviAPIError.fromResponse(errorBody, headersObj);\n } catch (err) {\n clearTimeout(timerId);\n if (err instanceof TchaviAPIError) throw err;\n\n if ((err as Error).name === 'AbortError') {\n throw new TchaviError(`Request timed out after ${timeout}ms`);\n }\n\n lastError = err;\n if (attempt === this.maxRetries) {\n throw new TchaviError(`Network error: ${(err as Error).message}`);\n }\n }\n }\n\n throw new TchaviError(`Request failed after ${this.maxRetries} retries: ${String(lastError)}`);\n }\n\n private buildURL(\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n ): string {\n const url = new URL(`${this.baseURL}${path}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n /** Exponential backoff with full jitter */\n private backoffMs(attempt: number): number {\n const base = 500;\n const cap = 10_000;\n const ceiling = Math.min(cap, base * Math.pow(2, attempt));\n return Math.random() * ceiling;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import { TchaviError } from '../errors/TchaviError.js';\nimport type { TchaviMeta } from '../types/common.js';\nimport type { StreamEvent } from '../types/streaming.js';\n\n/** Maximum SSE buffer size (1 MB) to prevent OOM from broken servers. */\nconst MAX_BUFFER_SIZE = 1_048_576;\n\n/**\n * Parses a ReadableStream<Uint8Array> SSE response from Tchavi into\n * an AsyncIterable of typed StreamEvent<T> objects.\n *\n * Protocol:\n * Standard chunks: \"data: {...json...}\\n\\n\"\n * Done marker: \"data: [DONE]\\n\\n\"\n * Tchavi metadata: \"event: tchavi\\ndata: {...json...}\\n\\n\"\n */\nexport async function* parseStream<T>(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<StreamEvent<T>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n if (buffer.length > MAX_BUFFER_SIZE) {\n throw new TchaviError(\n `SSE buffer exceeded ${MAX_BUFFER_SIZE} bytes — possible malformed stream`,\n );\n }\n\n const events = buffer.split('\\n\\n');\n buffer = events.pop() ?? '';\n\n for (const rawEvent of events) {\n const lines = rawEvent.split('\\n');\n let eventType: string | undefined;\n let dataLine: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n eventType = line.slice(7).trim();\n } else if (line.startsWith('data: ')) {\n dataLine = line.slice(6).trim();\n }\n }\n\n if (!dataLine) continue;\n\n if (dataLine === '[DONE]') {\n yield { type: 'done' };\n return;\n }\n\n if (eventType === 'tchavi') {\n try {\n const meta = JSON.parse(dataLine) as TchaviMeta;\n yield { type: 'tchavi', data: meta };\n } catch {\n // Malformed tchavi event — skip\n }\n continue;\n }\n\n try {\n const parsed = JSON.parse(dataLine) as T;\n yield { type: 'data', data: parsed };\n } catch {\n // Non-JSON data line — skip\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Wraps an SSE ReadableStream as an AsyncIterable<T>.\n * Stores the final Tchavi metadata so it can be accessed after iteration.\n *\n * @example\n * ```ts\n * const stream = await client.chat.completions.create({ ..., stream: true });\n * for await (const chunk of stream) {\n * process.stdout.write(chunk.choices[0]?.delta?.content ?? '');\n * }\n * console.log('Credits used:', stream.finalMeta()?.credits_used);\n * ```\n */\nexport class TchaviStream<T> implements AsyncIterable<T> {\n private body: ReadableStream<Uint8Array>;\n private _tchaviMeta: TchaviMeta | null = null;\n\n constructor(body: ReadableStream<Uint8Array>) {\n this.body = body;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return this._consume();\n }\n\n private async *_consume(): AsyncGenerator<T> {\n try {\n for await (const event of parseStream<T>(this.body)) {\n if (event.type === 'data') {\n yield event.data;\n } else if (event.type === 'tchavi') {\n this._tchaviMeta = event.data;\n }\n }\n } finally {\n // Release stream resources if iteration is abandoned early (e.g. break)\n this.body.cancel().catch(() => {});\n }\n }\n\n /** Returns Tchavi credit metadata once the stream is fully consumed. */\n finalMeta(): TchaviMeta | null {\n return this._tchaviMeta;\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { TchaviStream } from '../../core/streaming.js';\nimport { TchaviError } from '../../errors/TchaviError.js';\nimport type {\n ChatCompletionCreateParamsNonStreaming,\n ChatCompletionCreateParamsStreaming,\n ChatCompletionCreateParams,\n ChatCompletion,\n ChatCompletionChunk,\n} from '../../types/chat.js';\n\nexport class Completions {\n constructor(private http: HttpClient) {}\n\n create(params: ChatCompletionCreateParamsNonStreaming): Promise<ChatCompletion>;\n create(params: ChatCompletionCreateParamsStreaming): Promise<TchaviStream<ChatCompletionChunk>>;\n async create(\n params: ChatCompletionCreateParams,\n ): Promise<ChatCompletion | TchaviStream<ChatCompletionChunk>> {\n if (params.stream === true) {\n const response = await this.http.requestRaw({\n method: 'POST',\n path: '/v1/chat/completions',\n body: params,\n timeout: 120_000,\n });\n\n if (!response.body) {\n throw new TchaviError('Streaming response has no body');\n }\n\n return new TchaviStream<ChatCompletionChunk>(response.body);\n }\n\n return this.http.request<ChatCompletion>({\n method: 'POST',\n path: '/v1/chat/completions',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { Completions } from './completions.js';\n\nexport class Chat {\n readonly completions: Completions;\n\n constructor(http: HttpClient) {\n this.completions = new Completions(http);\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { EmbeddingCreateParams, EmbeddingsResponse } from '../types/embeddings.js';\n\nexport class Embeddings {\n constructor(private http: HttpClient) {}\n\n create(params: EmbeddingCreateParams): Promise<EmbeddingsResponse> {\n return this.http.request({\n method: 'POST',\n path: '/v1/embeddings',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport type { ImageGenerationParams, ImagesResponse } from '../../types/images.js';\n\nexport class Generations {\n constructor(private http: HttpClient) {}\n\n create(params: ImageGenerationParams): Promise<ImagesResponse> {\n return this.http.request({\n method: 'POST',\n path: '/v1/images/generations',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { Generations } from './generations.js';\n\nexport class Images {\n readonly generations: Generations;\n\n constructor(http: HttpClient) {\n this.generations = new Generations(http);\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { CreditBalance, CreditPack } from '../types/credits.js';\n\nexport class Credits {\n constructor(private http: HttpClient) {}\n\n getBalance(): Promise<CreditBalance> {\n return this.http.request({ path: '/credits/balance' });\n }\n\n listPacks(): Promise<CreditPack[]> {\n return this.http.request({ path: '/credits/packs', skipAuth: true });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type {\n ApiKey,\n ApiKeyWithSecret,\n CreateApiKeyParams,\n UpdateApiKeyParams,\n} from '../types/api-keys.js';\n\nexport class ApiKeys {\n constructor(private http: HttpClient) {}\n\n list(): Promise<ApiKey[]> {\n return this.http.request({ path: '/api-keys' });\n }\n\n create(params: CreateApiKeyParams = {}): Promise<ApiKeyWithSecret> {\n return this.http.request({ method: 'POST', path: '/api-keys', body: params });\n }\n\n retrieve(id: string): Promise<ApiKey> {\n return this.http.request({ path: `/api-keys/${id}` });\n }\n\n update(id: string, params: UpdateApiKeyParams): Promise<ApiKey> {\n return this.http.request({ method: 'PUT', path: `/api-keys/${id}`, body: params });\n }\n\n delete(id: string): Promise<{ message: string }> {\n return this.http.request({ method: 'DELETE', path: `/api-keys/${id}` });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { UsageStats, UsageLog, GetStatsParams, GetHistoryParams } from '../types/usage.js';\nimport type { PaginatedResponse } from '../types/common.js';\n\nexport class Usage {\n constructor(private http: HttpClient) {}\n\n getStats(params: GetStatsParams = {}): Promise<UsageStats> {\n return this.http.request({\n path: '/usage/stats',\n query: params as Record<string, string>,\n });\n }\n\n getHistory(params: GetHistoryParams = {}): Promise<PaginatedResponse<UsageLog>> {\n return this.http.request({\n path: '/usage/history',\n query: params as Record<string, string | number>,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { ModelTierConfig } from '../types/models.js';\n\nexport class Models {\n constructor(private http: HttpClient) {}\n\n /** Lists all active model tiers. Pass `all: true` to include inactive ones (admin only). */\n list(params: { all?: boolean } = {}): Promise<ModelTierConfig[]> {\n return this.http.request({\n path: '/model-tiers',\n query: params.all ? { all: 'true' } : undefined,\n skipAuth: true,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { Payment, InitiatePaymentParams, PaymentInitiateResponse } from '../types/payments.js';\nimport type { PaginatedResponse } from '../types/common.js';\n\nexport class Payments {\n constructor(private http: HttpClient) {}\n\n initiate(params: InitiatePaymentParams): Promise<PaymentInitiateResponse> {\n return this.http.request({ method: 'POST', path: '/payments/initiate', body: params });\n }\n\n getStatus(id: string): Promise<Payment> {\n return this.http.request({ path: `/payments/status/${id}` });\n }\n\n getHistory(params: { page?: number; limit?: number } = {}): Promise<PaginatedResponse<Payment>> {\n return this.http.request({\n path: '/payments/history',\n query: params as Record<string, number>,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { AuthStrategy } from '../core/auth.js';\nimport type { RegisterParams, LoginResponse, User } from '../types/auth.js';\n\nexport class AuthResource {\n constructor(\n private http: HttpClient,\n private authStrategy: AuthStrategy,\n ) {}\n\n async login(email: string, password: string): Promise<LoginResponse> {\n const result = await this.http.request<LoginResponse>({\n method: 'POST',\n path: '/auth/login',\n body: { email, password },\n skipAuth: true,\n });\n this.authStrategy.setAccessToken(result.accessToken);\n return result;\n }\n\n register(params: RegisterParams): Promise<{ message: string; user: User }> {\n return this.http.request({\n method: 'POST',\n path: '/auth/register',\n body: params,\n skipAuth: true,\n });\n }\n\n logout(): Promise<{ message: string }> {\n return this.http.request({ method: 'POST', path: '/auth/logout' });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { User, UpdateUserParams } from '../types/auth.js';\n\nexport class Users {\n constructor(private http: HttpClient) {}\n\n me(): Promise<User> {\n return this.http.request({ path: '/users/me' });\n }\n\n update(params: UpdateUserParams): Promise<User> {\n return this.http.request({ method: 'PUT', path: '/users/me', body: params });\n }\n}\n","import { AuthStrategy } from './core/auth.js';\nimport { HttpClient } from './core/http-client.js';\nimport { Chat } from './resources/chat/index.js';\nimport { Embeddings } from './resources/embeddings.js';\nimport { Images } from './resources/images/index.js';\nimport { Credits } from './resources/credits.js';\nimport { ApiKeys } from './resources/api-keys.js';\nimport { Usage } from './resources/usage.js';\nimport { Models } from './resources/models.js';\nimport { Payments } from './resources/payments.js';\nimport { AuthResource } from './resources/auth-resource.js';\nimport { Users } from './resources/users.js';\nimport type { TchaviClientOptions } from './types/common.js';\n\nconst DEFAULT_BASE_URL = 'http://localhost:3001';\nconst DEFAULT_MAX_RETRIES = 2;\nconst DEFAULT_TIMEOUT = 60_000;\n\n/**\n * Main Tchavi client. Mirrors the OpenAI SDK's resource-based API.\n *\n * @example API key mode (proxy endpoints):\n * ```ts\n * import Tchavi from '@tchavi/sdk';\n *\n * const client = new Tchavi({ apiKey: 'sk-tch-...' });\n *\n * const completion = await client.chat.completions.create({\n * model: 'gpt-4o-mini',\n * messages: [{ role: 'user', content: 'Hello' }],\n * });\n * console.log(completion.choices[0].message.content);\n * console.log(completion.tchavi.credits_used);\n * ```\n *\n * @example JWT mode (account management):\n * ```ts\n * const client = new Tchavi({ email: 'me@example.com', password: 'S3cret!' });\n * const balance = await client.credits.getBalance();\n * const keys = await client.apiKeys.list();\n * ```\n *\n * @example Streaming:\n * ```ts\n * const stream = await client.chat.completions.create({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Tell me a story' }],\n * stream: true,\n * });\n * for await (const chunk of stream) {\n * process.stdout.write(chunk.choices[0]?.delta?.content ?? '');\n * }\n * console.log('\\nCredits used:', stream.finalMeta()?.credits_used);\n * ```\n */\nexport class Tchavi {\n readonly chat: Chat;\n readonly embeddings: Embeddings;\n readonly images: Images;\n readonly credits: Credits;\n readonly apiKeys: ApiKeys;\n readonly usage: Usage;\n readonly models: Models;\n readonly payments: Payments;\n readonly auth: AuthResource;\n readonly users: Users;\n\n constructor(options: TchaviClientOptions) {\n const baseURL = options.baseURL ?? DEFAULT_BASE_URL;\n const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n const timeout = options.timeout ?? DEFAULT_TIMEOUT;\n\n const authStrategy = new AuthStrategy(options);\n const http = new HttpClient(authStrategy, baseURL, maxRetries, timeout);\n\n this.chat = new Chat(http);\n this.embeddings = new Embeddings(http);\n this.images = new Images(http);\n this.credits = new Credits(http);\n this.apiKeys = new ApiKeys(http);\n this.usage = new Usage(http);\n this.models = new Models(http);\n this.payments = new Payments(http);\n this.auth = new AuthResource(http, authStrategy);\n this.users = new Users(http);\n }\n}\n","import { Tchavi } from './tchavi.js';\nexport default Tchavi;\nexport { Tchavi };\nexport { TchaviStream } from './core/streaming.js';\n\nexport {\n TchaviError,\n TchaviAPIError,\n TchaviAuthenticationError,\n TchaviRateLimitError,\n TchaviInsufficientCreditsError,\n} from './errors/index.js';\n\nexport type * from './types/index.js';\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tchavi/sdk",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Official Node.js SDK for the Tchavi AI API gateway",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=20.0.0"
|
|
9
|
+
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"require": {
|
|
17
|
+
"types": "./dist/index.d.cts",
|
|
18
|
+
"default": "./dist/index.cjs"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"main": "./dist/index.cjs",
|
|
23
|
+
"module": "./dist/index.js",
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"files": [
|
|
26
|
+
"dist/",
|
|
27
|
+
"README.md"
|
|
28
|
+
],
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@eslint/js": "^9.0.0",
|
|
31
|
+
"@types/node": "^22.12.0",
|
|
32
|
+
"eslint": "^9.0.0",
|
|
33
|
+
"eslint-config-prettier": "^10.0.0",
|
|
34
|
+
"tsup": "^8.3.0",
|
|
35
|
+
"typescript": "^5.7.3",
|
|
36
|
+
"typescript-eslint": "^8.0.0"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsup",
|
|
40
|
+
"dev": "tsup --watch",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"lint": "eslint src/",
|
|
43
|
+
"lint:fix": "eslint src/ --fix"
|
|
44
|
+
}
|
|
45
|
+
}
|