Перейти к основному содержимому

Work: изолированные рабочие области

Work — встроенный интерфейс агентов программирования Libre WebUI. Каждая задача сочетает долговечный разговор, явный маршрут провайдера и отдельную файловую систему /workspace. Модель может просматривать и менять файлы, выполнять команды в контейнере Docker или Pod Kubernetes задачи и запускать предпросмотр.

Work реализован напрямую, без Libre Claw или демона.

Только доверенные пользователи

Все API требуют аутентифицированную учётную запись с доступом. По умолчанию это только администраторы; администратор может открыть доступ всем активным пользователям на вкладке «Управление пользователями» в Settings (папки хоста всегда остаются административными, поскольку подключают пути сервера). Work намеренно позволяет выполнять произвольные команды оболочки в песочнице. Задачи используют исходящий трафик, если выбранная именованная политика его не отключает. Считайте каждого допущенного пользователя доверенным оператором среды выполнения, а не просто пользователем чата.

Основные возможности выпуска

  • Отдельные Work и Chat с видимым режимом.
  • Задачи на основном боковом списке, стабильные позиции и прямое удаление.
  • Отдельная идентичность песочницы и постоянный том Docker или PVC Kubernetes для каждой задачи; среду можно остановить или пересоздать без потери файлов.
  • Разговор, состояние запуска, активность инструментов, выбор модели и владелец задачи сохраняются в базе Libre WebUI.
  • Текущий аутентифицированный поток текста ассистента, раскрываемых провайдером рассуждений, вызовов и результатов инструментов, использования, навыков и изменений состояния.
  • Принадлежащие серверу навыки рабочего процесса учат модель проверять, редактировать, тестировать и запускать предпросмотр, не создавая управляющих файлов в проекте.
  • Локальные модели Ollama с инструментами, Ollama Cloud и настроенные плагины провайдеров.
  • Адаптивное разделение «Разговор/Рабочая область», изменяемое мышью и клавиатурой на настольном экране, и переключатель на небольших экранах.
  • Встроенные представления «Файлы», «Активность», Git, «Терминал», «Предпросмотр» и «Экран»; «Экран» представляет рабочий стол Work Computer.
  • Подсветка синтаксиса в светлом и тёмном режимах, форматирование в браузере, обнаружение конфликтов сохранения и временные черновики.
  • Закрываемое раскрытие информации для каждого пользователя при выборе удалённого провайдера.
  • Полный перевод Work на 25 языков, включая родную арабскую раскладку справа налево, при сохранении направления кода, путей, ID моделей и вывода слева направо.

Постоянной единицей является рабочая область задачи, а не непрерывно работающий контейнер. Libre запускает, останавливает и при необходимости пересоздаёт контейнер, сохраняя его именованный том.

Архитектура

Libre WebUI, а не модель или браузер, выбирает имена песочницы и рабочей области, образ, подключение тома, пользователя, ограничения, режим сети и порт предпросмотра. Модель получает только следующие инструменты:

  • list_files
  • read_file
  • write_file
  • delete_file
  • move_file
  • search_files
  • run_command
  • start_preview
  • stop_preview

delete_file и move_file не позволяют выйти из рабочей области, не переходят по символическим ссылкам, требуют явного рекурсивного флага для каталога и не перезаписывают место назначения. Поскольку они используют файловый помощник, инструменты работают и во время предпросмотра, когда run_command заблокирован.

Запросы к модели выполняет серверная часть, а не контейнер Work, поэтому они не зависят от сетевой политики контейнера.

Требования

  • Для Docker нужен установленный достижимый демон и разрешение серверному процессу вызывать docker или программу из WORK_DOCKER_COMMAND.
  • Для Kubernetes нужны учётные данные API, ограниченные пространством имён Role и RoleBinding, пространство имён песочницы и NetworkPolicies, создаваемые Helm при work.enabled=true.

Также:

  • Модель с поддержкой инструментов через исправный Ollama или Ollama Cloud либо активный плагин дополнений или чата с точной моделью и учётными данными администратора.
  • Достаточная память для образа среды, проектов и локальных зависимостей.
  • Аутентифицированная учётная запись с доступом к Work; по умолчанию только администраторам, но доступ можно открыть всем активным пользователям.

Libre проверяет объявленные Ollama возможности и отклоняет модель без tools. Модель плагина должна поддерживать протокол вызова инструментов своего провайдера. Отказ завершает запуск без незаметного переключения.

Локальный запуск

Простейший вариант на одном компьютере:

docker info
npx libre-webui@latest

Откройте http://localhost:8080, войдите как администратор, выберите Work, совместимую модель и опишите задачу.

Если Docker отсутствует или недоступен, Work показывает Среда выполнения недоступна с причиной и отключает запуск. Команды никогда не выполняются напрямую на хосте.

При первом использовании образ среды проверяется и при отсутствии загружается автоматически, поэтому операция может занять больше времени.

Интерфейс Work

Создание и повторное открытие

Выберите Work, введите инструкцию, выберите модель и нажмите Запустить. Первое сообщение создаёт задачу, первый запуск, маршрут провайдера и постоянную рабочую область.

Задача остаётся на главной боковой панели. Повторное открытие восстанавливает недавний разговор, вкладку «Файлы», текущих провайдера и модель, а также рабочую область. Старые сообщения загружаются страницами. Задачу можно переименовать по заголовку и удалить из меню или боковой панели.

Для задачи может быть активен только один запуск; следующая инструкция использует тот же разговор и файловую систему.

Компоновщик поддерживает диктовку: кнопка микрофона использует речевой API браузера или настроенную модель распознавания речи и добавляет расшифровку к уже введённому тексту. Созданные или перемещённые файлы отображаются как кликабельные метки под соответствующим действием инструмента; щелчок открывает файл в редакторе и на узком экране переключает к рабочей области. Метки создаются только изменяющими инструментами, поэтому двадцать чтений и одна запись показывают ровно один артефакт.

Наём агента

При наличии персон доступно Нанять как агента: задача становится постоянным именованным агентом. Персона сохраняется между запусками — её имя и системный промпт предшествуют промпту Work, но контракт песочницы всегда имеет приоритет. Боковая панель помещает агентов в группу Агенты над разовыми задачами, показывая аватар, активность и состояние. В компактном режиме в рейле остаются только эти закреплённые аватары агентов; разовые задачи Work возвращаются при разворачивании панели.

Строка состояния имеет два уровня. Для нанятого агента после запуска выполняется недорогой запрос к модели без инструментов, который просит статус примерно из 8 слов («Входящие пусты. Готовы 2 ответа.»); ответ ограничен одной строкой из 90 символов, а при ошибке или тайм-ауте используется первая строка заключительного ответа ассистента. Разовые задачи и неудачные запуски используют только этот детерминированный вариант; WORK_STATUS_BLURB_MODEL=0 полностью отключает запрос. Открытие задачи продвигает монотонную отметку просмотра, синхронизируемую между устройствами, а точка показывает более поздний конечный запуск.

Агенты сообщают о работе через уведомления: work-run-finished, work-run-attention и work-takeover. Экранный баннер виден только на открытой вкладке, поэтому push-уведомление достигает пользователя в другом месте. Каждая ссылка ведёт прямо к агенту.

Можно использовать собственную или общую персону; общий просмотр не раскрывает воспоминания владельца. После удаления персоны агент продолжает работать без неё и записывает предупреждение. API принимает personaId и isAgent; задача с персоной автоматически становится агентом.

Вкладка Agent

