solver-sdk 1.8.0 → 1.9.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/README.md +176 -468
- package/dist/cjs/api/{chat-api.js → chat-api/index.js} +77 -125
- 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 +275 -3
- package/dist/cjs/api/projects-api.js.map +1 -1
- package/dist/cjs/code-solver-sdk.js +21 -23
- package/dist/cjs/code-solver-sdk.js.map +1 -1
- package/dist/cjs/constants/websocket-events.constants.js +90 -52
- package/dist/cjs/constants/websocket-events.constants.js.map +1 -1
- package/dist/cjs/constants/websocket-namespaces.constants.js +18 -0
- package/dist/cjs/constants/websocket-namespaces.constants.js.map +1 -0
- package/dist/cjs/interfaces/websocket/callbacks.interfaces.js +3 -0
- package/dist/cjs/interfaces/websocket/callbacks.interfaces.js.map +1 -0
- package/dist/cjs/interfaces/websocket/client-options.interfaces.js +3 -0
- package/dist/cjs/interfaces/websocket/client-options.interfaces.js.map +1 -0
- package/dist/cjs/interfaces/websocket/events.interfaces.js +3 -0
- package/dist/cjs/interfaces/websocket/events.interfaces.js.map +1 -0
- package/dist/cjs/interfaces/websocket/stats.interfaces.js +3 -0
- package/dist/cjs/interfaces/websocket/stats.interfaces.js.map +1 -0
- package/dist/cjs/utils/code-solver-websocket-client.js +383 -1473
- package/dist/cjs/utils/code-solver-websocket-client.js.map +1 -1
- package/dist/cjs/utils/connection-state-manager.js +133 -0
- package/dist/cjs/utils/connection-state-manager.js.map +1 -0
- package/dist/cjs/utils/http-client.js +7 -0
- package/dist/cjs/utils/http-client.js.map +1 -1
- package/dist/cjs/utils/logger.js +106 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/cjs/utils/ping-pong-manager.js +306 -0
- package/dist/cjs/utils/ping-pong-manager.js.map +1 -0
- package/dist/cjs/utils/reasoning-auth-helper.js +58 -0
- package/dist/cjs/utils/reasoning-auth-helper.js.map +1 -0
- package/dist/cjs/utils/session-manager.js +114 -0
- package/dist/cjs/utils/session-manager.js.map +1 -0
- package/dist/cjs/utils/websocket-client.js +37 -10
- package/dist/cjs/utils/websocket-client.js.map +1 -1
- package/dist/cjs/ws/base-ws-client.js +286 -0
- package/dist/cjs/ws/base-ws-client.js.map +1 -0
- package/dist/cjs/ws/dependencies-ws-client.js +11 -0
- package/dist/cjs/ws/dependencies-ws-client.js.map +1 -0
- package/dist/cjs/ws/diagnostics-service.js +170 -0
- package/dist/cjs/ws/diagnostics-service.js.map +1 -0
- package/dist/cjs/ws/indexing-ws-client.js +223 -0
- package/dist/cjs/ws/indexing-ws-client.js.map +1 -0
- package/dist/cjs/ws/notifications-ws-client.js +12 -0
- package/dist/cjs/ws/notifications-ws-client.js.map +1 -0
- package/dist/cjs/ws/reasoning-ws-client.js +330 -0
- package/dist/cjs/ws/reasoning-ws-client.js.map +1 -0
- package/dist/esm/api/{chat-api.js → chat-api/index.js} +74 -125
- 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 +275 -3
- package/dist/esm/api/projects-api.js.map +1 -1
- package/dist/esm/code-solver-sdk.js +13 -15
- package/dist/esm/code-solver-sdk.js.map +1 -1
- package/dist/esm/constants/websocket-events.constants.js +89 -51
- package/dist/esm/constants/websocket-events.constants.js.map +1 -1
- package/dist/esm/constants/websocket-namespaces.constants.js +15 -0
- package/dist/esm/constants/websocket-namespaces.constants.js.map +1 -0
- package/dist/esm/interfaces/websocket/callbacks.interfaces.js +2 -0
- package/dist/esm/interfaces/websocket/callbacks.interfaces.js.map +1 -0
- package/dist/esm/interfaces/websocket/client-options.interfaces.js +2 -0
- package/dist/esm/interfaces/websocket/client-options.interfaces.js.map +1 -0
- package/dist/esm/interfaces/websocket/events.interfaces.js +2 -0
- package/dist/esm/interfaces/websocket/events.interfaces.js.map +1 -0
- package/dist/esm/interfaces/websocket/stats.interfaces.js +2 -0
- package/dist/esm/interfaces/websocket/stats.interfaces.js.map +1 -0
- package/dist/esm/utils/code-solver-websocket-client.js +382 -1473
- package/dist/esm/utils/code-solver-websocket-client.js.map +1 -1
- package/dist/esm/utils/connection-state-manager.js +129 -0
- package/dist/esm/utils/connection-state-manager.js.map +1 -0
- package/dist/esm/utils/http-client.js +7 -0
- package/dist/esm/utils/http-client.js.map +1 -1
- package/dist/esm/utils/logger.js +101 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/esm/utils/ping-pong-manager.js +302 -0
- package/dist/esm/utils/ping-pong-manager.js.map +1 -0
- package/dist/esm/utils/reasoning-auth-helper.js +54 -0
- package/dist/esm/utils/reasoning-auth-helper.js.map +1 -0
- package/dist/esm/utils/session-manager.js +109 -0
- package/dist/esm/utils/session-manager.js.map +1 -0
- package/dist/esm/utils/websocket-client.js +37 -10
- package/dist/esm/utils/websocket-client.js.map +1 -1
- package/dist/esm/ws/base-ws-client.js +282 -0
- package/dist/esm/ws/base-ws-client.js.map +1 -0
- package/dist/esm/ws/dependencies-ws-client.js +7 -0
- package/dist/esm/ws/dependencies-ws-client.js.map +1 -0
- package/dist/esm/ws/diagnostics-service.js +166 -0
- package/dist/esm/ws/diagnostics-service.js.map +1 -0
- package/dist/esm/ws/indexing-ws-client.js +219 -0
- package/dist/esm/ws/indexing-ws-client.js.map +1 -0
- package/dist/esm/ws/notifications-ws-client.js +8 -0
- package/dist/esm/ws/notifications-ws-client.js.map +1 -0
- package/dist/esm/ws/reasoning-ws-client.js +326 -0
- package/dist/esm/ws/reasoning-ws-client.js.map +1 -0
- 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 -73
- 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 +114 -1
- package/dist/types/api/projects-api.d.ts.map +1 -1
- package/dist/types/code-solver-sdk.d.ts +3 -2
- package/dist/types/code-solver-sdk.d.ts.map +1 -1
- package/dist/types/constants/websocket-events.constants.d.ts +77 -36
- package/dist/types/constants/websocket-events.constants.d.ts.map +1 -1
- package/dist/types/constants/websocket-namespaces.constants.d.ts +14 -0
- package/dist/types/constants/websocket-namespaces.constants.d.ts.map +1 -0
- package/dist/types/interfaces/http-client.d.ts +1 -1
- package/dist/types/interfaces/http-client.d.ts.map +1 -1
- package/dist/types/interfaces/websocket/callbacks.interfaces.d.ts +30 -0
- package/dist/types/interfaces/websocket/callbacks.interfaces.d.ts.map +1 -0
- package/dist/types/interfaces/websocket/client-options.interfaces.d.ts +51 -0
- package/dist/types/interfaces/websocket/client-options.interfaces.d.ts.map +1 -0
- package/dist/types/interfaces/websocket/events.interfaces.d.ts +165 -0
- package/dist/types/interfaces/websocket/events.interfaces.d.ts.map +1 -0
- package/dist/types/interfaces/websocket/stats.interfaces.d.ts +72 -0
- package/dist/types/interfaces/websocket/stats.interfaces.d.ts.map +1 -0
- 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 +67 -612
- package/dist/types/utils/code-solver-websocket-client.d.ts.map +1 -1
- package/dist/types/utils/connection-state-manager.d.ts +94 -0
- package/dist/types/utils/connection-state-manager.d.ts.map +1 -0
- package/dist/types/utils/http-client.d.ts +5 -0
- package/dist/types/utils/http-client.d.ts.map +1 -1
- package/dist/types/utils/logger.d.ts +62 -0
- package/dist/types/utils/logger.d.ts.map +1 -0
- package/dist/types/utils/ping-pong-manager.d.ts +118 -0
- package/dist/types/utils/ping-pong-manager.d.ts.map +1 -0
- package/dist/types/utils/reasoning-auth-helper.d.ts +24 -0
- package/dist/types/utils/reasoning-auth-helper.d.ts.map +1 -0
- package/dist/types/utils/session-manager.d.ts +98 -0
- package/dist/types/utils/session-manager.d.ts.map +1 -0
- package/dist/types/utils/websocket-client.d.ts +6 -0
- package/dist/types/utils/websocket-client.d.ts.map +1 -1
- package/dist/types/ws/base-ws-client.d.ts +119 -0
- package/dist/types/ws/base-ws-client.d.ts.map +1 -0
- package/dist/types/ws/dependencies-ws-client.d.ts +6 -0
- package/dist/types/ws/dependencies-ws-client.d.ts.map +1 -0
- package/dist/types/ws/diagnostics-service.d.ts +93 -0
- package/dist/types/ws/diagnostics-service.d.ts.map +1 -0
- package/dist/types/ws/indexing-ws-client.d.ts +78 -0
- package/dist/types/ws/indexing-ws-client.d.ts.map +1 -0
- package/dist/types/ws/notifications-ws-client.d.ts +5 -0
- package/dist/types/ws/notifications-ws-client.d.ts.map +1 -0
- package/dist/types/ws/reasoning-ws-client.d.ts +87 -0
- package/dist/types/ws/reasoning-ws-client.d.ts.map +1 -0
- package/docs/API_REFERENCE.md +432 -0
- package/docs/AUTHENTICATION.md +83 -0
- package/docs/ERROR_HANDLING.md +240 -0
- package/docs/INTEGRATION_EXAMPLES.md +342 -0
- package/docs/PING_PONG.md +212 -0
- package/docs/README.md +102 -0
- package/docs/WEBSOCKET.md +139 -0
- package/docs/advanced/PING_PONG.md +212 -0
- package/docs/features/THINKING.md +158 -0
- package/docs/indexing/INDEXING.md +231 -0
- package/package.json +4 -3
- 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
|
@@ -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,342 @@
|
|
|
1
|
+
# Примеры интеграции с VS Code/Cursor
|
|
2
|
+
|
|
3
|
+
В этом документе приведены примеры использования SDK с VS Code или Cursor расширениями.
|
|
4
|
+
|
|
5
|
+
## Содержание
|
|
6
|
+
- [Инициализация SDK](#инициализация-sdk)
|
|
7
|
+
- [Работа с проектами](#работа-с-проектами)
|
|
8
|
+
- [Отслеживание прогресса индексации](#отслеживание-прогресса-индексации)
|
|
9
|
+
- [Потоковый чат с мышлением](#потоковый-чат-с-мышлением)
|
|
10
|
+
- [Поиск в коде](#поиск-в-коде)
|
|
11
|
+
|
|
12
|
+
## Инициализация SDK
|
|
13
|
+
|
|
14
|
+
Пример инициализации SDK в расширении VS Code/Cursor:
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import * as vscode from 'vscode';
|
|
18
|
+
import { CodeSolverSDK } from 'solver-sdk';
|
|
19
|
+
|
|
20
|
+
// Инициализация SDK
|
|
21
|
+
const sdk = new CodeSolverSDK({
|
|
22
|
+
baseURL: 'https://api.example.com',
|
|
23
|
+
apiKey: 'your-api-key',
|
|
24
|
+
websocket: {
|
|
25
|
+
reconnect: true,
|
|
26
|
+
reconnectAttempts: 5,
|
|
27
|
+
reconnectDelay: 3000,
|
|
28
|
+
rejectUnauthorized: false // для самоподписанных сертификатов
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Проверка доступности API
|
|
33
|
+
async function checkConnection() {
|
|
34
|
+
try {
|
|
35
|
+
const isHealthy = await sdk.checkHealth();
|
|
36
|
+
if (isHealthy) {
|
|
37
|
+
vscode.window.showInformationMessage('API доступен');
|
|
38
|
+
} else {
|
|
39
|
+
vscode.window.showErrorMessage('API недоступен');
|
|
40
|
+
}
|
|
41
|
+
} catch (error) {
|
|
42
|
+
vscode.window.showErrorMessage(`Ошибка соединения: ${error.message}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Работа с проектами
|
|
48
|
+
|
|
49
|
+
Пример автоматической работы с проектом при открытии рабочей области:
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
import * as path from 'path';
|
|
53
|
+
|
|
54
|
+
// Получение проекта по пути рабочей области
|
|
55
|
+
async function handleWorkspace() {
|
|
56
|
+
try {
|
|
57
|
+
// Получаем путь к текущей рабочей области
|
|
58
|
+
const workspaceFolders = vscode.workspace.workspaceFolders;
|
|
59
|
+
if (!workspaceFolders || workspaceFolders.length === 0) {
|
|
60
|
+
vscode.window.showWarningMessage('Откройте папку проекта');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const workspacePath = workspaceFolders[0].uri.fsPath;
|
|
65
|
+
const projectName = path.basename(workspacePath);
|
|
66
|
+
|
|
67
|
+
// Получаем проект или создаем новый
|
|
68
|
+
const project = await sdk.projects.getOrCreateProject(
|
|
69
|
+
workspacePath,
|
|
70
|
+
projectName
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
if (project) {
|
|
74
|
+
vscode.window.showInformationMessage(`Проект "${projectName}" идентифицирован (ID: ${project.id})`);
|
|
75
|
+
return project;
|
|
76
|
+
}
|
|
77
|
+
} catch (error) {
|
|
78
|
+
vscode.window.showErrorMessage(`Ошибка: ${error.message}`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Отслеживание прогресса индексации
|
|
86
|
+
|
|
87
|
+
Пример отслеживания прогресса индексации:
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
// Запуск индексации проекта
|
|
91
|
+
async function indexProject(projectId, projectName) {
|
|
92
|
+
try {
|
|
93
|
+
// Запускаем индексацию
|
|
94
|
+
await sdk.projects.indexProject(projectId);
|
|
95
|
+
|
|
96
|
+
// Показываем прогресс
|
|
97
|
+
vscode.window.withProgress({
|
|
98
|
+
location: vscode.ProgressLocation.Notification,
|
|
99
|
+
title: `Индексация проекта "${projectName}"`,
|
|
100
|
+
cancellable: true
|
|
101
|
+
}, async (progress, token) => {
|
|
102
|
+
// Подключаемся к WebSocket для индексации
|
|
103
|
+
await sdk.projects.connectWebSocket();
|
|
104
|
+
|
|
105
|
+
return new Promise((resolve) => {
|
|
106
|
+
// Отслеживаем прогресс
|
|
107
|
+
sdk.projects.on('indexing_progress', (data) => {
|
|
108
|
+
progress.report({
|
|
109
|
+
message: `${data.progress}% (${data.processedFiles}/${data.totalFiles} файлов)`,
|
|
110
|
+
increment: data.progress
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// Отслеживаем завершение
|
|
115
|
+
sdk.projects.on('indexing_complete', (data) => {
|
|
116
|
+
if (data.success) {
|
|
117
|
+
vscode.window.showInformationMessage('Индексация успешно завершена!');
|
|
118
|
+
} else {
|
|
119
|
+
vscode.window.showWarningMessage(`Индексация завершена с ошибками: ${data.errorMessage || 'неизвестная ошибка'}`);
|
|
120
|
+
}
|
|
121
|
+
sdk.projects.disconnectWebSocket();
|
|
122
|
+
resolve();
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// Обработка отмены
|
|
126
|
+
token.onCancellationRequested(() => {
|
|
127
|
+
sdk.projects.stopIndexing(projectId)
|
|
128
|
+
.then(() => {
|
|
129
|
+
vscode.window.showInformationMessage('Индексация отменена');
|
|
130
|
+
sdk.projects.disconnectWebSocket();
|
|
131
|
+
resolve();
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
} catch (error) {
|
|
137
|
+
vscode.window.showErrorMessage(`Ошибка индексации: ${error.message}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Потоковый чат с мышлением
|
|
143
|
+
|
|
144
|
+
Пример использования потокового чата с мышлением:
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
// Регистрация команды чата с мышлением
|
|
148
|
+
context.subscriptions.push(
|
|
149
|
+
vscode.commands.registerCommand('solver.chatWithThinking', async () => {
|
|
150
|
+
try {
|
|
151
|
+
// Запрашиваем ввод от пользователя
|
|
152
|
+
const question = await vscode.window.showInputBox({
|
|
153
|
+
prompt: 'Введите вопрос'
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
if (!question) return;
|
|
157
|
+
|
|
158
|
+
// Создаем и показываем панель для результата
|
|
159
|
+
const panel = vscode.window.createWebviewPanel(
|
|
160
|
+
'chatWithThinking',
|
|
161
|
+
'Ответ с мышлением',
|
|
162
|
+
vscode.ViewColumn.Beside,
|
|
163
|
+
{ enableScripts: true }
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
// Начальный HTML для панели
|
|
167
|
+
panel.webview.html = `
|
|
168
|
+
<!DOCTYPE html>
|
|
169
|
+
<html>
|
|
170
|
+
<head>
|
|
171
|
+
<style>
|
|
172
|
+
body { font-family: var(--vscode-font-family); padding: 10px; }
|
|
173
|
+
.thinking { color: #666; font-style: italic; white-space: pre-wrap; }
|
|
174
|
+
.answer { white-space: pre-wrap; }
|
|
175
|
+
</style>
|
|
176
|
+
</head>
|
|
177
|
+
<body>
|
|
178
|
+
<h3>Вопрос: ${question}</h3>
|
|
179
|
+
<div class="thinking" id="thinking"></div>
|
|
180
|
+
<h4>Ответ:</h4>
|
|
181
|
+
<div class="answer" id="answer"></div>
|
|
182
|
+
</body>
|
|
183
|
+
</html>
|
|
184
|
+
`;
|
|
185
|
+
|
|
186
|
+
// Сообщения для чата
|
|
187
|
+
const messages = [
|
|
188
|
+
{ role: 'user', content: question }
|
|
189
|
+
];
|
|
190
|
+
|
|
191
|
+
// Опции для чата
|
|
192
|
+
const options = {
|
|
193
|
+
model: 'claude-3-7-sonnet-20240229',
|
|
194
|
+
thinking: true,
|
|
195
|
+
temperature: 0.7
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
// Обработчик событий чата
|
|
199
|
+
const handleEvent = (eventType, data) => {
|
|
200
|
+
if (eventType === 'thinking_delta' && data.thinking) {
|
|
201
|
+
// Обновляем содержимое мышления
|
|
202
|
+
panel.webview.postMessage({
|
|
203
|
+
command: 'appendThinking',
|
|
204
|
+
content: data.thinking
|
|
205
|
+
});
|
|
206
|
+
} else if (eventType === 'text_delta' && data.text) {
|
|
207
|
+
// Обновляем содержимое ответа
|
|
208
|
+
panel.webview.postMessage({
|
|
209
|
+
command: 'appendAnswer',
|
|
210
|
+
content: data.text
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
// Отправляем запрос с мышлением
|
|
216
|
+
await sdk.chat.streamChatWithThinking(
|
|
217
|
+
messages,
|
|
218
|
+
options,
|
|
219
|
+
handleEvent
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
// Настраиваем обработку сообщений в WebView
|
|
223
|
+
panel.webview.onDidReceiveMessage(message => {
|
|
224
|
+
const thinkingElement = document.getElementById('thinking');
|
|
225
|
+
const answerElement = document.getElementById('answer');
|
|
226
|
+
|
|
227
|
+
if (message.command === 'appendThinking') {
|
|
228
|
+
thinkingElement.textContent += message.content;
|
|
229
|
+
} else if (message.command === 'appendAnswer') {
|
|
230
|
+
answerElement.textContent += message.content;
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
} catch (error) {
|
|
235
|
+
vscode.window.showErrorMessage(`Ошибка чата: ${error.message}`);
|
|
236
|
+
}
|
|
237
|
+
})
|
|
238
|
+
);
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## Поиск в коде
|
|
242
|
+
|
|
243
|
+
Пример семантического поиска в проекте:
|
|
244
|
+
|
|
245
|
+
```typescript
|
|
246
|
+
// Поиск в проекте
|
|
247
|
+
async function searchInProject(projectId, query) {
|
|
248
|
+
try {
|
|
249
|
+
// Показываем индикатор прогресса
|
|
250
|
+
return vscode.window.withProgress({
|
|
251
|
+
location: vscode.ProgressLocation.Notification,
|
|
252
|
+
title: 'Поиск в проекте...',
|
|
253
|
+
cancellable: false
|
|
254
|
+
}, async (progress) => {
|
|
255
|
+
// Выполняем поиск
|
|
256
|
+
const results = await sdk.search.semanticSearch(projectId, {
|
|
257
|
+
query: query,
|
|
258
|
+
limit: 10,
|
|
259
|
+
includeContent: true
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
if (results.results.length === 0) {
|
|
263
|
+
vscode.window.showInformationMessage('Результаты не найдены');
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Отображаем результаты
|
|
268
|
+
const panel = vscode.window.createWebviewPanel(
|
|
269
|
+
'searchResults',
|
|
270
|
+
'Результаты поиска',
|
|
271
|
+
vscode.ViewColumn.Beside,
|
|
272
|
+
{ enableScripts: true }
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
// Формируем HTML для отображения результатов
|
|
276
|
+
panel.webview.html = `
|
|
277
|
+
<!DOCTYPE html>
|
|
278
|
+
<html>
|
|
279
|
+
<head>
|
|
280
|
+
<style>
|
|
281
|
+
body { font-family: var(--vscode-font-family); padding: 10px; }
|
|
282
|
+
.result { margin-bottom: 15px; padding: 10px; border: 1px solid #ccc; }
|
|
283
|
+
.path { cursor: pointer; color: var(--vscode-textLink-foreground); }
|
|
284
|
+
.snippet { background: var(--vscode-editor-inactiveSelectionBackground); padding: 10px; margin-top: 5px; white-space: pre-wrap; }
|
|
285
|
+
</style>
|
|
286
|
+
</head>
|
|
287
|
+
<body>
|
|
288
|
+
<h3>Результаты для: ${query}</h3>
|
|
289
|
+
${results.results.map((result, index) => `
|
|
290
|
+
<div class="result">
|
|
291
|
+
<div class="path" data-path="${result.filePath}" data-start="${result.startLine}" data-end="${result.endLine}">
|
|
292
|
+
${result.filePath}:${result.startLine}-${result.endLine}
|
|
293
|
+
</div>
|
|
294
|
+
<div class="snippet">${result.snippet || result.content || ''}</div>
|
|
295
|
+
</div>
|
|
296
|
+
`).join('')}
|
|
297
|
+
|
|
298
|
+
<script>
|
|
299
|
+
// Добавляем обработчик для открытия файлов
|
|
300
|
+
document.querySelectorAll('.path').forEach(elem => {
|
|
301
|
+
elem.addEventListener('click', () => {
|
|
302
|
+
const vscode = acquireVsCodeApi();
|
|
303
|
+
vscode.postMessage({
|
|
304
|
+
command: 'openFile',
|
|
305
|
+
filePath: elem.dataset.path,
|
|
306
|
+
startLine: parseInt(elem.dataset.start),
|
|
307
|
+
endLine: parseInt(elem.dataset.end)
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
</script>
|
|
312
|
+
</body>
|
|
313
|
+
</html>
|
|
314
|
+
`;
|
|
315
|
+
|
|
316
|
+
// Обработка сообщений от WebView
|
|
317
|
+
panel.webview.onDidReceiveMessage(
|
|
318
|
+
message => {
|
|
319
|
+
if (message.command === 'openFile') {
|
|
320
|
+
const uri = vscode.Uri.file(message.filePath);
|
|
321
|
+
vscode.workspace.openTextDocument(uri).then(doc => {
|
|
322
|
+
vscode.window.showTextDocument(doc).then(editor => {
|
|
323
|
+
const range = new vscode.Range(
|
|
324
|
+
new vscode.Position(message.startLine - 1, 0),
|
|
325
|
+
new vscode.Position(message.endLine - 1, 0)
|
|
326
|
+
);
|
|
327
|
+
editor.revealRange(range);
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
},
|
|
332
|
+
undefined,
|
|
333
|
+
context.subscriptions
|
|
334
|
+
);
|
|
335
|
+
|
|
336
|
+
return results;
|
|
337
|
+
});
|
|
338
|
+
} catch (error) {
|
|
339
|
+
vscode.window.showErrorMessage(`Ошибка поиска: ${error.message}`);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
```
|