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,366 @@
1
+ # Руководство по интеграции функциональности мышления (Thinking Mode)
2
+
3
+ В этом документе описывается полный процесс интеграции функциональности мышления в клиентские приложения с использованием SDK версии 1.7.2.
4
+
5
+ ## Обзор функциональности
6
+
7
+ **Режим мышления** (Thinking Mode) - это расширенная функциональность, которая позволяет получать доступ к промежуточным рассуждениям языковой модели в процессе формирования ответа. Это дает следующие преимущества:
8
+
9
+ - Прозрачность в процессе генерации ответа
10
+ - Отладка и улучшение качества ответов
11
+ - Возможность показать пользователю как модель пришла к своему решению
12
+ - Поэтапное отображение процесса мышления в реальном времени (через WebSocket)
13
+
14
+ ## Архитектура взаимодействия
15
+
16
+ ```
17
+ Client (SDK) <--WebSocket--> NestJS Server <--HTTP Stream--> Anthropic API
18
+ ```
19
+
20
+ Существует два способа работы с функциональностью мышления:
21
+
22
+ 1. **REST API** - синхронный режим, где ответ возвращается после завершения генерации
23
+ 2. **WebSocket** - потоковый режим, с получением событий мышления в реальном времени
24
+
25
+ ## Интеграция через REST API
26
+
27
+ Простейший способ получить доступ к мышлению модели - использовать REST API:
28
+
29
+ ```javascript
30
+ const response = await sdk.chat.chat([
31
+ { role: 'user', content: 'Как работает алгоритм быстрой сортировки?' }
32
+ ], {
33
+ model: 'claude-3-7-sonnet-20240229',
34
+ thinking: true
35
+ });
36
+
37
+ // Ход мыслей доступен в свойстве thinking первого элемента choices
38
+ const thinking = response.choices[0].thinking;
39
+ ```
40
+
41
+ ## Интеграция через WebSocket (рекомендуемый подход)
42
+
43
+ Интеграция через WebSocket позволяет получать события мышления в реальном времени и показывать пользователю как модель формирует ответ шаг за шагом.
44
+
45
+ ### Шаг 1: Инициализация SDK и подключение WebSocket
46
+
47
+ ```javascript
48
+ const sdk = new CodeSolverSDK({
49
+ baseURL: 'https://api.example.com',
50
+ apiKey: 'ваш-ключ-api'
51
+ });
52
+
53
+ // Подключаем WebSocket
54
+ await sdk.chat.connectWebSocket();
55
+ ```
56
+
57
+ ### Шаг 2: Определение обработчика событий
58
+
59
+ ```javascript
60
+ // Функция обработки событий
61
+ function handleEvent(eventType, data) {
62
+ switch(eventType) {
63
+ case 'thinking_delta':
64
+ // Новый фрагмент мышления
65
+ console.log('Мышление:', data.text);
66
+ break;
67
+
68
+ case 'text_delta':
69
+ // Новый фрагмент ответа
70
+ console.log('Ответ:', data.text);
71
+ break;
72
+
73
+ case 'message_start':
74
+ console.log('Начало сообщения');
75
+ break;
76
+
77
+ case 'message_stop':
78
+ console.log('Завершение ответа');
79
+ break;
80
+ }
81
+ }
82
+ ```
83
+
84
+ ### Шаг 3: Отправка запроса с потоковой передачей мышления
85
+
86
+ ```javascript
87
+ // Сообщения для отправки
88
+ const messages = [
89
+ { role: 'user', content: 'Как реализовать алгоритм сортировки слиянием?' }
90
+ ];
91
+
92
+ // Опции запроса
93
+ const options = {
94
+ model: 'claude-3-7-sonnet-20240229',
95
+ thinking: true, // Активируем режим мышления
96
+ temperature: 0.7
97
+ };
98
+
99
+ // Отправляем запрос с потоковым мышлением
100
+ const response = await sdk.chat.streamChatWithThinking(
101
+ messages,
102
+ options,
103
+ handleEvent
104
+ );
105
+
106
+ console.log(`Запрос успешно отправлен. Socket ID: ${response.socketId}`);
107
+ ```
108
+
109
+ ### Шаг 4: Отключение от сервера после использования
110
+
111
+ ```javascript
112
+ // Отключаемся от WebSocket сервера
113
+ await sdk.chat.disconnectWebSocket();
114
+ ```
115
+
116
+ ## Полный пример интеграции в клиентское приложение
117
+
118
+ ```javascript
119
+ class ThinkingModeIntegration {
120
+ constructor(apiKey, baseURL) {
121
+ this.sdk = new CodeSolverSDK({
122
+ baseURL,
123
+ apiKey
124
+ });
125
+
126
+ this.thinkingText = '';
127
+ this.responseText = '';
128
+ this.isProcessing = false;
129
+ }
130
+
131
+ // Инициализация и подключение к WebSocket
132
+ async connect() {
133
+ const response = await this.sdk.chat.connectWebSocket();
134
+ return response.socketId;
135
+ }
136
+
137
+ // Отправка запроса с мышлением
138
+ async sendWithThinking(messages, options = {}) {
139
+ this.isProcessing = true;
140
+ this.thinkingText = '';
141
+ this.responseText = '';
142
+
143
+ // Настраиваем опции по умолчанию
144
+ const defaultOptions = {
145
+ model: 'claude-3-7-sonnet-20240229',
146
+ thinking: true,
147
+ temperature: 0.7
148
+ };
149
+
150
+ const mergedOptions = { ...defaultOptions, ...options };
151
+
152
+ try {
153
+ // Отправляем запрос с обработчиком событий
154
+ const response = await this.sdk.chat.streamChatWithThinking(
155
+ messages,
156
+ mergedOptions,
157
+ this.handleEvent.bind(this)
158
+ );
159
+
160
+ return response;
161
+ } catch (error) {
162
+ console.error('Ошибка при отправке запроса:', error);
163
+ this.isProcessing = false;
164
+ throw error;
165
+ }
166
+ }
167
+
168
+ // Обработчик событий WebSocket
169
+ handleEvent(eventType, data) {
170
+ switch(eventType) {
171
+ case 'thinking_delta':
172
+ this.thinkingText += data.text || '';
173
+
174
+ // Вызываем колбэк для обновления UI мышления
175
+ if (this.onThinkingUpdate) {
176
+ this.onThinkingUpdate(this.thinkingText);
177
+ }
178
+ break;
179
+
180
+ case 'text_delta':
181
+ this.responseText += data.text || '';
182
+
183
+ // Вызываем колбэк для обновления UI ответа
184
+ if (this.onResponseUpdate) {
185
+ this.onResponseUpdate(this.responseText);
186
+ }
187
+ break;
188
+
189
+ case 'message_stop':
190
+ this.isProcessing = false;
191
+
192
+ // Вызываем колбэк завершения
193
+ if (this.onComplete) {
194
+ this.onComplete({
195
+ thinking: this.thinkingText,
196
+ response: this.responseText
197
+ });
198
+ }
199
+ break;
200
+
201
+ case 'error':
202
+ this.isProcessing = false;
203
+
204
+ // Вызываем колбэк ошибки
205
+ if (this.onError) {
206
+ this.onError(data);
207
+ }
208
+ break;
209
+ }
210
+ }
211
+
212
+ // Отключение от сервера
213
+ async disconnect() {
214
+ await this.sdk.chat.disconnectWebSocket();
215
+ }
216
+
217
+ // Регистрация обработчиков событий
218
+ registerCallbacks({
219
+ onThinkingUpdate,
220
+ onResponseUpdate,
221
+ onComplete,
222
+ onError
223
+ }) {
224
+ this.onThinkingUpdate = onThinkingUpdate;
225
+ this.onResponseUpdate = onResponseUpdate;
226
+ this.onComplete = onComplete;
227
+ this.onError = onError;
228
+ }
229
+ }
230
+
231
+ // Пример использования
232
+ async function main() {
233
+ const thinkingMode = new ThinkingModeIntegration(
234
+ 'ваш-ключ-api',
235
+ 'https://api.example.com'
236
+ );
237
+
238
+ // Подключаемся к WebSocket
239
+ await thinkingMode.connect();
240
+
241
+ // Регистрируем обработчики
242
+ thinkingMode.registerCallbacks({
243
+ onThinkingUpdate: (thinking) => {
244
+ console.log('Обновление мышления');
245
+ document.getElementById('thinkingOutput').innerHTML = thinking;
246
+ },
247
+ onResponseUpdate: (response) => {
248
+ console.log('Обновление ответа');
249
+ document.getElementById('finalAnswer').innerHTML = response;
250
+ },
251
+ onComplete: (result) => {
252
+ console.log('Завершено!');
253
+ document.getElementById('status').textContent = 'Готово';
254
+ },
255
+ onError: (error) => {
256
+ console.error('Ошибка:', error);
257
+ document.getElementById('status').textContent = 'Ошибка: ' + error.message;
258
+ }
259
+ });
260
+
261
+ // Отправляем запрос
262
+ const messages = [
263
+ { role: 'user', content: 'Объясни, как работает алгоритм быстрой сортировки?' }
264
+ ];
265
+
266
+ document.getElementById('status').textContent = 'Обработка...';
267
+
268
+ await thinkingMode.sendWithThinking(messages);
269
+
270
+ // После завершения работы
271
+ // await thinkingMode.disconnect();
272
+ }
273
+ ```
274
+
275
+ ## Рекомендации по интеграции в UI
276
+
277
+ При интеграции функциональности мышления в пользовательский интерфейс рекомендуется:
278
+
279
+ 1. **Показывать индикатор загрузки** пока идет инициализация соединения
280
+ 2. **Выделять шаги мышления** визуально отдельно от окончательного ответа
281
+ 3. **Предусмотреть автоскроллинг** для длинных цепочек рассуждений
282
+ 4. **Добавить возможность скрыть/показать** ход мыслей для пользователей
283
+ 5. **Обеспечить обработку отключения** от сервера (например, при закрытии вкладки/приложения)
284
+
285
+ ### Пример HTML/CSS структуры для отображения мышления
286
+
287
+ ```html
288
+ <div class="thinking-container">
289
+ <div class="thinking-header">
290
+ <h3>Ход мыслей модели</h3>
291
+ <button id="toggleThinking">Скрыть</button>
292
+ <span id="status">Готово</span>
293
+ </div>
294
+
295
+ <div id="thinkingOutput" class="thinking-steps">
296
+ <!-- Шаги мышления будут добавляться здесь -->
297
+ </div>
298
+
299
+ <div class="final-answer">
300
+ <h3>Ответ модели</h3>
301
+ <div id="finalAnswer">
302
+ <!-- Финальный ответ будет здесь -->
303
+ </div>
304
+ </div>
305
+ </div>
306
+ ```
307
+
308
+ ## Отладка и устранение проблем
309
+
310
+ ### Распространенные проблемы и их решения
311
+
312
+ 1. **Нет соединения WebSocket**
313
+ - Проверьте, правильно ли указан baseURL
314
+ - Убедитесь, что порт не блокируется фаерволом
315
+ - Проверьте наличие CORS ограничений
316
+ - Используйте метод `sdk.getWebSocketClient().diagnoseConnection()` для диагностики
317
+
318
+ 2. **Не приходят события мышления**
319
+ - Убедитесь, что активирован параметр `thinking: true`
320
+ - Проверьте, что соединение WebSocket активно
321
+ - Убедитесь, что используется поддерживаемая модель
322
+
323
+ 3. **Разрыв соединения в процессе работы**
324
+ - Увеличьте timeout в настройках WebSocket
325
+ - Включите механизм ping/pong для поддержания соединения
326
+ - Используйте опцию `websocket.reconnect: true` в настройках SDK
327
+
328
+ ### Включение расширенной диагностики
329
+
330
+ В SDK версии 1.7.2 добавлены мощные инструменты для диагностики WebSocket соединений:
331
+
332
+ ```javascript
333
+ const sdk = new CodeSolverSDK({
334
+ baseURL: 'https://api.example.com',
335
+ apiKey: 'ваш-ключ-api',
336
+ websocket: {
337
+ debug: true, // Включаем подробное логирование
338
+ reconnect: true, // Автоматическое переподключение
339
+ reconnectAttempts: 5, // Количество попыток переподключения
340
+ reconnectDelay: 1000 // Задержка перед переподключением (мс)
341
+ }
342
+ });
343
+
344
+ // Включаем механизм ping/pong для поддержания соединения
345
+ const wsClient = sdk.getWebSocketClient();
346
+ wsClient.enablePingPong(30000, 3);
347
+
348
+ // Диагностика состояния соединения
349
+ const diagnostics = wsClient.diagnoseConnection();
350
+ console.log('Диагностика соединения:', diagnostics);
351
+ ```
352
+
353
+ ## Версии и совместимость
354
+
355
+ Функциональность мышления поддерживается в:
356
+ - SDK версии 1.5.0 и выше
357
+ - Потоковая передача мышления (streaming) полностью поддерживается с версии 1.7.2
358
+ - Backend API версии 1.5.0 и выше
359
+ - Совместима с моделями Claude 3 Opus, Claude 3 Sonnet и Claude 3 Haiku
360
+
361
+ ## Дополнительные ресурсы
362
+
363
+ - [Архитектура потоковой передачи мышления](../THINKING_ARCHITECTURE.md)
364
+ - [Руководство по потоковой передаче мышления](../streaming-thinking-guide.md)
365
+ - [WebSocket API](../WEBSOCKET.md)
366
+ - [Документация Anthropic по потоковой передаче](https://docs.anthropic.com/en/api/messages-streaming)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "solver-sdk",
3
- "version": "1.7.2",
3
+ "version": "1.7.4",
4
4
  "description": "SDK для интеграции с Code Solver Backend API (совместимо с браузером и Node.js), с поддержкой функциональности мышления (Thinking Mode)",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -24,7 +24,8 @@
24
24
  "files": [
25
25
  "dist/**/*",
26
26
  "README.md",
27
- "LICENSE"
27
+ "LICENSE",
28
+ "docs/**/*"
28
29
  ],
29
30
  "scripts": {
30
31
  "clean": "rimraf dist",