Первая дополнительная вкладка Agent:

  • Идентичность: аватар, имя, индикатор активности и последняя строка состояния.
  • Экран: при наличии Work Computer компактная живая миниатюра только для просмотра. Она является полноценным подключением и учитывается в лимите; щелчок открывает полный экран с перехватом, обучением и звуком.
  • Процедуры: автоматизации, связанные с задачей. Каждое срабатывание выполняется в той же рабочей области и беседе с моделью и средой агента, а не как новая задача, поэтому утренний отчёт накапливается в одном месте. Строки показывают расписание и переключатель паузы; форма + Процедура уже привязана к агенту. Срабатывание при занятом агенте честно завершается work-task-busy, не попадая в очередь.
  • Автопроверка: переключатель одобрений у агента и накопленные им правила «Разрешать всегда» (удаление правила снова закрывает его область). Если политика задачи требует проверку, переключатель заблокирован во включённом положении.
  • Обученные навыки: продемонстрированные процедуры с переключателем включения.

Подключённые инструменты (серверы MCP и OpenAPI)

Агенты Work вызывают те же серверы инструментов, что и чат, — MCP или OpenAPI, зарегистрированные администратором в Настройки → Инструменты. Инструменты видны агенту под именами с пространством имён (server__tool), а вызовы идут из бэкенда Libre WebUI через укреплённый шлюз инструментов (защита исходящего трафика от SSRF, учётные данные пользователя, ограничения размера и времени), но никогда изнутри песочницы.

Предложение честно отражает то, чем автономный запуск действительно может воспользоваться:

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

Делегирование между агентами (упоминания @)

Нанятые агенты могут передавать работу друг другу. Введите @ в поле ввода Work, чтобы упомянуть другого своего агента; текущий агент видит список коллег (имена и строки состояния) в инструкциях и делегирует подходящие запросы инструментом message_agent. Делегирование — это координация сообщениями, намеренно не общими компьютерами: у каждого агента своя изолированная рабочая область и песочница, а получатель не видит исходную беседу, поэтому запрос должен нести собственный контекст.

Делегирование асинхронно. Инструмент возвращается сразу, целевой агент работает в своей задаче (в его беседе запрос помечен Делегировано от отправителя), и по завершении — готово, нужны данные, ошибка или отмена — его итоговый ответ приходит в беседу делегирующего агента сообщением с пометкой Отчёт от этого агента. Если делегирующий ещё работает, отчёт доходит до модели в следующем раунде; если он простаивает, отчёт просто ждёт в беседе — отчёт никогда не запускает выполнение сам, поэтому два агента не могут перебрасываться бесконечно. Делегированные запуски не делегируют дальше, занятый получатель честно проваливает попытку вместо очереди, а при активных одобрениях message_agent ждёт проверки, как любое другое действие с побочными эффектами (правило «Разрешать всегда» ограничено одним целевым агентом).

Одобрение действий (Автопроверка)

Действия с побочными эффектами могут ждать вашего решения до выполнения. Когда одобрения активны для задачи — политика Work включает Требовать одобрения действий с побочными эффектами либо включён переключатель Автопроверка у агента — запуск останавливается перед выполнением run_command, computer_act, delete_file, move_file или message_agent и показывает в беседе карточку решения: Разрешить один раз, Разрешать всегда или Отклонить.

  • Разрешить один раз выполняет именно этот вызов и спросит снова в следующий раз.
  • Разрешать всегда выполняет вызов и сохраняет правило в задаче: для всего инструмента при действиях с файлами и компьютером, с ограничением по программе команды (её первому токену) для run_command — одобрение npm run build заранее одобряет будущие команды npm, а не всю оболочку — и с ограничением одним целевым агентом для message_agent. Правила перечислены в разделе «Автопроверка» вкладки Agent, там же их можно удалить.
  • Отклонить отклоняет вызов. Модели сообщают, что пользователь отказал и повторять действие как есть нельзя; запуск продолжается с этим ответом.

Ожидающее одобрение также поднимает уведомление (в приложении и web push, если он включён), потому что запуск может уже минутами идти без присмотра, когда доходит до барьера. Если никто не решит за пять минут, запрос истекает, действие не выполняется, а запуск завершается как Нужны данные с обычной передачей, а не тратит бюджет на ожидание.

Одобрения контролируют действия, а не видимость: write_file и инструменты только для чтения остаются без контроля, и каждое решение попадает в журнал аудита безопасности.

Состояние задачи

ИнтерфейсСостояние сервераЦвет
Простойidlergb(255, 255, 255)
Обработкаpreparing или runningrgb(48, 121, 255)
Готовоcompletedrgb(76, 212, 117)
Нужны данныеneeds_input или cancelledrgb(255, 204, 0)
Ошибкаfailedrgb(255, 61, 129)

Остановка активного запуска переводит его в Нужны данные и сохраняет файлы. Исчерпание бюджета раундов или инструментов также заканчивается так после заключительной передачи без инструментов, поэтому незавершённая работа не помечается Готово.

Активный запуск не блокирует разговор: отправленное сообщение присоединяется сразу и достигает модели в следующем раунде, позволяя направлять, исправлять и добавлять контекст без остановки; кнопка остановки остаётся рядом с отправкой.

Изменение размера

На настольной ширине xl разговор и рабочая область разделены перетаскиваемой границей:

  • Ширина разговора по умолчанию — 45%.
  • Предпочтительный диапазон — 30%–70% с учётом минимальной ширины содержимого.
  • Сохранённая пропорция относится к вошедшему пользователю в этом браузере.
  • Стрелки перемещают границу на 2%, с Shift — на 10%.
  • Home и End выбирают доступный минимум и максимум.
  • Enter или двойной щелчок сбрасывают разделение.

Элементы управления следуют направлению письма. В арабском разговор находится справа, рабочая область слева, а указатель и стрелки работают в ожидаемом визуальном направлении.

На небольших экранах используйте переключатель в заголовке задачи.

Файлы

Вкладка «Файлы» просматривает непосредственное содержимое /workspace, открывает только корректные текстовые файлы UTF-8 и сохраняет изменения в том задачи. Недопустимые последовательности байтов отклоняются, а не заменяются с потерей данных.

Редактор предоставляет:

  • подсветку синтаксиса в светлом и тёмном режимах для распространённых языков;
  • сохранение по Cmd/Ctrl+S;
  • форматирование по Shift+Alt+F;
  • оптимистичное обнаружение конфликтов сохранения;
  • черновики для конкретной задачи и пути в памяти сеанса; и
  • предупреждения при переходе с несохранёнными изменениями.

Живая подсветка приостанавливается выше 8,000 символов или 400 строк. Форматирование доступно до 100,000 символов и 4,000 строк для JavaScript/JSX, TypeScript/TSX, вариантов JSON, CSS/SCSS/Less, HTML, Markdown/MDX и YAML.

Когда модель меняет открытый файл, вкладка показывает красно-зелёное сравнение с начала хода, сворачивая длинные неизменённые участки. Переключатель меняет сравнение и редактор, а счётчики +added −removed дают краткий итог. За основу берётся содержимое, которое браузер видел до хода; файл, впервые открытый после него, не показывает различия.

Черновик служит для удобства, а не как резервная копия; он очищается после сохранения, удаления задачи или завершения сеанса.

Активность

Вкладка показывает вызовы и результаты инструментов, операции с файлами, вывод команд и ошибки. Метаданные можно раскрыть. Вывод отображается слева направо даже в интерфейсе справа налево.

Активный запуск открывает аутентифицированный поток SSE со следующими событиями:

  • snapshot, run_state;
  • reasoning_delta, если провайдер раскрывает рассуждения;
  • assistant_delta;
  • tool_call, tool_result;
  • usage;
  • skill_loaded; и
  • error, done.

Доступность рассуждений зависит от модели и провайдера; Libre показывает только содержимое, возвращаемое API, и не может восстановить скрытую цепочку рассуждений. Некоторые модели не передают её вовсе. Текст и действия инструментов могут передаваться независимо.

