> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://summarize.martino.im/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://summarize.martino.im/_mcp/server.

# Configuration

> **Note**
>
> CLI flags override everything in `summarizer.yaml`. Use `--no-config` to ignore the config file entirely.

## How Settings Are Resolved

Each run merges built-in defaults, the `defaults:` block, the chosen provider, and finally CLI or API overrides. Later layers win.

```mermaid
flowchart TD
  a[built-in defaults] --> b[YAML defaults]
  b --> c{provider set?}
  c -->|yes| d[provider URL, model, keys]
  c -->|no| e[CLI or API overrides]
  d --> e
  e --> f[env fallbacks for unset keys]
  f --> g[JEV defaults]
  g --> h[API key: flag, YAML, .env]
  h --> i([core.main])
```

## Providers (`summarizer.yaml`)

Define your LLM providers and defaults. See [`summarizer.example.yaml`](https://github.com/martinopiaggi/summarize/blob/main/summarizer.example.yaml) for a complete starter file.

```yaml
default_provider: groq

providers:
  groq:
    base_url: https://api.groq.com/openai/v1
    model: openai/gpt-oss-120b

  gemini:
    base_url: https://generativelanguage.googleapis.com/v1beta/openai
    model: gemini-3.5-flash-lite

  deepseek:
    base_url: https://api.deepseek.com/v1
    model: deepseek-v4-flash

  openrouter:
    base_url: https://openrouter.ai/api/v1
    model: google/gemini-3.1-flash-lite

  openrouter-video:
    base_url: https://openrouter.ai/api/v1
    model: minimax/minimax-m3

  openrouter-youtube:
    base_url: https://openrouter.ai/api/v1
    model: google/gemini-3.1-flash-lite
    visual-input-mode: url

  openai:
    base_url: https://api.openai.com/v1
    model: gpt-5.5

  nvidia:
    base_url: https://integrate.api.nvidia.com/v1
    model: nvidia/nemotron-3-nano-omni-30b-a3b-reasoning

  perplexity:
    base_url: https://openrouter.ai/api/v1
    model: perplexity/sonar
    chunk-size: 128000

  litellm-anthropic:
    base_url: litellm
    model: anthropic/claude-sonnet-4-6

defaults:
  prompt-type: Questions and answers
  chunk-size: 120000
  parallel-calls: 10
  max-tokens: 4096
  output-language: auto
  speed: 1.0
  use-proxy: false
  output-dir: summaries
  keep-history: false
  cache-transcript: true
  cache-transcript-persist: false
  use-jev-prefiltering: false
  jev-provider: openrouter
  jev-include: ""
  jev-exclude: ""
  jev-keep-ratio: 0.35
  visual: false
  visual-compression: off
  visual-chunk-seconds: auto
  visual-chunk-overlap-seconds: 0
```

#### Key defaults explained

* `output-language`: `auto`, `none`, or a human-readable name like `Italian`, `Spanish`, `German`, `Japanese`.
* `speed`: Playback speed for audio preprocessing before Whisper and for visual-mode video in base64 mode. Faster transcription is cheaper on Groq (priced by audio duration) but may reduce accuracy. The API accepts values up to `10.0`; the CLI accepts any positive value.
* `cache-transcript: false` disables the transcript cache entirely.
* `cache-transcript-persist: true` stores transcripts on disk under `{output-dir}/.cache/transcripts/` (survives restarts).
* `keep-history: true` persists GUI summaries to disk for the Streamlit sidebar.
* `use-jev-prefiltering: true` selects transcript passages before summarization. See [JEV Prefiltering](features/jev-prefiltering).
* `visual-input-mode: url` on a provider sends YouTube URLs directly to the model without downloading (see [Visual Mode](features/visual-mode)).
* Docker: use `summarizer.docker.yaml` or set `SUMMARIZER_KEEP_HISTORY` / `SUMMARIZER_CACHE_PERSIST` when a YAML key is omitted.

> **Note**
>
> The legacy `audio-speed` / `audio_speed` keys are no longer supported. Use `speed` instead.

## API Keys (`.env`)

```ini
# Required for Cloud Whisper transcription
groq = gsk_YOUR_KEY

# LLM providers (choose one or more)
openai = sk-proj-YOUR_KEY
generativelanguage = YOUR_GOOGLE_KEY
deepseek = YOUR_DEEPSEEK_KEY
openrouter = YOUR_OPENROUTER_KEY
perplexity = YOUR_PERPLEXITY_KEY
hyperbolic = YOUR_HYPERBOLIC_KEY
NVIDIA_API_KEY = YOUR_NVIDIA_KEY

# Optional: HTTP proxy
PROXY_URL = http://username:password@proxy.example.com:8080
NO_PROXY = localhost,127.0.0.1,::1,.local

# Optional: yt-dlp per-platform cookie files
YOUTUBE_COOKIES_FILE = C:\path\to\youtube-cookies.txt
INSTAGRAM_COOKIES_FILE = C:\path\to\instagram-cookies.txt
TIKTOK_COOKIES_FILE = C:\path\to\tiktok-cookies.txt
TWITTER_COOKIES_FILE = C:\path\to\twitter-cookies.txt
REDDIT_COOKIES_FILE = C:\path\to\reddit-cookies.txt
FACEBOOK_COOKIES_FILE = C:\path\to\facebook-cookies.txt

# Generic fallback cookie file (used when no per-platform file is set)
YTDLP_COOKIES_FILE = C:\path\to\cookies.txt

# Optional: Instagram username/password login when cookies are not used
INSTAGRAM_USER = YOUR_INSTAGRAM_USERNAME
INSTAGRAM_PASS = YOUR_INSTAGRAM_PASSWORD
```

## API Key Lookup

> **Note**
>
> The app resolves API keys in this order:
>
> 1. Explicit `--api-key` flag
> 2. Provider `api_key` field in `summarizer.yaml`
> 3. `.env` file matched by URL keyword (e.g., `generativelanguage` for Google AI Studio)
> 4. `.env` file matched by conventional env var name (e.g., `NVIDIA_API_KEY`, `GOOGLE_API_KEY`, `OPENAI_API_KEY`)
>
> If a key is missing, the error message lists all acceptable `.env` keys for that provider.