solver-sdk 1.7.4 → 1.7.6
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 +25 -49
- package/dist/cjs/api/{chat-api.js → chat-api/index.js} +32 -192
- 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/api/projects-api.js +211 -0
- package/dist/cjs/api/projects-api.js.map +1 -1
- 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} +29 -192
- 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/api/projects-api.js +211 -0
- package/dist/esm/api/projects-api.js.map +1 -1
- 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} +8 -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/api/projects-api.d.ts +76 -0
- package/dist/types/api/projects-api.d.ts.map +1 -1
- 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/types/index.d.ts +8 -0
- package/dist/types/types/index.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 +432 -0
- package/docs/INTEGRATION_EXAMPLES.md +342 -0
- package/docs/README.md +78 -53
- package/docs/WEBSOCKET.md +191 -400
- package/docs/advanced/PING_PONG.md +212 -0
- package/docs/features/THINKING.md +158 -0
- package/docs/indexing/INDEXING.md +434 -210
- package/package.json +2 -2
- 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) => {
|
|
@@ -276,16 +279,18 @@ async function streamThinking() {
|
|
|
276
279
|
// Обработчик событий WebSocket
|
|
277
280
|
const handleEvent = (eventType, data) => {
|
|
278
281
|
switch(eventType) {
|
|
279
|
-
case '
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
case 'thinking_delta':
|
|
284
|
-
process.stdout.write(data.text); // Потоковый вывод размышлений
|
|
282
|
+
case 'content_block_start':
|
|
283
|
+
if (data.content_block && data.content_block.type === 'thinking') {
|
|
284
|
+
console.log('Начало размышлений:');
|
|
285
|
+
}
|
|
285
286
|
break;
|
|
286
287
|
|
|
287
|
-
case '
|
|
288
|
-
|
|
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
|
+
}
|
|
289
294
|
break;
|
|
290
295
|
|
|
291
296
|
case 'error':
|
|
@@ -325,41 +330,15 @@ streamThinking();
|
|
|
325
330
|
|
|
326
331
|
- `message_start` - начало сообщения от модели
|
|
327
332
|
- `content_block_start` - начало блока контента (текст или thinking)
|
|
328
|
-
- `
|
|
329
|
-
- `
|
|
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'` - подпись блока мышления
|
|
330
338
|
- `content_block_stop` - завершение блока контента
|
|
339
|
+
- `message_delta` - дельта сообщения
|
|
331
340
|
- `message_stop` - завершение сообщения
|
|
332
341
|
|
|
333
|
-
### Работа с региональными эндпоинтами
|
|
334
|
-
|
|
335
|
-
```javascript
|
|
336
|
-
// Настройка SDK с указанием предпочтительного региона
|
|
337
|
-
const sdk = new CodeSolverSDK({
|
|
338
|
-
baseURL: 'https://api.example.com',
|
|
339
|
-
apiKey: 'your-api-key',
|
|
340
|
-
providers: {
|
|
341
|
-
anthropic: {
|
|
342
|
-
region: 'eu-west-1' // Использовать европейский регион
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
});
|
|
346
|
-
|
|
347
|
-
// Запрос с автоматическим переключением между регионами при ошибках
|
|
348
|
-
const response = await sdk.chat.chatWithRegionFailover([
|
|
349
|
-
{ role: 'user', content: 'Расскажи о квантовых компьютерах' }
|
|
350
|
-
], {
|
|
351
|
-
model: 'claude-3-7-sonnet-20240229'
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
// Запрос с явным указанием региона
|
|
355
|
-
const responseFromAsia = await sdk.chat.chat([
|
|
356
|
-
{ role: 'user', content: 'Расскажи о квантовых компьютерах' }
|
|
357
|
-
], {
|
|
358
|
-
model: 'claude-3-7-sonnet-20240229',
|
|
359
|
-
region: 'ap-southeast-2' // Явно указываем регион
|
|
360
|
-
});
|
|
361
|
-
```
|
|
362
|
-
|
|
363
342
|
## Примеры
|
|
364
343
|
|
|
365
344
|
В директории [`examples`](./examples) доступны примеры использования SDK:
|
|
@@ -373,9 +352,6 @@ npm run example:indexing
|
|
|
373
352
|
|
|
374
353
|
# Работа с зависимостями
|
|
375
354
|
npm run example:dependencies
|
|
376
|
-
|
|
377
|
-
# Проверка доступности регионов
|
|
378
|
-
npm run example:regions
|
|
379
355
|
```
|
|
380
356
|
|
|
381
357
|
## Совместимость
|
|
@@ -434,4 +410,4 @@ const sdk = new CodeSolverSDK({
|
|
|
434
410
|
|
|
435
411
|
## Лицензия
|
|
436
412
|
|
|
437
|
-
[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,22 +271,7 @@ class ChatApi {
|
|
|
320
271
|
};
|
|
321
272
|
}
|
|
322
273
|
catch (error) {
|
|
323
|
-
|
|
324
|
-
const errorObj = error;
|
|
325
|
-
const isGeoRestriction = (errorObj.status === 403 || errorObj.code === 403) &&
|
|
326
|
-
errorObj.message &&
|
|
327
|
-
(errorObj.message.includes('ограничен в вашем регионе') ||
|
|
328
|
-
errorObj.message.includes('Request not allowed') ||
|
|
329
|
-
errorObj.message.includes('forbidden'));
|
|
330
|
-
if (isGeoRestriction) {
|
|
331
|
-
console.error('\n==============================================');
|
|
332
|
-
console.error('⚠️ ОШИБКА ГЕОГРАФИЧЕСКОГО ОГРАНИЧЕНИЯ API ANTHROPIC');
|
|
333
|
-
console.error('⚠️ Для работы с API Anthropic требуется VPN или прокси');
|
|
334
|
-
console.error('⚠️ Anthropic API доступен только из определенных регионов');
|
|
335
|
-
console.error('==============================================');
|
|
336
|
-
// Обогащаем объект ошибки информацией о географических ограничениях
|
|
337
|
-
errorObj.type = 'geo_restriction';
|
|
338
|
-
}
|
|
274
|
+
const errorObj = (0, stream_utils_1.handleStreamError)(error);
|
|
339
275
|
if (options?.onError) {
|
|
340
276
|
options.onError(errorObj);
|
|
341
277
|
}
|
|
@@ -365,7 +301,7 @@ class ChatApi {
|
|
|
365
301
|
* Отправляет сообщение в чат в потоковом режиме с поддержкой thinking через WebSocket
|
|
366
302
|
* @param {ChatMessage[]} messages Массив сообщений для отправки
|
|
367
303
|
* @param {ChatStreamOptions} [options] Дополнительные параметры
|
|
368
|
-
* @param {
|
|
304
|
+
* @param {EventHandler} [onEvent] Обработчик событий WebSocket
|
|
369
305
|
* @returns {Promise<ThinkingStreamResponse>} Информация о потоковом запросе
|
|
370
306
|
*/
|
|
371
307
|
async streamChatWithThinking(messages, options = {}, onEvent) {
|
|
@@ -374,7 +310,9 @@ class ChatApi {
|
|
|
374
310
|
}
|
|
375
311
|
try {
|
|
376
312
|
// 1. Создаем параметры для запроса
|
|
377
|
-
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()}`;
|
|
378
316
|
let socket = null;
|
|
379
317
|
// 2. Подключаемся к WebSocket и ждем успешного подключения
|
|
380
318
|
if (onEvent) {
|
|
@@ -399,84 +337,12 @@ class ChatApi {
|
|
|
399
337
|
return;
|
|
400
338
|
}
|
|
401
339
|
// Создаем соединение с сервером WebSocket
|
|
402
|
-
const serverUrl = this.httpClient.getBaseURL() || 'http://localhost:3000';
|
|
340
|
+
const serverUrl = this.httpClient.getBaseURL?.() || 'http://localhost:3000';
|
|
403
341
|
socket = io(`${serverUrl}/reasoning`, socketOptions);
|
|
404
342
|
// Устанавливаем обработчики событий
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
socket.emit('authenticate', {
|
|
409
|
-
socketId: socketId,
|
|
410
|
-
token: options.authToken || 'test-token'
|
|
411
|
-
});
|
|
412
|
-
// Отправляем событие присоединения к комнате с ID
|
|
413
|
-
socket.emit('join_room', { roomId: socketId });
|
|
414
|
-
// Вызываем обработчик события connect
|
|
415
|
-
if (onEvent) {
|
|
416
|
-
onEvent('connect', { socketId });
|
|
417
|
-
}
|
|
418
|
-
// Разрешаем промис, продолжаем выполнение
|
|
419
|
-
resolve();
|
|
420
|
-
});
|
|
421
|
-
// Обработчик сообщений от сервера
|
|
422
|
-
socket.on('message', (data) => {
|
|
423
|
-
if (onEvent && data && data.type) {
|
|
424
|
-
onEvent(data.type, data.data || data);
|
|
425
|
-
}
|
|
426
|
-
});
|
|
427
|
-
// Обработчик ошибок
|
|
428
|
-
socket.on('error', (error) => {
|
|
429
|
-
console.error('[SDK] WebSocket error:', error);
|
|
430
|
-
// Проверяем наличие ошибки географических ограничений
|
|
431
|
-
const isGeoRestriction = (error.type === 'geo_restriction' || error.code === 403) &&
|
|
432
|
-
error.message &&
|
|
433
|
-
(error.message.includes('ограничен в вашем регионе') ||
|
|
434
|
-
error.message.includes('Request not allowed'));
|
|
435
|
-
if (isGeoRestriction) {
|
|
436
|
-
console.error('\n==============================================');
|
|
437
|
-
console.error('⚠️ ОШИБКА ГЕОГРАФИЧЕСКОГО ОГРАНИЧЕНИЯ API ANTHROPIC');
|
|
438
|
-
console.error('⚠️ Для работы с API Anthropic требуется VPN или прокси');
|
|
439
|
-
console.error('⚠️ Anthropic API доступен только из определенных регионов');
|
|
440
|
-
console.error('==============================================');
|
|
441
|
-
}
|
|
442
|
-
if (onEvent) {
|
|
443
|
-
onEvent('error', {
|
|
444
|
-
message: error.message || 'Unknown WebSocket error',
|
|
445
|
-
code: error.code,
|
|
446
|
-
type: isGeoRestriction ? 'geo_restriction' : (error.type || 'websocket_error')
|
|
447
|
-
});
|
|
448
|
-
}
|
|
449
|
-
});
|
|
450
|
-
// Обработчик отключения
|
|
451
|
-
socket.on('disconnect', (reason) => {
|
|
452
|
-
console.log(`[SDK] WebSocket отключен: ${reason}`);
|
|
453
|
-
if (onEvent) {
|
|
454
|
-
onEvent('disconnect', { reason });
|
|
455
|
-
}
|
|
456
|
-
});
|
|
457
|
-
// Обработчики для событий аутентификации
|
|
458
|
-
socket.on('authenticated', (data) => {
|
|
459
|
-
console.log('[SDK] Аутентификация успешна', data);
|
|
460
|
-
if (onEvent) {
|
|
461
|
-
onEvent('authenticated', data);
|
|
462
|
-
}
|
|
463
|
-
});
|
|
464
|
-
socket.on('authentication_error', (data) => {
|
|
465
|
-
console.error('[SDK] Ошибка аутентификации:', data);
|
|
466
|
-
if (onEvent) {
|
|
467
|
-
onEvent('error', { message: 'Ошибка аутентификации: ' + (data.message || 'Unknown error'), code: 'AUTH_ERROR' });
|
|
468
|
-
}
|
|
469
|
-
reject(new Error('Ошибка аутентификации: ' + (data.message || 'Unknown error')));
|
|
470
|
-
});
|
|
471
|
-
// Регистрируем обработчики для всех событий потока мышления
|
|
472
|
-
['message_start', 'content_block_start', 'thinking_start', 'thinking_delta',
|
|
473
|
-
'text_delta', 'content_block_stop', 'message_stop', 'done'].forEach(eventType => {
|
|
474
|
-
socket.on(eventType, (data) => {
|
|
475
|
-
if (onEvent) {
|
|
476
|
-
onEvent(eventType, data);
|
|
477
|
-
}
|
|
478
|
-
});
|
|
479
|
-
});
|
|
343
|
+
(0, websocket_helpers_1.setupSocketEventHandlers)(socket, socketId, sessionId, onEvent);
|
|
344
|
+
// Разрешаем промис, продолжаем выполнение
|
|
345
|
+
resolve();
|
|
480
346
|
// Обработчик таймаута соединения
|
|
481
347
|
setTimeout(() => {
|
|
482
348
|
if (socket && !socket.connected) {
|
|
@@ -501,48 +367,22 @@ class ChatApi {
|
|
|
501
367
|
temperature: options.temperature,
|
|
502
368
|
maxTokens: options.maxTokens,
|
|
503
369
|
socketId: socketId,
|
|
370
|
+
sessionId: sessionId, // Добавляем sessionId для кэширования блоков мышления
|
|
504
371
|
thinking: true,
|
|
505
372
|
region: options.region
|
|
506
373
|
}, {
|
|
507
|
-
'X-Socket-ID': socketId
|
|
374
|
+
'X-Socket-ID': socketId,
|
|
375
|
+
'X-Session-ID': sessionId // Добавляем ID сессии в заголовки
|
|
508
376
|
});
|
|
509
377
|
}
|
|
510
378
|
catch (error) {
|
|
511
|
-
|
|
512
|
-
const errorObj = error;
|
|
513
|
-
const isGeoRestriction = (errorObj.status === 403 || errorObj.code === 403) &&
|
|
514
|
-
errorObj.message &&
|
|
515
|
-
(errorObj.message.includes('ограничен в вашем регионе') ||
|
|
516
|
-
errorObj.message.includes('Request not allowed') ||
|
|
517
|
-
errorObj.message.includes('forbidden'));
|
|
518
|
-
if (isGeoRestriction) {
|
|
519
|
-
console.error('\n==============================================');
|
|
520
|
-
console.error('⚠️ ОШИБКА ГЕОГРАФИЧЕСКОГО ОГРАНИЧЕНИЯ API ANTHROPIC');
|
|
521
|
-
console.error('⚠️ Для работы с API Anthropic требуется VPN или прокси');
|
|
522
|
-
console.error('⚠️ Anthropic API доступен только из определенных регионов');
|
|
523
|
-
console.error('==============================================');
|
|
524
|
-
// Обогащаем объект ошибки информацией о географических ограничениях
|
|
525
|
-
errorObj.type = 'geo_restriction';
|
|
526
|
-
}
|
|
379
|
+
const errorObj = (0, stream_utils_1.handleStreamError)(error);
|
|
527
380
|
if (options.onError) {
|
|
528
381
|
options.onError(errorObj);
|
|
529
382
|
}
|
|
530
383
|
throw errorObj;
|
|
531
384
|
}
|
|
532
385
|
}
|
|
533
|
-
/**
|
|
534
|
-
* Генерирует случайный ID указанной длины
|
|
535
|
-
* @param {number} length Длина ID
|
|
536
|
-
* @returns {string} Сгенерированный ID
|
|
537
|
-
*/
|
|
538
|
-
generateId(length) {
|
|
539
|
-
const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
|
540
|
-
let result = '';
|
|
541
|
-
for (let i = 0; i < length; i++) {
|
|
542
|
-
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
543
|
-
}
|
|
544
|
-
return result;
|
|
545
|
-
}
|
|
546
386
|
}
|
|
547
387
|
exports.ChatApi = ChatApi;
|
|
548
|
-
//# 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
|