OrbitPilot виджет чата — потоковая передача, перемещение, мобильность и голос
Что это такое
OrbitPilot теперь это глобальный плавающий виджет чата для вошедших в систему пользователей: кнопка 🛰 в углу открывает панель, которую можно использовать с любой страницы. Панель не блокирует доступ (продолжайте пользоваться, пока она открыта), перетаскивается, сворачивается, и она помнит свое место и ваш открытый разговор, когда вы перемещаетесь по сайту.
Новые возможности
- Потоковые ответы — ответ появляется слово за словом, а не после ожидания.
- Остановить — прервать ИИ в середине ответа. Остановка сохраняет все, что было написано до сих пор и не использует вопрос из вашего ежемесячного лимита.
- Скопировать / Скачать весь чат — кнопки вверху и внизу панели (скачивание в формате .txt).
- Скопировать одно сообщение — наведите курсор на любой пузырь, чтобы увидеть значок копирования.
- Развернуть окно, просмотреть вашу историю чата и начать Новый разговор.
- Голосовой ввод — нажмите на микрофон и говорите; ваши слова будут напечатаны за вас.
Гости (не вошедшие в систему) сохраняют оригинальное всплывающее окно чата на главной странице.
На вашем телефоне (мобильный)
- Панель пришпиливается к дну экрана и никогда не выходит за края, в любом ориентации — вращение телефона автоматически подстраивает её.
- Она уважает вырез и индикатор домашнего экрана (безопасные зоны) и использует живую высоту экрана, чтобы адресная строка браузера не перекрывала кнопку Отправить.
- После того как вы говорите и отправляете, поле очищается для вашего следующего вопроса — снова нажмите на микрофон, чтобы говорить для следующего поворота.
Для разработчиков
Потоковая передача требует асинхронного представления под ASGI (синхронный генератор буферизует перед
первым байтом). orbitpilot.views.orbitpilot_ask_stream является async def, возвращающим
StreamingHttpResponse через асинхронный генератор, который выдает серверные события
(meta → token… → done). Вся ORM/гейтовая обработка выполняется в двух СИНХРОННЫХ вспомогательных
(_prepare_ask_stream / _finalize_ask_stream) через
sync_to_async(thread_sensitive=True). Остановить = клиент прерывает
запрос → асинхронный генератор отменяется → частичный ответ сохраняется, а строка квоты не
записывается. Фронтенд находится в templates/_orbitpilot_widget.html +
static/css/orbitpilot-widget.css + static/js/orbitpilot-widget.js, включен
в base.html только для авторизованных пользователей.
Мобильная отзывчивость (Workstream E): весь виджет имеет
box-sizing: border-box, поэтому 1px граница учитывается внутри ширины (старый iPhone
overflow был width:100vw + border). Правило @media (max-width:575px) отменяет
100vw для left/right: env(safe-area-inset-*) + width:auto, размеры
с dvh (с vh запасом), и отступает композитор по
env(safe-area-inset-bottom). В JS сохраненная позиция перетаскивания на десктопе не применяется
на мобильном экране, и слушатель resize/orientationchange снова фиксирует
позицию через applyPos(). Очистка голоса: модуль речи хранит финализированный
saved буфер отдельно от ввода; send() теперь вызывает общий
resetVoice() (остановить распознавание, очистить таймер тишины, очистить saved) прямо
там, где он очищает input.value, так что следующий поворот начинается пустым.
Размер шрифта чата + исправление отправки на мобильных (2026-07-27)
- A− / A+ в заголовке виджета уменьшают/увеличивают текст чата. Ваш выбор запоминается
(сохраняется в браузере через
localStorageключop_widget_font) на протяжении страниц и сессий. Размер ограничивается от 12 до 22 пикселей. - Кнопка Отправить на телефонах: строка композитора теперь сохраняет кнопки Отправить (и микрофона) видимыми рядом с текстовым полем на узких экранах — раньше текстовое поле могло сдвигать Отправить за правый край.
Для разработчиков: разметка templates/_orbitpilot_widget.html, поведение
static/js/orbitpilot-widget.js (applyFont()/bumpFont(), восстановлено при инициализации), стилизация
static/css/orbitpilot-widget.css. Кнопки увеличивают --op-chat-font CSS переменную, читаемую телом сообщения + ввод; композитор использует min-width:0 на текстовом поле и flex:0 0 auto на
кнопках, так что Отправить никогда не будет сдвинута за экран.
Меню-гамбургер + полноэкранный режим (2026-07-27)
В заголовке виджета чата теперь есть ☰ меню и ⤡ полноэкранная кнопка:
- Ваши инструкции — постоянные заметки, которые ИИ всегда учитывает (как пользовательские
инструкции ChatGPT). Сохраняется в
OrbitPilotSettings.custom_user_promptчерезorbitpilot_custom_instructions; ограничено планом в соответствии с функциейcustom_prompt(заблокированное сообщение + ссылка на обновление появляется, если план этого не позволяет; сервер также накладывает это с кодом 403). - Загрузки — теперь четко две опции: "Только этот разговор"
(
orbitpilot_conversation_download) против "Вся моя история чата" (новыйorbitpilot_history_download). Кнопка на панели инструментов переименована в "⭭ Этот чат". - Память → Восстановить мою память сейчас — полное восстановление
(
orbitpilot_rebuild_memory) с запросом на подтверждение и предупреждением о стоимость (оно перечитывает все и повторно встраивает, что использует кредиты ИИ); оно не позволит начать восстановление, если одно уже выполняется.
Полноэкранный режим (⤡) открывает /orbitpilot/chat/ в новой вкладке, чат в стиле ChatGPT/Gemini в полный экран, который повторно использует ТАЖЖЕ виджет (через класс тела op-fullpage) — таким образом, переключение между
маленьким виджетом и полной страницей сохраняет тот же разговор (общий op_widget_conv localStorage +
слушатель событий storage). Также: A− / A+ изменяют шрифт чата (запоминается), а на
телефоне кнопка Отправить остается видимой рядом с микрофоном.
Для разработчиков: разметка templates/_orbitpilot_widget.html, поведение
static/js/orbitpilot-widget.js, стилизация static/css/orbitpilot-widget.css; полноэкранный просмотр
orbitpilot.views.orbitpilot_chat → orbitpilot/templates/orbitpilot/chat_full.html.
Быстрое обновление против полного восстановления (мягкая/жесткая память, 2026-07-27)
Меню 🧠 Память виджета теперь предлагает два восстановления:
- ⚡ Быстрое обновление (мягкое) — перечитывается и повторно встраивается только те элементы, которые вы изменили с момента последнего построения; неизмененные элементы сохраняют свои существующие встраивания, удаленные элементы удаляются. Мыслите об этом как о "добавлении" больших вычислений, потому что стоимость встраивания OpenAI зависит от дельты, а не от всей корпуса.
- 🔄 Полное восстановление (жесткое) — перечитывает и повторно встраивает всё с нуля (использует больше кредитов ИИ). Используйте это только если что-то выглядит неправильно.
Для разработчиков: run_memory_build(user, settings, build, incremental=True) сравнивает новые
фрагменты с хранимыми по ключу (source_key, source_id, chunk_index, content_hash)
перед вызовом embed_chunks, так что только новые/измененные фрагменты встраиваются; устаревшие строки удаляются в том же атомарном блоке; неизмененные строки остаются без изменения. Режим задается в
OrbitPilotMemoryBuild.incremental (миграция orbitpilot/0025) и устанавливается через
orbitpilot_rebuild_memory из mode=soft|hard. Если incremental не указан,
run_memory_build читает это из записи построения. Полный/жесткий путь сохраняет точное предыдущее атомарное
удаление + повторное встраивание.
Исправления, управляемые чатом (2026-07-28)
Анализ реальных (с удаленными PII) разговоров OrbitPilot выявил четыре исправления:
- Сломанные ссылки ИИ (
your-app-link): модель придумала домен, когда получила относительные пути из устаревшей брошюры. Теперь (а) проверка состояния системы предупреждает, еслиSITE_URLявляется localhost в продакшене, и (б)orbitpilot.services.heal_links()переписывает любую ссылки-заполнитель/localhost базу на реальный хост сайта в каждом ответе (потоковом/блокирующем/гостевом) — так что ссылки работают даже до восстановления. Постоянное исправление (SITE_URL+ восстановление) находится в Админском чек-листе установки. - «Список моих Winks» теперь работает:
pipeline/retrieve.py add_list_intent_sources()внедряет ВСЕ фрагменты источника, когда запрос является запросом для перечисления ("список/показать/все мои winks/задачи/события"), а снимки рабочего пространства нумеруются; так что ИИ показывает настоящие элементы, а не только число. - Кликабельные действия: действия теперь представлены как
{label, url}. Реальная ссылка навигации отображается как кликаемая кнопка (открывается в новой вкладке); в противном случае это предварительно заполненная чипа. Исправлено по всему виджету, в модальном окне для гостей (которое было раньше без действий) и в результатах полноэкранного режима. Также теперь встроенные ссылки на ответы открываются в новой вкладке. - Полировка подсказки: основная подсказка ответа прекращает избыточно повторять главную цель пользователя и обрабатывает "что изменилось с вчерашнего дня" корректно (она работает от текущего снимка, а не от истории по дням).
Для разработчиков: orbitpilot/services.py (heal_links, request_base,
split_answer_actions теперь возвращает словари, слой действий для гостей),
pipeline/retrieve.py (add_list_intent_sources), adminapp/diagnostics.py
(_check_site_url), виджет JS + home.html (отрисовка действий + DOMPurify target=_blank hook),
aihub/prompt_registry.py (основные значения + значения next_actions; обновляется на нетронутых сеянцах Defaults через
aihub/0007).
This guide was translated automatically. Read the English original.