mirror of
https://github.com/Gitlawb/openclaude.git
synced 2026-08-24 10:14:19 -05:00
This PR addresses three real bugs in WebSearch's provider layer plus adds Brave
as a first-class adapter so users with a BRAVE_API_KEY get auto-detection +
auto-chain inclusion (matching the ergonomics of TAVILY_API_KEY, EXA_API_KEY,
etc.).
## 1. New: Brave first-class adapter
`providers/brave.ts` — auto-detects `BRAVE_API_KEY`, slots into the auto chain
between Jina and Bing. Sends the bare token in `X-Subscription-Token` per
Brave's API contract. Mirrors the structure of `tavily.ts` / `bing.ts`.
Brave runs an independent web index (~30B pages), making it a useful
non-Google, non-Bing fallback. Bing's hosted API was sunsetted in Aug 2025
for new users, so Brave is a more practical default fallback in 2026.
## 2. Bug fix: Brave preset sent malformed auth header
The `WEB_PROVIDER=brave` preset in `custom.ts` declared
`authHeader: 'X-Subscription-Token'` but no `authScheme`, so the default
`'Bearer'` scheme prefix kicked in, producing:
X-Subscription-Token: Bearer <token> ← wrong, returns 401
Brave's API expects:
X-Subscription-Token: <token> ← bare token, no scheme
Fix: declare `authScheme: ''` on the preset; update
`buildAuthHeadersForPreset` to emit a bare token (no leading space) when the
scheme is empty.
## 3. Bug fix: Google preset never worked
`WEB_PROVIDER=google` was wired with `Authorization: Bearer <key>`, but the
Google Custom Search JSON API does not support Bearer auth. It requires:
- `?key=<API_KEY>` as a query param
- `?cx=<ENGINE_ID>` as a query param (Programmable Search Engine ID)
The preset previously had no slot for the engine ID at all, so any user
trying `WEB_PROVIDER=google` hit a 400/401 immediately.
Fix: extend `ProviderPreset` with two minimal fields — `authQueryParam` (key
goes in URL, not header) and `envQueryParams` (additional URL params sourced
from env vars). Rewire the `google` preset to use them; reading
`GOOGLE_CSE_ID` for `cx`.
A clear error fires fast if either `WEB_KEY` or `GOOGLE_CSE_ID` is missing,
instead of silently producing a 400 from upstream.
> Note: Google has announced the Custom Search JSON API will be discontinued
> on 2027-01-01 and is closed to new customers. The fix unbreaks existing
> users for the remaining ~8 months; the README includes a sunset notice and
> recommends Brave/Tavily/Exa for new setups.
## 4. Bug fix: Exa results had empty descriptions
`providers/exa.ts` never passed `contents` in the request body. Per the Exa
docs (https://docs.exa.ai/reference/search-api-guide-for-coding-agents):
> Use `highlights` for agent workflows. Highlights return 10x fewer
> tokens with the most relevant excerpts.
Without `contents: { highlights: true }`, the Exa response includes only
`{title, url, id, ...}` — no `text`, no `highlights`, no `summary`. The
adapter was then mapping `r.snippet ?? r.text` (neither field exists in the
default response shape), so every Exa hit came back with
`description: undefined`. Tavily/Brave/DDG all return snippets — Exa was
silently degraded.
Fix: request `contents: { highlights: true }` in the body, and map
`results[].highlights[]` (an array of strings) into the description by
joining up to 3 excerpts with ` … `. Falls back to `text` when present, then
`undefined` if neither field is populated.
## Tests
105 / 105 pass in `src/tools/WebSearchTool/providers/`:
- `providers/brave.test.ts` (new) — 7 tests: auth header, mapping,
domain filters, error paths
- `providers/exa.test.ts` (new) — 9 tests: contents request shape,
highlights mapping, fallback
chain, error paths
- `providers/custom.test.ts` (extended) — 6 new tests covering
`authScheme: ''` (Brave preset),
`authQueryParam` suppression
(Google preset), GOOGLE_CSE_ID +
WEB_KEY fail-fast errors, full
request shape via mocked fetch
205 / 205 pass across `src/tools/`. tsc clean for changed files.
## Docs
- `README_SEARCH_PROVIDERS.md` — promotes `BRAVE_API_KEY` to first-class,
documents `GOOGLE_CSE_ID` + sunset notice, fixes the provider table,
updates the auto-chain priority list and mode list
- `.env.example` — adds `BRAVE_API_KEY` line, documents `GOOGLE_CSE_ID`
requirement + sunset notice, updates auto-chain priority comment
## Migration / behavior changes
- `WEB_PROVIDER=google` users must now set `GOOGLE_CSE_ID` (was previously
unable to function at all, so this is a strict improvement).
- `WEB_PROVIDER=brave` users with `WEB_AUTH_SCHEME=""` workarounds can
drop the workaround — the preset now emits a bare token by default.
- Brave joins the auto-chain priority order
(firecrawl → tavily → exa → you → jina → **brave** → bing → mojeek →
linkup → ddg).
444 lines
18 KiB
Bash
444 lines
18 KiB
Bash
# =============================================================================
|
|
# OpenClaude Environment Configuration
|
|
# =============================================================================
|
|
# Copy this file to .env and fill in your values:
|
|
# cp .env.example .env
|
|
#
|
|
# Only set the variables for the provider you want to use.
|
|
# All other sections can be left commented out.
|
|
# =============================================================================
|
|
|
|
# =============================================================================
|
|
# SYSTEM-WIDE SETUP (OPTIONAL)
|
|
# =============================================================================
|
|
# Instead of using a .env file per project, you can set these variables
|
|
# system-wide so OpenClaude works from any directory on your machine.
|
|
#
|
|
# STEP 1: Pick your provider variables from the list below.
|
|
# STEP 2: Set them using the method for your OS (see further down).
|
|
#
|
|
# ── Provider variables ───────────────────────────────────────────────
|
|
#
|
|
# Option 1 — Anthropic:
|
|
# ANTHROPIC_API_KEY=sk-ant-your-key-here
|
|
# ANTHROPIC_MODEL=claude-sonnet-4-5 (optional)
|
|
# ANTHROPIC_BASE_URL=https://api.anthropic.com (optional)
|
|
#
|
|
# Option 2 — OpenAI:
|
|
# CLAUDE_CODE_USE_OPENAI=1
|
|
# OPENAI_API_KEY=sk-your-key-here
|
|
# OPENAI_MODEL=gpt-4o
|
|
# OPENAI_BASE_URL=https://api.openai.com/v1 (optional)
|
|
#
|
|
# Option 3 — Google Gemini:
|
|
# CLAUDE_CODE_USE_GEMINI=1
|
|
# GEMINI_API_KEY=your-gemini-key-here
|
|
# GEMINI_MODEL=gemini-2.0-flash
|
|
# GEMINI_BASE_URL=https://generativelanguage.googleapis.com (optional)
|
|
#
|
|
# Option 4 — GitHub Models:
|
|
# CLAUDE_CODE_USE_GITHUB=1
|
|
# GITHUB_TOKEN=ghp_your-token-here
|
|
#
|
|
# Option 5 — Ollama (local):
|
|
# CLAUDE_CODE_USE_OPENAI=1
|
|
# OPENAI_BASE_URL=http://localhost:11434/v1
|
|
# OPENAI_API_KEY=ollama
|
|
# OPENAI_MODEL=llama3.2
|
|
#
|
|
# Option 6 — LM Studio (local):
|
|
# CLAUDE_CODE_USE_OPENAI=1
|
|
# OPENAI_BASE_URL=http://localhost:1234/v1
|
|
# OPENAI_MODEL=your-model-id-here
|
|
# OPENAI_API_KEY=lmstudio (optional)
|
|
#
|
|
# Option 7 — AWS Bedrock (may also need: aws configure):
|
|
# CLAUDE_CODE_USE_BEDROCK=1
|
|
# AWS_REGION=us-east-1
|
|
# AWS_DEFAULT_REGION=us-east-1
|
|
# AWS_BEARER_TOKEN_BEDROCK=your-bearer-token-here
|
|
# ANTHROPIC_BEDROCK_BASE_URL=https://bedrock-runtime.us-east-1.amazonaws.com
|
|
#
|
|
# Option 8 — Google Vertex AI:
|
|
# CLAUDE_CODE_USE_VERTEX=1
|
|
# ANTHROPIC_VERTEX_PROJECT_ID=your-gcp-project-id
|
|
# CLOUD_ML_REGION=us-east5
|
|
# GOOGLE_CLOUD_PROJECT=your-gcp-project-id
|
|
#
|
|
# ── How to set variables on each OS ──────────────────────────────────
|
|
#
|
|
# macOS (zsh):
|
|
# 1. Open: nano ~/.zshrc
|
|
# 2. Add each variable as: export VAR_NAME=value
|
|
# 3. Save and reload: source ~/.zshrc
|
|
#
|
|
# Linux (bash):
|
|
# 1. Open: nano ~/.bashrc
|
|
# 2. Add each variable as: export VAR_NAME=value
|
|
# 3. Save and reload: source ~/.bashrc
|
|
#
|
|
# Windows (PowerShell):
|
|
# Run for each variable:
|
|
# [System.Environment]::SetEnvironmentVariable('VAR_NAME', 'value', 'User')
|
|
# Then restart your terminal.
|
|
#
|
|
# Windows (Command Prompt):
|
|
# Run for each variable:
|
|
# setx VAR_NAME value
|
|
# Then restart your terminal.
|
|
#
|
|
# Windows (GUI):
|
|
# Settings > System > About > Advanced System Settings >
|
|
# Environment Variables > under "User variables" click New,
|
|
# then add each variable.
|
|
#
|
|
# ── Important notes ──────────────────────────────────────────────────
|
|
#
|
|
# LOCAL SERVERS: If using LM Studio or Ollama, the server MUST be
|
|
# running with a model loaded before you launch OpenClaude —
|
|
# otherwise you'll get connection errors.
|
|
#
|
|
# SWITCHING PROVIDERS: To temporarily switch, unset the relevant
|
|
# variables in your current terminal session:
|
|
#
|
|
# macOS / Linux:
|
|
# unset VAR_NAME
|
|
# # e.g.: unset CLAUDE_CODE_USE_OPENAI OPENAI_BASE_URL OPENAI_MODEL
|
|
#
|
|
# Windows (PowerShell — current session only):
|
|
# Remove-Item Env:VAR_NAME
|
|
#
|
|
# To permanently remove a variable on Windows:
|
|
# [System.Environment]::SetEnvironmentVariable('VAR_NAME', $null, 'User')
|
|
#
|
|
# LOAD ORDER:
|
|
# Shell and system environment variables are inherited by the process.
|
|
# Project .env files are only used if your launcher or shell loads them
|
|
# before starting OpenClaude.
|
|
# COMPATIBILITY:
|
|
# System-wide variables work regardless of how you run OpenClaude:
|
|
# npx, global npm install, bun run, or node directly. Any process
|
|
# launched from your terminal inherits your shell's environment.
|
|
#
|
|
# REMINDER: Make sure .env is in your .gitignore to avoid committing secrets.
|
|
# =============================================================================
|
|
|
|
# =============================================================================
|
|
# PROVIDER SELECTION — uncomment ONE block below
|
|
# =============================================================================
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Option 1: Anthropic (default — no provider flag needed)
|
|
# -----------------------------------------------------------------------------
|
|
ANTHROPIC_API_KEY=sk-ant-your-key-here
|
|
|
|
# Override the default model (optional)
|
|
# ANTHROPIC_MODEL=claude-sonnet-4-5
|
|
|
|
# Use a custom Anthropic-compatible endpoint (optional)
|
|
# ANTHROPIC_BASE_URL=https://api.anthropic.com
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Option 2: OpenAI
|
|
# -----------------------------------------------------------------------------
|
|
# CLAUDE_CODE_USE_OPENAI=1
|
|
# OPENAI_API_KEY=sk-your-key-here
|
|
# OPENAI_MODEL=gpt-4o
|
|
# For DeepSeek, set:
|
|
# OPENAI_BASE_URL=https://api.deepseek.com/v1
|
|
# OPENAI_MODEL=deepseek-v4-flash
|
|
# Optional: OPENAI_MODEL=deepseek-v4-pro
|
|
# Legacy aliases also work: deepseek-chat and deepseek-reasoner
|
|
# For Z.AI GLM Coding Plan, set:
|
|
# OPENAI_BASE_URL=https://api.z.ai/api/coding/paas/v4
|
|
# OPENAI_MODEL=GLM-5.1
|
|
# Optional: OPENAI_MODEL=GLM-5-Turbo, GLM-4.7, or GLM-4.5-Air
|
|
# For Hicap, use the OpenAI-compatible route flag above and set:
|
|
# HICAP_API_KEY=your-hicap-key-here
|
|
# OPENAI_BASE_URL=https://api.hicap.ai/v1
|
|
# OPENAI_MODEL=claude-opus-4.7
|
|
|
|
# Use a custom OpenAI-compatible endpoint (optional — defaults to api.openai.com)
|
|
# OPENAI_BASE_URL=https://api.openai.com/v1
|
|
# Choose the OpenAI-compatible API surface (optional — defaults to chat_completions)
|
|
# Supported: chat_completions, responses
|
|
# OPENAI_API_FORMAT=chat_completions
|
|
# Choose a custom auth header for OpenAI-compatible providers (optional).
|
|
# Authorization defaults to Bearer; custom headers default to the raw API key.
|
|
# Set OPENAI_AUTH_HEADER_VALUE when the header value differs from OPENAI_API_KEY.
|
|
# OPENAI_AUTH_HEADER=api-key
|
|
# OPENAI_AUTH_SCHEME=raw
|
|
# OPENAI_AUTH_HEADER_VALUE=your-header-value-here
|
|
|
|
# Fallback context window size (tokens) when the model is not found in
|
|
# integration model metadata (default: 128000). Increase this for models with larger
|
|
# context windows (e.g. 200000 for Claude-sized contexts).
|
|
# CLAUDE_CODE_OPENAI_FALLBACK_CONTEXT_WINDOW=128000
|
|
|
|
# Per-model context window overrides as a JSON object.
|
|
# Takes precedence over integration model metadata, so you can register new or
|
|
# custom models without patching source.
|
|
# Example: CLAUDE_CODE_OPENAI_CONTEXT_WINDOWS={"my-corp/llm-v3":262144,"gpt-4o-mini":128000}
|
|
# CLAUDE_CODE_OPENAI_CONTEXT_WINDOWS=
|
|
|
|
# Per-model maximum output token overrides as a JSON object.
|
|
# Use this alongside CLAUDE_CODE_OPENAI_CONTEXT_WINDOWS when your model
|
|
# supports a different output limit than what integration metadata specifies.
|
|
# Example: CLAUDE_CODE_OPENAI_MAX_OUTPUT_TOKENS={"my-corp/llm-v3":8192}
|
|
# CLAUDE_CODE_OPENAI_MAX_OUTPUT_TOKENS=
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Option 3: Google Gemini
|
|
# -----------------------------------------------------------------------------
|
|
# CLAUDE_CODE_USE_GEMINI=1
|
|
# GEMINI_API_KEY=your-gemini-key-here
|
|
# GEMINI_MODEL=gemini-2.0-flash
|
|
|
|
# Use a custom Gemini endpoint (optional)
|
|
# GEMINI_BASE_URL=https://generativelanguage.googleapis.com/v1beta/openai
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Option 4: GitHub Models
|
|
# -----------------------------------------------------------------------------
|
|
# CLAUDE_CODE_USE_GITHUB=1
|
|
# GITHUB_TOKEN=ghp_your-token-here
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Option 5: Ollama (local models)
|
|
# -----------------------------------------------------------------------------
|
|
# CLAUDE_CODE_USE_OPENAI=1
|
|
# OPENAI_BASE_URL=http://localhost:11434/v1
|
|
# OPENAI_API_KEY=ollama
|
|
# OPENAI_MODEL=llama3.2
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Option 6: LM Studio (local models)
|
|
# -----------------------------------------------------------------------------
|
|
# LM Studio exposes an OpenAI-compatible API, so we use the OpenAI provider.
|
|
# Make sure LM Studio is running with the Developer server enabled
|
|
# (Developer tab > toggle server ON).
|
|
#
|
|
# Steps:
|
|
# 1. Download and install LM Studio from https://lmstudio.ai
|
|
# 2. Search for and download a model (e.g. any coding or instruct model)
|
|
# 3. Load the model and start the Developer server
|
|
# 4. Set OPENAI_MODEL to the model ID shown in LM Studio's Developer tab
|
|
#
|
|
# The default server URL is http://localhost:1234 — change the port below
|
|
# if you've configured a different one in LM Studio.
|
|
#
|
|
# OPENAI_API_KEY is optional — LM Studio runs locally and ignores it.
|
|
# Some clients require a non-empty value; if you get auth errors, set it
|
|
# to any dummy value (e.g. "lmstudio").
|
|
#
|
|
# CLAUDE_CODE_USE_OPENAI=1
|
|
# OPENAI_BASE_URL=http://localhost:1234/v1
|
|
# OPENAI_MODEL=your-model-id-here
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Option 7: AWS Bedrock
|
|
# -----------------------------------------------------------------------------
|
|
|
|
# You may also need AWS CLI credentials configured (run: aws configure)
|
|
# or have AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY set in your
|
|
# environment in addition to the variables below.
|
|
#
|
|
# CLAUDE_CODE_USE_BEDROCK=1
|
|
# AWS_REGION=us-east-1
|
|
# AWS_DEFAULT_REGION=us-east-1
|
|
# AWS_BEARER_TOKEN_BEDROCK=your-bearer-token-here
|
|
# ANTHROPIC_BEDROCK_BASE_URL=https://bedrock-runtime.us-east-1.amazonaws.com
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Option 8: Google Vertex AI
|
|
# -----------------------------------------------------------------------------
|
|
# CLAUDE_CODE_USE_VERTEX=1
|
|
# ANTHROPIC_VERTEX_PROJECT_ID=your-gcp-project-id
|
|
# CLOUD_ML_REGION=us-east5
|
|
# GOOGLE_CLOUD_PROJECT=your-gcp-project-id
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Option 9: NVIDIA NIM
|
|
# -----------------------------------------------------------------------------
|
|
# NVIDIA NIM provides hosted inference endpoints for NVIDIA models.
|
|
# Get your API key from https://build.nvidia.com/
|
|
#
|
|
# CLAUDE_CODE_USE_OPENAI=1
|
|
# NVIDIA_API_KEY=nvapi-your-key-here
|
|
# OPENAI_BASE_URL=https://integrate.api.nvidia.com/v1
|
|
# OPENAI_MODEL=nvidia/llama-3.1-nemotron-70b-instruct
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Option 10: MiniMax
|
|
# -----------------------------------------------------------------------------
|
|
# MiniMax API provides text generation models.
|
|
# Get your API key from https://platform.minimax.io/
|
|
#
|
|
# CLAUDE_CODE_USE_OPENAI=1
|
|
# MINIMAX_API_KEY=your-minimax-key-here
|
|
# OPENAI_BASE_URL=https://api.minimax.io/v1
|
|
# OPENAI_MODEL=MiniMax-M2.5
|
|
|
|
|
|
# =============================================================================
|
|
# OPTIONAL TUNING
|
|
# =============================================================================
|
|
|
|
# Max number of API retries on failure (default: 10)
|
|
# CLAUDE_CODE_MAX_RETRIES=10
|
|
|
|
# Enable persistent retry mode for unattended/CI sessions
|
|
# Retries 429/529 indefinitely with smart backoff
|
|
# CLAUDE_CODE_UNATTENDED_RETRY=1
|
|
|
|
# Enable extended key reporting (Kitty keyboard protocol)
|
|
# Useful for iTerm2, WezTerm, Ghostty if modifier keys feel off
|
|
# OPENCLAUDE_ENABLE_EXTENDED_KEYS=1
|
|
|
|
# Disable "Co-authored-by" line in git commits made by OpenClaude
|
|
# OPENCLAUDE_DISABLE_CO_AUTHORED_BY=1
|
|
|
|
# Disable strict tool schema normalization for non-Gemini providers
|
|
# Useful when MCP tools with complex optional params (e.g. list[dict])
|
|
# trigger "Extra required key ... supplied" errors from OpenAI-compatible endpoints
|
|
# OPENCLAUDE_DISABLE_STRICT_TOOLS=1
|
|
|
|
# Disable hidden <system-reminder> messages injected into tool output
|
|
# Suppresses the file-read cyber-risk reminder and the todo/task tool nudges
|
|
# Useful for users who want full transparency over what the model sees
|
|
# OPENCLAUDE_DISABLE_TOOL_REMINDERS=1
|
|
|
|
# Log structured per-request token usage (including cache metrics) to stderr.
|
|
# Useful for auditing cache hit rate / debugging cost spikes outside the REPL.
|
|
# Any truthy value enables it ("verbose", "1", "true").
|
|
#
|
|
# Complements (does NOT replace) CLAUDE_CODE_ENABLE_TOKEN_USAGE_ATTACHMENT —
|
|
# they serve different audiences:
|
|
# - OPENCLAUDE_LOG_TOKEN_USAGE is user-facing: one JSON line per API
|
|
# request on stderr, intended for humans inspecting cost/caching.
|
|
# - CLAUDE_CODE_ENABLE_TOKEN_USAGE_ATTACHMENT is model-facing: injects
|
|
# a context-usage attachment INTO the prompt so the model can reason
|
|
# about its own remaining context. Does not touch stderr.
|
|
# Turn on whichever audience you're debugging; both can run together.
|
|
# OPENCLAUDE_LOG_TOKEN_USAGE=verbose
|
|
|
|
# Custom timeout for API requests in milliseconds (default: varies)
|
|
# API_TIMEOUT_MS=60000
|
|
|
|
# Enable debug logging
|
|
# CLAUDE_DEBUG=1
|
|
|
|
|
|
# =============================================================================
|
|
# WEB SEARCH (OPTIONAL)
|
|
# =============================================================================
|
|
# OpenClaude includes a web search tool. By default it uses DuckDuckGo (free)
|
|
# or the provider's native search (Anthropic firstParty / vertex).
|
|
#
|
|
# Set one API key below to enable a provider. That's it.
|
|
|
|
# ── Provider API keys — set ONE of these ────────────────────────────
|
|
|
|
# Tavily (AI-optimized search, recommended)
|
|
# TAVILY_API_KEY=tvly-your-key-here
|
|
|
|
# Exa (neural/semantic search)
|
|
# EXA_API_KEY=your-exa-key-here
|
|
|
|
# You.com (RAG-ready snippets)
|
|
# YOU_API_KEY=your-you-key-here
|
|
|
|
# Jina (s.jina.ai endpoint)
|
|
# JINA_API_KEY=your-jina-key-here
|
|
|
|
# Brave (independent web index, generous free tier)
|
|
# BRAVE_API_KEY=your-brave-key-here
|
|
|
|
# Bing Web Search
|
|
# BING_API_KEY=your-bing-key-here
|
|
|
|
# Mojeek (privacy-focused)
|
|
# MOJEEK_API_KEY=your-mojeek-key-here
|
|
|
|
# Linkup
|
|
# LINKUP_API_KEY=your-linkup-key-here
|
|
|
|
# Firecrawl (premium, uses @mendable/firecrawl-js)
|
|
# FIRECRAWL_API_KEY=fc-your-key-here
|
|
|
|
# Self-hosted Firecrawl endpoint (optional — omit to use cloud API)
|
|
# FIRECRAWL_API_URL=https://your-firecrawl-instance.com
|
|
|
|
# ── Provider selection mode ─────────────────────────────────────────
|
|
#
|
|
# WEB_SEARCH_PROVIDER controls fallback behavior:
|
|
#
|
|
# "auto" (default) — try all configured providers, fall through on failure
|
|
# "custom" — custom API only, throw on failure (NOT in auto chain)
|
|
# "firecrawl" — firecrawl only
|
|
# "tavily" — tavily only
|
|
# "exa" — exa only
|
|
# "you" — you.com only
|
|
# "jina" — jina only
|
|
# "brave" — brave only
|
|
# "bing" — bing only
|
|
# "mojeek" — mojeek only
|
|
# "linkup" — linkup only
|
|
# "ddg" — duckduckgo only
|
|
# "native" — anthropic native / codex only
|
|
#
|
|
# Auto mode priority: firecrawl → tavily → exa → you → jina → brave → bing →
|
|
# mojeek → linkup → ddg
|
|
# Note: "custom" is NOT in the auto chain. To use the custom API provider,
|
|
# you must explicitly set WEB_SEARCH_PROVIDER=custom.
|
|
#
|
|
# WEB_SEARCH_PROVIDER=auto
|
|
|
|
# ── Built-in custom API presets ─────────────────────────────────────
|
|
#
|
|
# Use with WEB_KEY for the API key:
|
|
# WEB_PROVIDER=searxng|google|brave|serpapi
|
|
# WEB_KEY=your-api-key-here
|
|
#
|
|
# Google Custom Search additionally requires the Programmable Search Engine ID:
|
|
# WEB_PROVIDER=google
|
|
# WEB_KEY=your-google-api-key
|
|
# GOOGLE_CSE_ID=your-programmable-search-engine-id
|
|
#
|
|
# Note: Google's Custom Search JSON API is closed to new customers and is
|
|
# scheduled for sunset on 2027-01-01. Prefer BRAVE_API_KEY / TAVILY_API_KEY
|
|
# / EXA_API_KEY for new setups.
|
|
|
|
# ── Custom API endpoint (advanced) ──────────────────────────────────
|
|
#
|
|
# WEB_SEARCH_API — base URL of your search endpoint
|
|
# WEB_QUERY_PARAM — query parameter name (default: "q")
|
|
# WEB_METHOD — GET or POST (default: GET)
|
|
# WEB_PARAMS — extra static query params as JSON: {"lang":"en","count":"10"}
|
|
# WEB_URL_TEMPLATE — URL template with {query} for path embedding
|
|
# WEB_BODY_TEMPLATE — custom POST body with {query} placeholder
|
|
# WEB_AUTH_HEADER — header name for API key (default: "Authorization")
|
|
# WEB_AUTH_SCHEME — prefix before key (default: "Bearer")
|
|
# WEB_HEADERS — extra headers as "Name: value; Name2: value2"
|
|
# WEB_JSON_PATH — dot-path to results array in response
|
|
|
|
# ── Custom API security guardrails ──────────────────────────────────
|
|
#
|
|
# The custom provider enforces security guardrails by default.
|
|
# Override these only if you understand the risks.
|
|
#
|
|
# WEB_CUSTOM_TIMEOUT_SEC=15 — request timeout in seconds (default 15)
|
|
# WEB_CUSTOM_MAX_BODY_KB=300 — max POST body size in KB (default 300)
|
|
# WEB_CUSTOM_ALLOW_ARBITRARY_HEADERS=false — set "true" to use non-standard headers
|
|
# WEB_CUSTOM_ALLOW_HTTP=false — set "true" to allow http:// URLs
|
|
# WEB_CUSTOM_ALLOW_PRIVATE=false — set "true" to target localhost/private IPs
|
|
# (needed for self-hosted SearXNG)
|