AIDive

Я запустил Claude Code на ноутбуке: прошла 1 из 2

AIDive · Опубликовано

Кодинг-агентыИИ-модели

Введение

Claude Code на модели для ноутбука справился с одной из двух наших реальных задач. Большинство демо такой связки заканчиваются на "hello"; мы дали маленькой локальной модели две задачи в пакете на Python и рассказываем, что получилось, а также какой алиас и какое правило мы оставили.

Схема простая. Когда лимит вашего плана кончается посреди задачи, вы либо ждёте сброса, либо передаёте работу тому же Claude Code, который работает с моделью на вашей машине. На задаче, затрагивающей несколько файлов, локальная модель сообщила, что все тесты проходят, хотя сделанное ею переименование сломало импорт. Один флаг, --bare, превратил локальный запуск, который ничего не изменил, в чистый успех на той же задаче.

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

Claude Code на собственной модели

Claude Code состоит из двух частей. Harness это программа в вашем терминале, которая читает файлы, запускает команды и вносит правки. Модель решает, что делать дальше; по умолчанию она работает на серверах Anthropic и расходует ваш план.

Одна настройка, базовый URL, говорит harness, куда отправлять запросы. Ollama это программа, которая скачивает открытые модели и отдаёт их по адресу на вашей машине. В самом Claude Code ничего не меняется, меняется только адрес, поэтому хватает одной строки в shell. Это похоже на то, как вы направляете приложение на локальную базу данных вместо боевой.

Для настройки установите Ollama через Homebrew, затем скачайте одну модель, которая помещается в вашу память. У нас это qwen3.5:9b, 7,6 ГБ, на MacBook Pro M1 Pro с 16 ГБ. Более крупные версии той же модели не поместились бы вообще. Сравните размер модели со своей памятью до загрузки: модель целиком должна лежать в ней рядом со всем остальным, что у вас открыто.

Одна оговорка из документации Anthropic: маршрутизация Claude Code на модели, которые не являются Claude, не поддерживается. Если что-то сломается, вы остаётесь один на один с проблемой, а запущенная вами модель намного меньше той, что даёт ваш план.

Алиас claude-alt

Алиас это короткое имя, которое ваш shell разворачивает в более длинную команду. Если весь переключатель собран в одном алиасе, обычный claude продолжает работать на вашем плане, потому что настройки действуют только при вызове алиаса.

Настройки берутся из собственного руководства Ollama: локальный адрес, токен-заглушка и API key. На ключ стоит обратить внимание. В документации Claude Code сказано, что заданный вами ключ используется вместо подписки, даже если вы вошли в аккаунт, поэтому он живёт только в строке алиаса. Откройте файл настроек shell, вставьте алиас с именем модели в конце и перезагрузите файл.

alias claude-alt='CLAUDE_CODE_ATTRIBUTION_HEADER=0 ANTHROPIC_AUTH_TOKEN=ollama ANTHROPIC_API_KEY=ollama ANTHROPIC_BASE_URL=http://localhost:11434 claude --bare --model qwen3.5:9b'

Это итоговая версия, в которой уже есть --bare (зачем он нужен, объясняет следующий раздел). CLAUDE_CODE_ATTRIBUTION_HEADER=0 это настройка, которую рекомендуют руководства по локальным моделям. Мы не измеряли, что она делает, так что считайте её необязательной.

Мы начали без --bare. Первой реальной задачей, в небольшом пакете на Python, который мы написали для этого теста, было добавить одну опцию в один файл и запустить результат. Claude Code запустился, предупредил, что не знает эту модель, и продолжил работать, пока шло время. Через 15 минут он не изменил ни одной строки, мы остановили его, и опции так и не появилось.

Если вы попробуете алиас в таком виде, то, скорее всего, увидите то же самое: сессия продолжает работать, а файл не меняется. Алиас направляет Claude Code на вашу модель, но для маленькой модели этого мало, чтобы выполнить задачу.

Флаг, который заставляет отвечать: --bare

Каждая сессия Claude Code начинается с длинного набора инструкций: ваш файл памяти и ваши инструменты. Для Claude это нормально, а для маленькой модели на ноутбуке тяжело. Флаг --bare это минимальный режим Claude Code. Он пропускает hooks, plugins, память и файл проекта, так что модель получает короткую страницу вместо справочника.