Вывод намеренно ограничен; обрезанный результат не доказывает отсутствие продолжения. Попросите модель проверить более узкий результат.

Git

Вкладка Git выполняет локальные операции в /workspace:

  • инициализирует репозиторий с веткой main;
  • показывает состояние porcelain, отставание и опережение, а также до 20 коммитов;
  • показывает ограниченное сравнение;
  • добавляет в индекс до 200 путей;
  • создаёт коммит с именем и почтой администратора или локальным адресом no-reply;
  • создаёт ветку после первого коммита; и
  • переключает существующую ветку при чистом рабочем дереве.

Поверхность только локальная: без clone, fetch, pull, push, управления удалёнными репозиториями, произвольных команд, токенов, SSH-ключей и pull request. Для этого нужен отдельный доверенный посредник учётных данных, предпочтительно GitHub App или эквивалентный установочный токен, ограниченный одним репозиторием и операцией. Не храните долговременные учётные данные в рабочей области, окружении контейнера или конфигурации репозитория.

Чтение Git доступно при бездействующей и активной задаче. Запись отклоняется, пока контейнером владеет запуск модели, терминал или предпросмотр; для переключения ветки требуется чистое дерево. Это предотвращает гонки.

Команды интерфейса используют фиксированные массивы аргументов и выполняются как 1000:1000; ввод не оценивается оболочкой. Среда отключает системную и глобальную конфигурацию, запросы, хуки, помощники учётных данных, подпись, подмодули, внешние сравнения, textconv и сетевые протоколы. Репозиторий отклоняется, если рабочее дерево не равно /workspace или каталог Git выходит за его пределы. Запись также блокируется при исполняемом фильтре clean, smudge или process.

Это защищает Git API Libre WebUI. Администратор через терминал и модель через run_command всё равно могут запускать обычные команды Git, поэтому произвольные команды ограничиваются песочницей и границей развёртывания.

Встроенные навыки рабочего процесса

Каждый запуск получает принадлежащий серверу справочник о постоянной границе /workspace, корневой системе только для чтения, временных процессах и /tmp, сети, ограничениях и жизненном цикле предпросмотра. Навыки предписывают:

  • изучить инструкции, манифесты, lock-файлы, скрипты и состояние репозитория до редактирования;
  • сохранять несвязанную работу и объединять независимые чтения;
  • продолжать реализацию, а не останавливаться на плане;
  • выполнить целевую проверку перед более широкой;
  • диагностировать ошибку, а не слепо повторять; и
  • проверить приложение перед запуском предпросмотра как последнего долгого процесса.

Справочник существует только в контексте модели. Libre не создаёт AGENTS.md, каталог навыков или иной управляющий файл. Инструкции проекта не могут переопределить границу безопасности.

Терминал

Интерактивная оболочка подключается к той же песочнице, чтобы администратор мог проверять состояние, собирать и отлаживать проект.

Она использует ту же политику: непривилегированный 1000:1000, каталог /workspace и защищённый контейнер без возможностей. Терминал не даёт больше прав, чем run_command, а лишь предоставляет человеку интерфейс к той же границе.

  • Аутентификация — обычный заголовок Authorization обменивается по HTTP на краткосрочный одноразовый билет, связанный с протоколом и точной задачей. Только билет и ID задачи присутствуют в /ws/work-terminal. Перед каждым вводом повторно проверяются аккаунт, доступ, задача и владелец; отзыв закрывает сессию и освобождает аренду.
  • Проверка происхождения — при CORS_ORIGIN или BASE_URL происхождение браузера должно совпадать. Для удалённого развёртывания настройте хотя бы одно. Клиенты Electron и без браузера могут не передавать Origin, но требуют тот же билет и проверку; управляйте ими через TLS, брандмауэр и прокси.
  • Допуск — терминал получает аренду среды и учитывается в WORK_MAX_ACTIVE_RUNTIMES_*.
  • Срок жизни контейнера — подключённый терминал удерживает контейнер и не даёт остановить его как неактивный.
  • ПараллельностьWORK_TERMINAL_MAX_SESSIONS_PER_TASK по умолчанию равен 2.
  • Тайм-аут бездействияWORK_TERMINAL_IDLE_TIMEOUT_MS по умолчанию равен 15 минутам.
  • Активный запуск — терминал ждёт окончания хода модели.

Терминал обращается напрямую к Docker Engine API, поскольку TTY требует перехваченного двунаправленного потока. Используется WORK_DOCKER_SOCKET, затем DOCKER_HOST — сокет unix:// или обычный HTTP tcp:// через прокси с туннелем Connection: Upgrade — и наконец /var/run/docker.sock. Неподдерживаемые ssh:// или tcp:// с DOCKER_TLS_VERIFY делают терминал недоступным с пояснением, не затрагивая остальной Work. Kubernetes использует TTY WebSocket подресурса exec API, включая изменение размера, без Docker.

Интерактивные сеансы не записываются, а команды не появляются в «Активности».

Предпросмотр

Предпросмотр запускает, останавливает, встраивает и открывает приложение. Пустое поле команды обнаруживает:

  • скрипт dev в корневом package.json с нужными хостом и портом;
  • корневой index.html, обслуживаемый встроенным статическим сервером; либо
  • единственное приложение во вложенном каталоге.

Корневое приложение имеет приоритет. Несколько равноценных вложенных приложений или отсутствие точки входа дают понятную ошибку, а не случайную команду npm. Для другого проекта укажите команду перед Запустить предпросмотр; она начинается в /workspace, например cd apps/web && npm run dev -- --host 0.0.0.0 --port 4173. Процесс должен слушать 0.0.0.0 и WORK_PREVIEW_PORT и стать готовым за 15 секунд.

Модель может использовать start_preview — единственный поддерживаемый способ оставить долгий процесс. run_command очищает фоновые дочерние процессы после завершения.

Экран (Work Computer)

Наблюдайте, как агент Work Libre WebUI ищет изображения и строит интерактивную космическую галерею

Полная демонстрация: реальный неотредактированный запуск (30x, затем в реальном времени), где агент сам просматривает NASA, выбирает фото и строит и тестирует галерею Three.js из одного промпта.

Политика Work Computer добавляет вкладку «Экран»: живое окно виртуального рабочего стола в той же песочнице — диспетчер окон, панель и Chromium с разрешением 1280×800. Можно наблюдать за агентом, перехватывать мышь и клавиатуру, слушать звук компьютера и обучать действиям показом. Открытие вкладки запускает графическую сессию по требованию (до появления наблюдателя ничего не работает) и подключает просмотр VNC через WebSocket.

Администратор включает функцию одним нажатием Включить: Libre создаёт встроенный графический образ на Docker-демоне развёртывания (первый раз это занимает несколько минут) и готовую политику без ручного docker build. За фильтрующим прокси конечная точка сборки намеренно закрыта; вместо этого загрузите образ на хосте (ghcr.io/libre-webui/libre-work-computer, тег libre-work-computer:latest) или соберите его из deploy/work-computer/, после чего кнопка создаст только политику. Задачам нужна сеть, поскольку экран доступен через опубликованный на loopback порт, как и предпросмотр.

Сервер VNC внутри контейнера слушает localhost и использует два пароля на сессию: пароль только для просмотра получает каждый разрешённый наблюдатель, а полный — только текущий владелец аренды управления. Поэтому сервер сам игнорирует ввод остальных. Мост WebSocket — единственная достижимая поверхность, опубликованная лишь на loopback хоста. Каждый наблюдатель проходит аутентификацию одноразовым билетом сессии и задачи, как в терминале; доступ Work проверяется при каждом подключении, и отзыв немедленно разрывает экран. Одновременно допускается до четырёх наблюдателей, а просмотр считается активностью задачи.

