diff --git a/docs/OPEN_QUESTIONS.md b/docs/OPEN_QUESTIONS.md index 9d13625..e9c8812 100644 --- a/docs/OPEN_QUESTIONS.md +++ b/docs/OPEN_QUESTIONS.md @@ -32,6 +32,19 @@ ## Журнал решений по ходу (дополняется автоматически во время работы) +### ⚠️ Конкурентность вызовов MCP и состояние сессии +MCP-сервер обрабатывает запросы **конкурентно**. Цикл моделирования с реестром эскизов по id +(`sketch_create` → `sketch_add_*`) предполагает, что клиент **ждёт ответа** на каждый вызов перед +следующим (нормальное поведение LLM-клиентов). При «конвейерной» отправке зависимых вызовов +возможна гонка (id ещё не зарегистрирован). STA-диспетчер сериализует COM, но не порядок постановки задач. +**На проработку:** нужна ли серверная сериализация вызовов инструментов (очередь) для надёжности +stateful-сессии? Пока полагаемся на последовательное поведение клиента. + +### ✅ Возврат изображения: ImageContentBlock.FromBytes +Поле `ImageContentBlock.Data` хранит **base64-байты**, а не сырые. Сырые байты PNG нужно +передавать через `ImageContentBlock.FromBytes(bytes, mimeType)` — он сам кодирует. Прямое +присваивание `Data = rawBytes` портит изображение на проводе. Исправлено в VisionTools. + ### ✅ Снимок 3D: рендер через файл, а не resultArrayBytes `ksDocument3D.SaveAsToRasterFormat(fileName, param)` при **непустом** `fileName` возвращает TRUE, пишет корректный PNG на диск, но `param.resultArrayBytes` остаётся **пустым**. Поэтому diff --git a/src/Kompas.Mcp.Host/Tools/VisionTools.cs b/src/Kompas.Mcp.Host/Tools/VisionTools.cs index eb00409..7cc8f03 100644 --- a/src/Kompas.Mcp.Host/Tools/VisionTools.cs +++ b/src/Kompas.Mcp.Host/Tools/VisionTools.cs @@ -17,10 +17,7 @@ public sealed class VisionTools(KompasSession session, SnapshotService snapshot) { await session.ConnectAsync(); var snap = await snapshot.CaptureActiveModelAsync(resolution: resolution); - return new ImageContentBlock - { - Data = snap.Bytes, - MimeType = snap.MimeType, - }; + // FromBytes хранит сырые байты и сам кодирует их в base64 для поля Data. + return ImageContentBlock.FromBytes(snap.Bytes, snap.MimeType); } }