@sintaksdev/sdk 0.1.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/README.md +12 -5
- package/dist/index.cjs +57 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +72 -8
- package/dist/index.d.ts +72 -8
- package/dist/index.js +55 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -36,13 +36,18 @@ for await (const chunk of stream) {
|
|
|
36
36
|
|
|
37
37
|
// Image generation
|
|
38
38
|
const images = await client.images.generate({
|
|
39
|
-
model: "flux-schnell",
|
|
40
39
|
prompt: "A futuristic Jakarta skyline at dusk",
|
|
41
40
|
});
|
|
42
41
|
console.log(images.data[0]?.url);
|
|
42
|
+
|
|
43
|
+
// List active models
|
|
44
|
+
const models = await client.models.list();
|
|
45
|
+
console.log(models.data.map((m) => m.id));
|
|
43
46
|
```
|
|
44
47
|
|
|
45
|
-
`model` defaults to `claude-sonnet-5-5`
|
|
48
|
+
`model` defaults to `claude-sonnet-5-5` for chat and `stable-image-core` for
|
|
49
|
+
images when omitted. Streaming requests ask for `stream_options.include_usage`,
|
|
50
|
+
so the final chunk carries `usage`. Point at another environment with `baseURL`:
|
|
46
51
|
|
|
47
52
|
```ts
|
|
48
53
|
const client = new Sintaks({ apiKey: "sk-...", baseURL: "http://localhost:8080" });
|
|
@@ -50,14 +55,16 @@ const client = new Sintaks({ apiKey: "sk-...", baseURL: "http://localhost:8080"
|
|
|
50
55
|
|
|
51
56
|
## Errors
|
|
52
57
|
|
|
53
|
-
Failures throw `SintaksError` with `status`, `type`, `code`, and `requestId` (the gateway `X-Request-ID`, useful for support).
|
|
58
|
+
Failures throw `SintaksError` with `status`, `type`, `code`, and `requestId` (the gateway `X-Request-ID`, useful for support). Convenience getters map the gateway's status semantics:
|
|
54
59
|
|
|
55
60
|
```ts
|
|
56
61
|
try {
|
|
57
62
|
await client.chat.completions.create({ messages: [{ role: "user", content: "x" }] });
|
|
58
63
|
} catch (err) {
|
|
59
|
-
if (err instanceof SintaksError
|
|
60
|
-
console.error("
|
|
64
|
+
if (err instanceof SintaksError) {
|
|
65
|
+
if (err.isUnauthorized) console.error("invalid or revoked api key");
|
|
66
|
+
if (err.isInsufficientCredits) console.error("insufficient balance, top up first");
|
|
67
|
+
if (err.isRetryable) console.error(`retry after ${err.requestId}`);
|
|
61
68
|
}
|
|
62
69
|
}
|
|
63
70
|
```
|
package/dist/index.cjs
CHANGED
|
@@ -22,6 +22,8 @@ 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,
|
|
26
|
+
DEFAULT_IMAGE_MODEL: () => DEFAULT_IMAGE_MODEL,
|
|
25
27
|
Sintaks: () => Sintaks,
|
|
26
28
|
SintaksError: () => SintaksError,
|
|
27
29
|
default: () => index_default
|
|
@@ -29,6 +31,8 @@ __export(index_exports, {
|
|
|
29
31
|
module.exports = __toCommonJS(index_exports);
|
|
30
32
|
var DEFAULT_BASE_URL = "https://api.sintaks.dev";
|
|
31
33
|
var DEFAULT_CHAT_MODEL = "claude-sonnet-5-5";
|
|
34
|
+
var DEFAULT_IMAGE_MODEL = "stable-image-core";
|
|
35
|
+
var DEFAULT_EMBEDDING_MODEL = "qwen3-embedding-0-6b";
|
|
32
36
|
var SintaksError = class extends Error {
|
|
33
37
|
status;
|
|
34
38
|
type;
|
|
@@ -42,12 +46,30 @@ var SintaksError = class extends Error {
|
|
|
42
46
|
this.code = opts.code ?? null;
|
|
43
47
|
this.requestId = opts.requestId ?? null;
|
|
44
48
|
}
|
|
49
|
+
/** True for missing, malformed, revoked, or invalid API keys (401). */
|
|
50
|
+
get isUnauthorized() {
|
|
51
|
+
return this.status === 401;
|
|
52
|
+
}
|
|
53
|
+
/** True when the account balance can't cover the request (402). Top up first. */
|
|
54
|
+
get isInsufficientCredits() {
|
|
55
|
+
return this.status === 402;
|
|
56
|
+
}
|
|
57
|
+
/** True for upstream throttling (429). */
|
|
58
|
+
get isRateLimited() {
|
|
59
|
+
return this.status === 429;
|
|
60
|
+
}
|
|
61
|
+
/** True for errors worth retrying with backoff: 429, 503, 504. */
|
|
62
|
+
get isRetryable() {
|
|
63
|
+
return this.status === 429 || this.status === 503 || this.status === 504;
|
|
64
|
+
}
|
|
45
65
|
};
|
|
46
66
|
var Sintaks = class {
|
|
47
67
|
apiKey;
|
|
48
68
|
baseURL;
|
|
49
69
|
chat;
|
|
50
70
|
images;
|
|
71
|
+
embeddings;
|
|
72
|
+
models;
|
|
51
73
|
/** @internal */
|
|
52
74
|
fetchFn;
|
|
53
75
|
/** @internal */
|
|
@@ -60,6 +82,8 @@ var Sintaks = class {
|
|
|
60
82
|
this.extraHeaders = options.headers ?? {};
|
|
61
83
|
this.chat = new ChatResource(this);
|
|
62
84
|
this.images = new ImagesResource(this);
|
|
85
|
+
this.embeddings = new EmbeddingsResource(this);
|
|
86
|
+
this.models = new ModelsResource(this);
|
|
63
87
|
}
|
|
64
88
|
async request(method, path, body) {
|
|
65
89
|
const res = await this.fetchFn(`${this.baseURL}${path}`, {
|
|
@@ -110,7 +134,11 @@ var ChatResource = class {
|
|
|
110
134
|
Accept: "text/event-stream",
|
|
111
135
|
...this.client.extraHeaders
|
|
112
136
|
},
|
|
113
|
-
body: JSON.stringify({
|
|
137
|
+
body: JSON.stringify({
|
|
138
|
+
...params,
|
|
139
|
+
model: params.model ?? DEFAULT_CHAT_MODEL,
|
|
140
|
+
stream_options: { include_usage: true }
|
|
141
|
+
})
|
|
114
142
|
});
|
|
115
143
|
if (!res.ok || !res.body) {
|
|
116
144
|
let envelope = {};
|
|
@@ -160,7 +188,32 @@ var ImagesResource = class {
|
|
|
160
188
|
}
|
|
161
189
|
client;
|
|
162
190
|
async generate(params) {
|
|
163
|
-
return this.client.request("POST", "/v1/images/generations",
|
|
191
|
+
return this.client.request("POST", "/v1/images/generations", {
|
|
192
|
+
...params,
|
|
193
|
+
model: params.model ?? DEFAULT_IMAGE_MODEL
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
var ModelsResource = class {
|
|
198
|
+
constructor(client) {
|
|
199
|
+
this.client = client;
|
|
200
|
+
}
|
|
201
|
+
client;
|
|
202
|
+
/** Lists the active models served by the gateway (GET /v1/models). */
|
|
203
|
+
async list() {
|
|
204
|
+
return this.client.request("GET", "/v1/models");
|
|
205
|
+
}
|
|
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
|
+
});
|
|
164
217
|
}
|
|
165
218
|
};
|
|
166
219
|
var index_default = Sintaks;
|
|
@@ -168,6 +221,8 @@ var index_default = Sintaks;
|
|
|
168
221
|
0 && (module.exports = {
|
|
169
222
|
DEFAULT_BASE_URL,
|
|
170
223
|
DEFAULT_CHAT_MODEL,
|
|
224
|
+
DEFAULT_EMBEDDING_MODEL,
|
|
225
|
+
DEFAULT_IMAGE_MODEL,
|
|
171
226
|
Sintaks,
|
|
172
227
|
SintaksError
|
|
173
228
|
});
|
package/dist/index.cjs.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\";\n\n/* ------------------------------------------------------------------ */\n/* Types (OpenAI-compatible shapes) */\n/* ------------------------------------------------------------------ */\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n name?: string;\n}\n\nexport interface ChatCompletionCreateParams {\n model?: string;\n messages: ChatMessage[];\n stream?: boolean;\n temperature?: number;\n top_p?: number;\n max_tokens?: number;\n stop?: string | string[];\n [key: string]: unknown;\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?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\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}\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\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\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 }\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({ ...params, model: params.model ?? DEFAULT_CHAT_MODEL }),\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\", params);\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/dist/index.d.cts
CHANGED
|
@@ -4,21 +4,36 @@
|
|
|
4
4
|
*/
|
|
5
5
|
declare const DEFAULT_BASE_URL = "https://api.sintaks.dev";
|
|
6
6
|
declare const DEFAULT_CHAT_MODEL = "claude-sonnet-5-5";
|
|
7
|
+
declare const DEFAULT_IMAGE_MODEL = "stable-image-core";
|
|
8
|
+
declare const DEFAULT_EMBEDDING_MODEL = "qwen3-embedding-0-6b";
|
|
9
|
+
type MessageContentPart = {
|
|
10
|
+
type: "text";
|
|
11
|
+
text: string;
|
|
12
|
+
};
|
|
7
13
|
interface ChatMessage {
|
|
8
|
-
role: "system" | "user" | "assistant" | "tool";
|
|
9
|
-
content: string;
|
|
14
|
+
role: "system" | "developer" | "user" | "assistant" | "tool";
|
|
15
|
+
content: string | MessageContentPart[];
|
|
10
16
|
name?: string;
|
|
11
17
|
}
|
|
12
18
|
interface ChatCompletionCreateParams {
|
|
13
19
|
model?: string;
|
|
14
20
|
messages: ChatMessage[];
|
|
15
21
|
stream?: boolean;
|
|
22
|
+
stream_options?: {
|
|
23
|
+
include_usage?: boolean;
|
|
24
|
+
};
|
|
16
25
|
temperature?: number;
|
|
17
26
|
top_p?: number;
|
|
18
27
|
max_tokens?: number;
|
|
28
|
+
max_completion_tokens?: number;
|
|
19
29
|
stop?: string | string[];
|
|
20
30
|
[key: string]: unknown;
|
|
21
31
|
}
|
|
32
|
+
interface Usage {
|
|
33
|
+
prompt_tokens: number;
|
|
34
|
+
completion_tokens: number;
|
|
35
|
+
total_tokens: number;
|
|
36
|
+
}
|
|
22
37
|
interface ChatCompletion {
|
|
23
38
|
id: string;
|
|
24
39
|
object: "chat.completion";
|
|
@@ -29,11 +44,7 @@ interface ChatCompletion {
|
|
|
29
44
|
message: ChatMessage;
|
|
30
45
|
finish_reason: string | null;
|
|
31
46
|
}[];
|
|
32
|
-
usage?:
|
|
33
|
-
prompt_tokens: number;
|
|
34
|
-
completion_tokens: number;
|
|
35
|
-
total_tokens: number;
|
|
36
|
-
};
|
|
47
|
+
usage?: Usage;
|
|
37
48
|
}
|
|
38
49
|
interface ChatCompletionChunk {
|
|
39
50
|
id: string;
|
|
@@ -48,6 +59,17 @@ interface ChatCompletionChunk {
|
|
|
48
59
|
};
|
|
49
60
|
finish_reason: string | null;
|
|
50
61
|
}[];
|
|
62
|
+
usage?: Usage;
|
|
63
|
+
}
|
|
64
|
+
interface Model {
|
|
65
|
+
id: string;
|
|
66
|
+
object: "model";
|
|
67
|
+
created: number;
|
|
68
|
+
owned_by: string;
|
|
69
|
+
}
|
|
70
|
+
interface ModelList {
|
|
71
|
+
object: "list";
|
|
72
|
+
data: Model[];
|
|
51
73
|
}
|
|
52
74
|
interface ImageGenerationParams {
|
|
53
75
|
model?: string;
|
|
@@ -64,6 +86,27 @@ interface ImageGenerationResult {
|
|
|
64
86
|
created: number;
|
|
65
87
|
data: GeneratedImage[];
|
|
66
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
|
+
}
|
|
67
110
|
interface ErrorEnvelope {
|
|
68
111
|
error?: {
|
|
69
112
|
message?: string;
|
|
@@ -82,6 +125,14 @@ declare class SintaksError extends Error {
|
|
|
82
125
|
code?: string | null;
|
|
83
126
|
requestId?: string | null;
|
|
84
127
|
});
|
|
128
|
+
/** True for missing, malformed, revoked, or invalid API keys (401). */
|
|
129
|
+
get isUnauthorized(): boolean;
|
|
130
|
+
/** True when the account balance can't cover the request (402). Top up first. */
|
|
131
|
+
get isInsufficientCredits(): boolean;
|
|
132
|
+
/** True for upstream throttling (429). */
|
|
133
|
+
get isRateLimited(): boolean;
|
|
134
|
+
/** True for errors worth retrying with backoff: 429, 503, 504. */
|
|
135
|
+
get isRetryable(): boolean;
|
|
85
136
|
}
|
|
86
137
|
interface SintaksOptions {
|
|
87
138
|
apiKey: string;
|
|
@@ -94,6 +145,8 @@ declare class Sintaks {
|
|
|
94
145
|
readonly baseURL: string;
|
|
95
146
|
readonly chat: ChatResource;
|
|
96
147
|
readonly images: ImagesResource;
|
|
148
|
+
readonly embeddings: EmbeddingsResource;
|
|
149
|
+
readonly models: ModelsResource;
|
|
97
150
|
/** @internal */
|
|
98
151
|
readonly fetchFn: typeof fetch;
|
|
99
152
|
/** @internal */
|
|
@@ -116,5 +169,16 @@ declare class ImagesResource {
|
|
|
116
169
|
constructor(client: Sintaks);
|
|
117
170
|
generate(params: ImageGenerationParams): Promise<ImageGenerationResult>;
|
|
118
171
|
}
|
|
172
|
+
declare class ModelsResource {
|
|
173
|
+
private client;
|
|
174
|
+
constructor(client: Sintaks);
|
|
175
|
+
/** Lists the active models served by the gateway (GET /v1/models). */
|
|
176
|
+
list(): Promise<ModelList>;
|
|
177
|
+
}
|
|
178
|
+
declare class EmbeddingsResource {
|
|
179
|
+
private client;
|
|
180
|
+
constructor(client: Sintaks);
|
|
181
|
+
create(params: EmbeddingCreateParams): Promise<EmbeddingResponse>;
|
|
182
|
+
}
|
|
119
183
|
|
|
120
|
-
export { type ChatCompletion, type ChatCompletionChunk, type ChatCompletionCreateParams, type ChatMessage, DEFAULT_BASE_URL, DEFAULT_CHAT_MODEL, type ErrorEnvelope, type GeneratedImage, type ImageGenerationParams, type ImageGenerationResult, Sintaks, SintaksError, type SintaksOptions, 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
|
@@ -4,21 +4,36 @@
|
|
|
4
4
|
*/
|
|
5
5
|
declare const DEFAULT_BASE_URL = "https://api.sintaks.dev";
|
|
6
6
|
declare const DEFAULT_CHAT_MODEL = "claude-sonnet-5-5";
|
|
7
|
+
declare const DEFAULT_IMAGE_MODEL = "stable-image-core";
|
|
8
|
+
declare const DEFAULT_EMBEDDING_MODEL = "qwen3-embedding-0-6b";
|
|
9
|
+
type MessageContentPart = {
|
|
10
|
+
type: "text";
|
|
11
|
+
text: string;
|
|
12
|
+
};
|
|
7
13
|
interface ChatMessage {
|
|
8
|
-
role: "system" | "user" | "assistant" | "tool";
|
|
9
|
-
content: string;
|
|
14
|
+
role: "system" | "developer" | "user" | "assistant" | "tool";
|
|
15
|
+
content: string | MessageContentPart[];
|
|
10
16
|
name?: string;
|
|
11
17
|
}
|
|
12
18
|
interface ChatCompletionCreateParams {
|
|
13
19
|
model?: string;
|
|
14
20
|
messages: ChatMessage[];
|
|
15
21
|
stream?: boolean;
|
|
22
|
+
stream_options?: {
|
|
23
|
+
include_usage?: boolean;
|
|
24
|
+
};
|
|
16
25
|
temperature?: number;
|
|
17
26
|
top_p?: number;
|
|
18
27
|
max_tokens?: number;
|
|
28
|
+
max_completion_tokens?: number;
|
|
19
29
|
stop?: string | string[];
|
|
20
30
|
[key: string]: unknown;
|
|
21
31
|
}
|
|
32
|
+
interface Usage {
|
|
33
|
+
prompt_tokens: number;
|
|
34
|
+
completion_tokens: number;
|
|
35
|
+
total_tokens: number;
|
|
36
|
+
}
|
|
22
37
|
interface ChatCompletion {
|
|
23
38
|
id: string;
|
|
24
39
|
object: "chat.completion";
|
|
@@ -29,11 +44,7 @@ interface ChatCompletion {
|
|
|
29
44
|
message: ChatMessage;
|
|
30
45
|
finish_reason: string | null;
|
|
31
46
|
}[];
|
|
32
|
-
usage?:
|
|
33
|
-
prompt_tokens: number;
|
|
34
|
-
completion_tokens: number;
|
|
35
|
-
total_tokens: number;
|
|
36
|
-
};
|
|
47
|
+
usage?: Usage;
|
|
37
48
|
}
|
|
38
49
|
interface ChatCompletionChunk {
|
|
39
50
|
id: string;
|
|
@@ -48,6 +59,17 @@ interface ChatCompletionChunk {
|
|
|
48
59
|
};
|
|
49
60
|
finish_reason: string | null;
|
|
50
61
|
}[];
|
|
62
|
+
usage?: Usage;
|
|
63
|
+
}
|
|
64
|
+
interface Model {
|
|
65
|
+
id: string;
|
|
66
|
+
object: "model";
|
|
67
|
+
created: number;
|
|
68
|
+
owned_by: string;
|
|
69
|
+
}
|
|
70
|
+
interface ModelList {
|
|
71
|
+
object: "list";
|
|
72
|
+
data: Model[];
|
|
51
73
|
}
|
|
52
74
|
interface ImageGenerationParams {
|
|
53
75
|
model?: string;
|
|
@@ -64,6 +86,27 @@ interface ImageGenerationResult {
|
|
|
64
86
|
created: number;
|
|
65
87
|
data: GeneratedImage[];
|
|
66
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
|
+
}
|
|
67
110
|
interface ErrorEnvelope {
|
|
68
111
|
error?: {
|
|
69
112
|
message?: string;
|
|
@@ -82,6 +125,14 @@ declare class SintaksError extends Error {
|
|
|
82
125
|
code?: string | null;
|
|
83
126
|
requestId?: string | null;
|
|
84
127
|
});
|
|
128
|
+
/** True for missing, malformed, revoked, or invalid API keys (401). */
|
|
129
|
+
get isUnauthorized(): boolean;
|
|
130
|
+
/** True when the account balance can't cover the request (402). Top up first. */
|
|
131
|
+
get isInsufficientCredits(): boolean;
|
|
132
|
+
/** True for upstream throttling (429). */
|
|
133
|
+
get isRateLimited(): boolean;
|
|
134
|
+
/** True for errors worth retrying with backoff: 429, 503, 504. */
|
|
135
|
+
get isRetryable(): boolean;
|
|
85
136
|
}
|
|
86
137
|
interface SintaksOptions {
|
|
87
138
|
apiKey: string;
|
|
@@ -94,6 +145,8 @@ declare class Sintaks {
|
|
|
94
145
|
readonly baseURL: string;
|
|
95
146
|
readonly chat: ChatResource;
|
|
96
147
|
readonly images: ImagesResource;
|
|
148
|
+
readonly embeddings: EmbeddingsResource;
|
|
149
|
+
readonly models: ModelsResource;
|
|
97
150
|
/** @internal */
|
|
98
151
|
readonly fetchFn: typeof fetch;
|
|
99
152
|
/** @internal */
|
|
@@ -116,5 +169,16 @@ declare class ImagesResource {
|
|
|
116
169
|
constructor(client: Sintaks);
|
|
117
170
|
generate(params: ImageGenerationParams): Promise<ImageGenerationResult>;
|
|
118
171
|
}
|
|
172
|
+
declare class ModelsResource {
|
|
173
|
+
private client;
|
|
174
|
+
constructor(client: Sintaks);
|
|
175
|
+
/** Lists the active models served by the gateway (GET /v1/models). */
|
|
176
|
+
list(): Promise<ModelList>;
|
|
177
|
+
}
|
|
178
|
+
declare class EmbeddingsResource {
|
|
179
|
+
private client;
|
|
180
|
+
constructor(client: Sintaks);
|
|
181
|
+
create(params: EmbeddingCreateParams): Promise<EmbeddingResponse>;
|
|
182
|
+
}
|
|
119
183
|
|
|
120
|
-
export { type ChatCompletion, type ChatCompletionChunk, type ChatCompletionCreateParams, type ChatMessage, DEFAULT_BASE_URL, DEFAULT_CHAT_MODEL, type ErrorEnvelope, type GeneratedImage, type ImageGenerationParams, type ImageGenerationResult, Sintaks, SintaksError, type SintaksOptions, 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
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
var DEFAULT_BASE_URL = "https://api.sintaks.dev";
|
|
3
3
|
var DEFAULT_CHAT_MODEL = "claude-sonnet-5-5";
|
|
4
|
+
var DEFAULT_IMAGE_MODEL = "stable-image-core";
|
|
5
|
+
var DEFAULT_EMBEDDING_MODEL = "qwen3-embedding-0-6b";
|
|
4
6
|
var SintaksError = class extends Error {
|
|
5
7
|
status;
|
|
6
8
|
type;
|
|
@@ -14,12 +16,30 @@ var SintaksError = class extends Error {
|
|
|
14
16
|
this.code = opts.code ?? null;
|
|
15
17
|
this.requestId = opts.requestId ?? null;
|
|
16
18
|
}
|
|
19
|
+
/** True for missing, malformed, revoked, or invalid API keys (401). */
|
|
20
|
+
get isUnauthorized() {
|
|
21
|
+
return this.status === 401;
|
|
22
|
+
}
|
|
23
|
+
/** True when the account balance can't cover the request (402). Top up first. */
|
|
24
|
+
get isInsufficientCredits() {
|
|
25
|
+
return this.status === 402;
|
|
26
|
+
}
|
|
27
|
+
/** True for upstream throttling (429). */
|
|
28
|
+
get isRateLimited() {
|
|
29
|
+
return this.status === 429;
|
|
30
|
+
}
|
|
31
|
+
/** True for errors worth retrying with backoff: 429, 503, 504. */
|
|
32
|
+
get isRetryable() {
|
|
33
|
+
return this.status === 429 || this.status === 503 || this.status === 504;
|
|
34
|
+
}
|
|
17
35
|
};
|
|
18
36
|
var Sintaks = class {
|
|
19
37
|
apiKey;
|
|
20
38
|
baseURL;
|
|
21
39
|
chat;
|
|
22
40
|
images;
|
|
41
|
+
embeddings;
|
|
42
|
+
models;
|
|
23
43
|
/** @internal */
|
|
24
44
|
fetchFn;
|
|
25
45
|
/** @internal */
|
|
@@ -32,6 +52,8 @@ var Sintaks = class {
|
|
|
32
52
|
this.extraHeaders = options.headers ?? {};
|
|
33
53
|
this.chat = new ChatResource(this);
|
|
34
54
|
this.images = new ImagesResource(this);
|
|
55
|
+
this.embeddings = new EmbeddingsResource(this);
|
|
56
|
+
this.models = new ModelsResource(this);
|
|
35
57
|
}
|
|
36
58
|
async request(method, path, body) {
|
|
37
59
|
const res = await this.fetchFn(`${this.baseURL}${path}`, {
|
|
@@ -82,7 +104,11 @@ var ChatResource = class {
|
|
|
82
104
|
Accept: "text/event-stream",
|
|
83
105
|
...this.client.extraHeaders
|
|
84
106
|
},
|
|
85
|
-
body: JSON.stringify({
|
|
107
|
+
body: JSON.stringify({
|
|
108
|
+
...params,
|
|
109
|
+
model: params.model ?? DEFAULT_CHAT_MODEL,
|
|
110
|
+
stream_options: { include_usage: true }
|
|
111
|
+
})
|
|
86
112
|
});
|
|
87
113
|
if (!res.ok || !res.body) {
|
|
88
114
|
let envelope = {};
|
|
@@ -132,13 +158,40 @@ var ImagesResource = class {
|
|
|
132
158
|
}
|
|
133
159
|
client;
|
|
134
160
|
async generate(params) {
|
|
135
|
-
return this.client.request("POST", "/v1/images/generations",
|
|
161
|
+
return this.client.request("POST", "/v1/images/generations", {
|
|
162
|
+
...params,
|
|
163
|
+
model: params.model ?? DEFAULT_IMAGE_MODEL
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
var ModelsResource = class {
|
|
168
|
+
constructor(client) {
|
|
169
|
+
this.client = client;
|
|
170
|
+
}
|
|
171
|
+
client;
|
|
172
|
+
/** Lists the active models served by the gateway (GET /v1/models). */
|
|
173
|
+
async list() {
|
|
174
|
+
return this.client.request("GET", "/v1/models");
|
|
175
|
+
}
|
|
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
|
+
});
|
|
136
187
|
}
|
|
137
188
|
};
|
|
138
189
|
var index_default = Sintaks;
|
|
139
190
|
export {
|
|
140
191
|
DEFAULT_BASE_URL,
|
|
141
192
|
DEFAULT_CHAT_MODEL,
|
|
193
|
+
DEFAULT_EMBEDDING_MODEL,
|
|
194
|
+
DEFAULT_IMAGE_MODEL,
|
|
142
195
|
Sintaks,
|
|
143
196
|
SintaksError,
|
|
144
197
|
index_default as default
|
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\";\n\n/* ------------------------------------------------------------------ */\n/* Types (OpenAI-compatible shapes) */\n/* ------------------------------------------------------------------ */\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n name?: string;\n}\n\nexport interface ChatCompletionCreateParams {\n model?: string;\n messages: ChatMessage[];\n stream?: boolean;\n temperature?: number;\n top_p?: number;\n max_tokens?: number;\n stop?: string | string[];\n [key: string]: unknown;\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?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\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}\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\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\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 }\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({ ...params, model: params.model ?? DEFAULT_CHAT_MODEL }),\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\", params);\n }\n}\n\nexport default Sintaks;"],"mappings":";AAKO,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAmF3B,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;AACF;AAaO,IAAM,UAAN,MAAc;AAAA,EACV;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;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,EAAE,GAAG,QAAQ,OAAO,OAAO,SAAS,mBAAmB,CAAC;AAAA,IAC/E,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,MAAM;AAAA,EAC5F;AACF;AAEA,IAAO,gBAAQ;","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