solver-sdk
Version:
SDK для интеграции с Code Solver Backend API (совместимо с браузером и Node.js), с поддержкой функциональности мышления (Thinking Mode)
366 lines (290 loc) • 14 kB
Markdown
# Руководство по интеграции функциональности мышления (Thinking Mode)
В этом документе описывается полный процесс интеграции функциональности мышления в клиентские приложения с использованием SDK версии 1.7.2.
## Обзор функциональности
**Режим мышления** (Thinking Mode) - это расширенная функциональность, которая позволяет получать доступ к промежуточным рассуждениям языковой модели в процессе формирования ответа. Это дает следующие преимущества:
- Прозрачность в процессе генерации ответа
- Отладка и улучшение качества ответов
- Возможность показать пользователю как модель пришла к своему решению
- Поэтапное отображение процесса мышления в реальном времени (через WebSocket)
## Архитектура взаимодействия
```
Client (SDK) <--WebSocket--> NestJS Server <--HTTP Stream--> Anthropic API
```
Существует два способа работы с функциональностью мышления:
1. **REST API** - синхронный режим, где ответ возвращается после завершения генерации
2. **WebSocket** - потоковый режим, с получением событий мышления в реальном времени
## Интеграция через REST API
Простейший способ получить доступ к мышлению модели - использовать REST API:
```javascript
const response = await sdk.chat.chat([
{ role: 'user', content: 'Как работает алгоритм быстрой сортировки?' }
], {
model: 'claude-3-7-sonnet-20240229',
thinking: true
});
// Ход мыслей доступен в свойстве thinking первого элемента choices
const thinking = response.choices[0].thinking;
```
## Интеграция через WebSocket (рекомендуемый подход)
Интеграция через WebSocket позволяет получать события мышления в реальном времени и показывать пользователю как модель формирует ответ шаг за шагом.
### Шаг 1: Инициализация SDK и подключение WebSocket
```javascript
const sdk = new CodeSolverSDK({
baseURL: 'https://api.example.com',
apiKey: 'ваш-ключ-api'
});
// Подключаем WebSocket
await sdk.chat.connectWebSocket();
```
### Шаг 2: Определение обработчика событий
```javascript
// Функция обработки событий
function handleEvent(eventType, data) {
switch(eventType) {
case 'thinking_delta':
// Новый фрагмент мышления
console.log('Мышление:', data.text);
break;
case 'text_delta':
// Новый фрагмент ответа
console.log('Ответ:', data.text);
break;
case 'message_start':
console.log('Начало сообщения');
break;
case 'message_stop':
console.log('Завершение ответа');
break;
}
}
```
### Шаг 3: Отправка запроса с потоковой передачей мышления
```javascript
// Сообщения для отправки
const messages = [
{ role: 'user', content: 'Как реализовать алгоритм сортировки слиянием?' }
];
// Опции запроса
const options = {
model: 'claude-3-7-sonnet-20240229',
thinking: true, // Активируем режим мышления
temperature: 0.7
};
// Отправляем запрос с потоковым мышлением
const response = await sdk.chat.streamChatWithThinking(
messages,
options,
handleEvent
);
console.log(`Запрос успешно отправлен. Socket ID: ${response.socketId}`);
```
### Шаг 4: Отключение от сервера после использования
```javascript
// Отключаемся от WebSocket сервера
await sdk.chat.disconnectWebSocket();
```
## Полный пример интеграции в клиентское приложение
```javascript
class ThinkingModeIntegration {
constructor(apiKey, baseURL) {
this.sdk = new CodeSolverSDK({
baseURL,
apiKey
});
this.thinkingText = '';
this.responseText = '';
this.isProcessing = false;
}
// Инициализация и подключение к WebSocket
async connect() {
const response = await this.sdk.chat.connectWebSocket();
return response.socketId;
}
// Отправка запроса с мышлением
async sendWithThinking(messages, options = {}) {
this.isProcessing = true;
this.thinkingText = '';
this.responseText = '';
// Настраиваем опции по умолчанию
const defaultOptions = {
model: 'claude-3-7-sonnet-20240229',
thinking: true,
temperature: 0.7
};
const mergedOptions = { ...defaultOptions, ...options };
try {
// Отправляем запрос с обработчиком событий
const response = await this.sdk.chat.streamChatWithThinking(
messages,
mergedOptions,
this.handleEvent.bind(this)
);
return response;
} catch (error) {
console.error('Ошибка при отправке запроса:', error);
this.isProcessing = false;
throw error;
}
}
// Обработчик событий WebSocket
handleEvent(eventType, data) {
switch(eventType) {
case 'thinking_delta':
this.thinkingText += data.text || '';
// Вызываем колбэк для обновления UI мышления
if (this.onThinkingUpdate) {
this.onThinkingUpdate(this.thinkingText);
}
break;
case 'text_delta':
this.responseText += data.text || '';
// Вызываем колбэк для обновления UI ответа
if (this.onResponseUpdate) {
this.onResponseUpdate(this.responseText);
}
break;
case 'message_stop':
this.isProcessing = false;
// Вызываем колбэк завершения
if (this.onComplete) {
this.onComplete({
thinking: this.thinkingText,
response: this.responseText
});
}
break;
case 'error':
this.isProcessing = false;
// Вызываем колбэк ошибки
if (this.onError) {
this.onError(data);
}
break;
}
}
// Отключение от сервера
async disconnect() {
await this.sdk.chat.disconnectWebSocket();
}
// Регистрация обработчиков событий
registerCallbacks({
onThinkingUpdate,
onResponseUpdate,
onComplete,
onError
}) {
this.onThinkingUpdate = onThinkingUpdate;
this.onResponseUpdate = onResponseUpdate;
this.onComplete = onComplete;
this.onError = onError;
}
}
// Пример использования
async function main() {
const thinkingMode = new ThinkingModeIntegration(
'ваш-ключ-api',
'https://api.example.com'
);
// Подключаемся к WebSocket
await thinkingMode.connect();
// Регистрируем обработчики
thinkingMode.registerCallbacks({
onThinkingUpdate: (thinking) => {
console.log('Обновление мышления');
document.getElementById('thinkingOutput').innerHTML = thinking;
},
onResponseUpdate: (response) => {
console.log('Обновление ответа');
document.getElementById('finalAnswer').innerHTML = response;
},
onComplete: (result) => {
console.log('Завершено!');
document.getElementById('status').textContent = 'Готово';
},
onError: (error) => {
console.error('Ошибка:', error);
document.getElementById('status').textContent = 'Ошибка: ' + error.message;
}
});
// Отправляем запрос
const messages = [
{ role: 'user', content: 'Объясни, как работает алгоритм быстрой сортировки?' }
];
document.getElementById('status').textContent = 'Обработка...';
await thinkingMode.sendWithThinking(messages);
// После завершения работы
// await thinkingMode.disconnect();
}
```
## Рекомендации по интеграции в UI
При интеграции функциональности мышления в пользовательский интерфейс рекомендуется:
1. **Показывать индикатор загрузки** пока идет инициализация соединения
2. **Выделять шаги мышления** визуально отдельно от окончательного ответа
3. **Предусмотреть автоскроллинг** для длинных цепочек рассуждений
4. **Добавить возможность скрыть/показать** ход мыслей для пользователей
5. **Обеспечить обработку отключения** от сервера (например, при закрытии вкладки/приложения)
### Пример HTML/CSS структуры для отображения мышления
```html
<div class="thinking-container">
<div class="thinking-header">
<h3>Ход мыслей модели</h3>
<button id="toggleThinking">Скрыть</button>
<span id="status">Готово</span>
</div>
<div id="thinkingOutput" class="thinking-steps">
<!-- Шаги мышления будут добавляться здесь -->
</div>
<div class="final-answer">
<h3>Ответ модели</h3>
<div id="finalAnswer">
<!-- Финальный ответ будет здесь -->
</div>
</div>
</div>
```
## Отладка и устранение проблем
### Распространенные проблемы и их решения
1. **Нет соединения WebSocket**
- Проверьте, правильно ли указан baseURL
- Убедитесь, что порт не блокируется фаерволом
- Проверьте наличие CORS ограничений
- Используйте метод `sdk.getWebSocketClient().diagnoseConnection()` для диагностики
2. **Не приходят события мышления**
- Убедитесь, что активирован параметр `thinking: true`
- Проверьте, что соединение WebSocket активно
- Убедитесь, что используется поддерживаемая модель
3. **Разрыв соединения в процессе работы**
- Увеличьте timeout в настройках WebSocket
- Включите механизм ping/pong для поддержания соединения
- Используйте опцию `websocket.reconnect: true` в настройках SDK
### Включение расширенной диагностики
В SDK версии 1.7.2 добавлены мощные инструменты для диагностики WebSocket соединений:
```javascript
const sdk = new CodeSolverSDK({
baseURL: 'https://api.example.com',
apiKey: 'ваш-ключ-api',
websocket: {
debug: true, // Включаем подробное логирование
reconnect: true, // Автоматическое переподключение
reconnectAttempts: 5, // Количество попыток переподключения
reconnectDelay: 1000 // Задержка перед переподключением (мс)
}
});
// Включаем механизм ping/pong для поддержания соединения
const wsClient = sdk.getWebSocketClient();
wsClient.enablePingPong(30000, 3);
// Диагностика состояния соединения
const diagnostics = wsClient.diagnoseConnection();
console.log('Диагностика соединения:', diagnostics);
```
## Версии и совместимость
Функциональность мышления поддерживается в:
- SDK версии 1.5.0 и выше
- Потоковая передача мышления (streaming) полностью поддерживается с версии 1.7.2
- Backend API версии 1.5.0 и выше
- Совместима с моделями Claude 3 Opus, Claude 3 Sonnet и Claude 3 Haiku
## Дополнительные ресурсы
- [Архитектура потоковой передачи мышления](../THINKING_ARCHITECTURE.md)
- [Руководство по потоковой передаче мышления](../streaming-thinking-guide.md)
- [WebSocket API](../WEBSOCKET.md)
- [Документация Anthropic по потоковой передаче](https://docs.anthropic.com/en/api/messages-streaming)