openrouter-cache

n8n node for OpenRouter Chat Model with Prompt Caching support

Package Information

Released: this month
Downloads: 15 weekly / 54 monthly
Latest Version: 0.7.1
Author: Dmitrij Plotnikov

Documentation

n8n-nodes-openrouter-cache

n8n community node для OpenRouter Chat Model с поддержкой Prompt Caching.

Возможности

  • Полная совместимость с AI Agent и другими LangChain узлами
  • Поддержка cache_control для Anthropic Claude и Google Gemini
  • Настраиваемый TTL кэша (5 минут или 1 час для Anthropic)
  • Кэширование системных промптов и первого пользовательского сообщения
  • Автоматическое определение поддержки кэширования по модели

Как работает кэширование

Провайдер Кэширование
OpenAI Автоматическое (минимум 1024 токена)
Anthropic Claude Требует cache_control - этот узел добавляет его автоматически
Google Gemini Требует cache_control - этот узел добавляет его автоматически
DeepSeek Автоматическое
Groq Автоматическое
Grok Автоматическое

Установка

Через Docker (рекомендуется)

  1. Соберите пакет локально:
cd n8n-nodes-openrouter-cache
pnpm install
pnpm build
  1. Создайте Dockerfile:
FROM n8nio/n8n:latest

USER root

# Копируем собранный пакет
COPY ./n8n-nodes-openrouter-cache /home/node/.n8n/custom/n8n-nodes-openrouter-cache

# Устанавливаем зависимости
WORKDIR /home/node/.n8n/custom/n8n-nodes-openrouter-cache
RUN npm install --production

USER node
WORKDIR /home/node
  1. Обновите docker-compose.yml:
version: '3.8'

services:
  n8n:
    build: .
    # или используйте image: n8nio/n8n:latest и volumes
    ports:
      - "5678:5678"
    environment:
      - N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
    volumes:
      - n8n_data:/home/node/.n8n
      # Для разработки можно монтировать напрямую:
      # - ./n8n-nodes-openrouter-cache:/home/node/.n8n/custom/n8n-nodes-openrouter-cache

volumes:
  n8n_data:
  1. Запустите:
docker-compose up --build

Альтернатива: монтирование volume

Если не хотите пересобирать образ:

services:
  n8n:
    image: n8nio/n8n:latest
    volumes:
      - n8n_data:/home/node/.n8n
      - ./n8n-nodes-openrouter-cache/dist:/home/node/.n8n/custom/n8n-nodes-openrouter-cache/dist
      - ./n8n-nodes-openrouter-cache/package.json:/home/node/.n8n/custom/n8n-nodes-openrouter-cache/package.json
    environment:
      - N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom

Использование

  1. Добавьте узел OpenRouter Chat Model (with Cache) в workflow

  2. Создайте credentials с вашим OpenRouter API ключом

  3. Выберите модель

  4. Настройте кэширование:

    • Enable Prompt Caching: включить для Anthropic/Gemini моделей
    • Cache TTL: 5 минут (по умолчанию) или 1 час
    • Cache System Prompt: кэшировать системный промпт
    • Cache First User Message: кэшировать первое сообщение пользователя (для больших документов)
  5. Подключите к AI Agent или другому LangChain узлу

Экономия на токенах

При использовании кэширования:

Провайдер Запись кэша Чтение кэша
Anthropic 1.25x цены 0.1x цены (90% экономия!)
Google Gemini бесплатно + хранение 0.25x цены
OpenAI бесплатно 0.5x цены
DeepSeek 1x цены 0.1x цены

Reasoning-модели (DeepSeek V4, o-series)

Reasoning-токены списываются из того же бюджета, что и ответ (Maximum Tokens). Если размышления съедают бюджет целиком, модель возвращает пустой content с finish_reason: "length" — AI Agent отдаёт пустой output, и воркфлоу выглядит сломанным без видимой причины.

Воспроизводится стабильно: deepseek/deepseek-v4-pro, maxTokens: 250 → reasoning: 250, текста нет.

Настройки в разделе Reasoning:

Параметр Действие
Effort: Disabled reasoning.enabled = false — размышления выключены полностью. Sonnet 5.5, Opus 5.5, Fable 5.x выключить не дают (400 «Reasoning is mandatory») — там узел шлёт effort: minimal. Haiku 5.5, Sonnet 5, Opus 5 выключаются честно (у них minimal ≠ выкл)
Effort: Minimal…Max reasoning.effort — подсказка провайдеру. На Claude 4.6+ это не бюджет размышлений, а общая «старательность» ответа (output_config.effort)
Reasoning Max Tokens reasoning.max_tokens — жёсткий потолок, имеет приоритет над Effort
Exclude From Response reasoning.exclude — скрыть размышления из ответа (токены всё равно тратятся)

⚠️ Проверено на deepseek/deepseek-v4-pro:

  • Effort: Disabled — работает надёжно (reasoning: 0, 3/3 прогона с текстом)
  • Reasoning Max Tokens и Effort: Low — провайдер не соблюдает лимит (при max_tokens: 100 пришло 179)

Поэтому для гарантии либо выключай reasoning совсем, либо ставь Maximum Tokens с большим запасом (4096+). Дефолт узла — 4096; проблема возникает, когда его понижают.

Если генерация всё же вернулась пустой, узел пишет в лог n8n:

[openrouter-cache] <model> returned an empty generation (finish_reason=length). ...

Прочие опции (0.7.0)

Опция Где Что делает
Cache Conversation (Auto) Prompt Caching Верхний cache_control (только Anthropic): OpenRouter двигает брейкпоинт на последнее сообщение — результаты тулов агента кэшируются от шага к шагу
Verbosity Options Длина/тщательность ответа. Для Claude 5.x — главный рычаг вместо температуры
Extra Body (JSON) Options Любые поля запроса, мержатся последними. Для DeepSeek: {"provider": {"quantizations": ["fp8","bf16"]}} — уводит от fp4-провайдеров (дефолтный роутинг OpenRouter тянет к самым дешёвым)

⚠️ Claude 5.x игнорирует Temperature, Top P, Frequency/Presence Penalty — OpenRouter молча их отбрасывает.

Проверка работы кэша

Проверить экономию можно:

  1. На странице Activity в OpenRouter
  2. Через API /api/v1/generation
  3. В поле cached_tokens в ответе API

Лицензия

MIT

Discussion