Настройки
Настройки платформы: уровни, на которых их задают, хозяева ключей, окно настроек, языки интерфейса и перечень всех ключей.
Введение
Документ описывает источники значений настроек, хозяев ключей, отображение настроек человеку и устройство языков интерфейса. Значения хранит функция settings, тексты собирает функция i18n, смысл каждого ключа определяет его хозяин. Формат файлов — Форматы файлов, раздел 8, методы — Методы служб платформы, раздел 1.
1 Уровни
Значение ищется от узкого уровня к широкому и берётся с первого уровня, где оно задано. Уровни в таблице 1 перечислены от широкого к узкому.
Таблица 1 — Уровни
| Уровень | Где хранится | Кто пишет |
|---|---|---|
| умолчание схемы | в схеме ключа | хозяин ключа |
core |
data/config/core.json, только ключи core.* |
окно настроек; ядро при первом старте создаёт пустой файл |
system |
data/config/system.json |
вручную; мастерская этот уровень не записывает. Уровень сохранён, хотя экземпляр обслуживает одного человека: он может потребоваться для настроек машины отдельно от настроек человека |
user |
data/config/user.json |
окно настроек |
process |
data/processes/<id>/settings.json |
настройки процесса |
session |
в памяти функции настроек, не в файле | действует до перезапуска функции |
Уровня настроек модуля нет: то, что человек задаёт модулю, — параметры узла (Модули, раздел 10).
Ключи core.* на любом уровне, кроме session, записываются в core.json. Ключ со схемой restart: true начинает действовать при следующем запуске; платформа не показывает его применённым сразу.
2 Схема настроек
Каждый хозяин описывает свои настройки в одном файле схемы settings.schema.json рядом со своим кодом (Устройство платформы); программа встраивает его при сборке. Других мест, где записаны умолчание или пределы настройки, нет — ни в коде хозяина, ни в функции настроек, ни в окне (правило 2.2 Правила разработки). Формат файла — Форматы файлов, раздел 8.
Схема делит настройки хозяина на подразделы. У каждого ключа в ней:
type—string,integer,number(дробное число: доля, миллиметры, температура модели),string[]илиcolor(#RGB/#RRGGBB);default— значение по умолчанию;default_by— необязательно: умолчание, которое зависит от значения другого ключа того же хозяина. Так цвета оболочки следуют выбранной цветовой схеме;restart— нужен ли перезапуск, чтобы значение подействовало;- для чисел —
minиmax, для закрытого набора значений —choices.
Тексты настройки хранятся в словарях хозяина, а не в схеме, и именуются по правилу; имена текстов отдельно не записываются (таблица 2).
Таблица 2 — Тексты настройки в словарях
| Текст | Ключ словаря |
|---|---|
| название настройки | setting.<ключ>.title |
| пояснение: назначение, единица, особые значения (например, «0 — выключено») и когда изменение действует; пределов и умолчания схемы в нём нет — окно настроек показывает их из схемы | setting.<ключ>.help |
| название значения из закрытого набора | setting.<ключ>.choice.<значение> |
| название подраздела | setting.section.<id подраздела> |
Проверка в make ci не проходит, если у ключа схемы нет хотя бы одного из этих текстов на русском или английском или если пояснение повторяет число своей схемы — предел или умолчание, кроме нуля: такая копия разойдётся со схемой при первом её изменении.
Код хозяина читает свою настройку через общий помощник из общего кода протокола. Помощник запрашивает функцию настроек, а при отсутствии ответа берёт умолчание из того же файла схемы. Собственных запасных значений у кода нет.
Исключение — значения уровня процесса: это свободные ключи для подстановки в параметры узлов (Программа: граф и запуски, раздел 15), схемы у них нет. Записывает их settings.set с уровнем process, а settings.get с process_id возвращает их в записанном виде (Методы служб платформы, раздел 1).
3 Хозяева ключей
Префикс ключа — адрес хозяина (правило 2.4). Функция настроек хранит значения и проверяет их по схеме, но своих ключей у неё нет: смысл каждого ключа определяет его хозяин.
Таблица 3 — Хозяева ключей
| Префикс | Хозяин | Передача схемы функции настроек |
|---|---|---|
core.* |
ядро | функция настроек при запуске запрашивает схему у ядра методом core.settings.schema |
ui.* |
функция ui |
settings.schema.register |
i18n.* |
функция i18n |
settings.schema.register |
graph.*, modules.*, canvas.*, observe.*, sources.* и любой другой |
функция с этим id | settings.schema.register |
Хозяин регистрирует схему при запуске и снова всякий раз, когда функция настроек поднимается заново (событие function.ready): схемы хозяев она держит, только пока работает, и после её перезапуска без повторной регистрации значения человека перестали бы действовать. Хозяин называет settings в своём описании (requires, Устройство платформы, 3.4.1); make ci это проверяет. Хозяин, которому умолчания его схемы безвредны, называет её необязательной (optional) и до её прихода работает на умолчаниях — так устроена функция i18n; графу и функции модулей настройки обязательны: их значения решают, что хранить и сколько ресурсов занять. Регистрировать можно только свою схему: хозяина называет ядро, отправитель вызова (Обмен с ядром, раздел 3), и схема другого хозяина — отказ settings_invalid_owner; в схеме — только ключи со своим префиксом, чужой ключ — отказ settings_invalid. Повторная регистрация того же хозяина заменяет его схему целиком.
Ядро стартует раньше функции настроек и не может её запросить. Поэтому ключи core.* оно читает само: по своей схеме, из core.json и system.json. Если значение в этих файлах не подходит по схеме — недопустимое число или неверный тип, — ядро не стартует и называет файл, ключ, значение и допустимые значения. Так же оно поступает с файлом, который не разбирается.
Функция настроек проверяет по схеме и то, что уже лежит в файлах уровней: файл мог быть изменён вручную. Неподходящее значение она не использует — берёт значение с более широкого уровня — и публикует событие settings.value_invalid с error_code: settings_value_invalid, файлом и ключом; по нему функция наблюдения открывает проблему.
4 Запись и сброс
- Значение проверяется до записи; если оно не подходит, остаётся старое.
- Файл записывается целиком, после записи публикуется событие
settings.changed. - Сброс убирает значение с уровня: ключ удаляется из файла или из памяти сессии, и значение снова берётся с более широких уровней и из схемы. Умолчание в файл не записывается. Ключ убирается из того файла, куда шла его запись на этом уровне: ключ
core.*— изcore.json, как и записывался.
5 Секреты
Платформа не хранит пароли и ключи доступа. Настройка, в имени которой есть secret, password, token, api_key, apikey или private_key (большие и маленькие буквы не различаются), отклоняется с settings_secret_rejected. Это защита от случайной ошибки, а не распознавание секретов: ключ openai_key проверку пройдёт (Защита, 3.5).
6 Окно настроек
- Раздел «Состояние» расположен первым в колонке окна: работает ли ядро, какие функции на связи, последние ошибки и простые счётчики. Этот раздел не является списком модулей.
- Порядок. Далее следуют крупные разделы (ядро, интерфейс, прочее), внутри них — подразделы. Подразделы по умолчанию свёрнуты.
- Изменение значения. Значение изменяется во вкладке «Правка» панели выбранной настройки (Мастерская, 5.1); клавиша
Enter, кнопка «Записать» и переход к другой настройке записывают значение, как уход из поля пульта; значение, которое не проходит проверку схемы, не записывается. Значение из закрытого набора выбирается из списка. - Справка. У каждой строки есть знак «?», раскрывающий пояснение; пояснение, ключ, умолчание и допустимые значения показывает вкладка «Информация».
- Сброс. Кнопка «Сбросить» во вкладке «Правка» возвращает умолчание настройки, кнопка «Сбросить всё» — умолчания всего раздела.
- Перезапуск. Настройки, требующие перезапуска, помечены.
7 Языки
- В коде только ключи строк, сами тексты — в словарях JSON хозяина текста: подписи окна — у функции
ui, названия настроек и тексты ошибок — у хозяина ключа или кода ошибки (правило 2.2). Функцияi18nсобирает словари, но чужих текстов не хранит. - Язык интерфейса — настройка
i18n.language. Её хозяин — функцияi18n; окно настроек записывает её обычнымsettings.set, как любую другую, переключатель языка мастерской — командой хозяинаi18n.language.set, а узнаёт язык мастерская запросомi18n.language.get, ключа настройки не зная; а функцияi18nчитает её при каждом запросе и собственной копии языка не хранит. - Словари. Функции объявляют папки своих словарей при знакомстве (
locales); папка с сегментом*означает каждую такую папку, которая есть в момент вопроса, поэтому словари, появившиеся во время работы, видны без нового объявления (Обмен с ядром, раздел 4). Ядро отдаёт их список запросомcore.localesи добавляет в него свою папкуcore/kernel/locales; функцияi18nчитает только эти папки и свою собственную. - Язык модуля. Модуль узнаёт язык в сообщении
init. Функция модулей спрашивает его у хозяина запросомi18n.language.getпри каждом запуске модуля; без функцииi18nязык вinit—null, и модуль говорит на своём языке по умолчанию. - Отсутствие текста для ключа является проблемой для диагностики, а не отказом:
i18n.translateотдаёт сам ключ вместо текста и публикует событиеi18n.key_missingсerror_code: i18n_key_missing, по которому функция наблюдения открывает одну проблему на ключ. - Обязательные языки — русский и английский; новый язык — это словари, без кода. Готовых наборов настроек, включаемых целиком, нет: уровни и сброс уже дают начать заново.
8 Перечень ключей
Раздел содержит только ключи и их назначение. Тип, умолчание, допустимые значения и нужен ли перезапуск записаны в одном месте — в файле схемы хозяина, — и в документе не повторяются: изменение умолчания выполняется в одном файле. Проверка в make ci не проходит, если ключ схемы здесь не упомянут или упомянут ключ, которого нет ни в одной схеме.
Ядро — core/kernel/settings.schema.json:
Таблица 4 — Ключи настроек ядра
| Ключ | Назначение |
|---|---|
core.connections_max |
сколько частей программы может одновременно подключиться к ядру |
core.rpc_queue |
сколько просьб одной части держать в очереди |
core.document_max_bytes |
наибольший размер одного документа |
core.function_start_timeout_ms |
сколько ждать, пока запущенная функция познакомится с ядром |
core.health_interval_ms |
как часто спрашивать функции «вы живы?» |
core.health_timeout_ms |
сколько ждать ответа «жива» |
core.function_restart_max |
сколько раз подряд перезапускать упавшую функцию |
core.function_restart_base_ms |
пауза перед первым перезапуском, дальше вдвое |
core.shutdown_grace_ms |
сколько ждать спокойной остановки экземпляра |
core.process_stop_grace_ms |
от просьбы остановиться до принудительной остановки программы, запущенной частью платформы (например, программы модуля) |
core.disk_budget_gib |
сколько места на диске платформа может занять всего; 0 — без предела; действует без перезапуска |
core.disk_free_min_gib |
сколько места на диске платформа оставляет свободным при любом пределе; действует без перезапуска |
core.backups_dir |
куда кладутся резервные копии; пусто — backups в папке установки; действует без перезапуска |
core.backups_keep |
сколько последних резервных копий хранить |
core.event_ring_size |
сколько последних событий помнит ядро |
core.command_dedup |
сколько команд ядро помнит, чтобы узнать повторную доставку |
Ядро читает свои ключи при запуске, поэтому они действуют после перезапуска платформы; два ключа места ядро перечитывает при каждом вопросе о месте, и они действуют сразу.
Мастерская — functions/ui/settings.schema.json:
Таблица 5 — Ключи настроек мастерской
| Ключ | Назначение |
|---|---|
ui.scheme |
цветовая схема: тёмная или светлая; цвета, которые человек не задал, следуют ей |
ui.notice.show_s |
сколько секунд уведомление о вопросе программы или сбое остаётся на экране |
ui.notice.at_once |
сколько уведомлений видно одновременно |
ui.undo_depth |
сколько последних правок программы возвращает «Отменить» |
ui.open_dir |
с какой папки Windows открывается окно выбора файла; пусто — с той, что выберет Windows |
ui.keep_awake |
не давать Windows уйти в сон, пока идёт запуск хоть одной программы |
ui.autostart |
запускать платформу при входе в Windows: ярлык в автозагрузке |
ui.window.exe |
программа окна, путь в WSL; пусто — bin/ogas-window.exe, затем результат make window |
ui.window.port |
порт окна на 127.0.0.1; 0 — свободный на каждый запуск |
ui.window.devtools_port |
порт отладки WebView2, только для разработки; 0 — выключен |
ui.font.source |
источник шрифта: встроенный, системный Windows или файл |
ui.font.file |
путь в WSL к файлу шрифта, если источник — файл |
ui.font.size_* |
размеры букв: основной, заголовок, подзаголовок, мелкий, подписи баров, узел |
ui.radius.* |
скругления: окно, кнопки окна платформы, поле, кнопка действия, узел, строка списка |
ui.space.* |
отступ списка, промежуток между строками, высота строки |
ui.stroke.* |
толщина обводки: окно, поле, узел, связь графа |
ui.layout.* |
клетка бара, кнопки окна операционной системы, колонка слева и панель выбранного у окон на хосте, размер узла |
ui.color.* |
цвета оболочки: хост, бары, окна (колонка слева, рабочее поле, панель выбранного), диалоги, строки и поля, кнопки, граф, пульт, обводки; шапки узлов по семействам вида и шапка группы (ui.color.head_*), связи и точки портов по типу данных (ui.color.type_*) — Мастерская, 5.3 |
Язык — functions/i18n/settings.schema.json:
Таблица 6 — Ключи настроек языка
| Ключ | Назначение |
|---|---|
i18n.language |
язык интерфейса |
Граф — functions/graph/settings.schema.json:
Таблица 7 — Ключи настроек функции графа
| Ключ | Назначение |
|---|---|
graph.max_iterations |
наибольшее число кругов одного цикла |
graph.max_loop_ms |
наибольшее время одного цикла от первого входа в тело; узел может задать меньше |
graph.queue_depth |
сколько данных может ждать у одного входа узла |
graph.runs_keep |
сколько последних прогонов процесса хранить; 0 — не убирать самой |
graph.show_max_bytes |
сколько байтов данных держит и отдаёт окну один узел «Показать»; от большего держится начало |
graph.file_max_bytes |
самый большой файл, который человек может дать процессу; по умолчанию 1 ГиБ (Форматы файлов, 16.4) |
graph.timer_min_ms |
наименьший промежуток между срабатываниями события по таймеру |
Модули — functions/modules/settings.schema.json:
Таблица 8 — Ключи настроек функции модулей
| Ключ | Назначение |
|---|---|
modules.artifact_max_bytes |
наибольший размер одного файла результата шага |
modules.gpu_budget_mb |
сколько видеопамяти делят поднятые модули; 0 — видеокартой пользуется один |
modules.models_dir |
папка нейросетей: путь от папки установки, по умолчанию models, или полный путь так, как его пишет WSL или Windows (Модули, раздел 11) |
modules.ping_interval_ms |
как часто спрашивать поднятые долгие модули и службы, отвечают ли они (ping) |
modules.ping_timeout_ms |
сколько ждать ответа на ping; не ответивший модуль останавливается как потерянный |
modules.python_candidates |
какие программы Python пробовать, по порядку |
modules.stderr_tail_bytes |
сколько байт конца служебного вывода модуля хранить и показывать при отказе шага |
modules.uv |
программа uv, которой ставятся окружения Python процессов: имя или путь |
modules.parallel_max |
сколько модулей на всём компьютере выполняют шаг одновременно; 0 — без предела |
modules.memory_max_mb |
сколько памяти все модули вместе могут занять; 0 — без предела |
modules.cpu_max |
сколько ядер процессора все модули вместе могут занять; 0 — без предела |
Сколько ждать остановки модуля, задаёт core.process_stop_grace_ms: остановкой OS-процесса занимается ядро, и второго ключа о том же нет.
Пульт — functions/canvas/settings.schema.json, раздел окна настроек «Интерфейс платформы»:
Таблица 9 — Ключи настроек функции пульта
| Ключ | Назначение |
|---|---|
canvas.image_max_bytes |
наибольший размер рисунка пульта; крупнее рисунок в пульт не берётся и окну не отдаётся. Верхний предел ключа — то, что проходит одним сообщением обмена |
canvas.sheet_gap |
промежуток между элементами, который функция пульта оставляет, когда сама даёт место новому элементу |
canvas.sheet_height |
высота листа нового пульта и нового раздела, в единицах листа |
canvas.sheet_margin |
отступ от края листа, который функция пульта оставляет, когда сама даёт место; к этой же черте прилипает элемент, который несут |
canvas.sheet_scale_min |
предел уменьшения листа на экране, в процентах его полного размера; мельче лист не становится, поле прокручивается |
canvas.sheet_step |
шаг листа: на него встаёт элемент, который несут или тянут за край, и по нему функция пульта ищет место новому элементу |
canvas.sheet_width |
ширина листа нового пульта и нового раздела, в единицах листа |
canvas.theme_accent |
цвет действия: кнопка события, заполнение полосы, включённый выключатель |
canvas.theme_background |
фон пульта: цвет листа и поля вокруг него |
canvas.theme_font |
шрифт пульта: шрифт платформы, шрифт Windows, с засечками или равной ширины |
canvas.theme_letters |
высота букв на пульте, в единицах листа |
canvas.theme_ok |
цвет готового: индикатор прошедшего запуска, кнопка повтора |
canvas.theme_radius |
скругление углов на пульте, в единицах листа |
canvas.theme_stop |
цвет остановки: кнопка остановки, сбой, отметка неработающего элемента |
canvas.theme_surface |
цвет элементов: поля, значения, рамки |
canvas.theme_text |
цвет букв |
Числа листа действуют со следующего изменения пульта; листы, которые уже есть, от них не меняются. Процесс может иметь свои числа на уровне настроек процесса (Мастерская, 6.3).
Ключи canvas.theme_* — вид пульта, который своего не задал: пульт называет в документе только те ключи темы, которые задал сам, остальные берутся отсюда (Мастерская, 6.5). Раздел схемы canvas.theme — одновременно закрытый перечень ключей темы и описание того, что каждый принимает: документ пульта проверяется по нему же (Форматы файлов, раздел 7).
Журнал — functions/observe/settings.schema.json:
Таблица 10 — Ключи настроек функции наблюдения
| Ключ | Назначение |
|---|---|
observe.logs_keep_months |
сколько последних месяцев общего журнала хранить, нынешний среди них; 0 — хранить всё (Устройство платформы, 3.8.2) |
Источники — functions/sources/settings.schema.json (Мастерская, 5.6):
Таблица 11 — Ключи настроек функции источников
| Ключ | Назначение |
|---|---|
sources.ogas_url |
адрес витрины O.G.A.S., по умолчанию https://ogas.space/catalog.json; пусто — витрины в библиотеке нет |
sources.catalogs |
адреса других витрин того же формата — у каждой своя строка под «Источниками» |
sources.huggingface_url |
адрес Hugging Face или его зеркала; пусто — источника нет |
sources.civitai_url |
адрес Civitai; пусто — источника нет |
sources.check_on_start |
смотреть ли витрину ogas.space при запуске — о новой версии платформы: on (по умолчанию) или off — только кнопкой «Проверить» |
sources.results |
сколько вещей показывает один поиск |
sources.answer_s |
сколько ждать ответа источника на поиск и на вопрос о файлах |
sources.stall_s |
сколько секунд загрузка может стоять без единого байта, прежде чем оборваться |
sources.max_gib |
наибольшая загрузка, ГиБ: больше не начинается |
Вход для программ — functions/gate/settings.schema.json (Методы служб платформы, раздел 5):
Таблица 12 — Ключи настроек функции входа
| Ключ | Назначение |
|---|---|
gate.door |
открыт ли вход для программ человека: closed или open |
gate.port |
порт входа на 127.0.0.1; 0 — свободный, его называет data/gate.json |
gate.clients |
сколько программ может войти сразу |
Помощник — functions/assistant/settings.schema.json (Методы служб платформы, раздел 6):
Таблица 13 — Ключи настроек функции помощника
| Ключ | Назначение |
|---|---|
assistant.max_steps |
сколько обращений к сети за задачу, прежде чем помощник остановится и спросит |
assistant.task_budget |
сколько токенов за задачу, прежде чем помощник остановится и спросит |
assistant.answer_length |
сколько токенов сеть может написать за один ответ |
assistant.result_chars |
сколько знаков результата одного действия помощника читает сеть |
Профиль — functions/profile/settings.schema.json (Методы служб платформы, раздел 7):
Таблица 14 — Ключи настроек функции профиля
| Ключ | Назначение |
|---|---|
profile.ask_at_start |
предлагать ли при запуске создать профиль или войти в свой: on (по умолчанию) или off — так ставит «Позже» |
profile.check_on_start |
смотреть ли при запуске, что стало со своими отправками, и письма: on (по умолчанию) или off — только кнопкой «Проверить» |
profile.site |
адрес сайта платформы, по умолчанию https://ogas.space/ |
profile.answer_s |
сколько ждать ответа сайта на чтение |
profile.send_s |
сколько может идти одна отправка |