- New provider 'openai' calls any OpenAI-compatible /chat/completions endpoint (OpenAI, OpenRouter, Together, Groq, NVIDIA, vLLM, Ollama, ...), set via OPENAI_BASE_URL / OPENAI_API_KEY / OPENAI_MODEL. Now the default; auto-detects. - Robustness for models that degenerate (e.g. Kimi repetition loops): anti- repetition sampling (temperature + frequency penalty), and a schema-aware retry — call_json(require_keys=...) retries a fresh sample on degenerate or unparseable output (LLMRetryable). Relevance requires 'signals', synth 'briefs'. - response_format=json_object (toggle via OPENAI_JSON_MODE); base URL accepts a full /chat/completions URL or a /v1 base. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
42 lines
1.5 KiB
Plaintext
42 lines
1.5 KiB
Plaintext
# Copy to .env and fill in. The loop runs WITHOUT a key using a mock reasoner.
|
|
|
|
# --- LLM provider ---
|
|
# LLM_PROVIDER: openai | gemini | anthropic (auto-detected from whichever key is
|
|
# set if blank; OpenAI-compatible preferred). Provider w/ a missing key => mock.
|
|
LLM_PROVIDER=openai
|
|
|
|
# OpenAI-compatible endpoint — works with OpenAI, OpenRouter, Together, Groq,
|
|
# vLLM, Ollama, LM Studio, etc. Just point these three at any /chat/completions API:
|
|
OPENAI_BASE_URL=https://api.openai.com/v1
|
|
OPENAI_API_KEY=
|
|
OPENAI_MODEL=gpt-4o-mini
|
|
OPENAI_JSON_MODE=1 # set 0 if the endpoint rejects response_format=json_object
|
|
|
|
# Other providers:
|
|
GEMINI_API_KEY=
|
|
GEMINI_MODEL=gemini-2.5-flash
|
|
ANTHROPIC_API_KEY=
|
|
LLM_MODEL=claude-sonnet-4-6
|
|
|
|
# Force the offline mock reasoner even if a key is set:
|
|
# USE_MOCK_LLM=1
|
|
|
|
# Scoring thresholds (design Phase 5)
|
|
PRIORITY_THRESHOLD=0.72
|
|
STANDARD_THRESHOLD=0.45
|
|
|
|
# --- Exa.ai news/web harvester ---
|
|
# Without a key, the news connector falls back to data/fixtures.json.
|
|
EXA_API_KEY=
|
|
EXA_ENABLED=1
|
|
# Hard ceilings to stay inside the free plan (~20,000 req/month). The connector
|
|
# refuses to call Exa once either cap is reached. Monthly count persists in
|
|
# output/state/exa_usage.json and resets at the start of each calendar month.
|
|
EXA_MONTHLY_REQUEST_CAP=1000
|
|
EXA_PER_RUN_REQUEST_CAP=25
|
|
EXA_RESULTS_PER_QUERY=5
|
|
EXA_LOOKBACK_DAYS=45
|
|
# Scope news to each account's own domain (1, default) to cut ticker/analyst
|
|
# noise, or search the broad web (0). Override per run: loop --no-domain-filter
|
|
EXA_DOMAIN_FILTER=1
|