Chimera — руководство по использованию
Chimera — это самоэволюционирующий агент, у которого командная строка на первом месте, а ядро рассуждения построено на LLM-Fusion. Это руководство описывает установку, настройку и каждую команду с примерами.
Впервые в проекте? Сначала прочитайте обзор архитектуры.
Установка
Chimera использует uv.
git clone https://github.com/brcampidelli/chimera-agent
cd chimera-agent
uv sync --extra dev # install runtime + dev deps
uv run chimera --help # verify the CLI
Каждая команда ниже запускается как uv run chimera <команда> (или просто chimera …, когда
виртуальное окружение проекта уже в вашем PATH).
Настройка
Chimera не привязана к поставщику благодаря LiteLLM. Положите ключи и
выбор моделей в локальный .env (он в gitignore — никогда не коммитьте его):
# At least one provider key. OpenRouter unlocks 100+ models behind one key.
OPENROUTER_API_KEY=sk-or-...
# OPENAI_API_KEY=...
# ANTHROPIC_API_KEY=...
# Tier-1/2 default model (single, cheap, must support tool-calling for Tier-2)
CHIMERA_DEFAULT_MODEL=openrouter/deepseek/deepseek-chat-v3.1
# LLM-Fusion: a diverse panel -> judge -> synthesizer
CHIMERA_FUSION_PANEL=openrouter/deepseek/deepseek-chat-v3.1,openrouter/openai/gpt-4o-mini,openrouter/meta-llama/llama-3.3-70b-instruct
CHIMERA_FUSION_JUDGE=openrouter/deepseek/deepseek-chat-v3.1
CHIMERA_FUSION_SYNTHESIZER=openrouter/openai/gpt-4o-mini
Другие рычаги: CHIMERA_HOME (каталог состояния, по умолчанию .chimera), CHIMERA_LOG_LEVEL
(INFO / DEBUG), CHIMERA_CACHE (on/off, по умолчанию выключено — кэширует одинаковые ответы
без инструментов, чтобы не повторять обращения к API) и CHIMERA_AUTO_FUSE (on/off, по умолчанию
выключено — автоматически сливает глубокие или чувствительные к ошибке ходы в solve и crew
без явного --fuse; маршрутизатор, знающий цену, всё равно оставляет дешёвые ходы и ходы с
инструментами на одной модели). Маршрутизатор распознаёт запросы с точным ответом (арифметика,
подсчёты, действия с цифрами) на основных языках проекта (en/pt/es/de/fr/zh/ja), поэтому короткий, но
важный шаг получает защиту слияния даже когда он слишком короток, чтобы сработал порог по длине.
Поставщики, запасные варианты и своё размещение. Работает любой ярлык LiteLLM вида
поставщик/модель (openai/…, anthropic/…, gemini/…, ollama_chat/…, openrouter/… и так далее).
Для своего сервера, совместимого с OpenAI (Ollama, vLLM), задайте CHIMERA_API_BASE (например,
http://127.0.0.1:11434 вместе с CHIMERA_DEFAULT_MODEL=ollama_chat/llama3). Используйте
ollama_chat/, а не ollama/: префикс ollama/ идёт через endpoint generate в Ollama, который
не умеет вызывать инструменты. Задайте
CHIMERA_FALLBACK_MODELS (через запятую), чтобы переключаться на другую модель, когда основная даёт
ошибку. В chat и tui команда /model <ярлык> меняет модель посреди сессии.
Локальной модели ключ не нужен. С CHIMERA_DEFAULT_MODEL=ollama_chat/<модель> или lm_studio/<модель> любая команда работает без API-ключа (LM Studio опрашивается по CHIMERA_LM_STUDIO_BASE_URL, по умолчанию http://localhost:1234/v1), а экран первого запуска настольного приложения предлагает модели, которые уже есть у Ollama или LM Studio — один клик, без ключа.
Пулы учётных данных. Дайте поставщику несколько ключей через CHIMERA_<ПОСТАВЩИК>_KEYS
(например, CHIMERA_OPENROUTER_KEYS=key1,key2,key3). Шлюз чередует их по кругу между вызовами
(распределяя нагрузку и лимиты), а внутри одного вызова переходит к следующему ключу, если один даёт
ошибку. Пул заменяет одиночный *_API_KEY этого поставщика. (Входы по OAuth и подписке — Copilot,
Claude Max и подобные — пока не подключены; ключи API и любая конечная точка, поддерживаемая LiteLLM,
работают.)
Проверьте, что всё связано:
uv run chimera doctor # shows version, default model, configured providers
uv run chimera models # shows the fusion panel / judge / synthesizer
uv run chimera features # optional capabilities + what each needs (key/dep)
Необязательные возможности. Зрение, режим готового документа и питомец встроены. Остальное
(веб-поиск, поиск в X, генерация изображений, синтез речи и голос, Spotify, браузер) — заготовленные
гнёзда: впишите нужные учётные данные в .env (или поставьте зависимость), и возможность включится.
chimera features — это живой список. Инструмент web_search (Tavily) регистрируется сам, как
только задан TAVILY_API_KEY, — и служит образцом для добавления остальных (либо пользуйтесь
клиентом MCP или импортёром OpenAPI → инструмент).
Бесплатные и платные модели. Модели OpenRouter с пометкой
:freeничего не стоят, но ограничены по частоте на стороне поставщика — годятся для быстрогоrunи капризны для команд с множеством вызовов вродеfuseиsolve. Для настоящей работы дешёвая платная модель (например,deepseek/deepseek-chat-v3.1, доли цента за вызов) куда надёжнее.
Команды
Состояние — version · doctor · models
uv run chimera version
uv run chimera doctor
uv run chimera models
chat — интерактивный помощник со многими ходами (ваша правая рука)
Интерактивный цикл с памятью разговора и использованием инструментов — то, чем пользуются каждый
день. Он вспоминает уместное из долговременной памяти, связывает разговор между ходами и
сохраняет ветку после каждого хода в <home>/sessions, так что следующий запуск продолжает с
того места, где вы остановились. chimera sessions перечисляет сохранённые ветки;
chimera sessions --delete <id> удаляет одну.
uv run chimera chat # resume the newest thread; /exit to quit
uv run chimera chat --new # start a fresh thread instead of resuming
uv run chimera chat --session standup # -s: resume, or name, one thread by id
uv run chimera chat --no-memory # don't recall long-term memory
uv run chimera chat --cascade # tiered routing: weak -> gate -> mid -> gate -> fusion
uv run chimera chat --fuse # fusion routing for tool-free turns (read the note)
uv run chimera chat --max-usd 0.50 # ceiling for the WHOLE thread, not for one turn
uv run chimera chat --write-region 'src/**,*.py' # the only paths the file-writers may touch
uv run chimera chat --model MODEL --workspace DIR --max-steps 8
--workspace/-w укореняет инструменты, и оттуда же читается AGENTS.md; --max-steps
ограничивает число шагов с вызовом инструментов внутри одного сообщения; --model/-m
переопределяет ярлык модели — но прочтите ниже замечание о маршрутизации.
Команды: /help · /new (свежая ветка — текущая остаётся на диске) · /reset (то же, что и
/new) · /model <ярлык> (без аргумента — обратно к модели по умолчанию) · /solve <задача>
(передать циклу с проверкой) · /exit (а также /quit, /q).
Он управляем, и он спрашивает вас. chat и assist собирают тот же стек, что и путь API:
журнал заражения, которому сообщают ваше собственное сообщение, ограждение <<external-data>>
вокруг недоверенного вывода инструментов, ядро доверия, --write-region, нижнюю границу охвата
владельца (CHIMERA_REACH) и его же указания из agent.json. Подтверждающий спрашивает в вашем
терминале — это единственная поверхность, где кто-то гарантированно есть и может ответить.
Измерено на корпусе внедрений (bench/right_hand_governance/RESULTS.md, 2026-09-08):
заблокированные атаки выросли с 0 из 7 до 7 из 7, внешние чтения, вернувшиеся внутри ограждения, —
с 0 из 12 до 12 из 12, а избыточных блокировок при отвечающем человеке 0,000 — ценой пяти вопросов
на восьми законных строках. Через конвейер (chimera chat < script.txt) спрашивать некого, поэтому
вопрос становится записанным отказом, а не молчаливым согласием.
Замечания о честности:
- Отклонённый вызов инструмента печатается под ответом —
✗ run_shell did not succeed: …. Модель рассказывает вокруг отказов: измеренный случай отвечал "The command printed exactly: marker-42" про команду, которую заслон выполнения на хосте отклонил. У одобрения тоже есть своя строка (governance: 1 approved this turn), чтобыy, набранное посреди хода, оставляло след, когда ответ уже уехал вверх. --fuseне сплавляет ход, который несёт инструменты, а ход цикла несёт их всегда. Маршрутизатор отправляет любой ход с инструментами одной модели, так что на практике ход с--fuseздесь — это ход одной модели.--cascadeк тому же перебивает--fuse, когда заданы оба. Единственный маршрут в терминале, который действительно сплавляет, — это/taskвassist.- Названная модель закрепляется, и лестница тиров отходит в сторону. Под
--cascadeмодель на каждом ходе выбирает лестница, и раньше она молча проглатывала названный вами ярлык. Теперь--modelи/model <ярлык>берут верх, пока хоть один из них назван, — отдельная строка сообщает, что лестница выключена, — а/modelбез аргумента возвращает работу ей. - Каждый ход печатает свои токены и цену —
cost: unavailable, когда прейскурантная цена модели неизвестна, и никогда угаданный ноль — и дописывает строку в<home>/usage.jsonl, которую читает экран «Стоимость» настольного приложения. --max-usdограничивает ветку, а не ход. Один счётчик идёт от первого сообщения до/exit;/solveтратит те же деньги; а когда они кончились, следующее сообщение отклоняется ещё до отправки, вместо того чтобы оплатить вызов и лишь тогда узнать, что не осталось ничего. Ответ, который оборвали — потолком,--max-stepsили контекстом, переставшим помещаться, — говорит об этом отдельной строкой, потому что иначе усечённый ответ читается ровно как законченный.- Восстановленный ход говорит об этом. Когда ветка возвращается с диска, тусклая строка под ответом считает воспроизведённые ходы, которые были восстановлены, и сколько из них так и не получили записанного происхождения. Они воспроизводятся внутри ограждения данных, а не как собственные слова модели, и до сих пор ограждение было невидимо тому, кого оно защищает.
/solve <задача>передаёт разговор циклу с проверкой — спланировать, отредактировать, проверить и откатить попытку, когда она не удалась; это вторая из двух кнопок на экране кода в настольном приложении. Он никогда не запускается сам, перед запуском печатает задачу и потолок, а собственный ответ цикла записывается в ветку. Без аргумента он берёт последнее, о чём вы просили.- Серверы MCP добираются до терминала. С
CHIMERA_MCP_AUTOLOAD=1серверы изmcp.jsonмонтируются до ограждения, так что список запретов, ядро и журнал заражения покрывают их, а вывод сервера приходит внутри ограждения данных, как любое другое внешнее чтение. Они подключаются один раз на процесс и делятся с приложением, поэтому ничего не запускается дважды. /resetначинает новую ветку; он не стирает текущую. Раньше он очищал стенограмму в памяти, когда на диске ничего не было; теперь, когда ветка — это файл, очистка на месте уничтожила бы работу. (Вassist, который ничего не сохраняет,/resetпо-прежнему очищает контекст.tuiпишет в то же хранилище и переопределил/resetтак же.)chimera doctorсообщает, где выполняются команды агента и спрашивает ли он сначала: настроенную песочницу, действительно ли доступна песочница ОС, и позицию по выполнению на хосте.
assist — та же правая рука, по умолчанию дешёвая
assist — это chat с включёнными настройками «второго мозга»: каскад тиров отправляет болтовню
дешёвым моделям и поднимает трудные просьбы выше, ваш постоянный профиль (chimera profile)
служит устойчивой преамбулой, а память, подсказки и консолидация в конце сессии активны. При
выходе он печатает чек сессии — распределение по тирам и измеренные токены, — чтобы «дёшево по
умолчанию» было числом.
uv run chimera assist # cascade, profile and memory on
uv run chimera assist --no-cascade # one default model instead of the ladder
uv run chimera assist --no-memory # don't recall long-term memory
uv run chimera assist --max-usd 0.25 # ceiling for the WHOLE run, not for one turn
uv run chimera assist --write-region 'src/**' # the only paths the file-writers may touch
uv run chimera assist --model MODEL --workspace DIR --max-steps 8
Команды: /help · /task <трудная просьба> (полная мощность через сплавление, один заход) ·
/solve <задача> (передать циклу с проверкой) · /profile <вид>: <факт> (запомнить что-то о вас
— виды: preference, project, context, name) · /model <ярлык> · /reset (очистить
контекст разговора; ничего не удаляется) · /exit (а также /quit, /q).
Управляем ровно так же, как chat, — тот же реестр, тот же спрашивающий подтверждающий, те же
строки отказа, управления и стоимости, та же строка в usage.jsonl, те же серверы MCP, тот же
счётчик --max-usd на весь запуск и тот же /solve. Два различия стоит знать: assist не
ведёт ветку (забывает при выходе — берите chat для разговора, который хотите вернуть); и
названная модель закрепляется, что выключает лестницу тиров, пока она закреплена, — модель
выбирает именно лестница, а раньше она принимала ярлык и не обращала на него внимания.
/task проводит одно принудительное сплавление над самой просьбой: разговор в панель не
отправляется, и это сделано намеренно, потому что подача ветки в панель, а затем судье и
синтезатору умножает стоимость маршрута, который существует, чтобы им пользовались изредка. Его
ответ теперь входит в контекст следующего хода, и он печатает цену и пишет строку в
usage.jsonl, как любой другой ход, — самый дорогой маршрут в терминале был тем самым, которого
экран «Стоимость» не видел.
tui — полноэкранное терминальное приложение
Полноэкранный интерфейс на Textual поверх того же разговорного ядра. Две панели: журнал разговора, который отрисовывает ответы как Markdown (код в блоках подсвечивается) и показывает токены модели прямо по мере поступления, и панель активности, показывающая, что агент сделал на этом ходе, — вызванные инструменты, количество токенов и стоимость, сколько фактов из памяти было вспомнено.
uv run chimera tui
uv run chimera tui --no-stream # answers render at the end instead of streaming
uv run chimera tui --fuse --no-memory # fusion routing (no token stream — the panel says so)
uv run chimera tui --model MODEL --workspace DIR --max-steps 8
uv run chimera tui --max-usd 2.00 # a ceiling for the whole session, shown in the panel
uv run chimera tui -s standup # resume a named thread (--new starts a fresh one)
uv run chimera tui --write-region 'src/**' # the file-writers may touch nothing else
Флаги не те же, что у циклов. У tui есть --stream/--no-stream, которых нет у них, и
--max-usd, который останавливает сессию, как только она столько потратила. Этот флаг ждал места,
где его показать: панель активности теперь несёт строку budget с тем, что осталось, — потому что
потолок, которого никто не видит, превращает ход, остановившийся из-за денег, в ход, остановившийся
без видимой причины.
chimera tui --session standup возобновляет именованную ветку, --new вместо этого начинает
свежую, а --write-region сужает то, к чему могут прикасаться инструменты записи файлов. Все три
значат здесь ровно то же, что и разделом выше, на том же хранилище сессий. Соответствия здесь нет
только у --cascade из chimera chat.
Команды: /model <ярлык> · /new (новая ветка; /reset — синоним) · /clear (очистить экран) · /stream
(переключить живые токены) · /help · /exit (а также /quit, /q). Клавиши: Ctrl+R новая ветка ·
Ctrl+L очистка · Ctrl+P палитра команд · PgUp/PgDn прокрутка · Ctrl+C выход. Команды со
слешем дополняются по мере набора.
Замечания о честности:
- Он управляем, и его вопросы нарисованы, а не набраны. Тот же стек, что собирают циклы:
журнал заражения, которому сообщают ваше собственное сообщение, ограждение
<<external-data>>вокруг недоверенного вывода инструментов, ядро доверия, нижняя граница охвата владельца и подключённые серверы MCP. До 2026-09-09 эту поверхность держал в стороне не стек, а вопрос: терминалом владеет Textual, поэтому запрос, написанный в stdin, написан там, куда никто не может посмотреть. Измерено в pty: такой ход простоял 123,8 с против лимита в 120 с и вернулся как✗ run_shellбез объяснения (bench/right_hand_governance/RESULTS.md, часть 2). Теперь оба заслона вместо этого открывают модальное окно: и подтверждение выполнения на хосте, и подтверждающий управления.yилиn, Escape отказывает, кнопка «Нет» удерживает фокус, чтобы Enter не одобрил случайно, а обратный отсчёт говорит, сколько молчанию осталось, — молчание по-прежнему отказывает и теперь об этом сообщает. На том же корпусе и том же инструменте заблокированные атаки выросли с 0 из 7 до 7 из 7, а внешние чтения, вернувшиеся внутри ограждения, — с 0 из 15 до 12 из 15 (те три, что остаются снаружи, — ваш собственный репозиторий, который не является внешним). - Отклонённый вызов теперь говорит почему — под ответом. Панель активности и раньше показывала
собственную фразу инструмента под его
✗; журнал разговора показывает и✗ run_shell did not succeed: …— там же, где и рассказ модели о команде, которая так и не выполнилась. У одобрения тоже есть своя строка (governance: 1 approved this turn), так чтоy, нажатое посреди хода, оставляет след. - Разговор переживает окно. Каждый ход сохраняется в
<home>/sessions— то же хранилище, куда пишетchatи которое перечисляетchimera sessions, так что ветка, начатая на одной поверхности, продолжается на другой, — и по умолчанию возобновляется самая свежая ветка. Поэтому/resetначинает НОВУЮ ветку вместо очистки этой: очистить на месте ветку, которая теперь является файлом, значило бы её уничтожить. При возобновлении прокрутка заново не отрисовывается, а строка под баннером говорит, сколько ходов видит модель, но не показывает экран. Остальное — вdocs/commands.md. - Потоковая выдача токенов работает только на пути одной модели — под
--fuse(ход панель → судья → синтезатор) приращений токенов нет, поэтому панель показывает состояние «синтезирую», а не поддельный курсор. Эта надпись следует за флагом, а не за маршрутом: как и вchat, ход с инструментами не сплавляется, а ход цикла несёт их всегда. - Стоимость читается как «недоступно», когда цена модели неизвестна (её никогда не угадывают), а
каждый ход дописывается в
<home>/usage.jsonlтак же, как в циклах. - Здесь нет ни проверки с откатом, ни
/solve: и то и другое ушло вchatиassist. Серверы MCP смонтированы, чего раньше не было, ровно по той причине, по которой их удерживали: вывод MCP по определению является недоверенным содержимым, а теперь есть куда его обособить. «Проверить или откатить» работает также вchimera solveиchimera project. - Если Textual не установлен,
tuiоткатывается к обычному циклуchat, передавая каждый аргумент явно, чтобы этот откат пережил свой первый ход. Потоковая выдача там ничего не значит, а ветка сохраняется как любая другая веткаchat.
serve — шлюз сообщений (HTTP или Discord)
Открывает агента с одним разговором (и его памятью) на каждый чат. Ядро маршрутизации не зависит от транспорта; переходники подключаются к нему.
uv run chimera serve --port 8765 # HTTP transport
# GET /health -> {"status":"ok","active_chats":N}
# POST /chat {"text":"...", "chat_id":"alice"} -> {"reply":"...","chat_id":"alice"}
У каждого chat_id свой контекст, поэтому разные пользователи и ветки не перемешиваются.
Работа без присмотра (вебхуки). Заведите задание, срабатывающее на входящий HTTP POST, чтобы Chimera запускалась без чьего-либо набора текста — push в GitHub, событие Stripe, пинг от внешнего планировщика:
chimera cron add "on push" gh-push "Summarize the pushed commits" --webhook
chimera serve # then POST to the hook:
# curl -X POST localhost:8765/webhook/gh-push -d '{"ref":"refs/heads/main"}'
Тело POST передаётся задаче задания как контекст, и отрабатывают все задания, зарегистрированные на
этот крючок. GET /health и POST /chat продолжают работать рядом.
Родной Discord. Запустите Chimera ботом Discord — каждый канал становится сессией, а агент может
и сам отправлять сообщения инструментом send_message:
uv sync --extra messaging # installs discord.py
export CHIMERA_DISCORD_BOT_TOKEN=... # bot token (Message Content intent enabled)
uv run chimera serve --discord
Создайте бота на https://discord.com/developers, включите намерение Message Content и пригласите его на свой сервер. Он отвечает в любом канале, который видит (с фильтром, чтобы игнорировать собственные сообщения и сообщения других ботов). Токен читается из окружения — никогда не зашивайте его в код.
Родной Telegram. Тот же образец переходника, и никакой дополнительной зависимости не нужно (Telegram Bot API — это обычный HTTP):
export CHIMERA_TELEGRAM_BOT_TOKEN=... # from @BotFather
uv run chimera serve --telegram
Родной Slack. Принимает через Socket Mode (нужно дополнение messaging) и отправляет через Web
API. Включите Socket Mode в своём приложении Slack, чтобы получить токен уровня приложения:
uv sync --extra messaging
export CHIMERA_SLACK_BOT_TOKEN=xoxb-... # bot token
export CHIMERA_SLACK_APP_TOKEN=xapp-... # app-level token (Socket Mode)
uv run chimera serve --slack
WhatsApp (отправка). WhatsApp работает на проталкивании (сообщения приходят на вебхук Meta,
который вы размещаете сами), поэтому, в отличие от остальных, никакого соединения открывать не надо.
Задайте учётные данные Cloud API, и агент сможет отправлять сообщения WhatsApp инструментом
send_message в любом режиме serve:
export CHIMERA_WHATSAPP_ACCESS_TOKEN=...
export CHIMERA_WHATSAPP_PHONE_NUMBER_ID=...
# in a chat: send_message(platform="whatsapp", chat_id="<E.164 number>", text="done ✅")
Двусторонний WhatsApp. Направьте вебхук вашего приложения Meta на https://<ваш-хост>/whatsapp и
задайте CHIMERA_WHATSAPP_VERIFY_TOKEN (любая строка на ваш выбор, совпадающая с настройкой
приложения). Тогда chimera serve подтверждает подписку (GET /whatsapp) и проводит входящие
сообщения (POST /whatsapp) через шлюз, отвечая по Cloud API. Для вебхука WhatsApp всё равно нужен
публичный адрес — это единственная часть за пределами Chimera.
Родной Signal (в обе стороны). У Signal нет официального API, поэтому Chimera говорит с мостом
signal-cli-rest-api, который вы запускаете сами
(в Docker) и связываете со своим номером, — обычный HTTP, без зависимостей на Python:
docker run -d -p 8080:8080 -v signal-cli:/home/.local/share/signal-cli bbernhard/signal-cli-rest-api
export CHIMERA_SIGNAL_API_URL=http://localhost:8080
export CHIMERA_SIGNAL_NUMBER=+15550000000 # this bot's registered number
uv run chimera serve --signal
run — первый уровень, разовый ответ
Один вызов модели, без инструментов и без слияния. Самый дешёвый путь.
uv run chimera run "In one sentence, what is an AI agent?"
uv run chimera run "Summarize this error" --model openrouter/openai/gpt-4o-mini
Зрение и вставка изображений. Прикрепляйте изображения через --image (путь или адрес, можно
повторять) — нужна модель, умеющая смотреть:
uv run chimera run "What's in this chart?" --image chart.png -m openrouter/google/gemini-2.5-flash
deliver — режим готового документа
Там, где run и chat отвечают в разговорной манере, deliver выдаёт цельный самодостаточный
документ (отчёт, план, спецификацию, README…) и записывает его в файл.
uv run chimera deliver "A one-page launch plan for a URL shortener" --out plan.md
uv run chimera deliver "An HTML status page" --format html -o status.html --fuse
agent — голый цикл ReAct с вызовом инструментов
Мысль → Действие (инструмент) → Наблюдение, и так до итогового ответа. Инструменты ограничены рабочей папкой.
uv run chimera agent "Create a file hello.txt containing 'Hello Chimera'" -w ./scratch
fuse — LLM-Fusion (то, что отличает проект)
Запускает панель моделей, судья разбирает их ответы (согласие / противоречия / слепые пятна), а
синтезатор пишет итог. Флаг --show-panel показывает весь ход.
uv run chimera fuse "Name three concrete ways to prevent SQL injection in Python."
uv run chimera fuse "Compare REST vs gRPC for a mobile backend." --show-panel
Слияние обходится примерно в 2–3 раза дороже одного вызова, поэтому приберегите его для трудных
рассуждений. fuse заодно печатает стоимость токенов по этапам (панель / судья / синтез), так что
видно, куда на самом деле уходят токены запуска.
Выборочное слияние (включено по умолчанию, экономит токены). Движок пробует первые
CHIMERA_FUSION_PROBE_K моделей панели (по умолчанию 2) и, когда их ответы близко сходятся,
пропускает остаток панели и судью, синтезируя прямо из совпавших ответов. Проверка согласия — это
дешёвое местное сравнение текстов (без лишнего вызова модели), поэтому расходящийся ход поднимается
до полного конвейера и стоит ровно столько же, сколько полное слияние, а согласный ход обходится
дешевле. Планку настраивает CHIMERA_FUSION_AGREEMENT (0–1, по умолчанию 0,8); значение
CHIMERA_FUSION_MODE=full (или флаг --full) заставляет всегда прогонять всю панель с судьёй.
Почему это поведение по умолчанию: в трёх запусках chimera fusion-bench --tasks hard (платная
панель из трёх моделей) оно срезало около 20–28% токенов и было верным на каждом ходе, где
действительно замыкало накоротко (16 из 16). Общая точность гуляла от 0 до −8,3 пункта между
запусками, но весь этот разброс приходится на поднятые ходы, где выборочный режим прогоняет тот же
конвейер, что и полный, — значит, это недетерминированность моделей, а не цена досрочной остановки.
Прогоните замер на своей нагрузке, чтобы увидеть размен для вашей панели и ваших задач:
uv run chimera fuse "What is 12 * 12?" --show-panel # likely early-stops
uv run chimera fusion-bench --tasks hard # full vs selective, tokens + accuracy
Берите надёжные модели в панель. Слияние окупается, только если каждый участник панели действительно отвечает. Избегайте ярлыков OpenRouter с
:freeвCHIMERA_FUSION_PANEL— под настоящей нагрузкой они упираются в лимит (HTTP 429), и панель молча сжимается до той платной модели, что осталась. Дешёвая и надёжная тройка:openrouter/deepseek/deepseek-chat,openrouter/openai/gpt-4o-mini,openrouter/meta-llama/llama-3.3-70b-instruct.
Карточки навыков (карточки рассуждения TRS, экспериментально)
Агент выжимает усвоенное в карточки рассуждения — пять полей: повод / делать / избегать /
проверить / риск (плюс ключевые слова для поиска) — как из успехов (карточка паттерна), так и из
повторяющихся провалов (предупреждающая карточка антипаттерна). При CHIMERA_SKILL_CARDS=on
команда solve достаёт k наиболее уместных карточек (BM25 по имени, описанию и поводам) и вставляет
их в контекст рассуждения работника, чтобы агент переиспользовал сработавшее и избегал известных
способов провалиться. Это замыкает круг — раньше усвоенные навыки сохранялись и никогда не читались
обратно.
По умолчанию выключено: вставка карточек добавляет токены в промпт, а экономия токенов у TRS
происходит от укорачивания длинных цепочек рассуждения, поэтому на задачах с коротким ответом
выигрыш — в точности, а не в стоимости. Это не домысел: на наборе hard с короткими ответами
(платная deepseek-v3.1) skillcard-bench намерил, что карточки стоят +290% токенов и −8
пунктов точности против варианта без карточек: при модели у самого потолка и без длинной цепочки,
которую можно укоротить, общие карточки — чистые накладные расходы, способные отвлекать. Включайте
карточки для нагрузок с длинным рассуждением (математика и код с длинными цепочками), где
арифметика токенов переворачивается, и всегда сперва измеряйте свой собственный размен с эталонной
проверкой:
uv run chimera skillcard-bench --tasks hard # demo cards vs no cards
uv run chimera skillcard-bench --use-store --tasks hard # bench your own learned cards
export CHIMERA_SKILL_CARDS=on CHIMERA_SKILL_CARDS_K=3 # enable, once it earns its place
Замер сообщает точность с карточками и без, разницу в токенах, долю попаданий карточек и точность в разбивке по попаданиям и промахам, а вердикт PASS ставится, когда точность с карточками остаётся в пределах одного пункта от базы без карточек.
Компактные схемы инструментов (экспериментально)
Схемы инструментов — особенно ввезённые с серверов MCP или из спецификаций OpenAPI — несут шум
аннотаций (примеры, заголовки, значения по умолчанию, многословные описания параметров, вложенные
тела запросов), который заново отправляется модели на каждом шаге ReAct. При
CHIMERA_COMPACT_SCHEMAS=on этот шум срезается, а описания параметров подрезаются в момент показа,
не трогая ничего, что влияет на вызов (имя и описание функции, а также type / properties /
required / enum каждой схемы сохраняются). Канонические схемы остаются нетронутыми — сжимается
только копия, отправляемая модели.
Экономия наибольшая на многословных наборах инструментов MCP и OpenAPI и накапливается по всем шагам; родные инструменты и так лаконичны, поэтому у них сокращение невелико. Сначала измерьте свой набор (обращений к модели нет — только подсчёт токенов):
uv run chimera schema-bench --demo # synthetic verbose tools, to see the effect
uv run chimera schema-bench --openapi ./openapi.json # your real spec's tools
По умолчанию выключено. Поскольку сжатие убирает только шум аннотаций и никогда не трогает структуру, единственный риск в том, что у модели остаётся чуть меньше текста, по которому выбирать инструмент, — поэтому оно остаётся осторожным, и перед включением стоит убедиться, что вызовы инструментов на вашей нагрузке ведут себя как надо.
solve — второй уровень, самостоятельная работа (план и «проверить или откатить»)
Планирует задачу, выполняет её циклом агента, а затем проверяет исполняемой командой. Если проверка не проходит, откатывает рабочую папку и повторяет с обратной связью. Проверяющий (код выхода 0 означает успех) — это эталон.
uv run chimera solve \
"Create solution.py with add(a,b) and is_prime(n)." \
--workspace ./work \
--verify "python -c \"import solution; assert solution.is_prime(7)\""
Полезные флаги:
| Флаг | Что означает |
|---|---|
--verify "<cmd>" |
команда, которая должна завершиться кодом 0 (тесты, сборка, линтер) |
--workspace, -w |
где агент читает и пишет (по умолчанию .) |
--max-attempts N |
бюджет попыток «проверить или откатить» (по умолчанию 3) |
--max-steps N |
шагов с вызовом инструментов на попытку (по умолчанию 8) |
--fuse |
строить план через слияние (глубокое рассуждение) |
--guard |
пропускать каждый вызов инструмента через ядро управления |
--no-plan / --no-manager |
пропустить этап планирования или разбора |
--rubric |
управляющий судит по каскадному своду правил (следование инструкции → фактичность → разумность) |
--no-remember |
не записывать факт в память при успехе |
--no-evolve-skills |
не предлагать усвоенный навык, когда задача повторяется |
--isolate |
работать в одноразовом рабочем дереве git; изменённые файлы копируются обратно только при успехе |
--require-diff |
попытка, не изменившая ни одного файла, считается провалом и повторяется — для задачи по коду объяснение не является исправлением |
--keep-workspace |
при провале оставить правки последней попытки на диске, а не откатывать, — для случая, когда «прошло или нет» решает внешний проверяющий |
--diff-feedback |
показать провалившейся попытке её же откаченную разницу как путь, который не стоит повторять |
--stagnation-fuzzy |
сопоставлять подписи повторяющихся провалов приблизительно, чтобы поворот против застревания срабатывал на провалах одной причины с разной формулировкой |
Про
--max-steps. Значение по умолчанию, 8, подобрано для небольших рабочих папок. На крупном репозитории именно оно, а не модель, становится ограничением: первый запуск SWE-bench дал ровные 0,0 пункта при 8 шагах на выгрузке в 250 МБ, а та же конфигурация при 30 шагах подняла долю патчей у базы с 47% до 74% (bench/swe_bench/RESULTS.md). Если агент осматривается, а потом заканчивает, ничего не изменив, поднимайте сначала это.
--require-diffи--keep-workspaceнужны для внешней оценки.solveустроен как «проверить или откатить»: когда решение «прошло или нет» принимает он сам, откат провалившейся попытки правилен. Когда его принимает кто-то другой — задание CI, стенд замера, человек, читающий разницу, —--keep-workspaceне даёт откатить работу агента раньше, чем судья её увидит, а--require-diffне даёт засчитать уверенное объяснение за выполненное изменение. Оба по умолчанию выключены.
solve учится между запусками. Каждый запуск питает замкнутый круг поведения, целиком
поставленный под «проверить или откатить», так что действует только подтверждённая работа: (1)
уместные уроки прошлых попыток (провалы в приоритете) вплетаются в план и промпт, а первый
ошибочный шаг провалившейся попытки локализуется и подаётся в повтор; (2) при подтверждённом
успехе записывается факт в память без повторов (позже его вспоминают chat и crew); и (3)
когда образец задачи повторяется (не менее 2 прошлых успехов), предлагается переиспользуемый
навык — при включённом --fuse он проходит через панель слияния и удерживается по
переносимости между моделями — и остаётся, только если проходит проверку управления и
исполняемый дымовой тест.
crew — третий уровень, несколько агентов
Команда ролевых агентов работает над одной задачей, а руководитель синтезирует итоговый ответ.
uv run chimera crew "Propose a minimal architecture for a URL shortener service."
lifecycle — команда жизненного цикла (план → сборка → тест → разбор)
Заранее собранный конвейер жизненного цикла разработки с «проверить или откатить» на этапе тестов:
plan раскладывает задачу, build её реализует, test запускает проверяющего (откатывая и повторяя
сборку при провале), а разбирающий критикует результат.
uv run chimera lifecycle "Add an add(a,b) function to solution.py" \
--workspace ./scratch --verify "python -c \"import solution; assert solution.add(2,3)==5\""
Каждый этап печатается со знаком ✓ или ✗; запуск считается успешным, только если проверяющий на этапе тестов прошёл.
meta — агенты, строящие агентов
Проектирует чертёж специализированного агента (имя, инструменты, промпт роли) под задачу.
uv run chimera meta "an agent that triages GitHub issues and routes them to teams"
guard — вердикт управления
Показывает решение ядра доверия (разрешить / предупредить / разобрать / заблокировать) для действия.
uv run chimera guard "rm -rf /" # BLOCK
uv run chimera guard "list the files in this folder" # ALLOW
bench — замер непрерывной эволюции
Измеряет, держится ли качество на цепочке задач (доказательство против деградации): общая доля прохождения, первая половина против второй, самая длинная серия.
uv run chimera bench --limit 6 # single-shot task set
uv run chimera bench --chain --limit 6 # stateful chain (error propagation)
uv run chimera bench --fuse # use fusion as the solver
Отчёт несёт ещё и статистически честный признак деградации: вместо того чтобы верить голой
разности первой и второй половины (на короткой цепочке разброс в 0,2 обычно шум),
degraded_significant равен 1.0 только когда доверительный интервал Уилсона для падения не
включает ноль, -1.0 когда выборка слишком мала, чтобы судить, и 0.0 в остальных случаях — плюс
границы degradation_ci_low/high. Отдельно CHIMERA_SKILL_ACCEPT_MODE=wilson ставит решение о
принятии навыка между моделями в зависимость от нижней доверительной границы доли переноса (так что
удачные 2 из 3 больше не считаются); значение по умолчанию point оставляет сырую долю, поскольку
граница Уилсона строга на крошечных панелях.
sandbox-bench — оценка состояния и побочных эффектов
Текстовые замеры оценивают ответ модели; этот оценивает то, что агент сделал. Каждая задача работает в изолированном каталоге песочницы, а стенд сравнивает итоговое состояние файлов с целью (любой путь допустим, важен исход) и отдельно считает вредные побочные эффекты — изменения за пределами объявленного задачей набора разрешённых. Так агент, который выдаёт верный результат, попутно затирая посторонний файл, оказывается пойман, а не засчитан за чистое прохождение.
uv run chimera sandbox-bench # runs the demo stateful tasks (real models + file tools)
Сообщает pass_rate и side_effect_rate. Поставляется методика (StatefulTask с goal_check и
набором разрешённых изменений allowed), а не большой набор задач, — задачи под свои инструменты
пишите сами. Существующие текстовые оценщики остаются верными для чистых вопросов и ответов.
memory — отобранная долговременная память
uv run chimera memory add "Alex prefers TypeScript strict and absolute imports"
uv run chimera memory search "imports"
uv run chimera memory list
uv run chimera memory graph # entity-relation graph from memory
uv run chimera memory graph --entity PassaPro # one entity's relations
uv run chimera memory prune --max 50 # keep the N highest-value memories (multi-factor)
Обращение к памяти проходит через приёмные ворота (границу доверия): вспомненная запись попадает
в промпт, только если она уместна и свободна от текста, пытающегося перехватить управление
(защита от джейлбрейка через память). memory prune забывает в рамках бюджета по многофакторной
модели ценности (свежесть, конкретность, вид, отобранность, надёжность), а не по одному признаку.
Слой графа извлекает тройки (источник, отношение, цель) из ваших записей (PassaPro использует Supabase, Alex предпочитает TypeScript), поэтому факты можно вспоминать по сущности, а не только
по ключевому слову.
История бесед — отдельное хранилище. Каждый ход кодирования, завершённый на экране Code,
индексируется — сообщение, ответ, прочитанные или изменённые файлы, время — в <home>/history.db
(SQLite, FTS5, если ваш Python его поддерживает) и остаётся там после того, как расшифровка беседы
обрежет самые старые ходы. Агент ищет в ней инструментом recall_history («что мы решили о функции
входа две недели назад?»), в пределах текущего проекта, если не запрошены все проекты. Ход,
выполненный на недоверенном содержимом, помечается при вызове, вставленные учётные данные
затираются перед записью, а удаление беседы удаляет её строки.
cron — задания по расписанию и по событиям
uv run chimera cron add daily-report "0 9 * * *" "generate the daily report"
uv run chimera cron list
kanban — доска задач с дорожками работников
Доска (backlog → doing → review → done), где каждая карточка называет дорожку, которая передаёт
её агентскому стеку: solve (второй уровень, самостоятельно, с проверкой или откатом) или crew
(третий уровень, конвейер ролей). Это рабочий вид того самого цикла, который агент и так выполняет.
uv run chimera kanban add "Fix the flaky test" -a "make test_login deterministic" \
--lane solve --verify "pytest -q tests/test_login.py"
uv run chimera kanban add "Compare REST vs gRPC" --lane crew
uv run chimera kanban board # show the columns
uv run chimera kanban run -w ./scratch # dispatch backlog cards through their lanes
uv run chimera kanban move <id> done # manual move
uv run chimera kanban learn --min 3 --yes # recurring tasks (experience) -> cards
run проводит каждую карточку backlog → doing → done (успех) или → review (нужно внимание). learn
переиспользует определитель повторяемости из обучателя расписаний, чтобы ставить в очередь задачи,
которые агент повторяет (без дублей на доске), — поставьте его на расписание, и очередь будет
наполняться сама.
workflow — спроектированные циклы (Loop Engineering)
Опишите самостоятельный цикл как YAML вместо разового промпта. Каждый шаг через uses обращается к
возможности (run / shell / solve / crew / lifecycle), может зависеть от предыдущего шага
(when: prev_succeeded | prev_failed) и может повторяться (repeat, until: success).
# examples/workflow.yaml
name: build-and-report
steps:
- name: build
uses: solve
with: { task: "Create greeting.py with greet(name)", verify: "python -c \"import greeting\"" }
repeat: 2
until: success
- name: report
uses: run
when: prev_succeeded
with: { prompt: "One-line changelog for greet()" }
uv run chimera workflow examples/workflow.yaml --workspace ./scratch
drift — заслон расхождения между спецификацией и кодом
Держит спецификацию и код в согласии. Спецификация — это небольшой YAML из требований (defines
определяет символ, contains — регулярное выражение, absent — его отсутствие, command должна
завершиться кодом 0). Заслон завершается ненулевым кодом при расхождении, поэтому годится и как
проверяющий.
uv run chimera drift examples/spec.yaml --workspace ./scratch
# as a verifier inside solve:
uv run chimera solve "..." --verify "chimera drift examples/spec.yaml -w ."
migrate — перенос от другого агента
Переносит конфигурацию и навыки из Hermes или OpenClaw, а с флагом --apply ещё и сливает
долговременную память (без дублей, ничего не разрушая). По умолчанию это предпросмотр без записи.
uv run chimera migrate hermes /path/to/hermes/home # preview
uv run chimera migrate hermes /path/to/hermes/home --apply # write + merge memory
uv run chimera migrate openclaw /path/to/openclaw/home --apply
Слияние памяти сообщает количества {ADD, UPDATE, NOOP} — повторы становятся NOOP, поэтому
повторный запуск безопасен.
evolve — эволюция модели по желанию (для продвинутых)
chimera solve --collect (включено по умолчанию) записывает каждый запуск как траекторию. Команды
evolve превращают их в готовые к обучению наборы данных и в работающий рецепт LoRA. Обучение
происходит снаружи и по желанию — оно меняет веса модели, поэтому никогда не запускается само;
Chimera готовит данные и скрипт и на этом останавливается.
chimera evolve status # is there enough signal to train?
chimera evolve export --format sft --out d.jsonl --min-steps 5 --diverse # long-horizon, one example per task
chimera evolve export --format dpo --out d.jsonl # preference pairs (success vs failure)
chimera evolve recipe --out ./recipe --format dpo # train.py + README + requirements
chimera evolve tune --rounds 2 # self-optimize the agent spec (no weights changed)
export принимает настройки рецепта: --min-steps N оставляет только длинные траектории,
--diverse оставляет не больше одного примера на задачу (разнообразие задач — узкое место отбора), а
--min-process P (SkillCoach) оставляет только траектории, чья оценка следования шагам не ниже P,
то есть доля шагов с инструментами, давших успешный видимый результат, — так удачный успех,
пробившийся сквозь провальные вызовы инструментов, не попадает в обучение. События по шагам, на
которых держится эта оценка, записываются автоматически при каждом запуске solve; фильтр по
умолчанию выключен (CHIMERA_SFT_MIN_PROCESS задаёт общее значение по умолчанию). evolve tune —
это не обучение: он ведёт мета-поиск по спецификации агента (модель, системный промпт, бюджет
шагов, панель, глубина памяти), оценивая каждого кандидата на ежедневных сценариях и сохраняя правку
только при отсутствии ухудшения. Он обращается к моделям, но никогда не меняет веса, поэтому его
безопасно запускать когда угодно.
Затем, чтобы действительно обучить, на GPU (или в Colab): pip install chimera-agent[train] (или по
requirements.txt из рецепта) и python recipe/train.py. При выдаче ответов направьте
CHIMERA_DEFAULT_MODEL на базовую модель вместе с адаптером.
pet — виртуальный питомец
Маленький постоянный спутник, чьи показатели меняются, пока вас нет. Ключ не нужен.
chimera pet new --name Chimi # adopt one
chimera pet status # check in (fullness / happiness / energy / mood)
chimera pet feed | play | rest # interact
Советы
- Инструменты против рассуждения. Ходы с вызовом инструментов всегда идут на одной модели (слияние не умеет вызывать инструменты); слияние приберегается для глубокого рассуждения без инструментов.
- Смотрите, что произошло.
CHIMERA_LOG_LEVEL=DEBUGпоказывает журналы маршрутизации и включения слияния. - Держите тесты честными. Хорошая команда
--verify(настоящий набор тестов) делаетsolveнадёжным — это исполняемый эталон, по которому спрашивают с агента.