Просмотр не конкурирует с выполнением: открытие во время запуска подключается к той же песочнице, наблюдаемый экран не блокирует следующий запуск, а сессия переживает завершение — даже в командном развёртывании с внешним рабочим процессом. Профиль браузера сохраняется в /workspace/.browser-profile, поэтому входы переживают перезапуск контейнера.

Управление агента использует два инструмента. computer_observe возвращает полный снимок экрана, положение указателя, активное окно, текущий URL браузера, указание на фокус страницы или интерфейса браузера, краткое описание элемента в фокусе и хеш снимка. Семантические сигналы поступают из DevTools на loopback контейнера и отсутствуют в старых образах. computer_act выполняет пакет до 24 действий мыши и клавиатуры — перемещение, щелчок, двойной или правый щелчок, ввод, сочетания клавиш, прокрутку и ожидание — и возвращает снимок после стабилизации.

Защита работает в трёх местах: действия type и key могут объявить ожидаемый focus и безопасно завершатся ошибкой, если поле не имеет фокуса, чтобы текст не попал в адресную строку; пакет прекращается при появлении окна, изменении заголовка или фокуса, поскольку оставшиеся координаты устарели; пакет может объявить ожидаемый заголовок, URL или изменение области, которое среда проверяет с адаптивным сроком — состояние ожидания не считается успехом.

После пакета экран опрашивается до стабилизации вместо фиксированной задержки. Результаты содержат доказательства: щелчок сообщает об изменении близких пикселей, scroll_until прокручивает к тексту или краю и сообщает о видимости, а каждое наблюдение сравнивается с предыдущим и явно называет отсутствие изменений. Однострочный subgoal сохраняется как контрольная точка и повторяется при восстановлении. Три одинаковых действия на неизменном экране вызывают предупреждение, а повтор завершает запуск с запросом данных; последовательные неподтверждённые ожидания требуют нового наблюдения. Телеметрия раундов, задержек, снимков, защит и вердиктов записывается с инструментами и итогом.

Снимки передаются как настоящие изображения по всем маршрутам — Ollama, Anthropic, Gemini и совместимым с OpenAI Chat и Responses — поэтому для управления лучше выбирать модель компьютерного зрения. Если провайдер отклоняет изображения, запуск не завершается ошибкой: снимки исключаются до конца запуска, модель переходит на текстовые наблюдения, а в журнале появляется пояснение. Такая проверка заметно слабее. В текущем контексте остаются только последние снимки, а постоянный журнал хранит лишь текст, никогда не байты изображений.

В браузер встроена блокировка содержимого: uBlock Origin Lite для рекламы и трекеров (версия закреплена и проверена контрольной суммой при сборке, режим фильтрации задан управляемой политикой) и автоматическое закрытие баннеров согласия на файлы cookie. Это не даёт рекламе расходовать снимки, токены и щелчки. Известные рекламные скрипты заменяются безопасными локальными заглушками, чтобы страницы продолжали работать. Агенту запрещено вводить учётные данные и проходить CAPTCHA или 2FA; он сообщает о препятствии. Для недоверенных задач сочетайте графическую политику с фильтрующим DNS: настольный браузер повышает значимость контроля исходящего трафика.

Звук по умолчанию выключен, поскольку браузер требует щелчка. Кнопка динамика передаёт звук компьютера в реальном времени. PulseAudio воспроизводит его в пустой приёмник, а монитор передаёт необработанный PCM через второй аутентифицированный WebSocket на loopback с теми же билетами, повторной проверкой доступа и лимитом наблюдателей. Требуется актуальный образ из deploy/work-computer/.

Кнопка Перехватить управление даёт мышь и клавиатуру для входа, CAPTCHA или шага, который агент выполнять не должен; Готово возвращает экран. Одна сессия VNC использует сгенерированные и никогда не журналируемые пароли полного и наблюдательного доступа; полный пароль выдаётся только владельцу аренды. Она истекает за две минуты, продлевается открытым интерфейсом и не может быть отнята у другого пользователя.

Политика Разрешить перехват экрана может полностью запретить управление: кнопки перехвата и обучения скрываются, конечная точка отказывает, а request_takeover сообщает о недоступности; просмотр остаётся. Пока управляет человек, computer_observe и computer_act заблокированы, поэтому агент не вмешивается и не снимает ввод. request_takeover показывает баннер с причиной и ждёт возврата. Учётные данные идут прямо с клавиатуры на страницу, никогда через модель или журнал. Старые образы поддерживают только просмотр.

Режим обучения Научить задаче записывает демонстрацию: человек управляет экраном с видимым индикатором, а действия сохраняются в координатах. Каждый щелчок также привязывается к найденным только для чтения тегу, ID, видимой подписи и текущему URL, поэтому шаг называет цель, например «Нажмите "button#submit (Place order)"», а координаты остаются подсказкой.

Сохранение создаёт сценарий детерминированно, без модели: нажатия объединяются в строки, щелчок отличается от перетаскивания порогом 8 пикселей, паузы становятся ожиданием, а текст с секретной лексикой или формой учётных данных (8+ символов из трёх классов) редактируется и заменяется request_takeover. Процедура на естественном языке сначала использует привязанные цели, затем координаты и повторно интерпретируется через computer_observe; она содержит условия применения, входные данные, шаги, проверку, разрешённую область из фактически посещённых хостов (перед выходом нужно остановиться и спросить), границы одобрения и остановку при ошибке.

Сценарий сохраняется как обычный навык с префиксом taught- и поддерживает версии, редактирование и общий доступ. Запуски Work Computer загружают включённые обученные навыки владельца и показывают их в списке; воспроизведение является обычным запуском по подходящей процедуре. После запуска метки позволяют одним нажатием добавить в Track record датированную оценку успеха или ошибки (новые сверху, число ограничено, каждая запись — обычная версия). Не вводите настоящие пароли при записи: покажите процесс до входа, сохраните и используйте request_takeover при воспроизведении.

Провайдеры, маршрутизация и раскрытие данных

Поддерживаемые маршруты

МаршрутПроверка и поведение
Локальный OllamaOllama исправен, точная модель объявляет поддержку инструментов.
Ollama CloudЯвно маршрутизируется через Ollama; облачный суффикс показывает раскрытие данных.
Плагин дополнений или чатаАктивен, содержит точную модель и учётные данные текущего администратора.
Плагин AnthropicИспользует адаптер сообщений и инструментов Anthropic для Work.
Плагин GeminiИспользует адаптер содержимого и вызовов функций Gemini для Work.
Другой совместимыйИспользует форму OpenAI для сообщений, инструментов и их выбора.

Тип провайдера и ID плагина сохраняются в задаче и каждом запуске. Одно имя модели не выбирает маршрут, а одноимённый плагин не перехватывает существующую задачу.

Что получает провайдер

  • системный промпт Work;
  • навыки рабочего процесса и текущие ограничения среды;
  • до 30 последних сообщений пользователя и ассистента, максимум 256 KB;
  • определения инструментов;
  • историю вызовов инструментов; и
  • результаты, включая списки, содержимое файлов, поиск, вывод и ошибки.

Том не загружается целиком, но содержимое, возвращённое инструментом, становится частью разговора и отправляется провайдеру. Перед конфиденциальной работой проверьте правила хранения, обучения, цены и использования.

Учётные данные остаются на серверной части и никогда не подключаются в контейнер Work.

Шифрование учётных данных приложением не означает шифрование всей задачи. Разговоры, результаты, вывод и метаданные являются обычным содержимым базы, а файлы — обычными файлами тома или PVC. Применяйте контроль хоста и шифрование диска согласно модели угроз.

