v0.1.0-alpha.420 октября 2026 г.
Добавлено 26
- ТерминалCtrl+V прикрепляет к следующему сообщению изображение из буфера обмена; буфер читается средствами, которые уже есть в системе (AppleScript на macOS, PowerShell на Windows, wl-paste или xclip на Linux). Изображение, перетащенное в терминал, тоже прикрепляется, а не вставляется как путь — в кавычках, с экранированием или в виде адреса file://; оба способа работают через
/image. - ТерминалВсё, что вы отправляете из строки ввода, сохраняется между сессиями отдельно для каждой папки проекта (
prompt-history.jsonlв папке данных), поэтому ↑ в новой сессии достаёт и вчерашние запросы, а Ctrl+R открывает их списком, который сужается по мере ввода, — сначала новые. Вставленный текст возвращается из истории целиком, а не заглушкой, команда/command, вызванная из истории, больше не запирает ↑ в меню, а правки в строке из истории не теряются, если пролистать её дальше; ответ на вопрос, например API-ключ, по ↑ не возвращается никогда. - ТерминалCtrl+G открывает содержимое поля ввода в вашем редакторе (
$VISUAL, затем$EDITOR), а когда вы закрываете редактор, возвращает написанное в поле. Ctrl+_ отменяет последнее изменение строки — по одному слову или по одной серии удалений за раз, а Ctrl+Y возвращает то, что последним вырезали Ctrl+U, Ctrl+K или Ctrl+W. - ТерминалСессия получает название от модели, как только приходит её первый ответ: название составляется по первому сообщению и началу ответа. Для чата через шлюз Letronna это автоматически делает быстрая модель Letronna, которую выбирает сервер Letronna, с проверкой Jev; в остальных случаях — вспомогательная модель, а если её нет, то модель самого чата.
/model namesвыбирает другую модель или отключает автоматические названия, а/renameпозволяет назвать сессию самостоятельно или, без аргумента, сразу просит модель придумать название. Чат на вашем собственном ключе, через шлюз компании или с моделью на этом компьютере получает название через свой же шлюз, и его содержимое никуда больше не отправляется. - ТерминалСтрока, начинающаяся с
!, выполняется как команда в папке сессии, как в оболочке, и без подтверждения: её ведь ввели вы сами. Её вывод показывается так же, как вывод инструмента, Esc останавливает команду, а модель вместе со следующим запросом узнаёт, что было запущено и чем это закончилось. Если ввести такую строку, пока агент работает, она, как и команды, ждёт конца хода. Пока вы её набираете, нижняя панель показывает, где она будет выполнена. - Терминал
?в пустой строке показывает над полем ввода сочетания клавиш — до следующего нажатия./helpперечисляет команды по разделам (сессии, модель, режимы, инструменты, память, фоновая работа, аккаунт), обрезая каждую строку по ширине окна, и все сочетания клавиш, а/help <command>объясняет, что делает команда и по каким словам её находит меню. Пока вы набираете слова команды, нижняя панель показывает, что она делает. - ТерминалКак только появляется ответ, нижний край поля ввода показывает, насколько заполнен контекст сессии, по объёму последнего запроса — так же, как строка состояния в окне приложения: пока место есть, индикатор неприметен, с 70% он янтарный, с 85% указывает на
/compact, а с 90% становится красным./contextпоказывает по частям, чем заполнен контекст: системный промпт, инструменты, MCP, память, навыки и переписка. - ТерминалВерхний край поля ввода показывает название сессии и состояние её папки в git (ветка, что изменено, насколько она расходится с отслеживаемой веткой), а заголовок окна начинается с названия сессии, показывает вращающийся индикатор, пока агент работает, и «waiting for you», пока ждёт карточка или вопрос; при выходе возвращается прежний заголовок, если терминал его хранит. Названия, взятые из первых строк запроса, показываются в одну строку и там, и в
/resume. - Терминал
/rewind,/undoили двойное нажатие Esc в пустом поле ввода показывают все отправленные вами сообщения — сначала новые, с отбором по мере ввода; при возврате к одному из них вы выбираете, восстановить код и переписку, только переписку или только код, либо сделать сводку до этого сообщения или создать от него ответвление;/undoбольше не ограничивается отменой последнего обмена. Если восстановлен только код, модель узнаёт, какие файлы вернулись к прежнему состоянию, а откат к более раннему сообщению всё равно возвращает их к исходному виду. - ВездеПодписка Claude теперь — провайдер, в который вы входите через аккаунт, наряду с API-ключом Anthropic: доступны модели из вашего тарифа, и вставлять ключ не нужно.
- ВездеЭндпоинт Custom, в адресе которого указан маршрут Messages, например
https://proxy.example/v1/messagesу прокси, теперь работает: с ним общаются через Messages API Anthropic, как с собственным API Anthropic, — с кэшированием промпта, уровнем усилий и размышлениями. Раньше на этот маршрут отправлялись запросы Chat Completions, на которые такие прокси не отвечают. Список его моделей запрашивается в корне API, а ключ передаётся так, как его принимает Messages, поэтому ход узнаёт окно контекста модели и её уровни усилий, а проверка при настройке и список моделей их находят; то же относится и к собственному адресу Anthropic, вставленному вместе с маршрутом. Такой прокси не принимается за саму Anthropic: метка кэша, которую он отклоняет, для него отбрасывается, как и для любого другого шлюза, а токен подписки передаётся ему как Bearer-токен — без признаков собственного клиента Anthropic и без идентификаторов вошедшего аккаунта, которые эти признаки содержат. - ВездеВстроенный кошелёк, из которого платит агент: создайте новый или перенесите существующий из MetaMask, Phantom или любого другого приложения-кошелька; поддерживаются Base, Ethereum, Solana и любая EVM-сеть. Сайтам, которые просят оплату (x402), агент платит в USDC в пределах заданных вами лимитов — каждый раз спрашивая или сам, если сумма ниже выбранной вами цены; на отправку средств разрешение спрашивается всегда.
letronna wallet,/wallet, страница Wallet и Settings › Wallet. - СайтТерминал в браузере: страница Cloud открывает сам Letronna, запущенный в Letronna Cloud в новом треде или в одном из ваших, — печатать в нём можно так же, как на своём компьютере.
- ТерминалНа одноразовой машине (
LETRONNA_DISPOSABLE=1, как в Letronna Cloud) терминал берёт сервер, API-ключ и модель изAGENT_BASE_URL,AGENT_API_KEYиAGENT_MODEL, как это делает-p, и ничего из этого не сохраняет. - СайтLetronna Cloud работает на большем числе серверов: администраторы подключают VPS со страницы администрирования одной командой установки, а задачи и боты 24/7 распределяются по всем серверам.
- СайтНа главной странице letronna.ai появился Letronna Cloud, а в документации — страница Cloud; приложения для iPhone и Android отмечены как «скоро».
- ВездеREADME стал короче, а в
docs/появилось полное руководство: установка, приложение и терминал, шлюзы, инструменты, расширение возможностей, облако, настройка, данные, архитектура, сборка и бенчмарки. - Везде
letronna -p --output jsonсообщает, по какому окну контекста рассчитывался размер запросов запуска и откуда взято это окно ("window": {"tokens", "source"}), и называет модель, которую использовал запуск, — в том числе когда её выбрали переменные окружения или--model. - ВездеЕсли поисковый сервис не выбран, search_web ищет через шлюз сессии, когда тот продаёт поиск (поиск Letronna оплачивается с баланса аккаунта, у другого шлюза используется его самая дешёвая поисковая модель), а если шлюз не может ответить, в том же поиске переключается на DuckDuckGo. Шлюз, который не смог ответить, исключается на десять минут, и всё это время первым опрашивается DuckDuckGo; карточка подтверждения называет все места, куда может уйти запрос, и кто платит; автоматический режим оставляет платный поиск на решение пользователя, а выбранный сервис по-прежнему остаётся единственным — в том числе если выбран только DuckDuckGo.
- Вездеwrite_file может создать новый файл во временной папке системы — например, скрипт, воспроизводящий ошибку, — а write_file и edit_file могут изменять файлы, которые там создала сессия, так что черновая работа не попадает в проект. Файл другой программы в этой папке или файл в папке, которую сессия не создавала, по-прежнему изменять нельзя, а команда, записывающая там новый файл, в сессии, прочитавшей веб-страницу, больше не считается записью за пределами проекта.
- ВездеЕсли запуск, за которым никто не следит, проходит двенадцать раундов, не меняя проект, в конце последнего результата этого раунда его просят одной строкой сказать, что уже установлено, какова гипотеза и каков следующий шаг; продолжить чтение — вполне допустимый ответ. Просьба повторяется после двадцать четвёртого и тридцать шестого раунда (в последний раз — с указанием закончить, если назвать шаг не удаётся), но не больше трёх раз за ход. Счёт начинается заново только после успешно применённой правки, но не после команды.
LETRONNA_PROGRESS_NOTE_ROUNDSзадаёт число раундов (0 — не просить никогда), аletronna -p --output jsonсообщаетprogress_notes,first_edit_roundиrounds_after_last_edit. - Везде
letronna -p --output jsonсообщает, как работал кэш за время запуска:cache_missesсчитает ответы, для которых провайдер отдал из кэша меньше токенов, чем для предыдущего, хотя ничего из отправленного не менялось, вместе с потерянными токенами, включая потери слишком мелкие, чтобы/usageо них сообщал, аhistory_rewritesсчитает промахи, вызванные изменением более раннего сообщения, так что показатели кэша за запуск можно оценивать за вычетом потерь на стороне самого провайдера. - ВездеНастройка
reasoning_replay(илиLETRONNA_REASONING_REPLAYдля одного запуска) со значениемchunkedотправляет DeepSeek и Kimi пустойreasoning_contentдля более старых вызовов инструментов в ходе, как только их рассуждения набирают 8 000 токенов, а дальше — по такой порции за раз, так что запросы между этими моментами продолжают пользоваться кэшем промпта у провайдера. Два последних вызова всегда передают свои рассуждения, вызовы перед уже очищенными результатами при той же перезаписи лишаются их,/usageиletronna -p --output jsonсчитают сдвиг этой границы изменением более раннего сообщения, а маршруту, который отклоняет пустое поле, вместо этого отправляются рассуждения каждого вызова во всех ходах, прежде чем от поля откажутся совсем. Значение по умолчанию,full, как и раньше, отправляет с каждым вызовом хода его собственные рассуждения. - ПриложениеПункт Rewind to here у любого сообщения спрашивает, что восстановить: код и переписку, только переписку или только код, — и показывает, сколько строк изменено в каждом файле; двойное нажатие Escape в пустом поле ввода или команда палитры Go back to an earlier message переходят к вашему последнему сообщению для отката, а стрелки вверх и вниз — к остальным.
- LinuxЕсли командам доступно меньше процессоров, чем есть на машине, — например, в контейнере с квотой на процессорное время, — команды и фоновые задания запускаются с
OMP_THREAD_LIMIT,OMP_NUM_THREADS,OPENBLAS_NUM_THREADSиMKL_NUM_THREADS, равными числу доступных им процессоров, если пользователь ещё не задал одну из этих переменных или другой размер пула потоков; системный промпт сообщает, сколько процессоров им доступно, и, если переменные были заданы, называет все четыре, посколькуOMP_THREAD_LIMITограничивает даже число потоков, которое команда задаёт сама. Если числа совпадают, промпт и команды остаются прежними; событиеmachineв журнале содержит оба числа. - ПриложениеСессия получает название от модели, как только приходит её первый ответ: название составляется по первому сообщению и началу ответа. Для чата через шлюз Letronna это автоматически делает быстрая модель Letronna, которую выбирает сервер Letronna, с проверкой Jev; в остальных случаях — вспомогательная модель, а если её нет, то модель самого чата; чат на вашем собственном ключе, через шлюз компании или с моделью на этом компьютере получает название через свой же шлюз. В Settings › Model › Session names автоматические названия можно отключить или выбрать для них модель самого чата либо одну из своих моделей, а пункт Name it again в меню сессии запрашивает новое название; название, которое вы дали сами, никогда не заменяется.
Изменено 31
- ТерминалЭкран отправляет только строки, изменившиеся с прошлого кадра, внутри синхронизированного обновления, если терминал его поддерживает, поэтому потоковый ответ передаёт примерно треть прежнего объёма и меньше мерцает по ssh и в консоли; движения указателя над окном больше не считываются и не вызывают перерисовку, а кадр больше не копирует всю переписку.
- ТерминалВывод инструмента показывает первые двенадцать строк, считая по экрану, чтобы одна длинная строка не заняла всё место, а остальное сворачивается под ними: щелчок или Ctrl+O разворачивает весь вывод и сворачивает его обратно. Правка, выполненная без подтверждения, показывает свой дифф после выполнения, как правка с подтверждением показывает его до, а изменённая строка длиннее окна в диффе переносится, а не обрезается у края.
- ТерминалБлоки кода в ответе показываются как код: ограничители блока убираются, над кодом приглушённо указан язык, код подсвечивается так же, как диффы, а
**и обратные кавычки внутри него остаются как написаны. Заголовки показываются жирным без символов#, жирный или цветной фрагмент, перенесённый на несколько строк, сохраняет оформление на каждой из них, ответ, начинающийся с жирного текста, его не теряет, а ответы возобновлённой сессии отрисовываются так же. - Терминал
/clearначинает всё заново в новой сессии на чистом экране, как в Claude Code, а прежняя сессия остаётся доступна в/resume; Ctrl+L очищает экран — то, что раньше делал/clear./statusпоказывает на одном экране версию, сессию и её файл, папку и её состояние в git, модель, режим, аккаунт, заполненность контекста и серверы MCP, а/export [file]сохраняет переписку в формате Markdown — по умолчанию в файл в проекте, названный по сессии, и никогда не перезаписывает существующий файл. - ТерминалВремя хода отсчитывается от его начала: строка ожидания считает весь ход, а не начинает отсчёт заново на каждом шаге, нижняя панель продолжает его, когда ответ уже начал выводиться, а подпись под последним ответом заканчивается длительностью хода. Слово в строке ожидания меняется от одного ожидания к другому, длинная команда обрезается, чтобы время оставалось на виду, а каждая подсказка нижней панели обрезается по ширине окна, а не переносится в узкой области терминала.
- ТерминалShift+Tab переключает режимы по кругу: «сначала спрашивать», «править без вопросов», «только план» и «автоматический режим» (а также режим обхода проверок, если его однажды выбрали), но никогда не попадает на «только разрешённые вызовы» — этот режим отклоняет всё, что потребовало бы вопроса, и остаётся доступным через
/mode dont-ask; Alt+M тоже переключает режимы, и каждый режим на мгновение показывает в нижней панели, что он разрешает выполнять. Если режим не задан флагом, терминал запускается в режиме по умолчанию, заданном для окна приложения; режим, переключённый во время работы, действует со следующего вызова инструмента, а/planвключает или выключает режим плана и возвращает тот режим, из которого он был включён. - ТерминалCtrl+C останавливает ответ и оставляет вас в сессии, тогда как раньше он останавливал ответ и выходил из переписки; как и Esc, он отклоняет карточку или список и пропускает вопрос, очищает набранный текст и выходит, только если нажать его дважды в пустом поле ввода. Строка, очищенная через Esc, возвращается по ↑ — но не ответ на вопрос и не секрет, — а после копирования выделением мышью Esc останавливает ответ с одного нажатия.
- ВездеПапка, которую write_file или apply_patch создали для файла, считается собственной папкой сессии, поэтому сессия, прочитавшая веб-страницу, может удалить её без вопроса, как и созданные ею файлы, — если в папке нет ничего, что было там раньше неё, и нет символических ссылок.
- ВездеЕсли размер окна модели нигде не указан, а её сервер принимает ключ, как шлюз или прокси LiteLLM, окно считается равным 64 000 токенов, а не минимальному, поэтому старые результаты инструментов очищаются гораздо позже; для сервера без ключа, например Ollama, сохраняется маленькое окно, а
LETRONNA_CONTEXT_WINDOWзадаёт его для прокси с ключом перед маленькой локальной моделью. - ВездеСтарые результаты инструментов очищаются, только когда запрос приближается к своему бюджету, и тогда порциями по половине окна, а не каждые восемь результатов, так что кэш промпта у провайдера продолжает обслуживать запросы в промежутке; результаты короче 600 символов не очищаются никогда, а очищенный результат помечается как убранный из истории — с вызовом, который нужно повторить, — а не как убранный ради экономии места.
- ВездеПока кэш промпта у провайдера обслуживает сессию, окно может быть до четырёх раз больше лимита по умолчанию: как только данные об использовании трёх последних ответов показывают, что не меньше половины их входных данных пришло из кэша, модель, окно которой вдвое больше лимита, хранит историю и старые результаты инструментов до 256 000 токенов или до трёх четвертей своего окна, если это меньше, — ведь промах по всему, что идёт после очищенного результата, обходится дороже, чем стоят сэкономленные токены. Точки, с которых может начинаться окно, порции, которыми очищаются результаты, и отправляемая доля результата инструмента остаются такими же, как при лимите, так что ничего не сдвигается на новое место; серия промахов, переполнение, маршрут, данные об использовании которого никогда не учитывают кэш, и заданный пользователем
context_capсохраняют лимит, а когда кэш снова начинает обслуживать сессию, окно и очищенные результаты остаются там, где их оставил лимит, и не сдвигаются обратно. Резерв в 4 000 токенов под файлы инструкций подпапок теперь выделяется, только когда результат затронул папку с таким файлом. - Везде
/usageназывает промах кэша, вызванный очищенными результатами или рассуждениями, которые больше не отправляются обратно, «an earlier message changed», а о промахе, при котором ничего из отправляемого Letronna не изменилось, сообщает, что провайдер обслужил запрос без кэша. - Вездеweb_fetch и search_web сообщают, почему запрос остался без ответа, — например, имя хоста не удалось разрешить или в соединении отказали, — а если запрос в интернет не смог подключиться (кроме запроса, на который перенаправила страница), оба инструмента сразу отвечают, что временно недоступны, называя хост и причину, вместо того чтобы каждый раз пробовать и дожидаться ошибки: в течение двух минут в сессии, за которой кто-то следит, и до конца запуска, за которым никто не следит, если только какой-нибудь запрос в интернет не пройдёт; страницы на этом компьютере или в локальной сети по-прежнему загружаются.
- Везде
letronna -pотправляет с каждым запросом примерно на 600 токенов меньше описаний инструментов и промпта: списки помощников и фоновых заданий находятся через find_tools, как и другие редко используемые инструменты, а в том, что ему отправляется, больше не упоминается то, чего у такого запуска нет: фоновые помощники, wake_me, list_sessions и /resume, а также собственный навык Letronna об использовании Letronna — если других навыков не включено, вместе с ним уходят индекс навыков и инструмент навыков. - ВездеЗапуск, за которым никто не следит, например
letronna -p, узнаёт о командах в PATH и о содержимом папки проекта в начале первого сообщения, а не из системного промпта, поэтому запуски в папках с разным содержимым отправляют одинаковые системный промпт и инструменты, и кэш промпта у провайдера обслуживает их от запуска к запуску; сессии, за которыми кто-то следит, не изменились. - ВездеМодели Claude, к которым обращаются через Chat Completions по любому шлюзу — через прокси LiteLLM или Portkey, через шлюз компании, а не только через OpenRouter и шлюз Letronna, — отмечают, где заканчивается кэш промпта Anthropic, так что каждое новое сообщение записывается в кэш один раз и при следующем запросе читается из него, а не оплачивается сначала полностью. Если маршрут отклоняет запрос как некорректный (400 или 422), какими бы словами он это ни объяснял, запрос отправляется ещё раз без меток, а соседние запросы свои метки сохраняют; если на повтор пришёл ответ, этот шлюз и эта модель обходятся без меток до конца запуска, если повтор тоже отклонён — дело не в метках, и они остаются, а если повтор остановлен или ответа нет, ничего не решается.
- ВездеПравило системного промпта о проверке изменения теперь велит сначала один раз запустить ближайшую к нему проверку — воспроизведение и тот единственный тестовый файл, который покрывает изменённый код, — а затем не перезапускать, не перечитывать и не смотреть дифф того, что уже прошло, и называть сбой, который вызвало не это изменение, а не доказывать, что он был и раньше; новое правило говорит, что ошибку, о которой сообщили на одном примере, исправляют в причине, общей для других входных данных и точек входа, и что делать, если сообщение об ошибке не воспроизводится, как описано; а правило о вызовах в одном ответе наряду с чтением и поиском называет команды и проверки. Запуску, за которым никто не следит, также говорится, что спросить некого и у него есть только текст задачи и папка проекта, поэтому решать нужно по ним, а не искать на компьютере или в сети, что имелось в виду. Новые пункты для
LETRONNA_PROMPT_RULES—shared-causeиscope-of-task. - ВездеВызов, который вернул то же, что и более ранний вызов в этом ходе, получает об этом пометку в конце результата («Same result as round 3»), даже если вызов записан иначе, но так, что это ничего не меняет: команда, в которой изменились пробелы,
cdв папку проекта,2>&1,| cat,| head -Nили| tail -N, чтение того же файла с началом в пределах тех же пятидесяти строк, поиск в другом регистре и результат, который отличается только идентификаторами коммитов, адресами, датами, замерами времени или начальными значениями генераторов случайных чисел. Третий такой результат получает пометку, которая и раньше советовала сменить подход, а теперь учитывает и эти случаи; запуск, за которым никто не следит, по-прежнему останавливается только вызовом, пять раз написанным одинаково. Счёт начинается заново только после успешно применённой правки, а отклонённый вызов или вызов, сделанный дважды в одном ответе, не учитывается. - ВездеЕсли вызов, который выполняется отдельно, например правка или команда, завершается сбоем, вызовы, поставленные тем же ответом в очередь после него, не выполняются, а получают ответ «Not run: an earlier call in this reply failed; resend it if still wanted», так что проверка, отправленная вместе с правкой, никогда не выглядит так, будто проверила неприменённую правку. Команда, которая выполнилась и завершилась с каким-либо кодом, здесь сбоем не считается, поэтому два набора тестов, отправленные вместе, сообщают каждый свой результат; чтение и поиск выполняются сразу, и промах среди них ничего не останавливает, как не останавливает и неудачное сохранение в память (например, на заполненную страницу), и вызов, которому не дали выполниться пользователь, механизм разрешений или остановка, — например, сохранение, о котором пользователь не просил, или вызов несуществующего инструмента.
- ВездеОписание read_file сообщает, сколько вмещает одна страница (около 7 тыс. символов, если
limitне указан), и что чтения нескольких файлов или фрагментов нужно отправлять в одном ответе; описание search говорит то же о нескольких шаблонах или папках, а описание run_command — о независимых командах, у каждой из которых свой код выхода. Там, где вызовы выполняются по одному, эти пункты убираются, как и правило о пакетных вызовах. read_file называет поддерживаемые типы файлов в нескольких словах, search больше не тратит целое предложение на то, когда поиск идёт по документам, а примечание search_web о фрагментах результатов стало короче. - ВездеЗапуску, за которым никто не следит, например
letronna -p, теперь говорится: перед завершением удалить из папок с выходными файлами всё, что он создал только для тестирования, если задача не требует это оставить и собственная сборка проекта не держит это там, и записывать в файл, предназначенный для ответа, только ответ в запрошенной форме; что правила не трогать входные данные и не удалять данные относятся к его собственным действиям, а не к тому, что должна делать программа, которую его попросили написать, — она может работать не только на имеющемся образце; получать результат через библиотеку или инструмент, названные в задаче, а если вызов не удался, вызывать их правильно, а не обходить; и проверять вспомогательную функцию, преобразующую данные, на крошечном входе с заранее известным ответом, а итоговый результат — отдельным кодом. - ВездеКоманда, переведённая в фон по истечении лимита времени, теперь называет рядом с wait и read_job ещё и stop_job — для задания, которое больше не нужно.
- ВездеЗапуск, за которым никто не следит, например
letronna -p, который не менял исходный код, но любым инструментом или командой создал или изменил названный в запросе файл, напримерout.csv, теперь один раз отправляется назад, чтобы проверить этот файл по требованиям из запроса, — так же, как запуск, изменивший исходный код, но с формулировкой для файла: проверить его текущее содержимое коротким новым скриптом, который читает только этот файл и входные данные задачи и не использует код, создавший файл, ведь ошибка в этом коде согласуется сама с собой. Помощника-рецензента, которого запуск создаёт для такой проверки — здесь или после изменения исходного кода, — тоже просят выяснять проверяемое собственным кодом. Проверяются только пути и имена файлов, указанные в запросе, но никогда не вся папка. - ВездеПри 80% от
LETRONNA_DEADLINEзапуску говорится, прежде чем улучшать свои результаты, удалить из папок с выходными файлами черновые файлы, логи и бинарные файлы, созданные только для тестирования, если сборка проекта не держит их там; то же говорится запуску, ответ которого после этой отметки остановлен за слишком долгие размышления, и запуску, который начинается уже после неё, как это бывает с более поздним ходом через stdin. - ВездеОписание run_command больше не создаёт впечатления, что каждая команда выполняется в песочнице: описание параметра
unsandboxedговорит, что команда выполнялась в песочнице, только если в её результате есть строка, начинающаяся с(ran sandboxed, и что параметр нужен, если такое выполнение не удалось из-за сети или записи за пределами проекта или если ошибка сообщает, что команду нельзя выполнить в песочнице. Поэтому запуск, команды которого не ограничены, напримерletronna -p --yes, больше не считает, что установка или запись за пределами проекта будут запрещены, даже не попробовав. Что разрешают песочница и подтверждения, не изменилось. - ВездеВ запуске, за которым никто не следит, — например,
letronna -p, запуске по расписанию или в чат-приложении — автоматического проверяющего (judge) в автоматическом режиме ждут до минуты, а не 20 секунд, и он может написать вместе с размышлениями до 8 192 токенов, а не 2 112 (меньше — на моделях, которые, как известно, принимают меньше), так что долго размышляющая модель успевает вынести вердикт, а вызов не отклоняется и не передаётся в чат из-за отсутствия ответа; в сессиях, за которыми кто-то следит, остаются 20 секунд, проверяющий по-прежнему отклоняет вызов или спрашивает, если не может ответить, и его никогда не ждут дольшеLETRONNA_DEADLINEзапуска. - ВездеЗапуску, за которым никто не следит, например
letronna -p, говорится, что даже открытие файла программой может его изменить — так, sqlite3 может влить в базу данных её журнал упреждающей записи или удалить этот журнал при закрытии, — и что перед запуском такой программы на входных данных, из которых нужно восстановить данные или которые нужно починить, следует скопировать их вместе с сопутствующими файлами и сначала опробовать программу на копии. На Terminal-Bench 2.0 три запуска таким образом потеряли журнал базы данных, прежде чем успели его скопировать. - ВездеЗапуск, за которым, возможно, никто не следит, — например,
letronna -p, запуск по расписанию или запуск из чат-приложения — отбрасывает ответ без вызова инструментов, если тот на протяжении 2 000 символов или больше ходит по кругу на одних и тех же нескольких словах, почти не добавляя во второй половине строк или предложений, которых ещё не было, или если ответ остаётся пустым даже после одной просьбы что-нибудь сказать; тогда запуск отправляет тот же запрос снова после паузы в 2, 4 и затем 8 секунд, не больше трёх раз за раунд, вместо того чтобы принять пустословие за ответ, тащить его во все последующие запросы или закончить на пустом ответе. Данные, в которых каждые несколько строк появляется новая строка, — например, лог, таблица или большинство JSON-списков записей — сохраняются; длинная серия одинаковых строк, например сетка из нулей, может быть запрошена заново до трёх раз, прежде чем сохранится четвёртый вариант. Ответ, исчерпавший бюджет запуска, сохраняется. Токены отброшенного ответа по-прежнему учитываются в общем числе токенов запуска и в его бюджете, но не в стоимости, которую он сообщает, — как никогда не учитывались токены пустого ответа. Если запуск из чат-приложения отбрасывает уже показанный ответ, приложение сообщает об этом; ходы, набранные в приложении или терминале, и ходы редактора через ACP не изменились. - ВездеЕсли запуск, за которым никто не следит, например
letronna -p, завершается, а названного в запросе пути — например,src/run.jsили/srv/app/report.pdf— всё ещё нет, запуск один раз отправляется назад, чтобы сверить это с запросом, в той же проверке, которая сообщает об отсутствующем выходном файле вout/, при условии, что он может записывать файлы или выполнять команды. Путь любого вида учитывается, если его не было в начале запуска и к концу запуска он находится в проекте или существует его папка. Учитывается только путь, записанный вместе с папкой, а не одно имя; не учитываются путь в примере, в коде или диффе, заполнитель вроде<name>илиYYYY-MM-DD, URL и путь с номером строки или порта после него, напримерsrc/app.js:42; не учитывается то, что записывает показанная в запросе команда, например файл после-oили>; не учитывается и путь в предложении о чтении, удалении или перемещении файлов или в предложении, где сказано не создавать его, создать позже или что он необязателен либо не нужен. - ВездеВ запуске с
LETRONNA_DEADLINEответ, который заменяет ответ, остановленный за размышления без единого написанного слова, продолжает эти размышления: они передаются вместе с уведомлением о том, что пора писать ответ, и, если они длинные, обрезаются до начала и конца. Для такого ответа запрашивается низкий уровень усилий или ближайший из доступных модели, но никогда не выше заданного для запуска, а со следующим ответом возвращается собственный уровень усилий запуска. Запуск с автоматическим уровнем усилий, модель которого не размышляла, — например, через API Anthropic, где модель размышляет, только если её попросить, — уровень усилий не запрашивает, потому что там такой запрос заставил бы модель размышлять до конца запуска. Уведомление сообщает, достиг ли ответ лимита вывода или размышлял дольше своей доли оставшегося времени; раньше в обоих случаях говорилось, что ответ остановлен за размышления, и следующий ответ планировал всё заново с нуля. - ВездеВ запуске с крайним сроком, например
letronna -pсLETRONNA_DEADLINE, команда, которой дали больше стандартных двух минут, продолжает выполняться в фоне вместе с уже полученным выводом, как только израсходует половину оставшегося времени (но не меньше двух минут), или — если две минуты уже прошли — как только появляется уведомление, ожидающее доставки, например о завершении фонового задания, так что модель узнаёт о нём сразу, а не после истечения собственного лимита команды. Ничего не останавливается; запуски без крайнего срока, помощники и команды в песочнице ждут, как и раньше.
Исправлено 36
- ТерминалТекст на китайском, японском и корейском и эмодзи занимают положенные им две колонки, поэтому ответы переносятся целиком, а не теряют конец каждой строки; поле ввода, строки в очереди, списки и выделение тоже выравниваются с учётом этого. Ответ, файл или вывод команды больше не могут управлять терминалом: проходят только цвет и стиль, поэтому текст с управляющими последовательностями, которые меняют заголовок окна, пишут в буфер обмена, перемещают курсор или уводят с экрана разговора, показывается как текст без них — даже если последовательность в ответе разбита между частями, в которых он приходит в потоке. Табуляция отображается как четыре пробела.
- ВездеКошелёк продолжает работать, когда публичный RPC ему отказывает: у каждой встроенной сети есть другие бесплатные RPC, на которые кошелёк переходит, если собственный RPC сети ограничивает запросы, отказывает или недоступен, а в следующий раз начинает с того, который ответил; если вы задали адрес сами, используется только он, как и раньше. Баланс токена Solana теперь читается со счёта, на котором его хранят кошельки и который отдаёт любой RPC; раньше он искался среди всех счетов владельца, но такие запросы публичный RPC Solana ограничивает, а другие бесплатные RPC отклоняют, поэтому баланс USDC в Solana читался как нулевой и платежи x402 в нём не проходили. Токен, баланс которого прочитать не удалось, показывается в списке с причиной, а о цене сообщается, что её нельзя оплатить, потому что баланс не удалось прочитать, а не потому, что в кошельке слишком мало средств.
- Терминал
/thinking,/search,/search keyless,/notify,/voice,/verifyи/memory-reviewпринимают on или off, а раньше их переключало любое слово, так что/notify offмог включить уведомления; без аргумента они по-прежнему переключают режим. Enter после начала имени, общего для нескольких команд, например/u, подставляет первую из них, а не выполняет её;/effortсо словом, которое не является уровнем, перечисляет доступные уровни, а не переключается на auto;/mcpс незнакомым ему словом сообщает об этом, а не спрашивает, какой сервер нужен; неизвестная команда подсказывает, как отправить её как текст; а/jobsпомечает завершённые задания как завершённые. - ТерминалСессия, которая изначально получила имя по сообщению из нескольких строк, больше не содержит перевода строки в своём имени — в заголовке окна его не было и раньше.
- ВездеЗначение после
Authorization:илиProxy-Authorization:снова скрывается в выводе инструментов и в логах, как было до того, как имена стали разбираться по словам. - ВездеЗапуск, прочитавший недоверенный текст, может удалить только настоящий дамп после сбоя, оставленный им самим (core-файл ELF или файлы JVM с PID в имени), но не файл проекта с похожим именем, например
app.core. - ВездеЗаданию, которому объясняют, как оставить сервер работать после окончания запуска
-p, теперь говорят запускать сервер обычной командой, а не отдельным заданием: такое задание запуск остановил бы вместе с собой. - Linux**, **macOSКоманды, задания, хуки и проверки, в том числе в песочнице, запускаются с обработкой Ctrl-C и Ctrl-\\ по умолчанию, поэтому их можно намеренно прервать, например через
kill -INTили^C, отправленный заданию в терминале, даже если сама Letronna была запущена с игнорированием обоих сигналов (так её запускаетcmd &в скрипте). Раньше Python, запущенный таким образом, не получалKeyboardInterrupt. Ctrl-C в собственном терминале Letronna до них по-прежнему не доходит, а сама Letronna сохраняет игнорирование сигналов, с которым была запущена. - ВездеЗапуск без наблюдения, например
letronna -p, который уже возвращали к работе из-за незакрытых пунктов чек-листа и который затем изменил их — отметил, добавил или начал пункт, — при попытке завершиться снова возвращается к работе со списком того, что ещё открыто, если только его уже не возвращали из-за точно такого же списка; поэтому запуск, который оставил пункты как были или вернул их обратно, всё равно завершается. Раньше запуск возвращали только один раз, поэтому если это случалось рано, на одном из промежуточных ответов, позже он мог завершиться с открытыми пунктами, и никто ему об этом не говорил. - ВездеЗапрос, который шлюз отклоняет как слишком большой (HTTP 413) — так бывает с запросом, где несколько крупных изображений, — сразу отправляется снова без самых старых изображений, пока не уложится в предел, названный в отказе, или, если предел не назван, пока не станет на четверть меньше; на месте каждого убранного изображения остаётся строка о том, что его можно увидеть, снова прочитав файл, а для самого нового — что может поместиться уменьшенная копия. Ошибка 413 из-за слишком большого числа токенов в минуту, которую присылает Groq, в том числе через OpenRouter, за такой отказ не принимается. Предел шлюза действует и для его последующих запросов в этом запуске, а сокращается так же, как при переполнении окна контекста, только запрос, из которого больше нечего убрать; раньше единственная повторная отправка по-прежнему несла все изображения, получала такой же отказ и завершала ход.
- ВездеРезультат инструмента с сохранённым изображением, которое запрос больше не передаёт, теперь сообщает об этом, а раньше по-прежнему говорил, что изображение прилагается: запрос отправляет только 4 самых новых, и теперь результат советует извлечь нужное из изображения, пока оно ещё передаётся; если модель отказывается принимать изображения, каждый такой результат сообщает, что это за изображение и как ещё его изучить, — так же, как для вложенного изображения. Старые снимки экрана Browse, которые намеренно не передаются, ничего не сообщают, а сессия хранит каждый результат в исходном виде.
- Вездеread_file уменьшает изображение до 1 568 пикселей по длинной стороне всякий раз, когда она длиннее, как и при вложении, а не только когда файл слишком велик для отправки.
- ВездеОшибка, которую шлюз присылает внутри ответа, уже начатого в потоке, — например, «every lender we tried refused this request (HTTP 502)» после двух минут сигналов поддержания соединения, — считается сбоем на стороне провайдера: запрос повторяется, а затем передаётся резервной модели, если она задана и из ответа ещё ничего не показано, и запуск больше не завершается необъяснимым сбоем. Статус, названный в тексте ошибки, читается так же, как собственный статус ответа: 429 пережидается, 408 повторяется, 413 считается запросом, слишком длинным для окна контекста, а другой код 4xx завершает ход как неверный запрос, если только это не код, который указывал бы на ключ, баланс или базовый URL, — ведь шлюз их только что принял. Ошибка, код или тип которой — собственная оценка запроса провайдером, например отклонённый промпт или
invalid_request_error, по-прежнему завершает ход, как и ошибка, которая передаёт статус в отдельном поле, как это делает TGI. - Везде
letronna -p --input-format stream-jsonсоблюдаетLETRONNA_DEADLINEтак же, как вопрос через-p, с отсчётом от начала запуска: на 80% текущему ходу предлагается записать результаты, по истечении срока запуск останавливается со строкой результата со статусомdeadline, а сообщение, отправленное после этого, не выполняется. Раньше запуск, управляемый через stdin (так им управляет Harbor), продолжался, пока его не убивала обвязка (harness), и строки результата не было. - ВездеЗапуску без наблюдения теперь прямо запрещено искать в сети копию своей задачи, её тестов или ответа. С тех пор как 11 октября было переформулировано правило о границах задачи, об этом ничего не говорилось, и на Terminal-Bench 2.0 шесть из 89 запусков искали собственную задачу, а три из них скачали её опубликованное решение или тесты и запустили их.
- ТерминалСессия, возобновлённая через
-cили-r, сразу показывает разговор (раньше он появлялся на экране только после нажатия клавиши) и показывает его целиком, до последней тысячи сообщений, — раньше были видны только последние двенадцать, без возможности вернуться к остальным; воспроизведённый вызов инструмента называет, к чему он применялся, как и вызов в реальном времени./undoи/retryперерисовывают разговор так же. - ТерминалКоманды работают в папке открытой сессии, а не в той, где запустилась Letronna, поэтому после
--worktreeили при возобновлённой сессии из другого проекта/where,/memory,/skills,/help,/undo,/retry,/image,/preview, меню/и ваши собственные команды читают и изменяют файлы этой сессии./newиз сессии в собственном рабочем дереве (worktree) тоже даёт новой сессии рабочее дерево, созданное из той же рабочей копии, а раньше новая сессия начиналась в самой рабочей копии, которую рабочее дерево и должно было оставить нетронутой. - Везде
/goal stop,/goal offи/goal cancelзавершают цель так же, как/goal clear, а раньше ставили целью работы это одно слово. - ТерминалПри выходе Letronna сообщает, какая это была сессия и как к ней вернуться (
Saved "…" · letronna -r 16), уже на обычном экране терминала. SIGTERM или закрытие терминала завершают сессию так же, как выход: терминал возвращается в обычное состояние, а задания и рабочие деревья приводятся в порядок; раньше терминал оставался в сыром режиме (raw mode) на экране разговора. При сбое Letronna покидает экран разговора и отключает захват мыши до вывода сообщения, поэтому оно остаётся читаемым, а перехваченная паника в потоке инструмента больше не отключает сырой режим под полем ввода.NO_COLORубирает цвета, но оставляет поле ввода, а раньше отключал его. - ТерминалКарточка подтверждения или вопрос модели, появившиеся, пока вы печатаете, больше не перехватывают нажатия клавиш: буквы продолжают попадать в поле ввода за карточкой, Enter, нажатый, пока вы ещё печатаете, отправляет вашу строку, а не «да», и цифра больше не выбирает «always allow». Строка, отправленная, пока агент работал, никогда не становится ответом на вопрос, заданный после неё, в том числе на секретный; Esc на вопросе самой модели останавливает работу на нём, а у высокой карточки варианты ответа остаются на экране.
- ТерминалСообщение, набранное с
//, чтобы начать его с косой черты,/retryснова отправляет как текст и в таком же виде возвращает в поле ввода, а не выполняет как команду. - Везде
letronna -p --input-format stream-jsonс заданнымLETRONNA_DEADLINEуже в первом запросе узнаёт, сколько у него времени, а ответ, который только размышляет дольше своей доли оставшегося времени, останавливается с указанием сразу записать результаты — так же, как вопрос через-p. - ВездеВ
letronna -p, включая--input-format stream-json, когда команда начинает работу в фоне или переводится туда по истечении лимита времени, модели сообщается, что запуск при завершении останавливает свои фоновые задания, а процесс, который должен работать и после этого, нужно запускать отсоединённым, например черезsetsid nohup(nohupна macOS,Start-Processна Windows), и проверять, что он отвечает. Раньше о сервере, запущенном как задание, сообщалось, что он работает, а затем он останавливался вместе с запуском. Задания по-прежнему останавливаются; в терминале и в приложении, где задания продолжают работать после хода, ничего не изменилось. - ВездеЗапуск с заданным
LETRONNA_DEADLINEполучает предупреждение на 80%, даже пока его удерживает команда или ожидание: вызов в этот момент возвращается, ещё работающая команда продолжает выполняться как задание с уже накопленным выводом, а предупреждение считает оставшиеся секунды на момент, когда запуск его читает, а не на момент, когда оно должно было сработать. После предупреждения вызов перестаёт ждать незадолго до крайнего срока, чтобы запуск увидел вывод команды до своей остановки; в обоих случаях результат сообщает, что команда ещё работает, и предлагает wait или stop_job. Раньше запуск, занятый долгой командой, получал предупреждение только после её завершения, а по истечении срока команда завершалась так, что запуск не видел её вывода. - ВездеЕсли аргументы вызова инструмента обрываются раньше конца вызова, хотя предел вывода не достигнут, модель узнаёт, что её вывод может оборваться там, где она пишет целиком специальный токен вроде
<|endoftext|>, и что такой токен в содержимом нужно собирать из частей во время выполнения; этот совет идёт перед советом отправлять меньше за один вызов. Раньше модели советовали только отправлять меньше, а это не помогает с файлом, в котором есть такой токен. - ТерминалСтрока, набранная и введённая, пока Letronna загружалась, отправляется, а раньше нажатие Enter терялось и следующие слова приклеивались к ней.
\, а затем Enter, и Ctrl+J начинают новую строку везде, а Shift+Enter — в терминалах, которые умеют отличать его от Enter (Letronna их об этом просит); начальный экран и/helpназывают клавиши, которые работают в вашем терминале. Option+стрелки и Alt+B/F перемещают курсор на слово, а не вводят букву, Alt+D и Alt+Backspace удаляют слово, Ctrl+P/N работают как стрелки, а AltGr на Windows вводит свой символ. - ТерминалСкопированное выделение попадает в буфер обмена и в терминалах, которые игнорируют управляющую последовательность для копирования, например в Terminal.app и tmux, — через системную команду буфера обмена (pbcopy, clip, wl-copy, xclip или xsel), а нижняя строка пишет «copied», только если команда сработала; по ssh копирование остаётся за терминалом, потому что команда заполнила бы буфер обмена удалённой машины. Копируется текст в исходном виде: строка, перенесённая на несколько рядов, снова становится одной строкой, без отступа и маркера перед ней.
/copyкопирует последний ответ в исходном виде, вместе с разметкой Markdown, а/copy 2— предыдущий. - ТерминалЕсли прокрутить разговор назад, вид остаётся на том, что вы читаете, пока ниже приходит ответ, — раньше каждое новое слово утягивало его вниз, а сворачивающийся ниже блок сдвигал его, — и нижняя строка показывает, насколько далеко вы прокрутили; отправка сообщения или клавиша End возвращает вниз. В длинном сообщении курсор стоит там, где вы печатаете, на перенесённом ряду, поле ввода показывает ряды вокруг него при любой длине сообщения, а ↑ и ↓ перемещают по перенесённым рядам, прежде чем листать ранее отправленное. Китайский, японский, корейский текст и эмодзи занимают там свои две колонки, поэтому их ряды не выходят за поле ввода.
- ВездеДля модели, которую шлюз перечисляет только под путём другого поставщика, например
deepseek/deepseek-v4.1-flashпод именемopencode-go/deepseek-v4.1-flash, размер окна контекста берётся из этого списка, а не принимается минимальным, поэтому старые результаты инструментов больше не стираются уже через несколько тысяч токенов. - ВездеЗагрузка страницы или поиск, которые так и не дошли до сервера, например когда компьютер не в сети, больше не считаются прочтением страницы, поэтому сессии, которая продолжает работу только со своими файлами, не задают вопросов и не отказывают при последующих удалениях и отправках; ошибка с цитатой ответа сервера по-прежнему считается прочтением, а слова сервера в неудавшемся защищённом соединении, адрес перенаправления и тип файла теперь помечаются как текст от сервера.
- ВездеНа DeepSeek и Kimi рассуждения, которые отправляются обратно вместе с вызовами инструментов текущего хода, учитываются в окне контекста, поэтому длинный ход стирает старые результаты до того, как его запросы перестанут помещаться в модель.
- ВездеТеперь читается отчёт шлюза о записи в кэш промпта в поле
prompt_tokens_details.cache_creation_tokens, как его присылают некоторые шлюзы, отдающие Claude через API chat completions: если промпт ответа был записан в кэш, он учитывается как входные токены, записанные в кэш, а не только как несколько токенов, отправленных заново, — в строке расхода, в заполненности окна контекста, в/usageи вletronna -p --output json. - ПриложениеОткат к вашему сообщению возвращает его текст в поле ввода перед тем, что вы успели набрать, а не вместо него, вместе с изображениями сообщения, и поле ввода снова принимает нажатия клавиш; Rewind и Retry недоступны, пока сессию занимает запуск (раньше они просто ничего не делали), а если во время отката что-то запустилось, откат сообщает об этом.
- ПриложениеКнопки Undo these и Revert на вкладке Changes сообщают модели, какие файлы были возвращены, чтобы она перечитала их, прежде чем менять, а откат на более раннюю точку по-прежнему возвращает их.
- ВездеВывод команд, страницы и результаты MCP больше не скрывают значение в строке как секрет только потому, что в имени есть слово вроде key или token: у
KeyError: '...'в Python и у любой другой ошибки или предупреждения сообщение сохраняется, а строки вродеkeyboard.drv=keyboard.drv,ssh-keygen: generating new host keysиsmtpd_tls_key_file=/etc/ssl/private/x.keyпоказываются целиком. Значение по-прежнему скрывается, если одно из слов имени оканчивается на key, token, secret, password, passwd, credential или auth, с s на конце или без, как вPGPASSWORD,API_KEYSиpassWord, — кроме случаев, когда последнее слово имени — file, filename, path, dir, url, name или type, с s или без. - Вездеweb_fetch доверяет не только своим сертификатам, но и системным, которые читаются из
SSL_CERT_FILEилиSSL_CERT_DIR, если задана одна из этих переменных, поэтому в сети, которая переподписывает HTTPS своим центром сертификации, он открывает те же страницы, что curl и git, а не отклоняет каждую как выданную неизвестным издателем; сертификат, который он не может использовать, пропускается. Соединения со шлюзом по-прежнему используют только встроенные корневые сертификаты.