solver-sdk
Version:
SDK для интеграции с Code Solver Backend API (совместимо с браузером и Node.js), с поддержкой функциональности мышления (Thinking Mode)
221 lines (169 loc) • 10.4 kB
Markdown
# Архитектура системы потоковой передачи мышления
Этот документ описывает техническую архитектуру системы потоковой передачи мышления в SDK и взаимодействие между клиентом, сервером и API Anthropic.
## Общая схема взаимодействия
```
Client (SDK) <--WebSocket--> NestJS Server <--HTTP Stream--> Anthropic API
```
## Компоненты системы
### 1. Клиент (SDK)
SDK предоставляет API для:
- Инициации WebSocket соединения
- Отправки запросов с активированным режимом мышления
- Обработки событий через callback-функцию
- Управления соединениями и сессиями
### 2. Сервер (NestJS)
Сервер выполняет несколько ключевых функций:
- Обрабатывает HTTP-запросы от SDK
- Создает и управляет WebSocket соединениями
- Отправляет запросы к Anthropic API
- Преобразует и перенаправляет события от Anthropic API клиентам
### 3. Anthropic API
API Anthropic предоставляет:
- Потоковую передачу ответов модели
- События мышления для моделей, поддерживающих расширенное мышление
- Различные типы дельта-событий для инкрементальной передачи контента
## Порядок работы системы
1. **Инициализация WebSocket соединения:**
- SDK вызывает метод подключения WebSocket
- Сервер создает соединение и назначает `socketId`
- SDK сохраняет `socketId` для использования в запросах
2. **Отправка запроса на обработку:**
- SDK отправляет запрос с параметром `thinking: true` и указанным `socketId`
- Сервер создает сессию рассуждения и связывает ее с WebSocket соединением
- Сервер инициирует потоковый запрос к Anthropic API
3. **Обработка потока данных:**
- Anthropic API отправляет потоковые события (SSE) серверу
- Сервер преобразует SSE события в WebSocket события
- Сервер отправляет события соответствующим клиентам
4. **Завершение обработки:**
- Anthropic API отправляет финальное событие `message_stop`
- Сервер пересылает событие клиенту и завершает сессию
- SDK вызывает обработчик `message_stop` и может закрыть соединение
## Потоки данных и события
### События от Anthropic API
Anthropic API отправляет следующие основные типы событий:
```
1. message_start
2. content_block_start (thinking block)
3. content_block_delta (thinking_delta) x N
4. content_block_stop
5. content_block_start (text block)
6. content_block_delta (text_delta) x M
7. content_block_stop
8. message_stop
```
### Преобразование событий
Сервер преобразует события от Anthropic API в формат WebSocket:
| Событие Anthropic API | WebSocket событие | Данные |
|----------------------|-------------------|--------|
| message_start | message_start | { id, model, type } |
| content_block_start (thinking) | thinking_block_start | { index, type } |
| content_block_delta (thinking_delta) | thinking_delta + thinking_block_delta | { text, thinking, index } |
| content_block_stop (thinking) | thinking_block_stop | { index, type } |
| content_block_start (text) | content_block_start | { index, type } |
| content_block_delta (text_delta) | text_delta + content_block_delta | { text, index } |
| content_block_stop (text) | content_block_stop | { index, type } |
| message_stop | message_stop | { type } |
## Особенности реализации
### 1. WebSocket архитектура
- Используется Socket.IO для WebSocket коммуникации
- Соединения организованы по namespace `/reasoning`
- Используется корректный path `/socket.io` без завершающего слеша
### 2. Обработка событий мышления
- События мышления (`thinking_delta`) передаются в двух форматах:
1. `thinking_delta` с полями `text` и `thinking` для совместимости с различными клиентами
2. `thinking_block_delta` с полем `delta` для совместимости с SDK тестами
### 3. Потоки данных
Система поддерживает два параллельных потока данных:
- Поток мышления (отображает процесс рассуждения модели)
- Поток ответа (финальный ответ модели после рассуждения)
### 4. Работа с многопроцессными средами
При использовании SDK в многопроцессных средах:
- WebSocket соединение должно быть инициализировано в одном процессе
- События должны передаваться между процессами через IPC
- Необходима буферизация событий для предотвращения потери данных
## Диагностика и устранение проблем
### Типичные проблемы и их решение
| Проблема | Возможные причины | Решение |
|----------|-------------------|---------|
| Нет подключения WebSocket | Неверный URL, CORS, блокировка порта | Проверьте сетевые настройки, логи сервера |
| Не приходят события thinking_delta | Проблема с socketId, неверный формат запроса | Проверьте передачу socketId, включение параметра thinking |
| Отключение в середине потока | Таймаут, ошибка сервера | Используйте механизм переподключения, проверьте логи сервера |
| Неправильный формат данных | Несоответствие между версиями клиента и сервера | Обновите SDK или сервер до последней версии |
### Диагностические инструменты
- Подробные логи на серверной стороне
- Индикация полученных событий в клиентской части
- Мониторинг состояния WebSocket соединений
## Рекомендации по оптимизации
### Клиентская сторона
- Используйте буферизацию событий для экономии ресурсов UI
- Применяйте дедупликацию и фильтрацию повторяющихся событий
- Добавьте индикаторы прогресса для длительных операций
### Серверная сторона
- Оптимизируйте структуру данных для минимизации трафика
- Используйте пулинг WebSocket соединений для высоконагруженных систем
- Применяйте компрессию данных для больших объемов текста
## Примеры использования
### Базовый пример
```javascript
// Инициализация SDK и WebSocket
const sdk = new CodeSolverSDK({ baseURL: 'https://api.example.com' });
const wsClient = sdk.getWebSocketClient();
await wsClient.connect();
// Обработчик событий
const handleEvent = (eventType, data) => {
if (eventType === 'thinking_delta') {
console.log('Thinking:', data.text || data.thinking);
} else if (eventType === 'text_delta') {
console.log('Response:', data.text);
}
};
// Отправка запроса с thinking
const response = await sdk.chat.streamChatWithThinking(
[{ role: 'user', content: 'Explain quantum computing' }],
{
model: 'claude-3-7-sonnet-20240229',
thinking: true
},
handleEvent
);
```
### Расширенный пример с обработкой ошибок
```javascript
// Инициализация с обработкой ошибок
try {
const wsClient = sdk.getWebSocketClient();
await wsClient.connect();
// Обработчик с поддержкой ошибок
const handleEvent = (eventType, data) => {
switch(eventType) {
case 'thinking_delta':
updateThinkingUI(data.text || data.thinking);
break;
case 'text_delta':
updateResponseUI(data.text);
break;
case 'error':
showError(`Error: ${data.message}`);
break;
case 'disconnect':
showWarning('Connection lost, attempting to reconnect...');
reconnect();
break;
}
};
// Отправка запроса
const response = await sdk.chat.streamChatWithThinking(
messages,
options,
handleEvent
);
} catch (error) {
console.error('Failed to connect:', error);
showFatalError(error.message);
}
```
## Дополнительные ресурсы
- [Документация Anthropic по потоковой передаче](https://docs.anthropic.com/en/api/messages-streaming)
- [Streaming Thinking Guide](./streaming-thinking-guide.md)
- [WebSocket Documentation](./WEBSOCKET.md)