Раскрытие удалённого провайдера

Модели плагинов и имена Ollama с :cloud или -cloud считаются удалёнными. При выборе показывается закрываемое уведомление о потоке данных и нескольких оплачиваемых вызовах; предпочтение сохраняется для пользователя.

Все маршруты используют WORK_MAX_AGENT_ROUNDS, по умолчанию 48 раундов; отдельного ограничения в 12 для плагинов нет. Бюджет инструментов равен большему из 128 и восьми вызовов на настроенный раунд. При исчерпании Libre запрашивает заключительную передачу без инструментов с выполненной работой, проверками, препятствиями и остатком, затем записывает Нужны данные, а не исключение или ложное завершение. Продолжение использует ту же рабочую область. Один запуск всё равно может выполнить много оплачиваемых запросов.

Папки хоста (опционально)

Docker обычно использует именованный том, поэтому модель не видит настоящие файлы. Задачу можно привязать к реальному каталогу хоста. Kubernetes отклоняет такие каталоги и использует PVC.

WORK_HOST_WORKSPACES_ENABLED=true
WORK_HOST_WORKSPACE_ROOTS=/Users/you/Projects

WORK_HOST_WORKSPACE_ROOTS — список корней, разделённых :, по умолчанию домашний каталог пользователя сервера. Поле Папка рабочей области необязательно; пустое значение сохраняет изоляцию.

Путь должен быть абсолютным существующим каталогом и после разрешения символических ссылок оставаться внутри корня. .ssh, .gnupg, .aws, .config, .kube, .docker, .claude, .libre-webui и node_modules всегда отклоняются. Разрешённый путь сохраняется и отображается.

Песочница становится уже

Модель читает и изменяет настоящие файлы; непривилегированный пользователь, удалённые возможности и ограничения больше не отделяют её от каталога. Оставляйте функцию выключенной без необходимости, задавайте узкие корни и предпочитайте каталоги под контролем версий.

Постоянство и жизненный цикл

СостояниеХранилищеВремя жизни
Владелец, заголовок, провайдер, статусБаза LibreДо удаления задачи/пользователя
Запуски, ошибки, сообщения, активностьБаза LibreДо удаления задачи
ФайлыТом Docker или PVC K8sПереживают отмену, остановку предпросмотра и перезапуски
Корневая система и временные файлыКонтейнер или PodОдноразовые, могут быть остановлены или пересозданы
Процесс предпросмотраРаботающая песочницаВременный, сохраняется только при подтверждённой исправности
Несохранённый черновикСеанс браузераВременное удобство

UUID задачи создаётся сервером, а имена ресурсов определяются только серверной частью. Перед повторным использованием или удалением проверяются метки управления и владельца; ресурс другой задачи отклоняется.

Песочница готовится по требованию. Файловые помощники останавливают бездействующую среду, команды — после завершения, а проверенный предпросмотр может удерживать её. Постоянная рабочая область подключается снова.

Администраторы задают именованные политики среды выполнения: образ, ограничения памяти, CPU и PID, размер Kubernetes, тайм-аут бездействия, сеть и переключатели Work Computer (GUI + браузер) и Разрешить перехват экрана (также определяет обучение). Задача работает по выбранной политике; пустые поля наследуют глобальные значения, а удаление возвращает их при следующем пересоздании. Политика меняет только ресурсы и функции и не может ослабить непривилегированный режим, корень только для чтения, удалённые возможности или сетевую изоляцию.

WORK_RUNTIME_IDLE_TIMEOUT_MS останавливает песочницу после отсутствия команд, терминала или запросов подписанного предпросмотра и освобождает слот. Рабочая область сохраняется, а предпросмотр запускается снова. Значение 0 по умолчанию удерживает его до явной остановки.

При запуске сервера активные выполнения помечаются неудачными, а состояние предпросмотра очищается. Драйвер одним запросом получает управляемые контейнеры или Pоды. Работающие среды известных задач останавливаются, уже остановленные не меняются, осиротевшие удаляются. Владелец определяется меткой, не именем. На пространство имён или демон должна приходиться одна инстанция Libre. Если очистку нельзя доказать, Work безопасно закрывается, повторяет попытку каждые 10 секунд и блокирует изменяющие операции.

Сеть

Проверьте политику

Без именованной политики сеть включена. Администратор может создать политику с сетью, выключенной по умолчанию, а автор выбирает её при создании. Отдельного переключателя задачи нет; изменение политики требует пересоздания среды.

Docker подключает сетевые задачи к управляемому мосту (libre-webui-work, WORK_NETWORK_NAME) с com.docker.network.bridge.enable_icc=false:

  • песочницы не могут соединяться друг с другом; и
  • не достигают контейнеров развёртывания на общем мосту по умолчанию, включая неопубликованные базу данных или Ollama.

Сеть с таким же именем, но без метки управления, отклоняется.

В Kubernetes Pod получает сетевую метку. Helm устанавливает запрет по умолчанию, вход только для предпросмотра и интернет-доступ для разрешённых Pod с исключением work.networkPolicy.blockedEgressCidrs. Это эффективно только при поддержке CNI; см. Kubernetes.

Исходящий трафик разрешён для пакетов, Git и API. Это не исходящий брандмауэр. Код может достигать:

  • служб хоста Docker;
  • локальной сети хоста;
  • интернета; и
  • конечных точек метаданных инфраструктуры.

Средства политики исходящего трафика

  • WORK_RUNTIME_DNS (Docker) — разделённые запятыми адреса IPv4/IPv6, принудительно заданные через --dns; фильтрующий резолвер даёт списки имён. Неверные адреса отклоняются и журналируются, поэтому флаги внедрить нельзя.
  • Брандмауэр хоста или вышестоящей сети в стабильной подсети управляемого моста.
  • WORK_NETWORK_NAME для заранее созданной сети с собственными параметрами, меткой управления и отключённым ICC.

DNS не ограничивает прямые IP-адреса; для гарантии нужен брандмауэр.

Не считайте Work защитой от передачи данных. Доступ предоставляйте только доверенным пользователям. Для автономной задачи выбирайте именованную офлайн-политику; глобальной переменной окружения, меняющей значение по умолчанию, нет.

Сеть не добавляет учётных данных: в задачу не подключаются SSH-ключи, облачные данные, профили браузера, домашний каталог хоста или socket Docker. Код всё равно может передать секрет, записанный в /workspace.

Трафик песочницы отделён от запросов модели; Ollama и плагины всегда вызываются серверной частью по явному маршруту.

Граница безопасности песочницы

Docker-контейнер:

  • работает без root как 1000:1000;
  • использует /workspace как рабочий каталог;
  • подключает только том выбранной задачи;
  • имеет корень только для чтения и ограниченный /tmp;
  • лишён всех Linux-возможностей;
  • no-new-privileges;
  • не является привилегированным и использует init-процесс;
  • применяет ограничения CPU, памяти, процессов, времени и вывода;
  • фиксирует swap (--memory-swap = --memory);
  • подключается к управляемой сети без ICC или остаётся без сети; и
  • публикует только порт предпросмотра на назначенный loopback.

Все свойства повторно проверяются через docker inspect и хешируются в ai.libre-webui.policy. Контейнер со старой политикой после обновления уничтожается и создаётся заново.

Kubernetes применяет эквивалент: непривилегированный пользователь, корень только для чтения, seccomp RuntimeDefault, отсутствие повышения прав, удалённые возможности, ограниченные временные ресурсы, отсутствие токена ServiceAccount и PVC в /workspace; метки и отпечаток проверяются.

