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 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
- * @param payload - Chat request parameters
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
- * @returns Async iterator of chat completion chunks
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
- * const stream = await sylix.charles.chat.completions.stream({
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
- stream(payload: CharlesChatRequest): AsyncGenerator<ChatStreamChunk, void, unknown>;
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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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 © 2025
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
- * Create a chat completion
123
- * @param payload - Chat request parameters
124
- * @returns Chat completion response
170
+ * Non-streaming completion
125
171
  */
126
- async create(payload) {
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
- * Create a streaming chat completion
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 *stream(payload) {
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 reader = response.body.getReader();
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.1.0",
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",