# Текстовые aux на локальной Ollama (qwen3:8b) + отключение thinking Дата: 2026-08-30. Продолжение `qwen3-vl-ollama-setup.md`: после vision переведены текстовые auxiliary-задачи (title_generation, web_extract) на локальную qwen3:8b. Хост: RTX 5060 Ti 16 GB VRAM, Ollama в Docker, main-модель — polza.ai. ## Итоговая конфигурация ```yaml auxiliary: vision: # qwen3-vl:8b (мультимодальная) provider: custom model: qwen3-vl:8b base_url: http://localhost:11434/v1 api_key: ollama title_generation: # qwen3:8b (текстовая) provider: custom model: qwen3:8b base_url: http://localhost:11434/v1 api_key: ollama extra_body: think: false web_extract: # qwen3:8b provider: custom model: qwen3:8b base_url: http://localhost:11434/v1 api_key: ollama extra_body: think: false compression: # остаётся в облаке (нужен 64K+ контекст) provider: auto ``` Проверено E2E через `from agent.auxiliary_client import call_llm`: - title_generation: "Настройка Ollama: локальные модели" — 11.3 сек (на qwen3-vl было 109 сек) - web_extract: нормальный пересказ — 7.5 сек - compression резолвится на auto → polza, не тронута ## Почему qwen3-vl НЕ годится для текстовых aux На простой вопрос ("какой сегодня день недели?") qwen3-vl:8b сгенерила 3778 токенов (eval_ms 54 сек) и отвечала 64 сек. reasoning=false в ответе, но content огромный — модель "растекается". Для быстрых aux (заголовки, извлечение) непригодна. ## Ключевая находка: отключение thinking у qwen3 в Ollama **ВАЖНО (2026-09-04, Ollama 0.22.1):** `think: false` через OpenAI `/v1/chat/completions` НЕ работает для qwen3 — модель все равно думает, content пуст, `finish: length` (reasoning съел лимит). Через нативный `/api/chat` + `think: false` думание выключается корректно (но Hermes ходит через /v1). **Решение для Hermes/aux — собрать тег с вырезанным reasoning** (никакие опции не помогают): ```bash # 1. Получить modelfile (docker): docker exec ollama ollama show qwen3:8b # или GET /api/show -> поле "modelfile" # 2. В TEMPLATE заменить все $.IsThinkSet -> false (ветки thinking навсегда выключены) # 3. Собрать (переиспользует blob, без скачивания): docker cp /tmp/qwen3-nothink-Modelfile ollama:/root/ docker exec ollama ollama create qwen3:8b-nothink -f /root/qwen3-nothink-Modelfile ``` Ключ: `$.IsThinkSet` управляет думанием (вставляет `/think`/`/no_think` в user msg и `thinking{{ .Thinking }}` в assistant). При `false` модель просто отвечает. Проверено: `qwen3:8b-nothink` через /v1 отвечает мгновенно (finish: stop), E2E через `call_llm(task=...)` в Hermes — корректный content (title_generation, web_extract). Оригинальный `qwen3:8b` не трогаем (откат — 1 строка в config). Затем в config.yaml (вручную, т.к. `hermes config set` не правит dict extra_body; порядок полей в файле: provider, model, base_url, api_key, timeout, extra_body): model для `auxiliary.title_generation` и `auxiliary.web_extract` := `qwen3:8b-nothink`. **ОПРОВЕРГНУТЫЕ способы (не работают — модель все равно генерит reasoning первыми токенами):** - `enable_thinking: false` в options (`/api/chat`) — таймаут - `enable_thinking: false` в extra_body (`/v1/chat/completions`) — content пустой - `/no_think` в начале user-сообщения — reasoning=True, content пустой - system prompt "don't think" — не помогает - корневой `think: false` в /v1 — НЕ работает в Ollama 0.22 (работает только native /api/chat) Симптом при неотключённом thinking: **content = ''**, `usage.completion_tokens == max_tokens` (весь бюджет съело reasoning), время ответа большое. Диагностика: смотреть поле `reasoning`/`reasoning_content` в ответе. ## Полный список auxiliary-задач (из config.yaml) vision, web_extract, compression, skills_hub, approval, mcp, title_generation, triage_specifier, kanban_decomposer, profile_describer, curator. `session_search` — НЕ auxiliary-задача: `hermes config set auxiliary.session_search.provider` даёт warning "not a recognized config key" (в конфиге у неё только extra_body/max_concurrency/ timeout). Не настраивать как auxiliary. ## VRAM (обе модели одновременно) qwen3:8b 6.13 GB + qwen3-vl:8b 7.19 GB + bge-m3 1.21 GB ≈ 14.5 GB — влезают в 16 GB, переключение vision↔текст без выгрузки (keep_alive по умолчанию). При нехватке Ollama выгружает LRU-модель и перезагружает при следующем вызове (+5-15 сек). ## Нюанс `hermes config set` `hermes config set auxiliary..extra_body` не пройдёт (extra_body — dict, не скаляр) — править YAML вручную (python+yaml.safe_dump). Остальные ключи (provider/model/base_url/ api_key) ставятся через `hermes config set` с `--force` если ключ не в schema.