Проверка путей отклоняет абсолютные пути, обход каталогов, обратные косые черты, NUL и чрезмерную длину. Помощники определяют реальный путь и отклоняют выход через символические ссылки. Запись использует временный файл и атомарное переименование.

Эти меры уменьшают случайное раскрытие хоста, но не превращают Work в виртуальную машину или безопасную среду анализа вредоносного ПО. Контейнеры разделяют ядро хоста; уязвимость Docker, Kubernetes, среды, образа, зависимости или ядра может пересечь границу.

Тома Docker не имеют независимой квоты. Проект может исчерпать хранилище; отслеживайте рост и применяйте ограничения хоста. Исполнение размера PVC Kubernetes зависит от провайдера хранилища.

Контрольный список защиты Docker

В Kubernetes также проверяйте RBAC пространства имён, безопасность Pod, класс хранилища и исполнение NetworkPolicy CNI по руководству.

Приложение задаёт флаги контейнера, проверяет пути и защищает API, но не может обеспечить брандмауэр хоста, квоты хранилища или уровень прав демона. Это обязанность оператора.

1. Изоляция управления Docker

Основному контейнеру нужно управление демоном; socket является учётными данными плоскости управления, поэтому компрометация приложения может привести к компрометации хоста.

docker-compose.socket-proxy.yml не передаёт socket приложению. Прокси пропускает только containers, images, volumes, networks, exec и info, блокируя swarm, secrets, configs, build, commit и system. Libre использует DOCKER_HOST=tcp://docker-socket-proxy:2375 без подключения socket или группы; CLI, терминал и диагностика следуют этому адресу. Поверхность API меньше, но радиус последствий остаётся: создание контейнеров позволяет подключать пути хоста.

Более сильная граница — отдельная виртуальная машина без посторонних нагрузок; ещё сильнее — выделенный rootless-демон или отдельный хост среды. До внедрения проверьте владение файлами, маршрутизацию, очистку и терминал. Подключение обычного socket только для чтения не делает API доступным только для чтения.

2. Блокировка управления хостом из песочницы

Отключение ICC не блокирует службы хоста. Проверьте реальный мост и подсеть:

docker network inspect libre-webui-work \
--format 'id={{.Id}} subnets={{range .IPAM.Config}}{{.Subnet}} {{end}}'
ss -lntup

Постоянный брандмауэр должен запрещать трафик моста к SSH, Docker API, базам данных и административным портам. Проверьте правило одноразовым контейнером и разрешёнными загрузками, затем сохраните его. DOCKER-USER управляет пересылаемым трафиком; доступ к самому хосту может потребовать правила INPUT.

3. Ограничение исходящих целей

Блокируйте метаданные облака, частную инфраструктуру и LAN клиента, если они не нужны. Сочетайте DNS и брандмауэр. Прямой IP обходит DNS, а HTTP-прокси недостаточен при прямых соединениях. Обеспечивайте политику вне контейнера.

Создавайте отдельные политики без сети, только для реестров и с открытым исходящим доступом. Политика определяет подключение сети, а внешние правила — допустимые цели.

4. Настоящие квоты хранения

Ограничения CPU, памяти и PID не ограничивают том. Используйте проектные квоты XFS, логические тома с квотами или драйвер тома/PVC с размером. Docker local на ext4 не получает надёжную квоту только из объявленного размера.

Отслеживайте каждый том ai.libre-webui.managed=true и корень данных Docker, предупреждайте до заполнения и проверяйте поведение при ошибке. Интерфейс или du лишь предупреждают и не обеспечивают лимит между проверками.

5. Проверка политики

После изменения создайте одноразовую задачу и проверьте через docker inspect: UID, корень только для чтения, возможности, no-new-privileges, память, swap, CPU, PID, единственный том задачи и сеть. У главного контейнера должны быть только ожидаемые подключения, а публичный вход должен идти через аутентифицированный прокси или туннель, не порт Docker или предпросмотра.

Безопасность и доступность предпросмотра

Docker динамически публикует предпросмотр на loopback серверной части; Kubernetes использует IP Pod. Модель и браузер не выбирают произвольный источник. Libre подписывает URL для точной задачи и конечной точки, при каждом запросе проверяет процесс и проксирует HTTP/WebSocket через /api/work/previews. Остановка или перезапуск отзывают URL.

Ответы удаляют учётные данные Libre и файлы cookie вышестоящего сервера. HTML ограничен iframe-песочницей и CSP, разрешающей скрипты, формы, модальные окна и загрузки без same-origin; это защищает и отдельную вкладку. Созданный код остаётся недоверенным и может отправлять данные рабочей области или браузера. URL является краткосрочным секретом.

Браузер загружает тот же публичный источник, поэтому удалённый HTTPS работает без открытия портов, IP Pod и смешанного содержимого. Обратный прокси должен сохранять WebSocket для /api/work/previews/; поставляемый Nginx это делает.

Основное приложение разрешает во фреймах только собственный источник и Turnstile. Предпросмотр обходит общую политику Helmet, чтобы передавать тела и применять более узкую песочницу. Политика cross-origin embedder отключена, поскольку серверы разработки редко имеют нужные заголовки.

Матрица развёртывания

РазвёртываниеЗапуски/файлыПодгляд
Локальный npx libre-webuiПоддерживается при установленном и доступном Docker.Подписанный прокси на источнике приложения.
Локальный запуск из исходниковТе же требования.Источник API разработки на порту 3001.
ElectronУсловно: использует внешнюю серверную часть без отдельной среды Work.Подписанный прокси этой серверной части.
Удалённый bare metal или VMРаботает при наличии Docker на хосте.Обратный прокси HTTP и WebSocket.
Стандартный ComposeПо умолчанию на Docker Desktop: образ содержит CLI, socket подключён, а порты Work идут через host.docker.internal. Нативному Docker Engine дополнительно нужен достижимый непубличный WORK_PREVIEW_BIND.Тот же публичный источник.
Kubernetes/Helm--set work.enabled=true: Pod/PVC для запусков, файлов, команд, Git, терминала, экрана и звука Work Computer по IP Pod, Role пространства имён и default-deny NetworkPolicies — без socket. См. Kubernetes.Прокси внутри кластера к IP Pod.

Work внутри Docker Libre WebUI

Все файлы Compose репозитория включают Work: образ содержит CLI и подключает /var/run/docker.sock. Docker Desktop работает со штатными настройками маршрутизации. Нативному Docker Engine дополнительно нужен WORK_PREVIEW_BIND на непубличном интерфейсе хоста, достижимом из соседних контейнеров, как описано ниже.

Контейнеры задач являются соседними с контейнером Libre WebUI, видны в docker ps и управляются тем же жизненным циклом.

Socket даёт управление хостом уровня root. Work без него не работает, поэтому следствие сформулировано явно: каждый администратор Libre WebUI фактически является администратором Docker-хоста. Оператор отвечает за безопасность, сеть, жизненный цикл, копии и доступ. Удалите строку socket, чтобы отключить Work; другие функции от неё не зависят.

Альтернатива — docker-compose.socket-proxy.yml через DOCKER_HOST; см. изоляцию управления.

Необходимо выполнить три условия:

  1. CLI Docker существует. Официальный образ содержит его; пользовательскому нужны docker-cli или WORK_DOCKER_COMMAND. Иначе: The "docker" CLI is not installed….
  2. Socket подключён. Иначе: No Docker daemon is reachable….
  3. Пользователь входит в группу socket. Образ работает как nodejs с uid 1001, socket обычно принадлежит root или docker, поэтому Compose использует group_add: ['${DOCKER_GID:-0}']. Значение по умолчанию подходит Docker Desktop, Linux требует свой ID. Иначе: The Docker socket is mounted but the Libre WebUI user cannot open it….
