Настройки
This page is in Russian.
Настраивать ничего не обязательно: без файла и без переменных всё работает на встроенных значениях. Файл нужен тогда, когда надоело повторять один и тот же флаг.
Порядок, в котором решается настройка
Флаг → переменная окружения → файл → встроенное значение. Один порядок на всю программу, в одном месте, чтобы никакая команда не могла решить иначе.
Внутри файла побеждает самая точная запись. Для команды личного аккаунта на профиле work:
personal.profiles.work → profiles.work → personal.defaults → defaults. Для команды
max work bot … — то же, но с bot вместо personal. Профиль старше раздела: запись про один
аккаунт важнее записи про все.
max chats list --limit 5 # флаг: 5
MAX_PROFILE=personal max chats list # переменная выбирает профиль
# "limit": 50 у профиля в файле — когда флага нет
# "limit": 30 в "defaults" — когда и у профиля нет
# 20 — когда нет ничегоДва исключения, которые старше этого порядка. Они не забыты, а записаны:
MAX_TOKENстарше ключницы. Если переменная задана, берётся она — так это работает в CI.MAX_CONFIG_DIR,MAX_STATE_DIR,MAX_CACHE_DIRпереносят всю установку, включая то, какая запись в ключнице соответствует профилю.
Что действует сейчас
max config show # профиль, какие профили есть, файл и каждая настройка
max work config show # то же для профиля work
max config show --json # то же одним объектомПротив каждой настройки — откуда она: flag, default или config file: с ключом, из которого
она прочитана, например config file: bot.profiles.test. Против профиля — first word,
MAX_PROFILE, MAX_PROFILE_LOCK, config file: defaultProfile или default.
max test config show --bot показывает настройки так, как их получит max test bot …: у бота свой
раздел и свой лимит отправок. configFound: false значит, что файла
нет и всё встроенное. Если задана одна из переменных MAX_*_DIR, команда скажет об этом в stderr:
с ними у профиля другая запись в ключнице, и вход, сделанный без них, выглядит как «нет сессии».
Секретов в выводе нет: в файле настроек нет поля, куда их можно было бы положить.
Файл
~/.config/max-cli/config.json, режим 0644. Его пишет max config set (ниже) или вы сами.
{
"defaultProfile": "personal",
"defaults": { "keepRunsForDays": 14 },
"profiles": {
"personal": { "limit": 50, "timeoutMs": 20000, "color": true },
"work": { "limit": 10 }
},
"personal": {
"defaults": { "sendsPerHour": 30 }
},
"bot": {
"defaults": { "allow": ["send", "reaction"] },
"profiles": { "shop": { "sendsPerHour": 200 } }
}
}defaults— всем профилям, и личным аккаунтам, и ботам.profiles.<имя>— одному профилю, в какой бы роли он ни работал.personal.defaults,personal.profiles.<имя>— только командам личного аккаунта.bot.defaults,bot.profiles.<имя>— только командамmax <имя> bot ….
| Поле | Что делает | По умолчанию |
|---|---|---|
defaultProfile | какой профиль, если первым словом ничего не названо и MAX_PROFILE не задан | default |
limit | сколько записей показывать, когда --limit не передан | 20 |
timeoutMs | сколько ждать ответа на один запрос | берётся из транспорта |
color | цвет в терминале; без поля решается по тому, терминал ли это | по терминалу |
senderColors | в max messages свой цвет у каждого автора; вы — всегда голубым. Без color не действует. Только для личного аккаунта | false |
record | записывать ли каждый запуск, как будто передан --record | false |
allow | что профилю разрешено делать, списком: send, reaction, edit, delete, groups, contacts и другие. Без поля — всё | всё |
serve | запускать ли max serve в фоне, когда команде нужен MAX, а сервера нет; --no-serve — на один запуск. С MAX_TOKEN сервер не запускается. Только для личного аккаунта | true |
keepRunsForDays | сколько дней хранятся записи запусков | 30 |
readOnly | профиль только для чтения: max messages send отказывает с кодом 5 | false |
sendsPerHour | сколько сообщений профиль может отправить за час — вместе с пересылками, правками, закреплениями с уведомлением, удалёнными сообщениями и добавленными в группы людьми; сверх — отказ с кодом 8. Боту лимит задаётся только в разделе bot; без него бот не ограничен | 30, у бота — нет |
readOtherBots | может ли бот читать копии других ботов, когда команда просит это --all-bots или --bots: false, true — всех, или список профилей ботов. Только в разделе bot | false |
mcpTools | какие изменения аккаунта агент может делать через max mcp: contacts, polls, groups, profile. Включается только здесь, флагом нельзя; см. mcp.md. Только для личного аккаунта | ничего |
updateCheck | раз в сутки спрашивать npm, нет ли новой версии, и сказать об этом в терминале. Только в defaults: версия у программы одна на все профили | true |
skillHint | раз в сутки говорить агенту в stderr, что навыка max у него нет или он старше программы и что его ставит max skill install. Агента узнаём по переменной AI_AGENT или CLAUDECODE. Только в defaults | true |
transcribeModel | какой моделью max messages transcribe распознаёт речь. Только в defaults | gigaam-v3 |
⚠ timeoutMs и --timeout — разные вещи, и перепутать их дорого. timeoutMs — это сколько
ждать один ответ от MAX. --timeout — сколько отведено команде целиком. Одно чтение это
подключение, INIT, LOGIN, разбор имени чата и сам запрос, поэтому время работы кратно timeoutMs
и никогда ему не равно.
Записываются они по-разному нарочно, чтобы их нельзя было спутать: timeoutMs — число
миллисекунд в файле, --timeout — длительность с единицей на командной строке (30s, 2m,
500ms). Единица обязательна: --timeout 30 отвергается, потому что рядом лежит поле в
миллисекундах, а все остальные программы пишут так секунды — ошибиться можно в тридцать раз в
любую сторону.
Поля для --timeout в файле нет: бюджет на команду — это про конкретный запуск, а не про
привычку.
--page и --all поля не имеют, и это намеренно. Номер страницы, записанный в файл, нужен
ровно один раз и потом мешает каждому следующему запуску. То же про --order у
max contacts list: настройка contactOrder была бы вторым написанием того же самого. --limit поле имеет,
потому что «сколько показывать» — это привычка, а не разовый выбор.
Секрет в этот файл положить некуда. В схеме нет ни поля для токена, ни для телефона, ни для идентификатора чата: схема, в которой нет места секрету, надёжнее правила «не кладите сюда секрет».
Изменить, не открывая файл
max config set limit 50 # профилю по умолчанию
max work config set record true # профилю work
max config set keepRunsForDays 7 --defaults # всем профилям сразу
max work config unset limit # убрать; снова решает defaults или встроенное
max agent config set readOnly true # профиль agent ничего не отправит
max shop config set --bot sendsPerHour 200 # только боту shop
max config set --personal --defaults limit 30 # всем личным аккаунтам
max config set defaultProfile work # какой профиль без первого словаЗначение проверяется той же схемой, что и при чтении, до записи: max config set limit 0
откажет, и файл останется прежним. serve, senderColors и mcpTools с --bot не принимаются: у бота
нет ни сервера, ни цветов авторов, а mcpTools включает инструменты личного аккаунта.
Опечатка — это ошибка, а не умолчание
Неизвестное поле отвергается с именем поля и кодом configuration_error (возврат 3):
{"error":{"code":"configuration_error","message":"/home/you/.config/max-cli/config.json is not a valid config:\n profiles.default.limitt: unknown setting — the known ones are limit, timeoutMs, color, record, keepRunsForDays, readOnly, allow, sendsPerHour, senderColors, serve, mcpTools"}}Значение не того вида называет поле и то, что допустимо: profiles.default.limit: has to be a whole number, 1 or more, not "20".
Так сделано намеренно. Схема, которая молча выбрасывает непонятное поле, превращает опечатку в полдня недоумения: настройка «не работает», и никто не говорит почему.
Отсутствующий файл — не ошибка: это программа, которую не настраивали.
Посмотреть, что получилось
Настройки решаются в несколько слоёв, и разобрать по файлу, какой из них победил, трудно. Поэтому есть команда, которая говорит это прямо:
max config show
max config show --jsonОна печатает выбранный профиль и откуда он взялся, путь к файлу настроек и есть ли он, профили и действующие значения всех настроек с источником каждого.
⚠ В списке профилей — все, что есть на машине: названные в файле, со входом личным аккаунтом и с ботом, и у каждого — личный он, бот или оба.
⚠ Это не проверка здоровья. Она читает файлы: не открывает кеш, не трогает ключницу и не связывается с MAX. Вопрос «жива ли сессия» стоит одного входа и относится к другой команде.
Переменные окружения
| Переменная | Что делает |
|---|---|
MAX_PROFILE | профиль на всю сессию оболочки; то же, что первое слово |
MAX_PROFILE_LOCK | запирает процесс на одном профиле: другой профиль — первым словом или через MAX_PROFILE — и config set --defaults получают отказ. Держит только там, где агент не может сам поменять окружение: в настройках MCP-клиента или в скрипте-обёртке. Агент с доступом к оболочке снимет переменную сам |
MAX_TIMEOUT | ограничение на команду целиком, на всю сессию оболочки; то же, что --timeout |
MAX_TOKEN | токен напрямую, в обход ключницы — для CI и разовых запусков |
MAX_BOT_TOKEN | токен бота для max bot, в обход ключницы |
MAX_CONFIG_DIR | где лежат config.json и, при отсутствии ключницы, файл с токеном |
MAX_STATE_DIR | где лежат состояние профилей и каталог runs/ |
MAX_CACHE_DIR | где лежит локальная копия чатов и сообщений |
NO_COLOR | выключает цвет, как и в любой другой программе |
MAX_NO_UPDATE_CHECK, NO_UPDATE_NOTIFIER | не спрашивать npm о новой версии; CI действует так же |
Пустая строка — это не значение, а несуществующая переменная: MAX_PROFILE= то же самое, что
MAX_PROFILE не задана.
Переменные есть только у профиля и у таймаута.
Это две вещи, которые выставляют один раз на процесс. Переменной для --json или для цвета не
будет: забытая в оболочке, она меняет вывод команды, которая об этом не просила, — а найти такое
потом труднее, чем набрать флаг.
Отдельный набор настроек на время
Три переменные каталогов дают полностью изолированную установку — это удобно для пробы, для второго аккаунта и для тестов:
export MAX_CONFIG_DIR=/tmp/max-try/config
export MAX_STATE_DIR=/tmp/max-try/state
export MAX_CACHE_DIR=/tmp/max-try/cache
max session start # этот токен не виден обычной установке
max chats list⚠ И обратно тоже: обычная установка не видит эту сессию. Именно на этом однажды был потерян час — «нет сессии» при живом токене, потому что переменные остались в одном окне терминала и не были заданы в другом.
Дальше
- commands.md — каждая команда и опция, и полная таблица кодов возврата
- sessions.md — как устроены профили и где лежит токен
- troubleshooting.md — что делать, когда не работает