Skip to main content
OrbitPilot

OrbitPilot виджет чата — потоковая передача, перемещение, мобильность и голос

Что это такое

OrbitPilot теперь это глобальный плавающий виджет чата для вошедших в систему пользователей: кнопка 🛰 в углу открывает панель, которую можно использовать с любой страницы. Панель не блокирует доступ (продолжайте пользоваться, пока она открыта), перетаскивается, сворачивается, и она помнит свое место и ваш открытый разговор, когда вы перемещаетесь по сайту.

Новые возможности

  • Потоковые ответы — ответ появляется слово за словом, а не после ожидания.
  • Остановить — прервать ИИ в середине ответа. Остановка сохраняет все, что было написано до сих пор и не использует вопрос из вашего ежемесячного лимита.
  • Скопировать / Скачать весь чат — кнопки вверху и внизу панели (скачивание в формате .txt).
  • Скопировать одно сообщение — наведите курсор на любой пузырь, чтобы увидеть значок копирования.
  • Развернуть окно, просмотреть вашу историю чата и начать Новый разговор.
  • Голосовой ввод — нажмите на микрофон и говорите; ваши слова будут напечатаны за вас.

Гости (не вошедшие в систему) сохраняют оригинальное всплывающее окно чата на главной странице.

На вашем телефоне (мобильный)

  • Панель пришпиливается к дну экрана и никогда не выходит за края, в любом ориентации — вращение телефона автоматически подстраивает её.
  • Она уважает вырез и индикатор домашнего экрана (безопасные зоны) и использует живую высоту экрана, чтобы адресная строка браузера не перекрывала кнопку Отправить.
  • После того как вы говорите и отправляете, поле очищается для вашего следующего вопроса — снова нажмите на микрофон, чтобы говорить для следующего поворота.

Для разработчиков

Потоковая передача требует асинхронного представления под ASGI (синхронный генератор буферизует перед первым байтом). orbitpilot.views.orbitpilot_ask_stream является async def, возвращающим StreamingHttpResponse через асинхронный генератор, который выдает серверные события (metatoken… → 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, размеры с dvhvh запасом), и отступает композитор по 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_chatorbitpilot/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.

🪐 OrbitPilot