# Read the socket's group as seen INSIDE a container. A macOS host reports a
# different value, because Docker Desktop proxies the socket through a VM.
echo "DOCKER_GID=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
alpine stat -c '%g' /var/run/docker.sock)" >> .env
docker compose up -d --force-recreate

Порты предпросмотра остаются на loopback хоста и доступны через подписанный прокси того же источника для HTTP и WebSocket. Это работает за HTTPS и туннелями, применяет песочницу и отзывает старый URL.

В Docker адреса публикации и подключения могут различаться. Оставьте WORK_PREVIEW_BIND=127.0.0.1, а WORK_DOCKER_PUBLISHED_HOST задайте как достижимый адрес хоста (host.docker.internal в Docker Desktop). Штатные профили Compose задают оба значения и сопоставляют имя хоста. Linux обязан переопределить WORK_PREVIEW_BIND шлюзом моста Docker (или другим явно достижимым непубличным интерфейсом хоста); одно сопоставление не делает loopback доступным. Никогда не привязывайте эти сырые временные порты к 0.0.0.0.

Параллельность ограничена: WORK_MAX_ACTIVE_RUNTIMES_PER_USER равно 2, WORK_MAX_ACTIVE_RUNTIMES_GLOBAL3. Ответ возможностей сообщает занятость. Повышайте только при достаточных ресурсах.

Для Kubernetes используйте work.enabled=true; чарт создаёт RBAC, пространство имён, политики и Pod/PVC из руководства.

Конфигурация среды выполнения

ПеременнаяПо умолчаниюНазначение
WORK_RUNTIME_BACKENDdockerdocker или kubernetes
WORK_RUNTIME_IMAGEnode:22.22-bookworm@sha256:2d178f2785b96dfbf62a416ca2e40f50e30150b4ff3320d706f0d96e90600eb3Образ песочницы задачи
WORK_DOCKER_COMMANDdockerИсполняемый файл CLI Docker
WORK_COMMAND_TIMEOUT_MS120000Тайм-аут команды
WORK_MAX_OUTPUT_CHARS50000Максимальный захваченный вывод
WORK_MAX_AGENT_ROUNDS48Раунды модели и инструментов на запуск
WORK_MEMORY_LIMIT2gОграничение памяти
WORK_CPU_LIMIT2Ограничение CPU
WORK_PIDS_LIMIT256Ограничение процессов
WORK_PREVIEW_PORT4173Порт приложения в контейнере
WORK_PREVIEW_BIND127.0.0.1Интерфейс публикации на хосте
WORK_DOCKER_PUBLISHED_HOSTкак WORK_PREVIEW_BINDХост или IP для опубликованных портов
WORK_COMPUTER_SCREEN_PORT6080Порт WebSocket экрана
WORK_COMPUTER_AUDIO_PORT6081Порт WebSocket звука
WORK_RUN_LEASE_WAIT_MS60000Ожидание временного владельца аренды
WORK_MAX_ACTIVE_RUNTIMES_GLOBAL3Параллельные задачи во всей инстанции
WORK_MAX_ACTIVE_RUNTIMES_PER_USER2Параллельные задачи администратора
WORK_MAX_TASKS_GLOBAL500Постоянные задачи во всей инстанции
WORK_MAX_TASKS_PER_USER100Постоянные задачи администратора
WORK_NETWORK_NAMElibre-webui-workУправляемый сетевой мост
WORK_RUNTIME_DNSне заданаIP резолверов через запятую
WORK_DOCKER_SOCKETDOCKER_HOST, если unix:// или tcp://, иначе /var/run/docker.sockКонечная точка Docker для терминалов
WORK_TERMINAL_MAX_SESSIONS_PER_TASK2Параллельные терминалы задачи
WORK_TERMINAL_IDLE_TIMEOUT_MS900000Тайм-аут бездействия терминала
WORK_RUNTIME_IDLE_TIMEOUT_MS0 (выключено)Остановка неактивной среды и предпросмотра
WORK_K8S_NAMESPACElibre-webui-workПространство имён Pod и PVC
WORK_K8S_STORAGE_CLASSзначение кластера по умолчаниюStorageClass для PVC
WORK_K8S_WORKSPACE_SIZE5GiРазмер PVC
WORK_K8S_POD_READY_TIMEOUT_MS900000Ожидание готовности Pod
WORK_K8S_POD_GONE_TIMEOUT_MS60000Ожидание удаления Pod

В промышленной среде используйте фиксированную версию или digest образа. Изменяемый тег может сменить инструменты и границу безопасности.

Запуск, предпросмотр, файлы, команды и пересоздание используют общий учёт ёмкости; вложенная операция уже учтённой задачи не считается повторно. Превышение возвращает HTTP 429.

Фиксированные ограничения

ЭлементОграничение
Новое сообщение65,536 символов и байтов UTF-8
ID модели500 символов и байтов UTF-8
ID провайдера плагина200
Активные запуски на задачу1
Текст команды20,000 символов
Тайм-аут инструмента1–600 секунд
Готовность предпросмотра15 секунд
Чтение и запись файла2,000,000 байтов UTF-8
Список каталогаПервые 1,000 записей
Страница сообщений200 сообщений, 1,000,000 байтов
Постоянное сообщение100 KB
Контекст моделиПоследние 30 сообщений, 256 KB
Постоянный вывод инструментаОколо 20,000 исходных символов и маркер
Подсветка8,000 символов и 400 строк
Форматирование100,000 символов и 4,000 строк
Состояние Git2,000,000 символов
Сравнение Git600,000 символов
История Git20 локальных коммитов
Пути в одном добавлении в индекс200
Сообщение коммита4,000 символов
Петелька агента48 по умолчанию через WORK_MAX_AGENT_ROUNDS
Бюджет инструментовmax(128, configured rounds × 8) вызовов

Файлы должны быть текстом UTF-8; двоичные файлы не поддерживаются, а файлы более 2 MB недоступны через API.

API

Все /api/work требуют аутентификации и текущего доступа. По умолчанию они доступны администраторам; обычные операции можно открыть пользователям, но папки хоста и политики остаются административными.

МетодПутьНазначение
GET/capabilitiesДоступность и ограничения
GET/tasksСписок задач
POST/tasksСоздание задачи и первого запуска
GET/tasks/:idСостояние и последние сообщения
GET/tasks/:id/messagesСтарые сообщения
PATCH/tasks/:idПереименование или смена маршрута
DELETE/tasks/:idУдаление задачи и рабочей области
POST/tasks/:id/runsПоследующий запуск
POST/tasks/:id/messagesСообщение активному агенту
GET/tasks/:taskId/runs/:runId/eventsSSE
POST/tasks/:id/cancelОтмена активного запуска
GET/tasks/:id/approvalsОжидающие одобрения и состояние Автопроверки
PUT/tasks/:id/approvalsВключение одобрений для задачи
POST/tasks/:id/approvals/:approvalIdРешение по одобрению (один раз/всегда, отказ)
DELETE/tasks/:id/approval-rules/:ruleIdУдаление правила «Разрешать всегда»
GET/computer/setupСостояние установки Work Computer
POST/computer/setupСоздание графического образа и политики
POST/tasks/:id/computer/startЗапуск компьютерной сессии
GET/tasks/:id/computer/controlТекущий управляющий и запрос агента
POST/tasks/:id/computer/controlПерехват или продление управления
DELETE/tasks/:id/computer/controlВозврат управления агенту
POST/tasks/:id/computer/teachСохранение демонстрации
POST/tasks/:id/computer/anchorОпределение элемента
POST/computer/skills/:slug/traceДобавление оценки
GET/tasks/:id/filesСписок файлов
GET/tasks/:id/fileЧтение файла
PUT/tasks/:id/fileСохранение файла
GET/tasks/:id/gitСостояние и история Git
GET/tasks/:id/git/diffСравнение Git
POST/tasks/:id/git/initИнициализация Git
POST/tasks/:id/git/stageДобавление путей в индекс
POST/tasks/:id/git/commitСоздание коммита
POST/tasks/:id/git/branchesСоздание ветки
POST/tasks/:id/git/switchПереключение ветки
POST/tasks/:id/preview/startЗапуск предпросмотра
POST/tasks/:id/preview/stopОстановка предпросмотра

