solver-sdk 1.7.3 → 1.7.5
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 +40 -49
- package/dist/cjs/api/{chat-api.js → chat-api/index.js} +37 -151
- package/dist/cjs/api/chat-api/index.js.map +1 -0
- package/dist/cjs/api/chat-api/interfaces.js +3 -0
- package/dist/cjs/api/chat-api/interfaces.js.map +1 -0
- package/dist/cjs/api/chat-api/models.js +6 -0
- package/dist/cjs/api/chat-api/models.js.map +1 -0
- package/dist/cjs/api/chat-api/stream-utils.js +192 -0
- package/dist/cjs/api/chat-api/stream-utils.js.map +1 -0
- package/dist/cjs/api/chat-api/websocket-helpers.js +211 -0
- package/dist/cjs/api/chat-api/websocket-helpers.js.map +1 -0
- package/dist/cjs/code-solver-sdk.js +10 -15
- package/dist/cjs/code-solver-sdk.js.map +1 -1
- package/dist/cjs/constants/websocket-events.constants.js +77 -52
- package/dist/cjs/constants/websocket-events.constants.js.map +1 -1
- package/dist/cjs/utils/code-solver-websocket-client.js.map +1 -1
- package/dist/esm/api/{chat-api.js → chat-api/index.js} +34 -151
- package/dist/esm/api/chat-api/index.js.map +1 -0
- package/dist/esm/api/chat-api/interfaces.js +2 -0
- package/dist/esm/api/chat-api/interfaces.js.map +1 -0
- package/dist/esm/api/chat-api/models.js +5 -0
- package/dist/esm/api/chat-api/models.js.map +1 -0
- package/dist/esm/api/chat-api/stream-utils.js +188 -0
- package/dist/esm/api/chat-api/stream-utils.js.map +1 -0
- package/dist/esm/api/chat-api/websocket-helpers.js +205 -0
- package/dist/esm/api/chat-api/websocket-helpers.js.map +1 -0
- package/dist/esm/code-solver-sdk.js +8 -13
- package/dist/esm/code-solver-sdk.js.map +1 -1
- package/dist/esm/constants/websocket-events.constants.js +76 -51
- package/dist/esm/constants/websocket-events.constants.js.map +1 -1
- package/dist/esm/utils/code-solver-websocket-client.js.map +1 -1
- package/dist/types/api/chat-api/index.d.ts +81 -0
- package/dist/types/api/chat-api/index.d.ts.map +1 -0
- package/dist/types/api/chat-api/interfaces.d.ts +47 -0
- package/dist/types/api/chat-api/interfaces.d.ts.map +1 -0
- package/dist/types/api/{chat-api.d.ts → chat-api/models.d.ts} +10 -79
- package/dist/types/api/chat-api/models.d.ts.map +1 -0
- package/dist/types/api/chat-api/stream-utils.d.ts +31 -0
- package/dist/types/api/chat-api/stream-utils.d.ts.map +1 -0
- package/dist/types/api/chat-api/websocket-helpers.d.ts +40 -0
- package/dist/types/api/chat-api/websocket-helpers.d.ts.map +1 -0
- package/dist/types/code-solver-sdk.d.ts +1 -1
- package/dist/types/code-solver-sdk.d.ts.map +1 -1
- package/dist/types/constants/websocket-events.constants.d.ts +65 -36
- package/dist/types/constants/websocket-events.constants.d.ts.map +1 -1
- package/dist/types/utils/code-solver-websocket-client.d.ts +28 -34
- package/dist/types/utils/code-solver-websocket-client.d.ts.map +1 -1
- package/docs/API_REFERENCE.md +168 -0
- package/docs/AUTHENTICATION.md +179 -0
- package/docs/ERROR_HANDLING.md +240 -0
- package/docs/README.md +32 -56
- package/docs/WEBSOCKET.md +55 -394
- package/docs/advanced/PING_PONG.md +212 -0
- package/docs/features/THINKING.md +158 -0
- package/package.json +1 -1
- package/dist/cjs/api/chat-api.js.map +0 -1
- package/dist/esm/api/chat-api.js.map +0 -1
- package/dist/types/api/chat-api.d.ts.map +0 -1
- package/docs/REGIONS.md +0 -140
- package/docs/WEBSOCKET_EVENTS.md +0 -183
- package/docs/thinking/THINKING_ARCHITECTURE.md +0 -221
- package/docs/thinking/streaming-thinking-guide.md +0 -164
- package/docs/thinking/thinking-mode.md +0 -366
package/README.md
CHANGED
|
@@ -43,8 +43,8 @@ SDK для интеграции с Code Solver Backend API. Поддержива
|
|
|
43
43
|
- Настраиваемый мониторинг здоровья соединения
|
|
44
44
|
- **Потоковая передача мышления**:
|
|
45
45
|
- Метод `streamChatWithThinking()` для потоковой передачи процесса мышления модели
|
|
46
|
-
- Полная поддержка
|
|
47
|
-
-
|
|
46
|
+
- Полная поддержка официального Anthropic API со всеми типами блоков контента
|
|
47
|
+
- Единый стандартизированный формат событий
|
|
48
48
|
- **Работа с регионами**:
|
|
49
49
|
- Поддержка региональных эндпоинтов Anthropic API
|
|
50
50
|
- Автоматическое переключение между регионами при ошибках
|
|
@@ -150,7 +150,6 @@ example().catch(console.error);
|
|
|
150
150
|
| `headers` | object | Пользовательские HTTP заголовки | Нет |
|
|
151
151
|
| `httpsAgent` | object | Опции для HTTPS агента (Node.js) | Нет |
|
|
152
152
|
| `mode` | string | Режим работы SDK ('browser', 'node', 'auto') | Нет |
|
|
153
|
-
| `providers` | object | Настройки провайдеров API (Anthropic и др.) | Нет |
|
|
154
153
|
| `websocket` | object | Настройки WebSocket (reconnect, timeout и др.) | Нет |
|
|
155
154
|
|
|
156
155
|
## Продвинутые функции
|
|
@@ -205,8 +204,12 @@ await wsClient.connectToReasoning(reasoning.id);
|
|
|
205
204
|
wsClient.enablePingPong(30000, 3);
|
|
206
205
|
|
|
207
206
|
// Обработка событий мышления
|
|
208
|
-
wsClient.on('
|
|
209
|
-
|
|
207
|
+
wsClient.on('content_block_delta', (data) => {
|
|
208
|
+
if (data.delta?.type === 'thinking_delta') {
|
|
209
|
+
console.log('Фрагмент размышления:', data.delta.thinking);
|
|
210
|
+
} else if (data.delta?.type === 'text_delta') {
|
|
211
|
+
console.log('Фрагмент ответа:', data.delta.text);
|
|
212
|
+
}
|
|
210
213
|
});
|
|
211
214
|
|
|
212
215
|
wsClient.on('message_stop', (data) => {
|
|
@@ -249,7 +252,7 @@ sdk.dependencies.on('dependency_update', (data) => {
|
|
|
249
252
|
|
|
250
253
|
### Потоковая передача мышления
|
|
251
254
|
|
|
252
|
-
Версия 1.7.
|
|
255
|
+
Версия 1.7.4 включает полную поддержку потоковой передачи мышления через Anthropic API, а также улучшенную обработку ошибок:
|
|
253
256
|
|
|
254
257
|
```javascript
|
|
255
258
|
const { CodeSolverSDK } = require('solver-sdk');
|
|
@@ -269,22 +272,34 @@ async function streamThinking() {
|
|
|
269
272
|
const options = {
|
|
270
273
|
model: 'claude-3-7-sonnet-20240229',
|
|
271
274
|
temperature: 0.7,
|
|
272
|
-
thinking: true
|
|
275
|
+
thinking: true,
|
|
276
|
+
authToken: 'your-auth-token' // Унифицированный параметр для аутентификации WebSocket
|
|
273
277
|
};
|
|
274
278
|
|
|
275
279
|
// Обработчик событий WebSocket
|
|
276
280
|
const handleEvent = (eventType, data) => {
|
|
277
281
|
switch(eventType) {
|
|
278
|
-
case '
|
|
279
|
-
|
|
282
|
+
case 'content_block_start':
|
|
283
|
+
if (data.content_block && data.content_block.type === 'thinking') {
|
|
284
|
+
console.log('Начало размышлений:');
|
|
285
|
+
}
|
|
280
286
|
break;
|
|
281
287
|
|
|
282
|
-
case '
|
|
283
|
-
|
|
288
|
+
case 'content_block_delta':
|
|
289
|
+
if (data.delta && data.delta.type === 'thinking_delta') {
|
|
290
|
+
process.stdout.write(data.delta.thinking); // Потоковый вывод размышлений
|
|
291
|
+
} else if (data.delta && data.delta.type === 'text_delta') {
|
|
292
|
+
process.stdout.write(data.delta.text); // Потоковый вывод итогового текста
|
|
293
|
+
}
|
|
284
294
|
break;
|
|
285
295
|
|
|
286
|
-
case '
|
|
287
|
-
|
|
296
|
+
case 'error':
|
|
297
|
+
console.error('Ошибка:', data.message);
|
|
298
|
+
|
|
299
|
+
// Обработка ошибки географических ограничений
|
|
300
|
+
if (data.type === 'geo_restriction') {
|
|
301
|
+
console.error('Необходимо включить VPN для доступа к API Anthropic из вашего региона');
|
|
302
|
+
}
|
|
288
303
|
break;
|
|
289
304
|
}
|
|
290
305
|
};
|
|
@@ -300,6 +315,11 @@ async function streamThinking() {
|
|
|
300
315
|
console.log(`Запрос успешно отправлен. Socket ID: ${response.socketId}`);
|
|
301
316
|
} catch (error) {
|
|
302
317
|
console.error('Ошибка:', error);
|
|
318
|
+
|
|
319
|
+
// Проверка наличия ошибки географических ограничений
|
|
320
|
+
if (error.type === 'geo_restriction') {
|
|
321
|
+
console.error('Необходимо включить VPN для доступа к API Anthropic из вашего региона');
|
|
322
|
+
}
|
|
303
323
|
}
|
|
304
324
|
}
|
|
305
325
|
|
|
@@ -310,41 +330,15 @@ streamThinking();
|
|
|
310
330
|
|
|
311
331
|
- `message_start` - начало сообщения от модели
|
|
312
332
|
- `content_block_start` - начало блока контента (текст или thinking)
|
|
313
|
-
- `
|
|
314
|
-
- `
|
|
333
|
+
- `content_block_delta` - дельта блока контента со следующими типами:
|
|
334
|
+
- `delta.type === 'thinking_delta'` - фрагмент размышления модели
|
|
335
|
+
- `delta.type === 'text_delta'` - фрагмент текстового ответа
|
|
336
|
+
- `delta.type === 'input_json_delta'` - фрагмент JSON для инструментов
|
|
337
|
+
- `delta.type === 'signature_delta'` - подпись блока мышления
|
|
315
338
|
- `content_block_stop` - завершение блока контента
|
|
339
|
+
- `message_delta` - дельта сообщения
|
|
316
340
|
- `message_stop` - завершение сообщения
|
|
317
341
|
|
|
318
|
-
### Работа с региональными эндпоинтами
|
|
319
|
-
|
|
320
|
-
```javascript
|
|
321
|
-
// Настройка SDK с указанием предпочтительного региона
|
|
322
|
-
const sdk = new CodeSolverSDK({
|
|
323
|
-
baseURL: 'https://api.example.com',
|
|
324
|
-
apiKey: 'your-api-key',
|
|
325
|
-
providers: {
|
|
326
|
-
anthropic: {
|
|
327
|
-
region: 'eu-west-1' // Использовать европейский регион
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
// Запрос с автоматическим переключением между регионами при ошибках
|
|
333
|
-
const response = await sdk.chat.chatWithRegionFailover([
|
|
334
|
-
{ role: 'user', content: 'Расскажи о квантовых компьютерах' }
|
|
335
|
-
], {
|
|
336
|
-
model: 'claude-3-7-sonnet-20240229'
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
// Запрос с явным указанием региона
|
|
340
|
-
const responseFromAsia = await sdk.chat.chat([
|
|
341
|
-
{ role: 'user', content: 'Расскажи о квантовых компьютерах' }
|
|
342
|
-
], {
|
|
343
|
-
model: 'claude-3-7-sonnet-20240229',
|
|
344
|
-
region: 'ap-southeast-2' // Явно указываем регион
|
|
345
|
-
});
|
|
346
|
-
```
|
|
347
|
-
|
|
348
342
|
## Примеры
|
|
349
343
|
|
|
350
344
|
В директории [`examples`](./examples) доступны примеры использования SDK:
|
|
@@ -358,9 +352,6 @@ npm run example:indexing
|
|
|
358
352
|
|
|
359
353
|
# Работа с зависимостями
|
|
360
354
|
npm run example:dependencies
|
|
361
|
-
|
|
362
|
-
# Проверка доступности регионов
|
|
363
|
-
npm run example:regions
|
|
364
355
|
```
|
|
365
356
|
|
|
366
357
|
## Совместимость
|
|
@@ -419,4 +410,4 @@ const sdk = new CodeSolverSDK({
|
|
|
419
410
|
|
|
420
411
|
## Лицензия
|
|
421
412
|
|
|
422
|
-
[MIT](./LICENSE)
|
|
413
|
+
[MIT](./LICENSE)
|
|
@@ -15,6 +15,9 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
19
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
|
+
};
|
|
18
21
|
var __importStar = (this && this.__importStar) || (function () {
|
|
19
22
|
var ownKeys = function(o) {
|
|
20
23
|
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
@@ -34,13 +37,18 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
37
|
})();
|
|
35
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
39
|
exports.ChatApi = void 0;
|
|
40
|
+
const websocket_helpers_1 = require("./websocket-helpers");
|
|
41
|
+
const stream_utils_1 = require("./stream-utils");
|
|
42
|
+
// Экспортируем все типы и интерфейсы для внешнего использования
|
|
43
|
+
__exportStar(require("./models"), exports);
|
|
44
|
+
__exportStar(require("./interfaces"), exports);
|
|
37
45
|
/**
|
|
38
46
|
* API для работы с чатом
|
|
39
47
|
*/
|
|
40
48
|
class ChatApi {
|
|
41
49
|
/**
|
|
42
50
|
* Создает новый экземпляр API для работы с чатом
|
|
43
|
-
* @param {
|
|
51
|
+
* @param {IHttpClient} httpClient HTTP клиент
|
|
44
52
|
*/
|
|
45
53
|
constructor(httpClient) {
|
|
46
54
|
this.httpClient = httpClient;
|
|
@@ -234,78 +242,21 @@ class ChatApi {
|
|
|
234
242
|
for (const line of lines) {
|
|
235
243
|
if (!line.startsWith('data:'))
|
|
236
244
|
continue;
|
|
237
|
-
const
|
|
238
|
-
|
|
245
|
+
const result = (0, stream_utils_1.processStreamChunk)(line, isInThinkingBlock, thinkingContent, textContent, thinkingSignature, options?.onToken);
|
|
246
|
+
isInThinkingBlock = result.isInThinkingBlock;
|
|
247
|
+
thinkingContent = result.thinkingContent;
|
|
248
|
+
textContent = result.textContent;
|
|
249
|
+
thinkingSignature = result.thinkingSignature;
|
|
250
|
+
if (result.chunk) {
|
|
251
|
+
yield result.chunk;
|
|
252
|
+
}
|
|
253
|
+
if (result.isDone) {
|
|
239
254
|
// Поток завершен
|
|
240
255
|
if (options?.onComplete) {
|
|
241
256
|
options.onComplete(textContent);
|
|
242
257
|
}
|
|
243
|
-
yield {
|
|
244
|
-
text: '',
|
|
245
|
-
isComplete: true,
|
|
246
|
-
thinkingContent: thinkingContent.length > 0 ? thinkingContent : undefined,
|
|
247
|
-
thinkingSignature: thinkingSignature.length > 0 ? thinkingSignature : undefined
|
|
248
|
-
};
|
|
249
258
|
return;
|
|
250
259
|
}
|
|
251
|
-
try {
|
|
252
|
-
const parsedData = JSON.parse(data);
|
|
253
|
-
// Обрабатываем различные типы событий
|
|
254
|
-
if (parsedData.type === 'thinking_start' || parsedData.type === 'content_block_start' && parsedData.content_block?.type === 'thinking') {
|
|
255
|
-
isInThinkingBlock = true;
|
|
256
|
-
// Отправляем начало блока thinking
|
|
257
|
-
if (options?.onToken) {
|
|
258
|
-
options.onToken('[THINKING_START]');
|
|
259
|
-
}
|
|
260
|
-
yield {
|
|
261
|
-
text: '[THINKING_START]',
|
|
262
|
-
isComplete: false,
|
|
263
|
-
isThinking: true
|
|
264
|
-
};
|
|
265
|
-
}
|
|
266
|
-
else if (parsedData.type === 'thinking_end' || parsedData.type === 'content_block_stop' && isInThinkingBlock) {
|
|
267
|
-
isInThinkingBlock = false;
|
|
268
|
-
// Отправляем конец блока thinking
|
|
269
|
-
if (options?.onToken) {
|
|
270
|
-
options.onToken('[THINKING_END]');
|
|
271
|
-
}
|
|
272
|
-
yield {
|
|
273
|
-
text: '[THINKING_END]',
|
|
274
|
-
isComplete: false,
|
|
275
|
-
isThinking: true
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
else if (parsedData.type === 'content_block_delta' || parsedData.type === 'thinking_delta') {
|
|
279
|
-
const text = parsedData.delta?.text || '';
|
|
280
|
-
if (isInThinkingBlock || parsedData.type === 'thinking_delta') {
|
|
281
|
-
// Добавляем текст к блоку размышлений
|
|
282
|
-
thinkingContent += text;
|
|
283
|
-
if (options?.onToken) {
|
|
284
|
-
options.onToken(text);
|
|
285
|
-
}
|
|
286
|
-
yield {
|
|
287
|
-
text,
|
|
288
|
-
isComplete: false,
|
|
289
|
-
isThinking: true
|
|
290
|
-
};
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
// Добавляем текст к основному содержимому
|
|
294
|
-
textContent += text;
|
|
295
|
-
if (options?.onToken) {
|
|
296
|
-
options.onToken(text);
|
|
297
|
-
}
|
|
298
|
-
yield {
|
|
299
|
-
text,
|
|
300
|
-
isComplete: false,
|
|
301
|
-
isThinking: false
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
catch (e) {
|
|
307
|
-
console.error('Ошибка при парсинге данных:', e);
|
|
308
|
-
}
|
|
309
260
|
}
|
|
310
261
|
}
|
|
311
262
|
// Финальный чанк, если поток завершился без [DONE]
|
|
@@ -320,10 +271,11 @@ class ChatApi {
|
|
|
320
271
|
};
|
|
321
272
|
}
|
|
322
273
|
catch (error) {
|
|
274
|
+
const errorObj = (0, stream_utils_1.handleStreamError)(error);
|
|
323
275
|
if (options?.onError) {
|
|
324
|
-
options.onError(
|
|
276
|
+
options.onError(errorObj);
|
|
325
277
|
}
|
|
326
|
-
throw
|
|
278
|
+
throw errorObj;
|
|
327
279
|
}
|
|
328
280
|
}
|
|
329
281
|
/**
|
|
@@ -349,7 +301,7 @@ class ChatApi {
|
|
|
349
301
|
* Отправляет сообщение в чат в потоковом режиме с поддержкой thinking через WebSocket
|
|
350
302
|
* @param {ChatMessage[]} messages Массив сообщений для отправки
|
|
351
303
|
* @param {ChatStreamOptions} [options] Дополнительные параметры
|
|
352
|
-
* @param {
|
|
304
|
+
* @param {EventHandler} [onEvent] Обработчик событий WebSocket
|
|
353
305
|
* @returns {Promise<ThinkingStreamResponse>} Информация о потоковом запросе
|
|
354
306
|
*/
|
|
355
307
|
async streamChatWithThinking(messages, options = {}, onEvent) {
|
|
@@ -358,7 +310,9 @@ class ChatApi {
|
|
|
358
310
|
}
|
|
359
311
|
try {
|
|
360
312
|
// 1. Создаем параметры для запроса
|
|
361
|
-
const socketId = `socket_${Date.now()}_${
|
|
313
|
+
const socketId = `socket_${Date.now()}_${(0, websocket_helpers_1.generateId)(10)}`;
|
|
314
|
+
// Создаем sessionId для отслеживания контекста между запросами
|
|
315
|
+
const sessionId = options.sessionId || `thinking-${Date.now()}`;
|
|
362
316
|
let socket = null;
|
|
363
317
|
// 2. Подключаемся к WebSocket и ждем успешного подключения
|
|
364
318
|
if (onEvent) {
|
|
@@ -372,8 +326,7 @@ class ChatApi {
|
|
|
372
326
|
timeout: 10000,
|
|
373
327
|
query: {
|
|
374
328
|
socketId: socketId,
|
|
375
|
-
|
|
376
|
-
testToken: options.testToken || 'test-token'
|
|
329
|
+
token: options.authToken || 'test-token'
|
|
377
330
|
}
|
|
378
331
|
};
|
|
379
332
|
// Динамически импортируем socket.io-client
|
|
@@ -384,69 +337,12 @@ class ChatApi {
|
|
|
384
337
|
return;
|
|
385
338
|
}
|
|
386
339
|
// Создаем соединение с сервером WebSocket
|
|
387
|
-
const serverUrl = this.httpClient.getBaseURL() || 'http://localhost:3000';
|
|
340
|
+
const serverUrl = this.httpClient.getBaseURL?.() || 'http://localhost:3000';
|
|
388
341
|
socket = io(`${serverUrl}/reasoning`, socketOptions);
|
|
389
342
|
// Устанавливаем обработчики событий
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
socket.emit('authenticate', {
|
|
394
|
-
isTest: true,
|
|
395
|
-
socketId: socketId,
|
|
396
|
-
testToken: options.testToken || 'test-token'
|
|
397
|
-
});
|
|
398
|
-
// Отправляем событие присоединения к комнате с ID
|
|
399
|
-
socket.emit('join_room', { roomId: socketId });
|
|
400
|
-
// Вызываем обработчик события connect
|
|
401
|
-
if (onEvent) {
|
|
402
|
-
onEvent('connect', { socketId });
|
|
403
|
-
}
|
|
404
|
-
// Разрешаем промис, продолжаем выполнение
|
|
405
|
-
resolve();
|
|
406
|
-
});
|
|
407
|
-
// Обработчик сообщений от сервера
|
|
408
|
-
socket.on('message', (data) => {
|
|
409
|
-
if (onEvent && data && data.type) {
|
|
410
|
-
onEvent(data.type, data.data || data);
|
|
411
|
-
}
|
|
412
|
-
});
|
|
413
|
-
// Обработчик ошибок
|
|
414
|
-
socket.on('error', (error) => {
|
|
415
|
-
console.error('[SDK] WebSocket error:', error);
|
|
416
|
-
if (onEvent) {
|
|
417
|
-
onEvent('error', { message: error.message || 'Unknown WebSocket error', code: error.code });
|
|
418
|
-
}
|
|
419
|
-
});
|
|
420
|
-
// Обработчик отключения
|
|
421
|
-
socket.on('disconnect', (reason) => {
|
|
422
|
-
console.log(`[SDK] WebSocket отключен: ${reason}`);
|
|
423
|
-
if (onEvent) {
|
|
424
|
-
onEvent('disconnect', { reason });
|
|
425
|
-
}
|
|
426
|
-
});
|
|
427
|
-
// Обработчики для событий аутентификации
|
|
428
|
-
socket.on('authenticated', (data) => {
|
|
429
|
-
console.log('[SDK] Аутентификация успешна', data);
|
|
430
|
-
if (onEvent) {
|
|
431
|
-
onEvent('authenticated', data);
|
|
432
|
-
}
|
|
433
|
-
});
|
|
434
|
-
socket.on('authentication_error', (data) => {
|
|
435
|
-
console.error('[SDK] Ошибка аутентификации:', data);
|
|
436
|
-
if (onEvent) {
|
|
437
|
-
onEvent('error', { message: 'Ошибка аутентификации: ' + (data.message || 'Unknown error'), code: 'AUTH_ERROR' });
|
|
438
|
-
}
|
|
439
|
-
reject(new Error('Ошибка аутентификации: ' + (data.message || 'Unknown error')));
|
|
440
|
-
});
|
|
441
|
-
// Регистрируем обработчики для всех событий потока мышления
|
|
442
|
-
['message_start', 'content_block_start', 'thinking_start', 'thinking_delta',
|
|
443
|
-
'text_delta', 'content_block_stop', 'message_stop', 'done'].forEach(eventType => {
|
|
444
|
-
socket.on(eventType, (data) => {
|
|
445
|
-
if (onEvent) {
|
|
446
|
-
onEvent(eventType, data);
|
|
447
|
-
}
|
|
448
|
-
});
|
|
449
|
-
});
|
|
343
|
+
(0, websocket_helpers_1.setupSocketEventHandlers)(socket, socketId, sessionId, onEvent);
|
|
344
|
+
// Разрешаем промис, продолжаем выполнение
|
|
345
|
+
resolve();
|
|
450
346
|
// Обработчик таймаута соединения
|
|
451
347
|
setTimeout(() => {
|
|
452
348
|
if (socket && !socket.connected) {
|
|
@@ -471,32 +367,22 @@ class ChatApi {
|
|
|
471
367
|
temperature: options.temperature,
|
|
472
368
|
maxTokens: options.maxTokens,
|
|
473
369
|
socketId: socketId,
|
|
370
|
+
sessionId: sessionId, // Добавляем sessionId для кэширования блоков мышления
|
|
474
371
|
thinking: true,
|
|
475
372
|
region: options.region
|
|
476
373
|
}, {
|
|
477
|
-
'X-Socket-ID': socketId
|
|
374
|
+
'X-Socket-ID': socketId,
|
|
375
|
+
'X-Session-ID': sessionId // Добавляем ID сессии в заголовки
|
|
478
376
|
});
|
|
479
377
|
}
|
|
480
378
|
catch (error) {
|
|
379
|
+
const errorObj = (0, stream_utils_1.handleStreamError)(error);
|
|
481
380
|
if (options.onError) {
|
|
482
|
-
options.onError(
|
|
381
|
+
options.onError(errorObj);
|
|
483
382
|
}
|
|
484
|
-
throw
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
/**
|
|
488
|
-
* Генерирует случайный ID указанной длины
|
|
489
|
-
* @param {number} length Длина ID
|
|
490
|
-
* @returns {string} Сгенерированный ID
|
|
491
|
-
*/
|
|
492
|
-
generateId(length) {
|
|
493
|
-
const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
|
494
|
-
let result = '';
|
|
495
|
-
for (let i = 0; i < length; i++) {
|
|
496
|
-
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
383
|
+
throw errorObj;
|
|
497
384
|
}
|
|
498
|
-
return result;
|
|
499
385
|
}
|
|
500
386
|
}
|
|
501
387
|
exports.ChatApi = ChatApi;
|
|
502
|
-
//# sourceMappingURL=
|
|
388
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/api/chat-api/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/api/chat-api/interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/api/chat-api/models.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processStreamChunk = processStreamChunk;
|
|
4
|
+
exports.handleStreamError = handleStreamError;
|
|
5
|
+
/**
|
|
6
|
+
* Обрабатывает чанк данных из потока SSE
|
|
7
|
+
*/
|
|
8
|
+
function processStreamChunk(line, isInThinkingBlock, thinkingContent, textContent, thinkingSignature, onToken) {
|
|
9
|
+
// Проверяем формат строки
|
|
10
|
+
if (!line.startsWith('data:')) {
|
|
11
|
+
return {
|
|
12
|
+
isInThinkingBlock,
|
|
13
|
+
thinkingContent,
|
|
14
|
+
textContent,
|
|
15
|
+
thinkingSignature,
|
|
16
|
+
isDone: false
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const data = line.slice(5).trim();
|
|
20
|
+
// Проверяем завершение потока
|
|
21
|
+
if (data === '[DONE]') {
|
|
22
|
+
if (onToken) {
|
|
23
|
+
onToken('');
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
isInThinkingBlock,
|
|
27
|
+
thinkingContent,
|
|
28
|
+
textContent,
|
|
29
|
+
thinkingSignature,
|
|
30
|
+
chunk: {
|
|
31
|
+
text: '',
|
|
32
|
+
isComplete: true,
|
|
33
|
+
thinkingContent: thinkingContent.length > 0 ? thinkingContent : undefined,
|
|
34
|
+
thinkingSignature: thinkingSignature.length > 0 ? thinkingSignature : undefined
|
|
35
|
+
},
|
|
36
|
+
isDone: true
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const parsedData = JSON.parse(data);
|
|
41
|
+
// Обрабатываем типы событий по актуальному API Anthropic
|
|
42
|
+
if (parsedData.type === 'content_block_start' && parsedData.content_block?.type === 'thinking') {
|
|
43
|
+
const newIsInThinkingBlock = true;
|
|
44
|
+
if (onToken) {
|
|
45
|
+
onToken('[THINKING_START]');
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
isInThinkingBlock: newIsInThinkingBlock,
|
|
49
|
+
thinkingContent,
|
|
50
|
+
textContent,
|
|
51
|
+
thinkingSignature,
|
|
52
|
+
chunk: {
|
|
53
|
+
text: '[THINKING_START]',
|
|
54
|
+
isComplete: false,
|
|
55
|
+
isThinking: true
|
|
56
|
+
},
|
|
57
|
+
isDone: false
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
else if (parsedData.type === 'content_block_stop' && isInThinkingBlock) {
|
|
61
|
+
const newIsInThinkingBlock = false;
|
|
62
|
+
if (onToken) {
|
|
63
|
+
onToken('[THINKING_END]');
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
isInThinkingBlock: newIsInThinkingBlock,
|
|
67
|
+
thinkingContent,
|
|
68
|
+
textContent,
|
|
69
|
+
thinkingSignature,
|
|
70
|
+
chunk: {
|
|
71
|
+
text: '[THINKING_END]',
|
|
72
|
+
isComplete: false,
|
|
73
|
+
isThinking: true
|
|
74
|
+
},
|
|
75
|
+
isDone: false
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
else if (parsedData.type === 'content_block_delta') {
|
|
79
|
+
// Получаем тип дельты из данных события
|
|
80
|
+
const deltaType = parsedData.delta?.type;
|
|
81
|
+
// Обрабатываем дельту в зависимости от типа
|
|
82
|
+
if (deltaType === 'text_delta') {
|
|
83
|
+
const text = parsedData.delta?.text || '';
|
|
84
|
+
const newTextContent = textContent + text;
|
|
85
|
+
if (onToken) {
|
|
86
|
+
onToken(text);
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
isInThinkingBlock,
|
|
90
|
+
thinkingContent,
|
|
91
|
+
textContent: newTextContent,
|
|
92
|
+
thinkingSignature,
|
|
93
|
+
chunk: {
|
|
94
|
+
text,
|
|
95
|
+
isComplete: false,
|
|
96
|
+
isThinking: false
|
|
97
|
+
},
|
|
98
|
+
isDone: false
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
else if (deltaType === 'thinking_delta') {
|
|
102
|
+
const thinking = parsedData.delta?.thinking || '';
|
|
103
|
+
const newThinkingContent = thinkingContent + thinking;
|
|
104
|
+
if (onToken) {
|
|
105
|
+
onToken(thinking);
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
isInThinkingBlock: true,
|
|
109
|
+
thinkingContent: newThinkingContent,
|
|
110
|
+
textContent,
|
|
111
|
+
thinkingSignature,
|
|
112
|
+
chunk: {
|
|
113
|
+
text: thinking,
|
|
114
|
+
isComplete: false,
|
|
115
|
+
isThinking: true
|
|
116
|
+
},
|
|
117
|
+
isDone: false
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
else if (deltaType === 'signature_delta') {
|
|
121
|
+
const signature = parsedData.delta?.signature || '';
|
|
122
|
+
return {
|
|
123
|
+
isInThinkingBlock,
|
|
124
|
+
thinkingContent,
|
|
125
|
+
textContent,
|
|
126
|
+
thinkingSignature: signature,
|
|
127
|
+
isDone: false
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
else if (deltaType === 'input_json_delta') {
|
|
131
|
+
const jsonData = parsedData.delta?.input_json || '';
|
|
132
|
+
if (onToken) {
|
|
133
|
+
onToken(jsonData);
|
|
134
|
+
}
|
|
135
|
+
// Убираем свойство isToolUse, добавляем метаданные
|
|
136
|
+
return {
|
|
137
|
+
isInThinkingBlock,
|
|
138
|
+
thinkingContent,
|
|
139
|
+
textContent,
|
|
140
|
+
thinkingSignature,
|
|
141
|
+
chunk: {
|
|
142
|
+
text: jsonData,
|
|
143
|
+
isComplete: false,
|
|
144
|
+
isThinking: false
|
|
145
|
+
},
|
|
146
|
+
isDone: false
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Возвращаем без изменений, если тип события не обрабатывается
|
|
151
|
+
return {
|
|
152
|
+
isInThinkingBlock,
|
|
153
|
+
thinkingContent,
|
|
154
|
+
textContent,
|
|
155
|
+
thinkingSignature,
|
|
156
|
+
isDone: false
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
console.error('Ошибка при парсинге данных:', e);
|
|
161
|
+
return {
|
|
162
|
+
isInThinkingBlock,
|
|
163
|
+
thinkingContent,
|
|
164
|
+
textContent,
|
|
165
|
+
thinkingSignature,
|
|
166
|
+
isDone: false
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Обрабатывает ошибку из потока
|
|
172
|
+
*/
|
|
173
|
+
function handleStreamError(error) {
|
|
174
|
+
// Проверяем наличие ошибки географических ограничений
|
|
175
|
+
const errorObj = error;
|
|
176
|
+
const isGeoRestriction = (errorObj.status === 403 || errorObj.code === 403) &&
|
|
177
|
+
errorObj.message &&
|
|
178
|
+
(errorObj.message.includes('ограничен в вашем регионе') ||
|
|
179
|
+
errorObj.message.includes('Request not allowed') ||
|
|
180
|
+
errorObj.message.includes('forbidden'));
|
|
181
|
+
if (isGeoRestriction) {
|
|
182
|
+
console.error('\n==============================================');
|
|
183
|
+
console.error('⚠️ ОШИБКА ГЕОГРАФИЧЕСКОГО ОГРАНИЧЕНИЯ API ANTHROPIC');
|
|
184
|
+
console.error('⚠️ Для работы с API Anthropic требуется VPN или прокси');
|
|
185
|
+
console.error('⚠️ Anthropic API доступен только из определенных регионов');
|
|
186
|
+
console.error('==============================================');
|
|
187
|
+
// Обогащаем объект ошибки информацией о географических ограничениях
|
|
188
|
+
errorObj.type = 'geo_restriction';
|
|
189
|
+
}
|
|
190
|
+
return errorObj;
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=stream-utils.js.map
|