sylix 3.1.0 → 3.2.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.d.ts +68 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +78 -23
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -37,37 +37,95 @@ declare class Reason {
|
|
|
37
37
|
process(payload: ReasonRequest): Promise<ReasonResponse>;
|
|
38
38
|
private handleError;
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Stream response wrapper with controller
|
|
42
|
+
*/
|
|
43
|
+
declare class Stream<T> implements AsyncIterable<T> {
|
|
44
|
+
private iterator;
|
|
45
|
+
controller: AbortController;
|
|
46
|
+
constructor(iterator: AsyncGenerator<T, void, unknown>, controller: AbortController);
|
|
47
|
+
[Symbol.asyncIterator](): AsyncIterator<T>;
|
|
48
|
+
/**
|
|
49
|
+
* Abort the stream
|
|
50
|
+
*/
|
|
51
|
+
abort(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Convert stream to array
|
|
54
|
+
*/
|
|
55
|
+
toArray(): Promise<T[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Get final message by accumulating all chunks
|
|
58
|
+
*/
|
|
59
|
+
finalMessage(): Promise<string>;
|
|
60
|
+
}
|
|
40
61
|
/**
|
|
41
62
|
* Charles chat completions namespace
|
|
42
63
|
* Usage: sylix.charles.chat.completions.create()
|
|
64
|
+
*
|
|
65
|
+
* OpenAI-compatible API with streaming, abort controller, and tool calls
|
|
43
66
|
*/
|
|
44
67
|
declare class CharlesChatCompletions {
|
|
45
68
|
private client;
|
|
46
69
|
constructor(client: SylixClient);
|
|
47
70
|
/**
|
|
48
|
-
* Create a chat completion
|
|
49
|
-
*
|
|
50
|
-
* @returns Chat completion response
|
|
51
|
-
*/
|
|
52
|
-
create(payload: CharlesChatRequest): Promise<ChatResponse>;
|
|
53
|
-
/**
|
|
54
|
-
* Create a streaming chat completion
|
|
71
|
+
* Create a chat completion (OpenAI-compatible)
|
|
72
|
+
*
|
|
55
73
|
* @param payload - Chat request parameters
|
|
56
|
-
* @
|
|
74
|
+
* @param options - Additional options (signal for abort)
|
|
75
|
+
* @returns Chat response or Stream if stream: true
|
|
57
76
|
*
|
|
58
77
|
* @example
|
|
59
78
|
* ```typescript
|
|
60
|
-
*
|
|
79
|
+
* // Non-streaming
|
|
80
|
+
* const response = await sylix.charles.chat.completions.create({
|
|
61
81
|
* model: 'charles-v3:latest',
|
|
62
82
|
* messages: [{ role: 'user', content: 'Hello!' }]
|
|
63
83
|
* });
|
|
64
84
|
*
|
|
85
|
+
* // Streaming (OpenAI-style)
|
|
86
|
+
* const stream = await sylix.charles.chat.completions.create({
|
|
87
|
+
* model: 'charles-v3:latest',
|
|
88
|
+
* messages: [{ role: 'user', content: 'Hello!' }],
|
|
89
|
+
* stream: true
|
|
90
|
+
* });
|
|
65
91
|
* for await (const chunk of stream) {
|
|
66
92
|
* process.stdout.write(chunk.choices[0]?.delta?.content || '');
|
|
67
93
|
* }
|
|
94
|
+
*
|
|
95
|
+
* // With abort controller
|
|
96
|
+
* const stream = await sylix.charles.chat.completions.create({
|
|
97
|
+
* model: 'charles-v3:latest',
|
|
98
|
+
* messages: [...],
|
|
99
|
+
* stream: true
|
|
100
|
+
* });
|
|
101
|
+
* setTimeout(() => stream.abort(), 5000); // Cancel after 5s
|
|
68
102
|
* ```
|
|
69
103
|
*/
|
|
70
|
-
|
|
104
|
+
create(payload: CharlesChatRequest & {
|
|
105
|
+
stream: true;
|
|
106
|
+
}, options?: {
|
|
107
|
+
signal?: AbortSignal;
|
|
108
|
+
}): Promise<Stream<ChatStreamChunk>>;
|
|
109
|
+
create(payload: CharlesChatRequest & {
|
|
110
|
+
stream?: false;
|
|
111
|
+
}, options?: {
|
|
112
|
+
signal?: AbortSignal;
|
|
113
|
+
}): Promise<ChatResponse>;
|
|
114
|
+
create(payload: CharlesChatRequest, options?: {
|
|
115
|
+
signal?: AbortSignal;
|
|
116
|
+
}): Promise<ChatResponse | Stream<ChatStreamChunk>>;
|
|
117
|
+
/**
|
|
118
|
+
* Non-streaming completion
|
|
119
|
+
*/
|
|
120
|
+
private createNonStream;
|
|
121
|
+
/**
|
|
122
|
+
* Streaming completion with OpenAI-compatible interface
|
|
123
|
+
*/
|
|
124
|
+
private createStream;
|
|
125
|
+
/**
|
|
126
|
+
* Parse Server-Sent Events stream
|
|
127
|
+
*/
|
|
128
|
+
private parseSSE;
|
|
71
129
|
private handleError;
|
|
72
130
|
}
|
|
73
131
|
/**
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,SAAS,EACT,WAAW,EAKX,YAAY,EACZ,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAElB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,cAAM,eAAe;IACP,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEjC,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAezD,OAAO,CAAC,WAAW;CAQpB;AAED;;GAEG;AACH,cAAM,MAAM;IACE,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEjC,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA6B9D,OAAO,CAAC,WAAW;CAQpB;AAED;;GAEG;AACH,cAAM,IAAI;IACI,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEjC,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAe3D,OAAO,CAAC,WAAW;CAQpB;AAED;;GAEG;AACH,cAAM,MAAM;IACE,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEjC,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAe9D,OAAO,CAAC,WAAW;CAQpB;AAOD
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -108,24 +108,70 @@ class Reason {
|
|
|
108
108
|
}
|
|
109
109
|
// ============================================================================
|
|
110
110
|
// CHARLES v1 NAMESPACE (OpenAI-compatible)
|
|
111
|
-
// Owned by Sylix ©
|
|
111
|
+
// Owned by Sylix © 2026
|
|
112
112
|
// ============================================================================
|
|
113
|
+
/**
|
|
114
|
+
* Stream response wrapper with controller
|
|
115
|
+
*/
|
|
116
|
+
class Stream {
|
|
117
|
+
constructor(iterator, controller) {
|
|
118
|
+
this.iterator = iterator;
|
|
119
|
+
this.controller = controller;
|
|
120
|
+
}
|
|
121
|
+
[Symbol.asyncIterator]() {
|
|
122
|
+
return this.iterator;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Abort the stream
|
|
126
|
+
*/
|
|
127
|
+
abort() {
|
|
128
|
+
this.controller.abort();
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Convert stream to array
|
|
132
|
+
*/
|
|
133
|
+
async toArray() {
|
|
134
|
+
const chunks = [];
|
|
135
|
+
for await (const chunk of this) {
|
|
136
|
+
chunks.push(chunk);
|
|
137
|
+
}
|
|
138
|
+
return chunks;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get final message by accumulating all chunks
|
|
142
|
+
*/
|
|
143
|
+
async finalMessage() {
|
|
144
|
+
let content = '';
|
|
145
|
+
for await (const chunk of this) {
|
|
146
|
+
const delta = chunk.choices?.[0]?.delta?.content;
|
|
147
|
+
if (delta)
|
|
148
|
+
content += delta;
|
|
149
|
+
}
|
|
150
|
+
return content;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
113
153
|
/**
|
|
114
154
|
* Charles chat completions namespace
|
|
115
155
|
* Usage: sylix.charles.chat.completions.create()
|
|
156
|
+
*
|
|
157
|
+
* OpenAI-compatible API with streaming, abort controller, and tool calls
|
|
116
158
|
*/
|
|
117
159
|
class CharlesChatCompletions {
|
|
118
160
|
constructor(client) {
|
|
119
161
|
this.client = client;
|
|
120
162
|
}
|
|
163
|
+
async create(payload, options) {
|
|
164
|
+
if (payload.stream) {
|
|
165
|
+
return this.createStream(payload, options);
|
|
166
|
+
}
|
|
167
|
+
return this.createNonStream(payload, options);
|
|
168
|
+
}
|
|
121
169
|
/**
|
|
122
|
-
*
|
|
123
|
-
* @param payload - Chat request parameters
|
|
124
|
-
* @returns Chat completion response
|
|
170
|
+
* Non-streaming completion
|
|
125
171
|
*/
|
|
126
|
-
async
|
|
172
|
+
async createNonStream(payload, options) {
|
|
127
173
|
try {
|
|
128
|
-
const response = await this.client.getClient().post("/charles/chat/completions", { ...payload, stream: false });
|
|
174
|
+
const response = await this.client.getClient().post("/charles/chat/completions", { ...payload, stream: false }, { signal: options?.signal });
|
|
129
175
|
return response.data;
|
|
130
176
|
}
|
|
131
177
|
catch (error) {
|
|
@@ -133,25 +179,16 @@ class CharlesChatCompletions {
|
|
|
133
179
|
}
|
|
134
180
|
}
|
|
135
181
|
/**
|
|
136
|
-
*
|
|
137
|
-
* @param payload - Chat request parameters
|
|
138
|
-
* @returns Async iterator of chat completion chunks
|
|
139
|
-
*
|
|
140
|
-
* @example
|
|
141
|
-
* ```typescript
|
|
142
|
-
* const stream = await sylix.charles.chat.completions.stream({
|
|
143
|
-
* model: 'charles-v3:latest',
|
|
144
|
-
* messages: [{ role: 'user', content: 'Hello!' }]
|
|
145
|
-
* });
|
|
146
|
-
*
|
|
147
|
-
* for await (const chunk of stream) {
|
|
148
|
-
* process.stdout.write(chunk.choices[0]?.delta?.content || '');
|
|
149
|
-
* }
|
|
150
|
-
* ```
|
|
182
|
+
* Streaming completion with OpenAI-compatible interface
|
|
151
183
|
*/
|
|
152
|
-
async
|
|
184
|
+
async createStream(payload, options) {
|
|
185
|
+
const controller = new AbortController();
|
|
153
186
|
const baseURL = this.client.getBaseURL();
|
|
154
187
|
const apiKey = this.client.getApiKey();
|
|
188
|
+
// Link external signal to internal controller
|
|
189
|
+
if (options?.signal) {
|
|
190
|
+
options.signal.addEventListener('abort', () => controller.abort());
|
|
191
|
+
}
|
|
155
192
|
const response = await fetch(`${baseURL}/charles/chat/completions`, {
|
|
156
193
|
method: 'POST',
|
|
157
194
|
headers: {
|
|
@@ -159,6 +196,7 @@ class CharlesChatCompletions {
|
|
|
159
196
|
'x-api-key': apiKey,
|
|
160
197
|
},
|
|
161
198
|
body: JSON.stringify({ ...payload, stream: true }),
|
|
199
|
+
signal: controller.signal,
|
|
162
200
|
});
|
|
163
201
|
if (!response.ok) {
|
|
164
202
|
throw new SylixError('STREAM_ERROR', `Stream request failed: ${response.status} ${response.statusText}`);
|
|
@@ -166,11 +204,20 @@ class CharlesChatCompletions {
|
|
|
166
204
|
if (!response.body) {
|
|
167
205
|
throw new SylixError('STREAM_ERROR', 'No response body');
|
|
168
206
|
}
|
|
169
|
-
const
|
|
207
|
+
const iterator = this.parseSSE(response.body, controller);
|
|
208
|
+
return new Stream(iterator, controller);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Parse Server-Sent Events stream
|
|
212
|
+
*/
|
|
213
|
+
async *parseSSE(body, controller) {
|
|
214
|
+
const reader = body.getReader();
|
|
170
215
|
const decoder = new TextDecoder();
|
|
171
216
|
let buffer = '';
|
|
172
217
|
try {
|
|
173
218
|
while (true) {
|
|
219
|
+
if (controller.signal.aborted)
|
|
220
|
+
break;
|
|
174
221
|
const { done, value } = await reader.read();
|
|
175
222
|
if (done)
|
|
176
223
|
break;
|
|
@@ -184,6 +231,11 @@ class CharlesChatCompletions {
|
|
|
184
231
|
if (trimmed.startsWith('data: ')) {
|
|
185
232
|
try {
|
|
186
233
|
const json = JSON.parse(trimmed.slice(6));
|
|
234
|
+
// Parse tool calls if present
|
|
235
|
+
const choice = json.choices?.[0];
|
|
236
|
+
if (choice?.delta && choice.delta.tool_calls) {
|
|
237
|
+
// Tool calls are already parsed in the chunk
|
|
238
|
+
}
|
|
187
239
|
yield json;
|
|
188
240
|
}
|
|
189
241
|
catch (e) {
|
|
@@ -198,6 +250,9 @@ class CharlesChatCompletions {
|
|
|
198
250
|
}
|
|
199
251
|
}
|
|
200
252
|
handleError(error) {
|
|
253
|
+
if (error.name === 'AbortError') {
|
|
254
|
+
return new SylixError('ABORTED', 'Request was aborted');
|
|
255
|
+
}
|
|
201
256
|
const message = error.response?.data?.error?.message || error.message || "Unknown error";
|
|
202
257
|
const code = error.response?.data?.error?.code || error.code || "UNKNOWN_ERROR";
|
|
203
258
|
return new SylixError(code, message, error.response?.data);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sylix",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "The official Sylix AI SDK for TypeScript and JavaScript. Build intelligent applications with Charles v3 models featuring multi-model consensus, intelligent routing, vision understanding, deep reasoning, and OpenAI-compatible APIs. Enterprise-grade AI infrastructure for developers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|