ID задачи всегда проверяется относительно аутентифицированного владельца. Состояние аккаунта, роль и доступ читаются из базы при каждом запросе, поэтому отзыв действует даже при устаревшем JWT.

Сервер сохраняет networkEnabled для внутренней совместимости, но не показывает отдельный переключатель. Выбирайте именованную политику и не используйте сырое поле как постоянный API конфигурации.

Удаление, изменения аккаунтов и копии

Удаление задачи

  1. Сервер помечает задачу как выводимую из эксплуатации и блокирует новые изменения.
  2. Активный запуск отменяется, песочница останавливается.
  3. Проверяются метки владения ресурсами.
  4. Удаляются контейнер или Pod и том или PVC.
  5. Строка базы удаляется каскадно вместе с запусками и сообщениями.
  6. После успеха очищаются черновики браузера.

Если очистка среды не удалась, запись и ошибка сохраняются для исправления и повторной попытки, не оставляя неучтённый ресурс. Остановка запуска или предпросмотра сохраняет данные.

Понижение администратора и удаление пользователя

Отзыв роли сохраняется до очистки, а каждый запрос проверяет текущие права. Задачи приостанавливаются, запуски и песочницы останавливаются. Ошибка очистки не возвращает доступ и сообщается для повторной попытки.

При удалении другого пользователя сначала удаляются управляемые ресурсы; при ошибке запись пользователя сохраняется вместе с метаданными владения.

Полная резервная копия

Нужны база с владельцами, именами ресурсов, маршрутизацией, запусками, сообщениями и активностью, а также все тома Docker и PVC Kubernetes с ai.libre-webui.managed=true, содержащие файлы.

Контейнеры и процессы предпросмотра копировать не нужно. Для согласованного снимка остановите новую активность Work и сервер.

Восстанавливайте базу и рабочие области вместе под точными именами с метками ai.libre-webui.task=<task UUID> и ai.libre-webui.managed=true. Одни файлы теряют метки, одна база не имеет файлов, а одно хранилище теряет владельца и имена.

Для зашифрованных учётных данных провайдера следуйте основной процедуре копирования данных и ключа.

Локализация и арабский RTL

25 языков: английский, арабский, бенгальский, чешский, датский, немецкий, испанский, французский, хинди, индонезийский, исландский, итальянский, японский, корейский, малайский, нидерландский, польский, португальский, русский, шведский, тайский, турецкий, украинский, вьетнамский, китайский.

Арабский устанавливает lang="ar" и dir="rtl" до React: боковая панель и разговор находятся справа, рабочая область слева, значки зеркальны, вкладки следуют RTL, а изменение размера учитывает визуальное направление.

Техническое LTR:

  • код и подсветка;
  • пути;
  • ID моделей;
  • команды и журналы;
  • вывод и метаданные; и
  • блоки кода.

Имена задач, промпты, ошибки, имена файлов и команды предпросмотра используют автоматическое направление.

Устранение неполадок

Недоступно при npx

npx libre-webui не устанавливает Docker. Выполните docker info от того же пользователя ОС; установите или запустите Docker либо исправьте права и перезагрузите Work. Также нужен исправный Ollama или активный плагин с моделью и учётными данными.

Недоступно в Docker/Kubernetes

Развёртывание Compose не должно сообщать эту ошибку: образ содержит CLI и подключает socket. Панель указывает причину — отсутствие CLI, socket или группы. Задайте DOCKER_GID и пересоздайте контейнер. См. Work внутри Docker.

В Kubernetes используйте --set work.enabled=true; Libre сообщает kubernetes, проверяет API и использует Pod/PVC. Не подключайте socket узла; см. Kubernetes.

Нет совместимых моделей

Ollama должна объявлять tools. Для плагина проверьте тип completion или chat, активность, точную модель в карте, API-ключ и поддержку вызовов инструментов. Резервного переключения нет.

Не удаётся установить пакет или выполнить удалённый Git

Проверьте сеть выбранной именованной политики, затем DNS, прокси, брандмауэр, NetworkPolicy, реестр, сертификат, среду, вышестоящую службу и наличие команды. Вкладка Git только локальна; терминал и модель используйте для удалённого Git лишь намеренно и не вставляйте долгосрочный токен.

Запуск останавливается на лимите агента

Исчерпан бюджет раундов или инструментов. После заключительной передачи без инструментов проверьте выполненную работу и остаток. Нужны данные является конечным состоянием без заявления о завершении. Продолжите запуск или увеличьте WORK_MAX_AGENT_ROUNDS, если позволяют ресурсы и расходы.

HTTP 429

Достигнут лимит допуска среды или задач. Подождите, остановите выполнение, удалите старые задачи или увеличьте соответствующий WORK_MAX_*.

Предпросмотр не становится готовым

Команда должна продолжать работу, привязываться к 0.0.0.0 и слушать WORK_PREVIEW_PORT за 15 секунд. Пустое поле обнаруживает dev в package.json, index.html или одно вложенное приложение. Для нескольких или отсутствующих приложений задайте явную команду. Она начинается в /workspace; используйте cd <app-directory> && ....

Предпросмотр работает на сервере, но не удалённо

Проверьте сборку с подписанным прокси и перезапустите старый URL. Обратный прокси должен разрешать WebSocket для /api/work/previews/. Порт Docker остаётся на loopback и не требует открытия брандмауэра.

Файлы остались, но предпросмотр остановлен

Это ожидаемо после отмены, перезапуска, явной остановки или ошибки готовности. Процесс временный, том постоянный. Запустите предпросмотр снова.

Файл не открывается или не сохраняется

API принимает текст UTF-8 до 2 MB. При конфликте перезагрузите файл. Подсветка переходит в обычный текст выше 8,000 символов или 400 строк; форматирование поддерживает 100,000 символов и 4,000 строк только для перечисленных типов.

Work восстанавливает песочницы

Не удалось доказать остановку. Work безопасно закрывается и повторяет попытку каждые 10 секунд. Восстановите доступ к Docker или Kubernetes API и проверьте журнал. Не удаляйте строки базы до согласования ресурсов.

Не удаётся удалить задачу

Убедитесь, что среда достижима. Конфликтующий ресурс без ai.libre-webui.task намеренно отклоняется. Исправьте владение и повторите.

Итоги безопасности

  • По умолчанию доступ только администраторам; открытие всем делает каждую учётную запись оператором песочницы. Папки хоста всегда административные.
  • Серверная часть управляет демоном или пространством имён.
  • Контейнеры не являются виртуальными машинами.
  • Без офлайн-политики есть исходящий трафик; цели контролирует оператор.
  • У томов нет независимой дисковой квоты.
  • Git работает локально, без удалённых учётных данных.
  • Брандмауэр, изоляция, исходящий трафик и квоты обеспечиваются оператором.
  • Удалённые провайдеры получают результаты и могут выполнять много вызовов.
  • Предпросмотр остаётся на loopback и доступен через подписанные отзываемые URL.
  • Compose предоставляет Docker, а Kubernetes/Helm — Pod/PVC при work.enabled=true.
  • Полная копия требует базу и тома.

Связанная документация