@sintaksdev/sdk 1.0.0 → 1.1.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
@@ -22,6 +22,7 @@ var index_exports = {};
22
22
  __export(index_exports, {
23
23
  DEFAULT_BASE_URL: () => DEFAULT_BASE_URL,
24
24
  DEFAULT_CHAT_MODEL: () => DEFAULT_CHAT_MODEL,
25
+ DEFAULT_EMBEDDING_MODEL: () => DEFAULT_EMBEDDING_MODEL,
25
26
  DEFAULT_IMAGE_MODEL: () => DEFAULT_IMAGE_MODEL,
26
27
  Sintaks: () => Sintaks,
27
28
  SintaksError: () => SintaksError,
@@ -31,6 +32,7 @@ module.exports = __toCommonJS(index_exports);
31
32
  var DEFAULT_BASE_URL = "https://api.sintaks.dev";
32
33
  var DEFAULT_CHAT_MODEL = "claude-sonnet-5-5";
33
34
  var DEFAULT_IMAGE_MODEL = "stable-image-core";
35
+ var DEFAULT_EMBEDDING_MODEL = "qwen3-embedding-0-6b";
34
36
  var SintaksError = class extends Error {
35
37
  status;
36
38
  type;
@@ -66,6 +68,7 @@ var Sintaks = class {
66
68
  baseURL;
67
69
  chat;
68
70
  images;
71
+ embeddings;
69
72
  models;
70
73
  /** @internal */
71
74
  fetchFn;
@@ -79,6 +82,7 @@ var Sintaks = class {
79
82
  this.extraHeaders = options.headers ?? {};
80
83
  this.chat = new ChatResource(this);
81
84
  this.images = new ImagesResource(this);
85
+ this.embeddings = new EmbeddingsResource(this);
82
86
  this.models = new ModelsResource(this);
83
87
  }
84
88
  async request(method, path, body) {
@@ -200,11 +204,24 @@ var ModelsResource = class {
200
204
  return this.client.request("GET", "/v1/models");
201
205
  }
202
206
  };
207
+ var EmbeddingsResource = class {
208
+ constructor(client) {
209
+ this.client = client;
210
+ }
211
+ client;
212
+ async create(params) {
213
+ return this.client.request("POST", "/v1/embeddings", {
214
+ ...params,
215
+ model: params.model ?? DEFAULT_EMBEDDING_MODEL
216
+ });
217
+ }
218
+ };
203
219
  var index_default = Sintaks;
204
220
  // Annotate the CommonJS export names for ESM import in node:
205
221
  0 && (module.exports = {
206
222
  DEFAULT_BASE_URL,
207
223
  DEFAULT_CHAT_MODEL,
224
+ DEFAULT_EMBEDDING_MODEL,
208
225
  DEFAULT_IMAGE_MODEL,
209
226
  Sintaks,
210
227
  SintaksError
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @sintaksdev/sdk — TypeScript client for the sintaks.dev OpenAI-compatible\n * AI API gateway. Zero runtime dependencies; requires Node >= 18 (global fetch).\n */\n\nexport const DEFAULT_BASE_URL = \"https://api.sintaks.dev\";\nexport const DEFAULT_CHAT_MODEL = \"claude-sonnet-5-5\";\nexport const DEFAULT_IMAGE_MODEL = \"stable-image-core\";\n\n/* ------------------------------------------------------------------ */\n/* Types (OpenAI-compatible shapes) */\n/* ------------------------------------------------------------------ */\n\nexport type MessageContentPart = { type: \"text\"; text: string };\n\nexport interface ChatMessage {\n role: \"system\" | \"developer\" | \"user\" | \"assistant\" | \"tool\";\n content: string | MessageContentPart[];\n name?: string;\n}\n\nexport interface ChatCompletionCreateParams {\n model?: string;\n messages: ChatMessage[];\n stream?: boolean;\n stream_options?: { include_usage?: boolean };\n temperature?: number;\n top_p?: number;\n max_tokens?: number;\n max_completion_tokens?: number;\n stop?: string | string[];\n [key: string]: unknown;\n}\n\nexport interface Usage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\nexport interface ChatCompletion {\n id: string;\n object: \"chat.completion\";\n created: number;\n model: string;\n choices: {\n index: number;\n message: ChatMessage;\n finish_reason: string | null;\n }[];\n usage?: Usage;\n}\n\nexport interface ChatCompletionChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n choices: {\n index: number;\n delta: { role?: string; content?: string | null };\n finish_reason: string | null;\n }[];\n usage?: Usage;\n}\n\nexport interface Model {\n id: string;\n object: \"model\";\n created: number;\n owned_by: string;\n}\n\nexport interface ModelList {\n object: \"list\";\n data: Model[];\n}\n\nexport interface ImageGenerationParams {\n model?: string;\n prompt: string;\n n?: number;\n size?: string;\n [key: string]: unknown;\n}\n\nexport interface GeneratedImage {\n url?: string;\n b64_json?: string;\n}\n\nexport interface ImageGenerationResult {\n created: number;\n data: GeneratedImage[];\n}\n\nexport interface ErrorEnvelope {\n error?: {\n message?: string;\n type?: string;\n param?: string | null;\n code?: string | null;\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Error */\n/* ------------------------------------------------------------------ */\n\nexport class SintaksError extends Error {\n readonly status: number;\n readonly type: string | undefined;\n readonly code: string | null;\n readonly requestId: string | null;\n\n constructor(\n status: number,\n message: string,\n opts: { type?: string; code?: string | null; requestId?: string | null } = {},\n ) {\n super(message);\n this.name = \"SintaksError\";\n this.status = status;\n this.type = opts.type;\n this.code = opts.code ?? null;\n this.requestId = opts.requestId ?? null;\n }\n\n /** True for missing, malformed, revoked, or invalid API keys (401). */\n get isUnauthorized(): boolean {\n return this.status === 401;\n }\n\n /** True when the account balance can't cover the request (402). Top up first. */\n get isInsufficientCredits(): boolean {\n return this.status === 402;\n }\n\n /** True for upstream throttling (429). */\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n /** True for errors worth retrying with backoff: 429, 503, 504. */\n get isRetryable(): boolean {\n return this.status === 429 || this.status === 503 || this.status === 504;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Client */\n/* ------------------------------------------------------------------ */\n\nexport interface SintaksOptions {\n apiKey: string;\n baseURL?: string;\n fetch?: typeof fetch;\n headers?: Record<string, string>;\n}\n\nexport class Sintaks {\n readonly apiKey: string;\n readonly baseURL: string;\n readonly chat: ChatResource;\n readonly images: ImagesResource;\n readonly models: ModelsResource;\n\n /** @internal */\n readonly fetchFn: typeof fetch;\n /** @internal */\n readonly extraHeaders: Record<string, string>;\n\n constructor(options: SintaksOptions) {\n if (!options.apiKey) throw new Error(\"Sintaks: apiKey is required\");\n this.apiKey = options.apiKey;\n this.baseURL = (options.baseURL ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.fetchFn = options.fetch ?? fetch;\n this.extraHeaders = options.headers ?? {};\n this.chat = new ChatResource(this);\n this.images = new ImagesResource(this);\n this.models = new ModelsResource(this);\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const res = await this.fetchFn(`${this.baseURL}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n ...this.extraHeaders,\n },\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n if (!res.ok) {\n let envelope: ErrorEnvelope = {};\n try {\n envelope = (await res.json()) as ErrorEnvelope;\n } catch {\n // non-JSON error body; fall through with defaults\n }\n throw new SintaksError(res.status, envelope.error?.message ?? `request failed with ${res.status}`, {\n type: envelope.error?.type,\n code: envelope.error?.code,\n requestId: res.headers.get(\"x-request-id\"),\n });\n }\n return (await res.json()) as T;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Chat */\n/* ------------------------------------------------------------------ */\n\nclass ChatResource {\n readonly completions = this;\n\n constructor(private client: Sintaks) {}\n\n async create(params: ChatCompletionCreateParams): Promise<ChatCompletion>;\n async create(params: ChatCompletionCreateParams & { stream: true }): Promise<AsyncIterable<ChatCompletionChunk>>;\n async create(\n params: ChatCompletionCreateParams,\n ): Promise<ChatCompletion | AsyncIterable<ChatCompletionChunk>> {\n if (params.stream) {\n return this.createStream(params as ChatCompletionCreateParams & { stream: true });\n }\n return this.client.request<ChatCompletion>(\"POST\", \"/v1/chat/completions\", {\n ...params,\n model: params.model ?? DEFAULT_CHAT_MODEL,\n });\n }\n\n private async createStream(\n params: ChatCompletionCreateParams & { stream: true },\n ): Promise<AsyncIterable<ChatCompletionChunk>> {\n const res = await this.client.fetchFn(`${this.client.baseURL}/v1/chat/completions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.client.apiKey}`,\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...this.client.extraHeaders,\n },\n body: JSON.stringify({\n ...params,\n model: params.model ?? DEFAULT_CHAT_MODEL,\n stream_options: { include_usage: true },\n }),\n });\n\n if (!res.ok || !res.body) {\n let envelope: ErrorEnvelope = {};\n try {\n envelope = (await res.json()) as ErrorEnvelope;\n } catch {\n // ignore\n }\n throw new SintaksError(res.status, envelope.error?.message ?? `request failed with ${res.status}`, {\n type: envelope.error?.type,\n code: envelope.error?.code,\n requestId: res.headers.get(\"x-request-id\"),\n });\n }\n\n return parseSSE<ChatCompletionChunk>(res.body);\n }\n}\n\n/** Minimal SSE parser for OpenAI-style `data:` events. */\nasync function* parseSSE<T>(body: ReadableStream<Uint8Array>): AsyncIterable<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 buffer += decoder.decode(value, { stream: true });\n\n let boundary: number;\n while ((boundary = buffer.indexOf(\"\\n\\n\")) !== -1) {\n const chunk = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n const dataLine = chunk\n .split(\"\\n\")\n .find((line) => line.startsWith(\"data:\"));\n if (!dataLine) continue;\n const payload = dataLine.slice(5).trim();\n if (payload === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as T;\n } catch {\n // skip malformed event\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Images */\n/* ------------------------------------------------------------------ */\n\nclass ImagesResource {\n constructor(private client: Sintaks) {}\n\n async generate(params: ImageGenerationParams): Promise<ImageGenerationResult> {\n return this.client.request<ImageGenerationResult>(\"POST\", \"/v1/images/generations\", {\n ...params,\n model: params.model ?? DEFAULT_IMAGE_MODEL,\n });\n }\n}\n\nclass ModelsResource {\n constructor(private client: Sintaks) {}\n\n /** Lists the active models served by the gateway (GET /v1/models). */\n async list(): Promise<ModelList> {\n return this.client.request<ModelList>(\"GET\", \"/v1/models\");\n }\n}\n\nexport default Sintaks;"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @sintaksdev/sdk — TypeScript client for the sintaks.dev OpenAI-compatible\n * AI API gateway. Zero runtime dependencies; requires Node >= 18 (global fetch).\n */\n\nexport const DEFAULT_BASE_URL = \"https://api.sintaks.dev\";\nexport const DEFAULT_CHAT_MODEL = \"claude-sonnet-5-5\";\nexport const DEFAULT_IMAGE_MODEL = \"stable-image-core\";\nexport const DEFAULT_EMBEDDING_MODEL = \"qwen3-embedding-0-6b\";\n\n/* ------------------------------------------------------------------ */\n/* Types (OpenAI-compatible shapes) */\n/* ------------------------------------------------------------------ */\n\nexport type MessageContentPart = { type: \"text\"; text: string };\n\nexport interface ChatMessage {\n role: \"system\" | \"developer\" | \"user\" | \"assistant\" | \"tool\";\n content: string | MessageContentPart[];\n name?: string;\n}\n\nexport interface ChatCompletionCreateParams {\n model?: string;\n messages: ChatMessage[];\n stream?: boolean;\n stream_options?: { include_usage?: boolean };\n temperature?: number;\n top_p?: number;\n max_tokens?: number;\n max_completion_tokens?: number;\n stop?: string | string[];\n [key: string]: unknown;\n}\n\nexport interface Usage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\nexport interface ChatCompletion {\n id: string;\n object: \"chat.completion\";\n created: number;\n model: string;\n choices: {\n index: number;\n message: ChatMessage;\n finish_reason: string | null;\n }[];\n usage?: Usage;\n}\n\nexport interface ChatCompletionChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n choices: {\n index: number;\n delta: { role?: string; content?: string | null };\n finish_reason: string | null;\n }[];\n usage?: Usage;\n}\n\nexport interface Model {\n id: string;\n object: \"model\";\n created: number;\n owned_by: string;\n}\n\nexport interface ModelList {\n object: \"list\";\n data: Model[];\n}\n\nexport interface ImageGenerationParams {\n model?: string;\n prompt: string;\n n?: number;\n size?: string;\n [key: string]: unknown;\n}\n\nexport interface GeneratedImage {\n url?: string;\n b64_json?: string;\n}\n\nexport interface ImageGenerationResult {\n created: number;\n data: GeneratedImage[];\n}\n\nexport interface EmbeddingCreateParams {\n model?: string;\n input: string | string[];\n encoding_format?: \"float\";\n dimensions?: number;\n [key: string]: unknown;\n}\n\nexport interface EmbeddingObject {\n object: \"embedding\";\n index: number;\n embedding: number[];\n}\n\nexport interface EmbeddingResponse {\n object: \"list\";\n data: EmbeddingObject[];\n model: string;\n usage?: {\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n\nexport interface ErrorEnvelope {\n error?: {\n message?: string;\n type?: string;\n param?: string | null;\n code?: string | null;\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Error */\n/* ------------------------------------------------------------------ */\n\nexport class SintaksError extends Error {\n readonly status: number;\n readonly type: string | undefined;\n readonly code: string | null;\n readonly requestId: string | null;\n\n constructor(\n status: number,\n message: string,\n opts: { type?: string; code?: string | null; requestId?: string | null } = {},\n ) {\n super(message);\n this.name = \"SintaksError\";\n this.status = status;\n this.type = opts.type;\n this.code = opts.code ?? null;\n this.requestId = opts.requestId ?? null;\n }\n\n /** True for missing, malformed, revoked, or invalid API keys (401). */\n get isUnauthorized(): boolean {\n return this.status === 401;\n }\n\n /** True when the account balance can't cover the request (402). Top up first. */\n get isInsufficientCredits(): boolean {\n return this.status === 402;\n }\n\n /** True for upstream throttling (429). */\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n /** True for errors worth retrying with backoff: 429, 503, 504. */\n get isRetryable(): boolean {\n return this.status === 429 || this.status === 503 || this.status === 504;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Client */\n/* ------------------------------------------------------------------ */\n\nexport interface SintaksOptions {\n apiKey: string;\n baseURL?: string;\n fetch?: typeof fetch;\n headers?: Record<string, string>;\n}\n\nexport class Sintaks {\n readonly apiKey: string;\n readonly baseURL: string;\n readonly chat: ChatResource;\n readonly images: ImagesResource;\n readonly embeddings: EmbeddingsResource;\n readonly models: ModelsResource;\n\n /** @internal */\n readonly fetchFn: typeof fetch;\n /** @internal */\n readonly extraHeaders: Record<string, string>;\n\n constructor(options: SintaksOptions) {\n if (!options.apiKey) throw new Error(\"Sintaks: apiKey is required\");\n this.apiKey = options.apiKey;\n this.baseURL = (options.baseURL ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.fetchFn = options.fetch ?? fetch;\n this.extraHeaders = options.headers ?? {};\n this.chat = new ChatResource(this);\n this.images = new ImagesResource(this);\n this.embeddings = new EmbeddingsResource(this);\n this.models = new ModelsResource(this);\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const res = await this.fetchFn(`${this.baseURL}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n ...this.extraHeaders,\n },\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n if (!res.ok) {\n let envelope: ErrorEnvelope = {};\n try {\n envelope = (await res.json()) as ErrorEnvelope;\n } catch {\n // non-JSON error body; fall through with defaults\n }\n throw new SintaksError(res.status, envelope.error?.message ?? `request failed with ${res.status}`, {\n type: envelope.error?.type,\n code: envelope.error?.code,\n requestId: res.headers.get(\"x-request-id\"),\n });\n }\n return (await res.json()) as T;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Chat */\n/* ------------------------------------------------------------------ */\n\nclass ChatResource {\n readonly completions = this;\n\n constructor(private client: Sintaks) {}\n\n async create(params: ChatCompletionCreateParams): Promise<ChatCompletion>;\n async create(params: ChatCompletionCreateParams & { stream: true }): Promise<AsyncIterable<ChatCompletionChunk>>;\n async create(\n params: ChatCompletionCreateParams,\n ): Promise<ChatCompletion | AsyncIterable<ChatCompletionChunk>> {\n if (params.stream) {\n return this.createStream(params as ChatCompletionCreateParams & { stream: true });\n }\n return this.client.request<ChatCompletion>(\"POST\", \"/v1/chat/completions\", {\n ...params,\n model: params.model ?? DEFAULT_CHAT_MODEL,\n });\n }\n\n private async createStream(\n params: ChatCompletionCreateParams & { stream: true },\n ): Promise<AsyncIterable<ChatCompletionChunk>> {\n const res = await this.client.fetchFn(`${this.client.baseURL}/v1/chat/completions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.client.apiKey}`,\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...this.client.extraHeaders,\n },\n body: JSON.stringify({\n ...params,\n model: params.model ?? DEFAULT_CHAT_MODEL,\n stream_options: { include_usage: true },\n }),\n });\n\n if (!res.ok || !res.body) {\n let envelope: ErrorEnvelope = {};\n try {\n envelope = (await res.json()) as ErrorEnvelope;\n } catch {\n // ignore\n }\n throw new SintaksError(res.status, envelope.error?.message ?? `request failed with ${res.status}`, {\n type: envelope.error?.type,\n code: envelope.error?.code,\n requestId: res.headers.get(\"x-request-id\"),\n });\n }\n\n return parseSSE<ChatCompletionChunk>(res.body);\n }\n}\n\n/** Minimal SSE parser for OpenAI-style `data:` events. */\nasync function* parseSSE<T>(body: ReadableStream<Uint8Array>): AsyncIterable<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 buffer += decoder.decode(value, { stream: true });\n\n let boundary: number;\n while ((boundary = buffer.indexOf(\"\\n\\n\")) !== -1) {\n const chunk = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n const dataLine = chunk\n .split(\"\\n\")\n .find((line) => line.startsWith(\"data:\"));\n if (!dataLine) continue;\n const payload = dataLine.slice(5).trim();\n if (payload === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as T;\n } catch {\n // skip malformed event\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Images */\n/* ------------------------------------------------------------------ */\n\nclass ImagesResource {\n constructor(private client: Sintaks) {}\n\n async generate(params: ImageGenerationParams): Promise<ImageGenerationResult> {\n return this.client.request<ImageGenerationResult>(\"POST\", \"/v1/images/generations\", {\n ...params,\n model: params.model ?? DEFAULT_IMAGE_MODEL,\n });\n }\n}\n\nclass ModelsResource {\n constructor(private client: Sintaks) {}\n\n /** Lists the active models served by the gateway (GET /v1/models). */\n async list(): Promise<ModelList> {\n return this.client.request<ModelList>(\"GET\", \"/v1/models\");\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Embeddings */\n/* ------------------------------------------------------------------ */\n\nclass EmbeddingsResource {\n constructor(private client: Sintaks) {}\n\n async create(params: EmbeddingCreateParams): Promise<EmbeddingResponse> {\n return this.client.request<EmbeddingResponse>(\"POST\", \"/v1/embeddings\", {\n ...params,\n model: params.model ?? DEFAULT_EMBEDDING_MODEL,\n });\n }\n}\n\nexport default Sintaks;"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAC5B,IAAM,0BAA0B;AA8HhC,IAAM,eAAN,cAA2B,MAAM;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,QACA,SACA,OAA2E,CAAC,GAC5E;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO,KAAK;AACjB,SAAK,OAAO,KAAK,QAAQ;AACzB,SAAK,YAAY,KAAK,aAAa;AAAA,EACrC;AAAA;AAAA,EAGA,IAAI,iBAA0B;AAC5B,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA,EAGA,IAAI,wBAAiC;AACnC,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA,EAGA,IAAI,gBAAyB;AAC3B,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA,EAGA,IAAI,cAAuB;AACzB,WAAO,KAAK,WAAW,OAAO,KAAK,WAAW,OAAO,KAAK,WAAW;AAAA,EACvE;AACF;AAaO,IAAM,UAAN,MAAc;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA;AAAA,EAEA;AAAA,EAET,YAAY,SAAyB;AACnC,QAAI,CAAC,QAAQ,OAAQ,OAAM,IAAI,MAAM,6BAA6B;AAClE,SAAK,SAAS,QAAQ;AACtB,SAAK,WAAW,QAAQ,WAAW,kBAAkB,QAAQ,QAAQ,EAAE;AACvE,SAAK,UAAU,QAAQ,SAAS;AAChC,SAAK,eAAe,QAAQ,WAAW,CAAC;AACxC,SAAK,OAAO,IAAI,aAAa,IAAI;AACjC,SAAK,SAAS,IAAI,eAAe,IAAI;AACrC,SAAK,aAAa,IAAI,mBAAmB,IAAI;AAC7C,SAAK,SAAS,IAAI,eAAe,IAAI;AAAA,EACvC;AAAA,EAEA,MAAM,QAAW,QAAgB,MAAc,MAA4B;AACzE,UAAM,MAAM,MAAM,KAAK,QAAQ,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MACvD;AAAA,MACA,SAAS;AAAA,QACP,eAAe,UAAU,KAAK,MAAM;AAAA,QACpC,gBAAgB;AAAA,QAChB,GAAG,KAAK;AAAA,MACV;AAAA,MACA,MAAM,SAAS,SAAY,SAAY,KAAK,UAAU,IAAI;AAAA,IAC5D,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,UAAI,WAA0B,CAAC;AAC/B,UAAI;AACF,mBAAY,MAAM,IAAI,KAAK;AAAA,MAC7B,QAAQ;AAAA,MAER;AACA,YAAM,IAAI,aAAa,IAAI,QAAQ,SAAS,OAAO,WAAW,uBAAuB,IAAI,MAAM,IAAI;AAAA,QACjG,MAAM,SAAS,OAAO;AAAA,QACtB,MAAM,SAAS,OAAO;AAAA,QACtB,WAAW,IAAI,QAAQ,IAAI,cAAc;AAAA,MAC3C,CAAC;AAAA,IACH;AACA,WAAQ,MAAM,IAAI,KAAK;AAAA,EACzB;AACF;AAMA,IAAM,eAAN,MAAmB;AAAA,EAGjB,YAAoB,QAAiB;AAAjB;AAAA,EAAkB;AAAA,EAAlB;AAAA,EAFX,cAAc;AAAA,EAMvB,MAAM,OACJ,QAC8D;AAC9D,QAAI,OAAO,QAAQ;AACjB,aAAO,KAAK,aAAa,MAAuD;AAAA,IAClF;AACA,WAAO,KAAK,OAAO,QAAwB,QAAQ,wBAAwB;AAAA,MACzE,GAAG;AAAA,MACH,OAAO,OAAO,SAAS;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,aACZ,QAC6C;AAC7C,UAAM,MAAM,MAAM,KAAK,OAAO,QAAQ,GAAG,KAAK,OAAO,OAAO,wBAAwB;AAAA,MAClF,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,KAAK,OAAO,MAAM;AAAA,QAC3C,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,GAAG,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,GAAG;AAAA,QACH,OAAO,OAAO,SAAS;AAAA,QACvB,gBAAgB,EAAE,eAAe,KAAK;AAAA,MACxC,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM;AACxB,UAAI,WAA0B,CAAC;AAC/B,UAAI;AACF,mBAAY,MAAM,IAAI,KAAK;AAAA,MAC7B,QAAQ;AAAA,MAER;AACA,YAAM,IAAI,aAAa,IAAI,QAAQ,SAAS,OAAO,WAAW,uBAAuB,IAAI,MAAM,IAAI;AAAA,QACjG,MAAM,SAAS,OAAO;AAAA,QACtB,MAAM,SAAS,OAAO;AAAA,QACtB,WAAW,IAAI,QAAQ,IAAI,cAAc;AAAA,MAC3C,CAAC;AAAA,IACH;AAEA,WAAO,SAA8B,IAAI,IAAI;AAAA,EAC/C;AACF;AAGA,gBAAgB,SAAY,MAAoD;AAC9E,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAEhD,UAAI;AACJ,cAAQ,WAAW,OAAO,QAAQ,MAAM,OAAO,IAAI;AACjD,cAAM,QAAQ,OAAO,MAAM,GAAG,QAAQ;AACtC,iBAAS,OAAO,MAAM,WAAW,CAAC;AAClC,cAAM,WAAW,MACd,MAAM,IAAI,EACV,KAAK,CAAC,SAAS,KAAK,WAAW,OAAO,CAAC;AAC1C,YAAI,CAAC,SAAU;AACf,cAAM,UAAU,SAAS,MAAM,CAAC,EAAE,KAAK;AACvC,YAAI,YAAY,SAAU;AAC1B,YAAI;AACF,gBAAM,KAAK,MAAM,OAAO;AAAA,QAC1B,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;AAMA,IAAM,iBAAN,MAAqB;AAAA,EACnB,YAAoB,QAAiB;AAAjB;AAAA,EAAkB;AAAA,EAAlB;AAAA,EAEpB,MAAM,SAAS,QAA+D;AAC5E,WAAO,KAAK,OAAO,QAA+B,QAAQ,0BAA0B;AAAA,MAClF,GAAG;AAAA,MACH,OAAO,OAAO,SAAS;AAAA,IACzB,CAAC;AAAA,EACH;AACF;AAEA,IAAM,iBAAN,MAAqB;AAAA,EACnB,YAAoB,QAAiB;AAAjB;AAAA,EAAkB;AAAA,EAAlB;AAAA;AAAA,EAGpB,MAAM,OAA2B;AAC/B,WAAO,KAAK,OAAO,QAAmB,OAAO,YAAY;AAAA,EAC3D;AACF;AAMA,IAAM,qBAAN,MAAyB;AAAA,EACvB,YAAoB,QAAiB;AAAjB;AAAA,EAAkB;AAAA,EAAlB;AAAA,EAEpB,MAAM,OAAO,QAA2D;AACtE,WAAO,KAAK,OAAO,QAA2B,QAAQ,kBAAkB;AAAA,MACtE,GAAG;AAAA,MACH,OAAO,OAAO,SAAS;AAAA,IACzB,CAAC;AAAA,EACH;AACF;AAEA,IAAO,gBAAQ;","names":[]}
package/dist/index.d.cts CHANGED
@@ -5,6 +5,7 @@
5
5
  declare const DEFAULT_BASE_URL = "https://api.sintaks.dev";
6
6
  declare const DEFAULT_CHAT_MODEL = "claude-sonnet-5-5";
7
7
  declare const DEFAULT_IMAGE_MODEL = "stable-image-core";
8
+ declare const DEFAULT_EMBEDDING_MODEL = "qwen3-embedding-0-6b";
8
9
  type MessageContentPart = {
9
10
  type: "text";
10
11
  text: string;
@@ -85,6 +86,27 @@ interface ImageGenerationResult {
85
86
  created: number;
86
87
  data: GeneratedImage[];
87
88
  }
89
+ interface EmbeddingCreateParams {
90
+ model?: string;
91
+ input: string | string[];
92
+ encoding_format?: "float";
93
+ dimensions?: number;
94
+ [key: string]: unknown;
95
+ }
96
+ interface EmbeddingObject {
97
+ object: "embedding";
98
+ index: number;
99
+ embedding: number[];
100
+ }
101
+ interface EmbeddingResponse {
102
+ object: "list";
103
+ data: EmbeddingObject[];
104
+ model: string;
105
+ usage?: {
106
+ prompt_tokens: number;
107
+ total_tokens: number;
108
+ };
109
+ }
88
110
  interface ErrorEnvelope {
89
111
  error?: {
90
112
  message?: string;
@@ -123,6 +145,7 @@ declare class Sintaks {
123
145
  readonly baseURL: string;
124
146
  readonly chat: ChatResource;
125
147
  readonly images: ImagesResource;
148
+ readonly embeddings: EmbeddingsResource;
126
149
  readonly models: ModelsResource;
127
150
  /** @internal */
128
151
  readonly fetchFn: typeof fetch;
@@ -152,5 +175,10 @@ declare class ModelsResource {
152
175
  /** Lists the active models served by the gateway (GET /v1/models). */
153
176
  list(): Promise<ModelList>;
154
177
  }
178
+ declare class EmbeddingsResource {
179
+ private client;
180
+ constructor(client: Sintaks);
181
+ create(params: EmbeddingCreateParams): Promise<EmbeddingResponse>;
182
+ }
155
183
 
156
- export { type ChatCompletion, type ChatCompletionChunk, type ChatCompletionCreateParams, type ChatMessage, DEFAULT_BASE_URL, DEFAULT_CHAT_MODEL, DEFAULT_IMAGE_MODEL, type ErrorEnvelope, type GeneratedImage, type ImageGenerationParams, type ImageGenerationResult, type MessageContentPart, type Model, type ModelList, Sintaks, SintaksError, type SintaksOptions, type Usage, Sintaks as default };
184
+ export { type ChatCompletion, type ChatCompletionChunk, type ChatCompletionCreateParams, type ChatMessage, DEFAULT_BASE_URL, DEFAULT_CHAT_MODEL, DEFAULT_EMBEDDING_MODEL, DEFAULT_IMAGE_MODEL, type EmbeddingCreateParams, type EmbeddingObject, type EmbeddingResponse, type ErrorEnvelope, type GeneratedImage, type ImageGenerationParams, type ImageGenerationResult, type MessageContentPart, type Model, type ModelList, Sintaks, SintaksError, type SintaksOptions, type Usage, Sintaks as default };
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@
5
5
  declare const DEFAULT_BASE_URL = "https://api.sintaks.dev";
6
6
  declare const DEFAULT_CHAT_MODEL = "claude-sonnet-5-5";
7
7
  declare const DEFAULT_IMAGE_MODEL = "stable-image-core";
8
+ declare const DEFAULT_EMBEDDING_MODEL = "qwen3-embedding-0-6b";
8
9
  type MessageContentPart = {
9
10
  type: "text";
10
11
  text: string;
@@ -85,6 +86,27 @@ interface ImageGenerationResult {
85
86
  created: number;
86
87
  data: GeneratedImage[];
87
88
  }
89
+ interface EmbeddingCreateParams {
90
+ model?: string;
91
+ input: string | string[];
92
+ encoding_format?: "float";
93
+ dimensions?: number;
94
+ [key: string]: unknown;
95
+ }
96
+ interface EmbeddingObject {
97
+ object: "embedding";
98
+ index: number;
99
+ embedding: number[];
100
+ }
101
+ interface EmbeddingResponse {
102
+ object: "list";
103
+ data: EmbeddingObject[];
104
+ model: string;
105
+ usage?: {
106
+ prompt_tokens: number;
107
+ total_tokens: number;
108
+ };
109
+ }
88
110
  interface ErrorEnvelope {
89
111
  error?: {
90
112
  message?: string;
@@ -123,6 +145,7 @@ declare class Sintaks {
123
145
  readonly baseURL: string;
124
146
  readonly chat: ChatResource;
125
147
  readonly images: ImagesResource;
148
+ readonly embeddings: EmbeddingsResource;
126
149
  readonly models: ModelsResource;
127
150
  /** @internal */
128
151
  readonly fetchFn: typeof fetch;
@@ -152,5 +175,10 @@ declare class ModelsResource {
152
175
  /** Lists the active models served by the gateway (GET /v1/models). */
153
176
  list(): Promise<ModelList>;
154
177
  }
178
+ declare class EmbeddingsResource {
179
+ private client;
180
+ constructor(client: Sintaks);
181
+ create(params: EmbeddingCreateParams): Promise<EmbeddingResponse>;
182
+ }
155
183
 
156
- export { type ChatCompletion, type ChatCompletionChunk, type ChatCompletionCreateParams, type ChatMessage, DEFAULT_BASE_URL, DEFAULT_CHAT_MODEL, DEFAULT_IMAGE_MODEL, type ErrorEnvelope, type GeneratedImage, type ImageGenerationParams, type ImageGenerationResult, type MessageContentPart, type Model, type ModelList, Sintaks, SintaksError, type SintaksOptions, type Usage, Sintaks as default };
184
+ export { type ChatCompletion, type ChatCompletionChunk, type ChatCompletionCreateParams, type ChatMessage, DEFAULT_BASE_URL, DEFAULT_CHAT_MODEL, DEFAULT_EMBEDDING_MODEL, DEFAULT_IMAGE_MODEL, type EmbeddingCreateParams, type EmbeddingObject, type EmbeddingResponse, type ErrorEnvelope, type GeneratedImage, type ImageGenerationParams, type ImageGenerationResult, type MessageContentPart, type Model, type ModelList, Sintaks, SintaksError, type SintaksOptions, type Usage, Sintaks as default };
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  var DEFAULT_BASE_URL = "https://api.sintaks.dev";
3
3
  var DEFAULT_CHAT_MODEL = "claude-sonnet-5-5";
4
4
  var DEFAULT_IMAGE_MODEL = "stable-image-core";
5
+ var DEFAULT_EMBEDDING_MODEL = "qwen3-embedding-0-6b";
5
6
  var SintaksError = class extends Error {
6
7
  status;
7
8
  type;
@@ -37,6 +38,7 @@ var Sintaks = class {
37
38
  baseURL;
38
39
  chat;
39
40
  images;
41
+ embeddings;
40
42
  models;
41
43
  /** @internal */
42
44
  fetchFn;
@@ -50,6 +52,7 @@ var Sintaks = class {
50
52
  this.extraHeaders = options.headers ?? {};
51
53
  this.chat = new ChatResource(this);
52
54
  this.images = new ImagesResource(this);
55
+ this.embeddings = new EmbeddingsResource(this);
53
56
  this.models = new ModelsResource(this);
54
57
  }
55
58
  async request(method, path, body) {
@@ -171,10 +174,23 @@ var ModelsResource = class {
171
174
  return this.client.request("GET", "/v1/models");
172
175
  }
173
176
  };
177
+ var EmbeddingsResource = class {
178
+ constructor(client) {
179
+ this.client = client;
180
+ }
181
+ client;
182
+ async create(params) {
183
+ return this.client.request("POST", "/v1/embeddings", {
184
+ ...params,
185
+ model: params.model ?? DEFAULT_EMBEDDING_MODEL
186
+ });
187
+ }
188
+ };
174
189
  var index_default = Sintaks;
175
190
  export {
176
191
  DEFAULT_BASE_URL,
177
192
  DEFAULT_CHAT_MODEL,
193
+ DEFAULT_EMBEDDING_MODEL,
178
194
  DEFAULT_IMAGE_MODEL,
179
195
  Sintaks,
180
196
  SintaksError,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @sintaksdev/sdk — TypeScript client for the sintaks.dev OpenAI-compatible\n * AI API gateway. Zero runtime dependencies; requires Node >= 18 (global fetch).\n */\n\nexport const DEFAULT_BASE_URL = \"https://api.sintaks.dev\";\nexport const DEFAULT_CHAT_MODEL = \"claude-sonnet-5-5\";\nexport const DEFAULT_IMAGE_MODEL = \"stable-image-core\";\n\n/* ------------------------------------------------------------------ */\n/* Types (OpenAI-compatible shapes) */\n/* ------------------------------------------------------------------ */\n\nexport type MessageContentPart = { type: \"text\"; text: string };\n\nexport interface ChatMessage {\n role: \"system\" | \"developer\" | \"user\" | \"assistant\" | \"tool\";\n content: string | MessageContentPart[];\n name?: string;\n}\n\nexport interface ChatCompletionCreateParams {\n model?: string;\n messages: ChatMessage[];\n stream?: boolean;\n stream_options?: { include_usage?: boolean };\n temperature?: number;\n top_p?: number;\n max_tokens?: number;\n max_completion_tokens?: number;\n stop?: string | string[];\n [key: string]: unknown;\n}\n\nexport interface Usage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\nexport interface ChatCompletion {\n id: string;\n object: \"chat.completion\";\n created: number;\n model: string;\n choices: {\n index: number;\n message: ChatMessage;\n finish_reason: string | null;\n }[];\n usage?: Usage;\n}\n\nexport interface ChatCompletionChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n choices: {\n index: number;\n delta: { role?: string; content?: string | null };\n finish_reason: string | null;\n }[];\n usage?: Usage;\n}\n\nexport interface Model {\n id: string;\n object: \"model\";\n created: number;\n owned_by: string;\n}\n\nexport interface ModelList {\n object: \"list\";\n data: Model[];\n}\n\nexport interface ImageGenerationParams {\n model?: string;\n prompt: string;\n n?: number;\n size?: string;\n [key: string]: unknown;\n}\n\nexport interface GeneratedImage {\n url?: string;\n b64_json?: string;\n}\n\nexport interface ImageGenerationResult {\n created: number;\n data: GeneratedImage[];\n}\n\nexport interface ErrorEnvelope {\n error?: {\n message?: string;\n type?: string;\n param?: string | null;\n code?: string | null;\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Error */\n/* ------------------------------------------------------------------ */\n\nexport class SintaksError extends Error {\n readonly status: number;\n readonly type: string | undefined;\n readonly code: string | null;\n readonly requestId: string | null;\n\n constructor(\n status: number,\n message: string,\n opts: { type?: string; code?: string | null; requestId?: string | null } = {},\n ) {\n super(message);\n this.name = \"SintaksError\";\n this.status = status;\n this.type = opts.type;\n this.code = opts.code ?? null;\n this.requestId = opts.requestId ?? null;\n }\n\n /** True for missing, malformed, revoked, or invalid API keys (401). */\n get isUnauthorized(): boolean {\n return this.status === 401;\n }\n\n /** True when the account balance can't cover the request (402). Top up first. */\n get isInsufficientCredits(): boolean {\n return this.status === 402;\n }\n\n /** True for upstream throttling (429). */\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n /** True for errors worth retrying with backoff: 429, 503, 504. */\n get isRetryable(): boolean {\n return this.status === 429 || this.status === 503 || this.status === 504;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Client */\n/* ------------------------------------------------------------------ */\n\nexport interface SintaksOptions {\n apiKey: string;\n baseURL?: string;\n fetch?: typeof fetch;\n headers?: Record<string, string>;\n}\n\nexport class Sintaks {\n readonly apiKey: string;\n readonly baseURL: string;\n readonly chat: ChatResource;\n readonly images: ImagesResource;\n readonly models: ModelsResource;\n\n /** @internal */\n readonly fetchFn: typeof fetch;\n /** @internal */\n readonly extraHeaders: Record<string, string>;\n\n constructor(options: SintaksOptions) {\n if (!options.apiKey) throw new Error(\"Sintaks: apiKey is required\");\n this.apiKey = options.apiKey;\n this.baseURL = (options.baseURL ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.fetchFn = options.fetch ?? fetch;\n this.extraHeaders = options.headers ?? {};\n this.chat = new ChatResource(this);\n this.images = new ImagesResource(this);\n this.models = new ModelsResource(this);\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const res = await this.fetchFn(`${this.baseURL}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n ...this.extraHeaders,\n },\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n if (!res.ok) {\n let envelope: ErrorEnvelope = {};\n try {\n envelope = (await res.json()) as ErrorEnvelope;\n } catch {\n // non-JSON error body; fall through with defaults\n }\n throw new SintaksError(res.status, envelope.error?.message ?? `request failed with ${res.status}`, {\n type: envelope.error?.type,\n code: envelope.error?.code,\n requestId: res.headers.get(\"x-request-id\"),\n });\n }\n return (await res.json()) as T;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Chat */\n/* ------------------------------------------------------------------ */\n\nclass ChatResource {\n readonly completions = this;\n\n constructor(private client: Sintaks) {}\n\n async create(params: ChatCompletionCreateParams): Promise<ChatCompletion>;\n async create(params: ChatCompletionCreateParams & { stream: true }): Promise<AsyncIterable<ChatCompletionChunk>>;\n async create(\n params: ChatCompletionCreateParams,\n ): Promise<ChatCompletion | AsyncIterable<ChatCompletionChunk>> {\n if (params.stream) {\n return this.createStream(params as ChatCompletionCreateParams & { stream: true });\n }\n return this.client.request<ChatCompletion>(\"POST\", \"/v1/chat/completions\", {\n ...params,\n model: params.model ?? DEFAULT_CHAT_MODEL,\n });\n }\n\n private async createStream(\n params: ChatCompletionCreateParams & { stream: true },\n ): Promise<AsyncIterable<ChatCompletionChunk>> {\n const res = await this.client.fetchFn(`${this.client.baseURL}/v1/chat/completions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.client.apiKey}`,\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...this.client.extraHeaders,\n },\n body: JSON.stringify({\n ...params,\n model: params.model ?? DEFAULT_CHAT_MODEL,\n stream_options: { include_usage: true },\n }),\n });\n\n if (!res.ok || !res.body) {\n let envelope: ErrorEnvelope = {};\n try {\n envelope = (await res.json()) as ErrorEnvelope;\n } catch {\n // ignore\n }\n throw new SintaksError(res.status, envelope.error?.message ?? `request failed with ${res.status}`, {\n type: envelope.error?.type,\n code: envelope.error?.code,\n requestId: res.headers.get(\"x-request-id\"),\n });\n }\n\n return parseSSE<ChatCompletionChunk>(res.body);\n }\n}\n\n/** Minimal SSE parser for OpenAI-style `data:` events. */\nasync function* parseSSE<T>(body: ReadableStream<Uint8Array>): AsyncIterable<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 buffer += decoder.decode(value, { stream: true });\n\n let boundary: number;\n while ((boundary = buffer.indexOf(\"\\n\\n\")) !== -1) {\n const chunk = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n const dataLine = chunk\n .split(\"\\n\")\n .find((line) => line.startsWith(\"data:\"));\n if (!dataLine) continue;\n const payload = dataLine.slice(5).trim();\n if (payload === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as T;\n } catch {\n // skip malformed event\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Images */\n/* ------------------------------------------------------------------ */\n\nclass ImagesResource {\n constructor(private client: Sintaks) {}\n\n async generate(params: ImageGenerationParams): Promise<ImageGenerationResult> {\n return this.client.request<ImageGenerationResult>(\"POST\", \"/v1/images/generations\", {\n ...params,\n model: params.model ?? DEFAULT_IMAGE_MODEL,\n });\n }\n}\n\nclass ModelsResource {\n constructor(private client: Sintaks) {}\n\n /** Lists the active models served by the gateway (GET /v1/models). */\n async list(): Promise<ModelList> {\n return this.client.request<ModelList>(\"GET\", \"/v1/models\");\n }\n}\n\nexport default Sintaks;"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @sintaksdev/sdk — TypeScript client for the sintaks.dev OpenAI-compatible\n * AI API gateway. Zero runtime dependencies; requires Node >= 18 (global fetch).\n */\n\nexport const DEFAULT_BASE_URL = \"https://api.sintaks.dev\";\nexport const DEFAULT_CHAT_MODEL = \"claude-sonnet-5-5\";\nexport const DEFAULT_IMAGE_MODEL = \"stable-image-core\";\nexport const DEFAULT_EMBEDDING_MODEL = \"qwen3-embedding-0-6b\";\n\n/* ------------------------------------------------------------------ */\n/* Types (OpenAI-compatible shapes) */\n/* ------------------------------------------------------------------ */\n\nexport type MessageContentPart = { type: \"text\"; text: string };\n\nexport interface ChatMessage {\n role: \"system\" | \"developer\" | \"user\" | \"assistant\" | \"tool\";\n content: string | MessageContentPart[];\n name?: string;\n}\n\nexport interface ChatCompletionCreateParams {\n model?: string;\n messages: ChatMessage[];\n stream?: boolean;\n stream_options?: { include_usage?: boolean };\n temperature?: number;\n top_p?: number;\n max_tokens?: number;\n max_completion_tokens?: number;\n stop?: string | string[];\n [key: string]: unknown;\n}\n\nexport interface Usage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\nexport interface ChatCompletion {\n id: string;\n object: \"chat.completion\";\n created: number;\n model: string;\n choices: {\n index: number;\n message: ChatMessage;\n finish_reason: string | null;\n }[];\n usage?: Usage;\n}\n\nexport interface ChatCompletionChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n choices: {\n index: number;\n delta: { role?: string; content?: string | null };\n finish_reason: string | null;\n }[];\n usage?: Usage;\n}\n\nexport interface Model {\n id: string;\n object: \"model\";\n created: number;\n owned_by: string;\n}\n\nexport interface ModelList {\n object: \"list\";\n data: Model[];\n}\n\nexport interface ImageGenerationParams {\n model?: string;\n prompt: string;\n n?: number;\n size?: string;\n [key: string]: unknown;\n}\n\nexport interface GeneratedImage {\n url?: string;\n b64_json?: string;\n}\n\nexport interface ImageGenerationResult {\n created: number;\n data: GeneratedImage[];\n}\n\nexport interface EmbeddingCreateParams {\n model?: string;\n input: string | string[];\n encoding_format?: \"float\";\n dimensions?: number;\n [key: string]: unknown;\n}\n\nexport interface EmbeddingObject {\n object: \"embedding\";\n index: number;\n embedding: number[];\n}\n\nexport interface EmbeddingResponse {\n object: \"list\";\n data: EmbeddingObject[];\n model: string;\n usage?: {\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n\nexport interface ErrorEnvelope {\n error?: {\n message?: string;\n type?: string;\n param?: string | null;\n code?: string | null;\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Error */\n/* ------------------------------------------------------------------ */\n\nexport class SintaksError extends Error {\n readonly status: number;\n readonly type: string | undefined;\n readonly code: string | null;\n readonly requestId: string | null;\n\n constructor(\n status: number,\n message: string,\n opts: { type?: string; code?: string | null; requestId?: string | null } = {},\n ) {\n super(message);\n this.name = \"SintaksError\";\n this.status = status;\n this.type = opts.type;\n this.code = opts.code ?? null;\n this.requestId = opts.requestId ?? null;\n }\n\n /** True for missing, malformed, revoked, or invalid API keys (401). */\n get isUnauthorized(): boolean {\n return this.status === 401;\n }\n\n /** True when the account balance can't cover the request (402). Top up first. */\n get isInsufficientCredits(): boolean {\n return this.status === 402;\n }\n\n /** True for upstream throttling (429). */\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n /** True for errors worth retrying with backoff: 429, 503, 504. */\n get isRetryable(): boolean {\n return this.status === 429 || this.status === 503 || this.status === 504;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Client */\n/* ------------------------------------------------------------------ */\n\nexport interface SintaksOptions {\n apiKey: string;\n baseURL?: string;\n fetch?: typeof fetch;\n headers?: Record<string, string>;\n}\n\nexport class Sintaks {\n readonly apiKey: string;\n readonly baseURL: string;\n readonly chat: ChatResource;\n readonly images: ImagesResource;\n readonly embeddings: EmbeddingsResource;\n readonly models: ModelsResource;\n\n /** @internal */\n readonly fetchFn: typeof fetch;\n /** @internal */\n readonly extraHeaders: Record<string, string>;\n\n constructor(options: SintaksOptions) {\n if (!options.apiKey) throw new Error(\"Sintaks: apiKey is required\");\n this.apiKey = options.apiKey;\n this.baseURL = (options.baseURL ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.fetchFn = options.fetch ?? fetch;\n this.extraHeaders = options.headers ?? {};\n this.chat = new ChatResource(this);\n this.images = new ImagesResource(this);\n this.embeddings = new EmbeddingsResource(this);\n this.models = new ModelsResource(this);\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const res = await this.fetchFn(`${this.baseURL}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n ...this.extraHeaders,\n },\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n if (!res.ok) {\n let envelope: ErrorEnvelope = {};\n try {\n envelope = (await res.json()) as ErrorEnvelope;\n } catch {\n // non-JSON error body; fall through with defaults\n }\n throw new SintaksError(res.status, envelope.error?.message ?? `request failed with ${res.status}`, {\n type: envelope.error?.type,\n code: envelope.error?.code,\n requestId: res.headers.get(\"x-request-id\"),\n });\n }\n return (await res.json()) as T;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Chat */\n/* ------------------------------------------------------------------ */\n\nclass ChatResource {\n readonly completions = this;\n\n constructor(private client: Sintaks) {}\n\n async create(params: ChatCompletionCreateParams): Promise<ChatCompletion>;\n async create(params: ChatCompletionCreateParams & { stream: true }): Promise<AsyncIterable<ChatCompletionChunk>>;\n async create(\n params: ChatCompletionCreateParams,\n ): Promise<ChatCompletion | AsyncIterable<ChatCompletionChunk>> {\n if (params.stream) {\n return this.createStream(params as ChatCompletionCreateParams & { stream: true });\n }\n return this.client.request<ChatCompletion>(\"POST\", \"/v1/chat/completions\", {\n ...params,\n model: params.model ?? DEFAULT_CHAT_MODEL,\n });\n }\n\n private async createStream(\n params: ChatCompletionCreateParams & { stream: true },\n ): Promise<AsyncIterable<ChatCompletionChunk>> {\n const res = await this.client.fetchFn(`${this.client.baseURL}/v1/chat/completions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.client.apiKey}`,\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...this.client.extraHeaders,\n },\n body: JSON.stringify({\n ...params,\n model: params.model ?? DEFAULT_CHAT_MODEL,\n stream_options: { include_usage: true },\n }),\n });\n\n if (!res.ok || !res.body) {\n let envelope: ErrorEnvelope = {};\n try {\n envelope = (await res.json()) as ErrorEnvelope;\n } catch {\n // ignore\n }\n throw new SintaksError(res.status, envelope.error?.message ?? `request failed with ${res.status}`, {\n type: envelope.error?.type,\n code: envelope.error?.code,\n requestId: res.headers.get(\"x-request-id\"),\n });\n }\n\n return parseSSE<ChatCompletionChunk>(res.body);\n }\n}\n\n/** Minimal SSE parser for OpenAI-style `data:` events. */\nasync function* parseSSE<T>(body: ReadableStream<Uint8Array>): AsyncIterable<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 buffer += decoder.decode(value, { stream: true });\n\n let boundary: number;\n while ((boundary = buffer.indexOf(\"\\n\\n\")) !== -1) {\n const chunk = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n const dataLine = chunk\n .split(\"\\n\")\n .find((line) => line.startsWith(\"data:\"));\n if (!dataLine) continue;\n const payload = dataLine.slice(5).trim();\n if (payload === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as T;\n } catch {\n // skip malformed event\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Images */\n/* ------------------------------------------------------------------ */\n\nclass ImagesResource {\n constructor(private client: Sintaks) {}\n\n async generate(params: ImageGenerationParams): Promise<ImageGenerationResult> {\n return this.client.request<ImageGenerationResult>(\"POST\", \"/v1/images/generations\", {\n ...params,\n model: params.model ?? DEFAULT_IMAGE_MODEL,\n });\n }\n}\n\nclass ModelsResource {\n constructor(private client: Sintaks) {}\n\n /** Lists the active models served by the gateway (GET /v1/models). */\n async list(): Promise<ModelList> {\n return this.client.request<ModelList>(\"GET\", \"/v1/models\");\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Embeddings */\n/* ------------------------------------------------------------------ */\n\nclass EmbeddingsResource {\n constructor(private client: Sintaks) {}\n\n async create(params: EmbeddingCreateParams): Promise<EmbeddingResponse> {\n return this.client.request<EmbeddingResponse>(\"POST\", \"/v1/embeddings\", {\n ...params,\n model: params.model ?? DEFAULT_EMBEDDING_MODEL,\n });\n }\n}\n\nexport default Sintaks;"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sintaksdev/sdk",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "TypeScript client for the sintaks.dev OpenAI-compatible AI API gateway. Top up in IDR, call chat and image models, pay per request.",
5
5
  "license": "MIT",
6
6
  "type": "module",