Внешний (public-share) AI-чат расходится с внутренним: нет стриминга/typing — переиспользовать внутренний код #41
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
Внешний AI-чат на публичных шарах ощущается заметно хуже внутреннего: нет анимированного «печатает…» (typing) индикатора и ответ не выглядит стримящимся. Внутренний чат это уже умеет и отлажен — внешний переписан отдельным минимальным виджетом и расходится по UX.
Что в коде
Внутренний чат —
apps/client/src/features/ai-chat/— богатый, отлаженный пайплайн:/ai-chat/stream(services/ai-chat-service.ts,queries/ai-chat-query.ts);components/typing-indicator.tsx+ логикаshowTypingIndicator()вcomponents/message-list.tsx(мостит паузу до первых токенов);components/tool-call-card.tsx),message-item/message-list, история диалогов.Внешний чат —
apps/client/src/features/share/components/share-ai-widget.tsx(~233 строки) — отдельная минимальная реализация:useChat(@ai-sdk/react) +DefaultChatTransportна/api/shares/ai/stream— то есть транспорт стриминговый;getMessageText()+<Text style={{ whiteSpace: "pre-wrap" }}>), без markdown;isStreaming;features/ai-chat(импортирует толькоuseChat).Итог расхождения: нет анимированного typing, ответ выглядит не-стримящимся (плоский текст без инкрементального markdown), нет tool-call карточек.
Почему так получилось
Похоже, public-share-assistant (PR #14) сделали отдельным тонким виджетом под анонимный/публичный контекст (другой эндпоинт
/api/shares/ai/stream,credentials: "omit", без auth и без conversation-store), а UI написали с нуля вместо переиспользования внутреннего, уже отлаженного чата.Предложение
Свести оба чата к общему отлаженному коду:
features/ai-chatпереиспользуемые презентационные части (message-list,message-item,typing-indicator, markdown-рендер,tool-call-card) в общий слой, не завязанный на внутренний транспорт/auth./ai-chat/streamvs публичный/api/shares/ai/stream,credentials, наличие/отсутствие conversation-store. Оба уже на AI SDK, так что общий рендер сообщений и typing-логика переиспользуемы.share-ai-widget.tsxповерх этого общего слоя — получить тот же стриминг / typing / markdown / tool-cards, что и внутри.Критерии готовности (DoD)
Затронутые файлы (ориентир)
apps/client/src/features/ai-chat/components/{message-list,message-item,typing-indicator,tool-call-card}.tsxapps/client/src/features/ai-chat/utils/{chat-markdown,markdown,tool-parts}.*apps/client/src/features/share/components/share-ai-widget.tsx