Материалы к статье «Как запустить Claude Code локально: llama.cpp + Qwen 3.8 27B»
================================================================================

В архиве два файла:

  qwen38-fixed.jinja - исправленный шаблон чата Qwen 3.8 27B (лечит API Error: 500)
  settings.json      - конфигурация Claude Code для одного проекта


1. qwen38-fixed.jinja
=====================

Что исправлено
--------------
В штатном шаблоне из GGUF строка 110 бросает исключение на любом системном
сообщении, которое пришло не первым:

    {{- raise_exception('System message must be at the beginning.') }}

Claude Code кладёт в messages сообщение с role="system" (список типов агентов)
после пользовательского - и сервер отвечает "API Error: 500". В этом шаблоне
строка заменена на обычный рендер системного хода:

    {{- '<|im_start|>system\n' + content + '<|im_end|>' + '\n' }}

Как использовать
----------------
1. Положите qwen38-fixed.jinja в свою домашнюю папку (например, ~/ai/).
2. В команде запуска подставьте СВОЙ путь вместо /home/ilya/ai/.
3. Команда выполняется из каталога llama.cpp после сборки:

CUDA_VISIBLE_DEVICES=0,1,2 ./build/bin/llama-server -hf unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL --host 0.0.0.0 --port 8000 --ctx-size 262144 --parallel 1 --cache-type-k q8_0 --cache-type-v q8_0 --flash-attn on --spec-draft-n-max 4 --spec-type draft-mtp --temp 0.7 --top-p 0.8 --top-k 20 --presence-penalty 1.5 --min-p 0.00 --reasoning off --split-mode layer --batch-size 2048 --ubatch-size 512 --jinja --chat-template-file /home/ilya/ai/qwen38-fixed.jinja

Проверка после запуска: в логе сервера должны быть n_slots = 1 и
n_ctx_slot = 262144, а grep -c "got exception" server.log должен дать 0.


2. settings.json
================

Включает локальную модель ТОЛЬКО в одном проекте - в отличие от export,
который уводит на локальный сервер все запуски claude из этой оболочки.

Куда класть
-----------
В корень своего проекта, в папку .claude/ :

    <проект>/.claude/settings.json          - командный файл, едет в git
    <проект>/.claude/settings.local.json    - личный файл, он в .gitignore

Адрес собственного сервера обычно кладут в settings.local.json: у коллеги
на localhost:8000 вашей модели нет, и командный файл сломает работу всей
команде. Приоритет: settings.local.json > settings.json > ~/.claude/settings.json.

Что поправить под себя
----------------------
  ANTHROPIC_BASE_URL              - адрес и порт вашего llama-server
  ANTHROPIC_MODEL                 - алиас модели (любой, сервер его не проверяет)
  CLAUDE_CODE_MAX_CONTEXT_TOKENS  - равен --ctx-size сервера, значение строкой

Дальше запускаете claude из корня проекта - переменные подхватятся
автоматически, в соседних репозиториях клиент останется на облаке.

Разбор целиком: https://nizamov.school/claude-code-lokalnaya-model/