Вы добавляете --bare в конец алиаса и пишете слово ollama в ANTHROPIC_API_KEY, потому что в минимальном режиме Claude Code берёт ключ только оттуда. С тем же запросом, той же маленькой моделью и тем же небольшим context window запуск прочитал файл, отредактировал его и выполнил команду. Он уложился в 93 секунды с одним изменённым файлом, а команда вывела slug с префиксом впереди, ровно как просили: blog-hello-world.

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

Цена у этого есть. Минимальный режим также отбрасывает ваши hooks и правила проекта, поэтому локальная модель никогда не видит записанных вами соглашений. Если ваш проект полагается на hook, чтобы блокировать что-то опасное, оставьте такую задачу на плане, где ваши hooks действительно работают.

Ловушка 4k и исправление 64k

Вторую ловушку легко пропустить, потому что размер памяти модели Ollama выбирает за вас. Эта память и есть context window, то есть сколько разговора модель способна держать в поле зрения одновременно. В документации Ollama сказано, что на машине вроде нашей окно по умолчанию маленькое: 4k токенов при VRAM меньше 24 GiB, это далеко от 64 000, которые они рекомендуют для инструментов программирования. Все наши первые запуски шли с этим значением по умолчанию, и вы не узнаете об этом, пока не проверите.

Чтобы это исправить, остановите Ollama и запустите заново с длиной контекста 64 000 (OLLAMA_CONTEXT_LENGTH=65536), затем выполните ollama ps и посмотрите столбец CONTEXT. Это нужно задавать при каждом запуске сервера, а ollama ps единственное место, которое показывает, что значение применилось. Столбец изменился с 4096 на 65536, а модель заняла лишь чуть больше памяти: 7,6 ГБ до и 7,7 ГБ после.

Запуск Контекст --bare Результат Время
a-4k-nobare (алиас без --bare) 4096 нет FAIL: остановлен по лимиту 15 минут, ноль правок, ответа нет 900 s
a-4k (алиас) 4096 да PASS, blog-hello-world 93 s
a-64k (алиас) 65536 да PASS, blog-hello-world 35 s

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

Задача на несколько файлов: зелёные тесты, сломанный код

Раз локальная модель отвечает быстро, возникает соблазн дать ей настоящую работу. Поэтому мы дали ей задачу, затрагивающую несколько файлов: переименовать smart_truncate в truncate_words во всём пакете и оставить smart_truncate как алиас в slugkit/truncate.py. Алиас в коде это старое имя, сохранённое как указатель на новую функцию, так что код, который всё ещё использует старое имя, продолжает работать.

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

Запуск Контекст --bare Результат Время
b-plan (план, Claude) н/д нет PASS: 12 тестов OK, старый и новый импорты работают, тесты переименованы 38 s
b-4k (алиас) 4096 да BROKE: "All 12 unit tests pass", но from slugkit import truncate_words даёт ImportError; тесты всё ещё вызывают smart_truncate через import truncate_words as smart_truncate 464 s
b-64k (алиас) 65536 да BROKE: 12 тестов OK, сообщено о завершении, но алиас попал в __init__.py, поэтому from slugkit.truncate import smart_truncate даёт ImportError (в инструкции был truncate.py) 142 s

Когда мы импортировали старое имя так, как это сделал бы старый код, Python отказал. Модель положила алиас в главный файл пакета вместо модуля, который мы указали, так что старый путь импорта исчез. С маленьким окном та же задача сломалась иначе: новое имя так и не было экспортировано, а тесты по-прежнему вызывали старое.

Как все тесты могут быть зелёными, когда код сломан? Тесты проверяют только то, что проверяют, и никто не написал теста на старый импорт. Зелёный прогон локальной модели говорит лишь о том, что ничего из покрытого тестами не сломалось, и ничего не говорит о том, что они не покрывают.

