solver-sdk 1.7.2 → 1.7.4

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.
@@ -0,0 +1,240 @@
1
+ # Обработка ошибок в Solver SDK
2
+
3
+ Документация по системе обработки ошибок в Solver SDK, включая общие ошибки, ошибки WebSocket и географические ограничения.
4
+
5
+ ## Содержание
6
+
7
+ - [Общие принципы](#общие-принципы)
8
+ - [Типы ошибок](#типы-ошибок)
9
+ - [HTTP ошибки](#http-ошибки)
10
+ - [WebSocket ошибки](#websocket-ошибки)
11
+ - [Ошибки географических ограничений](#ошибки-географических-ограничений)
12
+ - [Примеры обработки ошибок](#примеры-обработки-ошибок)
13
+
14
+ ## Общие принципы
15
+
16
+ Solver SDK использует следующие принципы при работе с ошибками:
17
+
18
+ 1. **Унифицированный формат** — все ошибки имеют единую структуру
19
+ 2. **Информативные сообщения** — ошибки содержат детальное описание проблемы
20
+ 3. **Коды ошибок** — каждая ошибка имеет уникальный код для идентификации
21
+ 4. **Типизация** — ошибки классифицируются по типам для удобной обработки
22
+
23
+ ## Типы ошибок
24
+
25
+ Основные типы ошибок в SDK:
26
+
27
+ | Тип ошибки | Описание |
28
+ |------------|----------|
29
+ | `http_error` | Ошибки HTTP запросов |
30
+ | `websocket_error` | Ошибки WebSocket соединений |
31
+ | `validation_error` | Ошибки валидации входных данных |
32
+ | `authentication_error` | Ошибки аутентификации |
33
+ | `rate_limit_error` | Ошибки превышения лимита запросов |
34
+ | `provider_error` | Ошибки провайдеров API (Anthropic, OpenAI) |
35
+ | `geo_restriction` | Ошибки географических ограничений |
36
+
37
+ ## HTTP ошибки
38
+
39
+ HTTP ошибки возникают при проблемах с HTTP запросами:
40
+
41
+ ```javascript
42
+ try {
43
+ const result = await sdk.chat.chat([{ role: 'user', content: 'Hello' }]);
44
+ } catch (error) {
45
+ console.error(`Код ошибки: ${error.code}`);
46
+ console.error(`Сообщение: ${error.message}`);
47
+
48
+ // Проверка типа ошибки
49
+ if (error.code === 401) {
50
+ console.error('Ошибка аутентификации: проверьте API ключ');
51
+ } else if (error.code === 429) {
52
+ console.error('Превышен лимит запросов: повторите позже');
53
+ }
54
+ }
55
+ ```
56
+
57
+ ## WebSocket ошибки
58
+
59
+ WebSocket ошибки обрабатываются через обработчики событий:
60
+
61
+ ```javascript
62
+ const handleEvent = (eventType, data) => {
63
+ if (eventType === 'error') {
64
+ console.error(`WebSocket ошибка: ${data.message} (код: ${data.code})`);
65
+
66
+ // Обработка конкретных типов ошибок
67
+ switch (data.type) {
68
+ case 'connection_error':
69
+ console.error('Проблема с подключением, пробуем переподключиться...');
70
+ break;
71
+ case 'authentication_error':
72
+ console.error('Проблема аутентификации, запрашиваем новый токен...');
73
+ break;
74
+ case 'timeout_error':
75
+ console.error('Превышен таймаут ожидания ответа');
76
+ break;
77
+ }
78
+ }
79
+ };
80
+
81
+ // Передаем обработчик событий
82
+ await sdk.chat.streamChatWithThinking(messages, options, handleEvent);
83
+ ```
84
+
85
+ ## Ошибки географических ограничений
86
+
87
+ > **Добавлено в версии 1.7.4**
88
+
89
+ Начиная с версии 1.7.4 SDK поддерживает специальную обработку ошибок географических ограничений API Anthropic. Эти ошибки возникают, когда запросы отправляются из регионов, не поддерживаемых API Anthropic:
90
+
91
+ ```javascript
92
+ try {
93
+ const response = await sdk.chat.streamChatWithThinking(messages, options, handleEvent);
94
+ } catch (error) {
95
+ // Проверка наличия ошибки географических ограничений
96
+ if (error.type === 'geo_restriction') {
97
+ console.error('==============================================');
98
+ console.error('⚠️ ОШИБКА ГЕОГРАФИЧЕСКОГО ОГРАНИЧЕНИЯ API ANTHROPIC');
99
+ console.error('⚠️ Для работы с API Anthropic требуется VPN или прокси');
100
+ console.error('⚠️ Anthropic API доступен только из определенных регионов');
101
+ console.error('==============================================');
102
+
103
+ // Возможные действия:
104
+ // 1. Предложить пользователю включить VPN
105
+ // 2. Переключиться на другой провайдер API
106
+ // 3. Использовать прокси-сервер
107
+ }
108
+ }
109
+ ```
110
+
111
+ Через обработчик WebSocket событий:
112
+
113
+ ```javascript
114
+ const handleEvent = (eventType, data) => {
115
+ if (eventType === 'error' && data.type === 'geo_restriction') {
116
+ console.error('Необходимо включить VPN для доступа к API Anthropic из вашего региона');
117
+
118
+ // Выполнить действия по настройке VPN или показать инструкции пользователю
119
+ }
120
+ };
121
+ ```
122
+
123
+ ### Причины ошибок географических ограничений
124
+
125
+ Основные причины возникновения ошибок географических ограничений:
126
+
127
+ 1. **Региональные ограничения API Anthropic** — API доступен только из определенных регионов (США, Европа и некоторые другие)
128
+ 2. **Регуляторные требования** — законодательство некоторых стран ограничивает доступ к определенным API
129
+ 3. **IP-блокировка** — некоторые IP-адреса могут быть заблокированы провайдером API
130
+
131
+ ### Решение проблемы
132
+
133
+ Для решения проблемы географических ограничений:
134
+
135
+ 1. **Использование VPN** — подключитесь через VPN к поддерживаемому региону (США, Европа)
136
+ 2. **Прокси-сервер** — настройте прокси для запросов к API
137
+ 3. **Альтернативные провайдеры** — используйте альтернативных провайдеров, доступных в вашем регионе
138
+
139
+ ## Примеры обработки ошибок
140
+
141
+ ### Комплексная обработка ошибок
142
+
143
+ ```javascript
144
+ async function exampleWithErrorHandling() {
145
+ const sdk = new CodeSolverSDK({
146
+ baseURL: 'https://api.example.com',
147
+ apiKey: 'your-api-key'
148
+ });
149
+
150
+ const messages = [
151
+ { role: 'user', content: 'Explain quantum computing' }
152
+ ];
153
+
154
+ const options = {
155
+ model: 'claude-3-7-sonnet-20240229',
156
+ thinking: true,
157
+ authToken: 'your-auth-token'
158
+ };
159
+
160
+ // Обработчик WebSocket событий
161
+ const handleEvent = (eventType, data) => {
162
+ // Обработка ошибок
163
+ if (eventType === 'error') {
164
+ console.error(`Ошибка: ${data.message}`);
165
+
166
+ // Проверка типа ошибки
167
+ switch (data.type) {
168
+ case 'geo_restriction':
169
+ console.error('Географическое ограничение: требуется VPN');
170
+ break;
171
+ case 'authentication_error':
172
+ console.error('Ошибка аутентификации: неверный токен');
173
+ break;
174
+ case 'rate_limit_error':
175
+ console.error('Превышен лимит запросов');
176
+ break;
177
+ default:
178
+ console.error(`Неизвестная ошибка типа: ${data.type}`);
179
+ break;
180
+ }
181
+ }
182
+ };
183
+
184
+ try {
185
+ const response = await sdk.chat.streamChatWithThinking(messages, options, handleEvent);
186
+ console.log(`Успешно отправлен запрос, Socket ID: ${response.socketId}`);
187
+ } catch (error) {
188
+ console.error(`Критическая ошибка: ${error.message}`);
189
+
190
+ // Обработка специфических типов ошибок
191
+ if (error.type === 'geo_restriction') {
192
+ showVpnInstructions(); // Показать инструкции по настройке VPN
193
+ } else if (error.status === 429) {
194
+ scheduleRetry(5000); // Запланировать повторную попытку через 5 секунд
195
+ } else {
196
+ reportError(error); // Отправить отчет об ошибке
197
+ }
198
+ }
199
+ }
200
+ ```
201
+
202
+ ### Обработка ошибок при работе с рассуждениями
203
+
204
+ ```javascript
205
+ try {
206
+ // Создание рассуждения
207
+ const reasoning = await sdk.reasoning.createReasoning({
208
+ projectId: 'project-123',
209
+ query: 'Analyze this codebase'
210
+ });
211
+
212
+ // Подключение WebSocket
213
+ await sdk.reasoning.connectWebSocket({
214
+ reasoningId: reasoning.id,
215
+ authToken: 'your-auth-token',
216
+ onError: (error) => {
217
+ console.error(`WebSocket ошибка: ${error.message}`);
218
+
219
+ if (error.type === 'geo_restriction') {
220
+ // Показать сообщение о необходимости VPN
221
+ showVpnAlert();
222
+ }
223
+ }
224
+ });
225
+
226
+ // Запуск рассуждения
227
+ await sdk.reasoning.startReasoning(reasoning.id);
228
+ } catch (error) {
229
+ console.error(`HTTP ошибка: ${error.message}`);
230
+
231
+ // Обработка HTTP ошибок
232
+ if (error.status === 401) {
233
+ // Перенаправить на страницу входа
234
+ redirectToLogin();
235
+ } else if (error.status === 403) {
236
+ // Показать сообщение об отсутствии доступа
237
+ showAccessDeniedMessage();
238
+ }
239
+ }
240
+ ```
@@ -0,0 +1,212 @@
1
+ # WebSocket Ping/Pong механизм
2
+
3
+ Данный документ описывает механизм поддержания WebSocket соединений и мониторинга их состояния через ping/pong обмен.
4
+
5
+ ## Обзор функциональности
6
+
7
+ SDK поддерживает автоматический механизм отправки ping-сообщений и обработки pong-ответов для:
8
+
9
+ 1. **Проверки активности соединения** - обнаружение разрывов соединения даже в отсутствие активности
10
+ 2. **Измерения времени отклика (Round Trip Time, RTT)** - мониторинг качества соединения
11
+ 3. **Сбора статистики соединения** - для диагностики и отладки
12
+ 4. **Автоматического обнаружения проблем** - уведомление о потере соединения
13
+
14
+ ## Включение механизма ping/pong
15
+
16
+ ```typescript
17
+ import { CodeSolverSDK, WebSocketNamespace } from 'solver-sdk';
18
+
19
+ // Создаем экземпляр SDK
20
+ const sdk = new CodeSolverSDK({
21
+ baseURL: 'https://api.example.com',
22
+ apiKey: 'your-api-key'
23
+ });
24
+
25
+ // Получаем WebSocket клиент
26
+ const wsClient = sdk.getWebSocketClient();
27
+
28
+ // Подключаемся к пространствам имен
29
+ await wsClient.connectToReasoning();
30
+ await wsClient.connectToDependencies();
31
+ await wsClient.connectToIndexing();
32
+
33
+ // Включаем автоматический механизм ping/pong
34
+ // параметры: интервал отправки в мс (по умолчанию 30000) и порог таймаута (по умолчанию 3)
35
+ wsClient.enablePingPong(10000, 3);
36
+
37
+ // Регистрируем обработчик для события таймаута соединения
38
+ wsClient.onPingPongEvent('connection_timeout', (data) => {
39
+ console.log(`Соединение потеряно для namespace ${data.namespace}`);
40
+ console.log(`Socket ID: ${data.socketId}`);
41
+ console.log(`Количество пропущенных pong: ${data.timeouts}`);
42
+
43
+ // Здесь можно добавить логику переподключения или уведомления пользователя
44
+ });
45
+ ```
46
+
47
+ ## Отключение механизма ping/pong
48
+
49
+ ```typescript
50
+ // Отключение для всех пространств имен
51
+ wsClient.disablePingPong();
52
+
53
+ // Отключение для конкретного пространства имен
54
+ wsClient.disablePingPong(WebSocketNamespace.REASONING);
55
+ ```
56
+
57
+ ## Получение статистики ping/pong
58
+
59
+ ```typescript
60
+ // Получение статистики для всех пространств имен
61
+ const allStats = wsClient.getPingStats();
62
+ console.log('Статистика для всех соединений:', allStats);
63
+
64
+ // Получение статистики для конкретного пространства имен
65
+ const reasoningStats = wsClient.getPingStats(WebSocketNamespace.REASONING);
66
+ console.log('Статистика для reasoning:', reasoningStats);
67
+
68
+ // Пример содержимого статистики:
69
+ // {
70
+ // namespace: '/reasoning',
71
+ // socketId: 'socket-id-123',
72
+ // pingSent: 10, // Количество отправленных ping
73
+ // pongReceived: 10, // Количество полученных pong
74
+ // averageRtt: 15.5, // Среднее время отклика (мс)
75
+ // minRtt: 5, // Минимальное время отклика (мс)
76
+ // maxRtt: 45, // Максимальное время отклика (мс)
77
+ // lastRtt: 12, // Последнее измеренное время отклика (мс)
78
+ // lastPongTimestamp: 1712345678901, // Timestamp последнего полученного pong
79
+ // isConnected: true // Текущий статус соединения
80
+ // }
81
+ ```
82
+
83
+ ## Ручная отправка ping/pong
84
+
85
+ Хотя SDK обеспечивает автоматический механизм ping/pong, вы также можете вручную отправлять ping-сообщения:
86
+
87
+ ```typescript
88
+ // Отправка ping и получение pong
89
+ wsClient.send(WebSocketNamespace.REASONING, 'connection_ping', {
90
+ timestamp: Date.now()
91
+ });
92
+
93
+ // Добавление обработчика для pong-ответов
94
+ wsClient.on('connection_pong', (data) => {
95
+ const rtt = Date.now() - data.echo;
96
+ console.log(`Получен pong, RTT: ${rtt}ms`);
97
+ });
98
+
99
+ // Альтернативно, можно использовать готовый обработчик
100
+ wsClient.on('connection_pong', wsClient.getPongHandler());
101
+ ```
102
+
103
+ ## Обработка отключений и переподключение
104
+
105
+ ```typescript
106
+ // Обработка события таймаута соединения
107
+ wsClient.onPingPongEvent('connection_timeout', async (data) => {
108
+ console.log(`Соединение потеряно для ${data.namespace}`);
109
+
110
+ // Попытка переподключения
111
+ try {
112
+ // Отключаемся от проблемного пространства имен
113
+ wsClient.disconnect(data.namespace);
114
+
115
+ // Пауза перед повторным подключением
116
+ await new Promise(resolve => setTimeout(resolve, 1000));
117
+
118
+ // Переподключаемся
119
+ switch (data.namespace) {
120
+ case WebSocketNamespace.REASONING:
121
+ await wsClient.connectToReasoning();
122
+ break;
123
+ case WebSocketNamespace.DEPENDENCIES:
124
+ await wsClient.connectToDependencies();
125
+ break;
126
+ case WebSocketNamespace.INDEXING:
127
+ await wsClient.connectToIndexing();
128
+ break;
129
+ }
130
+
131
+ console.log(`Успешно переподключились к ${data.namespace}`);
132
+ } catch (error) {
133
+ console.error(`Ошибка при переподключении к ${data.namespace}:`, error);
134
+ }
135
+ });
136
+ ```
137
+
138
+ ## Рекомендации по использованию
139
+
140
+ 1. **Интервал ping/pong**: Рекомендуемый интервал - 30 секунд для продакшн и 5-10 секунд для отладки.
141
+
142
+ 2. **Порог таймаута**: Значение 2-3 пропущенных ping/pong позволяет избежать ложных срабатываний при временных задержках сети.
143
+
144
+ 3. **Экономия трафика**: При частой передаче данных через WebSocket можно увеличить интервал ping/pong, так как регулярный обмен данными уже поддерживает соединение активным.
145
+
146
+ 4. **Мониторинг RTT**: Используйте statsPingStats для мониторинга задержек сети и раннего обнаружения проблем с соединением.
147
+
148
+ 5. **Отключение перед закрытием приложения**: Вызывайте disablePingPong() и затем disconnectAll() при закрытии приложения для корректного освобождения ресурсов.
149
+
150
+ ## Пример комплексного использования
151
+
152
+ ```typescript
153
+ async function setupWebSocketWithHealthMonitoring() {
154
+ const sdk = new CodeSolverSDK({
155
+ baseURL: 'https://api.example.com',
156
+ apiKey: 'your-api-key',
157
+ websocket: {
158
+ reconnect: true,
159
+ reconnectAttempts: 5,
160
+ reconnectDelay: 2000
161
+ }
162
+ });
163
+
164
+ const wsClient = sdk.getWebSocketClient();
165
+
166
+ // Подключаемся ко всем пространствам имен
167
+ await wsClient.connectToReasoning();
168
+ await wsClient.connectToDependencies();
169
+ await wsClient.connectToIndexing();
170
+
171
+ // Включаем механизм ping/pong для всех соединений
172
+ wsClient.enablePingPong(20000, 3);
173
+
174
+ // Регистрируем обработчик для события таймаута
175
+ wsClient.onPingPongEvent('connection_timeout', handleConnectionTimeout);
176
+
177
+ // Периодически проверяем статистику соединений
178
+ const statsInterval = setInterval(() => {
179
+ const stats = wsClient.getPingStats();
180
+
181
+ // Анализируем статистику
182
+ for (const stat of stats) {
183
+ if (stat.averageRtt > 500) {
184
+ console.warn(`Высокая задержка для ${stat.namespace}: ${stat.averageRtt}ms`);
185
+ }
186
+ }
187
+ }, 60000); // Проверка каждую минуту
188
+
189
+ // Функция для обработки таймаута соединения
190
+ async function handleConnectionTimeout(data) {
191
+ console.error(`Соединение потеряно для ${data.namespace}`);
192
+
193
+ // Логика переподключения...
194
+ }
195
+
196
+ // Функция для корректного закрытия соединений
197
+ function cleanup() {
198
+ clearInterval(statsInterval);
199
+ wsClient.disablePingPong();
200
+ wsClient.disconnectAll();
201
+ }
202
+
203
+ // Возвращаем функцию очистки
204
+ return cleanup;
205
+ }
206
+
207
+ // Использование
208
+ const cleanup = await setupWebSocketWithHealthMonitoring();
209
+
210
+ // При закрытии приложения
211
+ window.addEventListener('beforeunload', cleanup);
212
+ ```
package/docs/README.md ADDED
@@ -0,0 +1,77 @@
1
+ # Документация Solver SDK
2
+
3
+ Эта директория содержит подробную документацию по Solver SDK версии 1.7.2.
4
+
5
+ ## Содержание
6
+
7
+ ### Основная документация
8
+
9
+ - [Потоковая передача мышления (Thinking Architecture)](./THINKING_ARCHITECTURE.md) - Архитектура системы потоковой передачи мышления
10
+ - [Руководство по потоковой передаче мышления](./streaming-thinking-guide.md) - Практическое руководство по использованию потоковой передачи мышления
11
+ - [Работа с региональными эндпоинтами](./REGIONS.md) - Информация о работе с региональными эндпоинтами Anthropic API
12
+ - [Расширенные возможности SDK](./ADVANCED.md) - Продвинутые функции и конфигурация SDK
13
+ - [WebSocket API](./WEBSOCKET.md) - Подробное руководство по работе с WebSocket
14
+ - [Справочник WebSocket событий](./WEBSOCKET_EVENTS.md) - Полный список всех WebSocket событий SDK
15
+ - [Механизм Ping/Pong](./PING_PONG.md) - Документация по мониторингу состояния WebSocket соединений
16
+ - [Индексация проектов](./INDEXING.md) - Руководство по индексации и обновлению индекса проектов
17
+
18
+ ### Дополнительные материалы
19
+
20
+ - [Режим мышления](./thinking/thinking-mode.md) - Основная информация о режиме мышления
21
+
22
+ ## Основные возможности SDK 1.7.2
23
+
24
+ ### Потоковая передача мышления (Streaming Thinking)
25
+
26
+ В версии 1.7.2 добавлена полная поддержка потоковой передачи мышления с помощью метода `streamChatWithThinking()`. Это позволяет получать события мышления модели в реальном времени через WebSocket.
27
+
28
+ ```javascript
29
+ const response = await sdk.chat.streamChatWithThinking(
30
+ messages,
31
+ { model: 'claude-3-7-sonnet-20240229', thinking: true },
32
+ handleEvent
33
+ );
34
+ ```
35
+
36
+ ### Региональные эндпоинты
37
+
38
+ SDK поддерживает работу с различными региональными эндпоинтами Anthropic API:
39
+
40
+ ```javascript
41
+ const sdk = new CodeSolverSDK({
42
+ providers: {
43
+ anthropic: {
44
+ region: 'eu-west-1' // Использовать европейский регион
45
+ }
46
+ }
47
+ });
48
+
49
+ // Автоматическое переключение между регионами при ошибках
50
+ const response = await sdk.chat.chatWithRegionFailover([...], options);
51
+ ```
52
+
53
+ ### WebSocket улучшения
54
+
55
+ Улучшена надежность и диагностика WebSocket соединений:
56
+
57
+ ```javascript
58
+ // Диагностика соединения
59
+ const diagnostics = sdk.getWebSocketClient().diagnoseConnection(namespace);
60
+ console.log(diagnostics);
61
+
62
+ // Мониторинг здоровья
63
+ sdk.getWebSocketClient().setupConnectionHealthCheck(interval);
64
+ ```
65
+
66
+ ## Примеры кода
67
+
68
+ Примеры использования SDK доступны в директории `examples` корневого каталога проекта:
69
+
70
+ - `example:check-api` - Проверка соединения с API
71
+ - `example:indexing` - Индексация проектов
72
+ - `example:dependencies` - Работа с зависимостями
73
+ - `example:regions` - Проверка доступности регионов
74
+
75
+ ## Обратная связь
76
+
77
+ Если вы обнаружили ошибки в документации или у вас есть предложения по улучшению, пожалуйста, создайте issue в репозитории проекта.
@@ -0,0 +1,140 @@
1
+ # Работа с региональными эндпоинтами Anthropic API
2
+
3
+ SDK поддерживает работу с различными региональными эндпоинтами Anthropic API, что позволяет:
4
+ - Улучшить производительность для пользователей в разных регионах
5
+ - Обеспечить отказоустойчивость при перегрузке одного из регионов
6
+ - Соблюдать законодательные требования по обработке данных в конкретных регионах
7
+
8
+ ## Содержание
9
+
10
+ - [Поддерживаемые регионы](#поддерживаемые-регионы)
11
+ - [Настройка региона](#настройка-региона)
12
+ - [Автоматическое переключение между регионами](#автоматическое-переключение-между-регионами)
13
+ - [Примеры использования](#примеры-использования)
14
+ - [Ограничения](#ограничения)
15
+
16
+ ## Поддерживаемые регионы
17
+
18
+ SDK поддерживает следующие регионы Anthropic API:
19
+
20
+ | Регион | Код | Расположение | Доступность |
21
+ |--------|-----|--------------|-------------|
22
+ | US East (N. Virginia) | `us-east-1` | США | Основной регион |
23
+ | EU West (Ireland) | `eu-west-1` | Евросоюз | Соответствует GDPR |
24
+ | Asia Pacific (Sydney) | `ap-southeast-2` | Австралия | Для пользователей в APAC |
25
+
26
+ Каждый регион имеет собственный эндпоинт и характеристики производительности.
27
+
28
+ ## Настройка региона
29
+
30
+ Регион для запросов можно настроить несколькими способами:
31
+
32
+ ### 1. В глобальных настройках SDK
33
+
34
+ ```javascript
35
+ const sdk = new CodeSolverSDK({
36
+ baseURL: 'https://api.example.com',
37
+ apiKey: 'your-api-key',
38
+ providers: {
39
+ anthropic: {
40
+ region: 'eu-west-1' // Использовать европейский регион для всех запросов
41
+ }
42
+ }
43
+ });
44
+ ```
45
+
46
+ ### 2. В параметрах конкретного запроса
47
+
48
+ ```javascript
49
+ // Для чата
50
+ const response = await sdk.chat.chat([
51
+ { role: 'user', content: 'Привет! Как дела?' }
52
+ ], {
53
+ model: 'claude-3-sonnet-20240229',
54
+ region: 'ap-southeast-2' // Использовать азиатско-тихоокеанский регион для этого запроса
55
+ });
56
+
57
+ // Для рассуждений
58
+ const reasoning = await sdk.reasoning.createReasoning({
59
+ projectId: 'my-project',
60
+ query: 'Как оптимизировать этот код?',
61
+ options: {
62
+ region: 'us-east-1' // Использовать американский регион для этого рассуждения
63
+ }
64
+ });
65
+ ```
66
+
67
+ ## Автоматическое переключение между регионами
68
+
69
+ SDK (версия 1.7.1+) поддерживает автоматическое переключение между регионами при получении ошибки перегрузки (код 529) от Anthropic API.
70
+
71
+ ### Для чата
72
+
73
+ ```javascript
74
+ // Использует автоматическое переключение между регионами
75
+ const response = await sdk.chat.chatWithRegionFailover([
76
+ { role: 'user', content: 'Привет! Как дела?' }
77
+ ], {
78
+ model: 'claude-3-sonnet-20240229',
79
+ region: 'us-east-1' // Начинаем с этого региона, но можем переключиться на другие
80
+ });
81
+ ```
82
+
83
+ ### Для рассуждений
84
+
85
+ ```javascript
86
+ // Использует автоматическое переключение между регионами
87
+ const reasoning = await sdk.reasoning.createReasoningWithRegionFailover({
88
+ projectId: 'my-project',
89
+ query: 'Как оптимизировать этот код?',
90
+ options: {
91
+ region: 'eu-west-1' // Начинаем с этого региона, но можем переключиться на другие
92
+ }
93
+ });
94
+ ```
95
+
96
+ ### Как работает переключение между регионами
97
+
98
+ 1. Запрос отправляется в указанный регион
99
+ 2. Если регион возвращает ошибку перегрузки (код 529), SDK автоматически пробует следующий доступный регион
100
+ 3. Если все регионы перегружены, возвращается ошибка
101
+
102
+ Порядок переключения: регионы проверяются в порядке, начиная с указанного в параметрах, затем по кругу.
103
+
104
+ ## Примеры использования
105
+
106
+ ### Базовый пример переключения регионов
107
+
108
+ ```javascript
109
+ try {
110
+ const response = await sdk.chat.chatWithRegionFailover([
111
+ { role: 'user', content: 'Привет! Расскажи о переключении регионов Anthropic API.' }
112
+ ], {
113
+ model: 'claude-3-sonnet-20240229'
114
+ });
115
+
116
+ console.log('Ответ:', response.choices[0].message.content);
117
+ } catch (error) {
118
+ console.error('Все регионы недоступны:', error);
119
+ }
120
+ ```
121
+
122
+ ### Пример с настройкой порядка регионов
123
+
124
+ ```javascript
125
+ // Запрос с указанием предпочтительного региона
126
+ // (остальные будут проверены в порядке следования после него)
127
+ const response = await sdk.chat.chatWithRegionFailover([
128
+ { role: 'user', content: 'Привет!' }
129
+ ], {
130
+ model: 'claude-3-sonnet-20240229',
131
+ region: 'ap-southeast-2' // Сначала пробуем AP регион, затем US и EU
132
+ });
133
+ ```
134
+
135
+ ## Ограничения
136
+
137
+ - Переключение работает только для ошибки перегрузки (код 529)
138
+ - Другие ошибки (аутентификация, формат запроса и т.д.) не вызывают переключение
139
+ - При переключении между регионами может быть заметная задержка
140
+ - Цены и квоты могут отличаться в разных регионах