На плане Claude сделал ту же работу за 38 секунд, переименовал и тесты, и оба импорта, старый и новый, работали. Справедливости ради, работу плана тоже стоит проверить, но здесь локальная модель оба раза ошиблась в задаче на несколько файлов. После каждого локального запуска прочитайте diff сами и вручную импортируйте старые имена, прежде чем доверять зелёному прогону тестов. Эта проверка занимает меньше времени, чем сам запуск, и не даёт сломанному импорту попасть в вашу основную ветку.

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

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

# claude-alt: one-file jobs I can check in a glance
# plan: anything across files, or that I can't check by reading the diff
# always: read the diff before committing

Локальная модель получает задачи в одном файле, которые вы можете проверить с одного взгляда, например добавить опцию, объяснить функцию или протестировать одну функцию. Всё, что затрагивает несколько файлов или что вы не можете проверить чтением diff, ждёт вашего плана. Какая бы модель ни написала код, вы читаете diff перед commit.

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

У этой схемы есть и ограничения, которые Ollama перечисляет в собственной документации. Нет prompt caching, когда сервер держит наготове начало разговора, так что в длинной сессии каждый ход перечитывает всё заново и вы замедляетесь. Нельзя заставить модель использовать конкретный инструмент. И Anthropic не поддерживает Claude Code на моделях, которые не являются Claude. Наше правило основано на двух задачах в одном маленьком пакете, так что считайте его отправной точкой и расширяйте собственными запусками.

Итог

Когда лимит плана кончается посреди задачи, один алиас запускает тот же Claude Code на модели на вашем ноутбуке. В нашем тесте он справился с задачей в одном файле и сломал задачу на несколько файлов. Опаснее всего сломанный запуск, потому что он сообщил, что все тесты зелёные, пока импорт не работал.

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

На плане каждая задача заняла меньше 40 секунд (21 s и 38 s), так что когда сброс близко, ждать часто быстрее. Алиас не заменяет ваш план. Он позволяет продолжать с небольшими задачами, пока вы ждёте его возвращения, и если настроить его сегодня, он будет готов в следующий раз, когда кончится лимит.

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

Бесплатные материалы

  • Пакет к видео

    Claude Code на Ollama: алиас claude-alt и правило переключения

    Блок алиаса claude-alt, одностраничное правило переключения, чек-лист на понедельник и таблица наших запусков Claude Code на ноутбуке с 16 ГБ и qwen3.5:9b.

    6 мин чтения · Я запустил Claude Code на ноутбуке: прошла 1 из 2

Источники

Частые вопросы

Можно ли запустить Claude Code с локальной моделью Ollama?
Да. Задайте базовый URL на адрес вашего Ollama, токен-заглушку и API key и передайте имя модели. Anthropic не поддерживает маршрутизацию Claude Code на модели, не являющиеся Claude, так что при поломке вы остаётесь один.
Что делает флаг --bare в Claude Code?
`--bare` это минимальный режим Claude Code. Он пропускает hooks, plugins, память и файл проекта, так что маленькая модель получает короткий prompt. В нашем запуске он превратил 15-минутную сессию без правок в успех за 93 секунды.
Почему локальная модель в Claude Code с Ollama работает медленно?
Ollama по умолчанию использует context window 4k при VRAM меньше 24 GiB. Запустите сервер с `OLLAMA_CONTEXT_LENGTH=65536` и проверьте столбец `CONTEXT` в `ollama ps`. Наша задача в одном файле сократилась до 35 секунд.
Достаточно ли локальной модели, чтобы заменить Claude Code на вашем плане?
Нет. В нашем тесте она справилась с задачей в одном файле, но сломала переименование в нескольких файлах, сообщив, что все 12 тестов зелёные. Используйте её для задач, которые можно проверить по одному diff, а работу с несколькими файлами оставляйте на план.
Что проверить после того, как локальная модель закончила задачу?
Прочитайте diff и вручную импортируйте старые имена. Зелёные тесты покрывают только то, что проверяют, а старый импорт, который сломало переименование, никто не тестировал.
Чего не поддерживает эндпоинт Anthropic в Ollama?
В документации Ollama перечислены отсутствие prompt caching и принудительного выбора инструмента. Без кеширования каждый ход длинной сессии перечитывает весь разговор, и вы замедляетесь.

Похожие видео