# Secrets: copy this file to .env locally. Never commit the resulting .env. OPENAI_API_KEY= POLYBOT_OPENAI_BASE_URL=https://api.openai.com/v1 OPENAI_FALLBACK_API_KEY= POLYBOT_OPENAI_FALLBACK_BASE_URL= # GPT-6 Astra is opt-in. The scanner works without it using the deterministic # parser, but Astra can audit ambiguous market wording and is cached by rule hash. POLYBOT_ASTRA_ENABLED=false POLYBOT_ASTRA_MODEL=gpt-6-astra POLYBOT_ASTRA_REASONING_EFFORT=low POLYBOT_ASTRA_MAX_OUTPUT_TOKENS=1800 POLYBOT_ASTRA_TIMEOUT_SECONDS=120 POLYBOT_ASTRA_BUDGET_USD=5.00 POLYBOT_ASTRA_RESERVE_PER_CALL_USD=0.25 # Defaults from the project brief dated 2026-09-08. Override these if the # official OpenAI API price for your account changes. POLYBOT_ASTRA_INPUT_USD_PER_MILLION=10.00 POLYBOT_ASTRA_OUTPUT_USD_PER_MILLION=50.00 # Paper-strategy safety limits. A separate minimal live-pilot library is present # but has no scheduler/CLI/service, reads no key from this file, and remains # unusable until an exact one-shot root-owned approval is supplied out of band. POLYBOT_MAX_EVENT_RISK_USD=2.00 POLYBOT_MAX_TOTAL_RISK_USD=6.00 POLYBOT_DAILY_STOP_LOSS_USD=2.00 POLYBOT_TOTAL_DRAWDOWN_STOP_USD=5.00 POLYBOT_MIN_PROBABILITY_EDGE=0.08 POLYBOT_MIN_EXPECTED_PROFIT_USD=0.25 POLYBOT_EXECUTION_BUFFER_USD=0.02 POLYBOT_MAX_BOOK_AGE_SECONDS=180 # Ended paper positions still block duplicate entries, but their external # resolution endpoint is polled less often than active market/forecast data. POLYBOT_PAPER_RESOLUTION_RECHECK_SECONDS=1800 # Market/weather discovery. POLYBOT_MARKET_SEARCH_QUERY=highest temperature # Observe-only commands keep the smaller coverage. Paper commands use the # broader limit unless --max-events is supplied explicitly. POLYBOT_MAX_EVENTS=2 POLYBOT_PAPER_MAX_EVENTS=8 POLYBOT_WEATHER_ERROR_SIGMA_C=1.5 POLYBOT_MIN_ENSEMBLE_MEMBERS=20 POLYBOT_MAX_FORECAST_HORIZON_DAYS=10 POLYBOT_OBSERVATION_DEFAULT_CADENCE_MINUTES=60 POLYBOT_OBSERVATION_STALE_MULTIPLIER=2.5 # Shadow forecast comparison. This never changes v1 paper decisions. The # lightweight runtime feed explicitly requests ECMWF IFS 0.25 ENS and archives # the exact JSON response. The separate official Open Data GRIB adapter lives # in polybot.ecmwf and can archive all 50 perturbed members directly. POLYBOT_ECMWF_ENABLED=false POLYBOT_ECMWF_SHADOW_MODEL=ecmwf_ifs025 POLYBOT_ECMWF_JSON_ARCHIVE_ROOT=data/forecasts/ecmwf-ifs025-json POLYBOT_ECMWF_MIN_MEMBERS=50 POLYBOT_FORECAST_V2_ENABLED=false POLYBOT_FORECAST_V2_STATION_MIN_SAMPLES=5 POLYBOT_FORECAST_V2_POOLED_MIN_SAMPLES=20 POLYBOT_FORECAST_V2_DEFAULT_RESIDUAL_SIGMA_C=1.5 POLYBOT_FORECAST_SNAPSHOT_MIN_INTERVAL_SECONDS=3600 POLYBOT_FORECAST_SNAPSHOT_PROBABILITY_DELTA=0.02 POLYBOT_FORECAST_OUTCOME_MONITOR_HOURS=336 # Bounded research lane. It never changes the ordered v1 candidate sample, # decisions, paper orders, risk, sigma, or promotion gates. Extra discoveries # are metadata-only rows in the separate shadow-extra-v1 registry. POLYBOT_SHADOW_RESEARCH_ENABLED=false POLYBOT_SHADOW_RESEARCH_WORKERS=1 POLYBOT_SHADOW_OUTCOME_BATCH_SIZE=8 POLYBOT_SHADOW_EXTRA_MAX_EVENTS=8 # Optional Google WeatherNext 3 comparison source. Disabled until Google access # is approved and an authorized export is supplied. It never changes v1 trades. POLYBOT_WEATHERNEXT_ENABLED=false POLYBOT_WEATHERNEXT_SURFACE=gcs_full_ensemble POLYBOT_WEATHERNEXT_SNAPSHOT_PATH= # Requester Pays billing project ID (not an API key). The full ensemble is in # gs://weathernext3_spatial under this Zarr-v3 root. Set STORE_PREFIX to one # concrete .../predictions.zarr path to skip prefix discovery on refresh. POLYBOT_WEATHERNEXT_GCS_PROJECT= POLYBOT_WEATHERNEXT_GCS_BUCKET=weathernext3_spatial POLYBOT_WEATHERNEXT_GCS_PREFIX=weathernext_3_0_0/zarr POLYBOT_WEATHERNEXT_GCS_STORE_PREFIX= # Safety ceiling for one raw full-ensemble point read. Reads above this are # rejected before payload download. This deployment intentionally never sets # `--allow-large-read`; use the bounded statistics surface instead. POLYBOT_WEATHERNEXT_RAW_READ_MAX_BYTES=2000000000 # Official precomputed mean/p10/p25/p50/p75/p90 surface. This is SUMMARY_ONLY: # it is never converted into synthetic members or daily probabilities. POLYBOT_WEATHERNEXT_STATISTICS_SNAPSHOT_PATH= POLYBOT_WEATHERNEXT_STATISTICS_BUCKET=weathernext3_statistics_spatial POLYBOT_WEATHERNEXT_STATISTICS_PREFIX=weathernext_3_0_0_statistics/zarr POLYBOT_WEATHERNEXT_STATISTICS_STORE_PREFIX= POLYBOT_WEATHERNEXT_STATISTICS_VARIABLE=station_head_temperature_2m POLYBOT_WEATHERNEXT_STATISTICS_READ_MAX_BYTES=2000000000 POLYBOT_WEATHERNEXT_STATISTICS_MAX_HOURS=4 # Approval-gated full-ensemble refresh. The timer only plans the first trial # from real strictly-future targets and performs metadata/HEAD requests. It # never reads payload; a separate exact-digest approval and explicit command # are required for the full sequential pass. POLYBOT_WEATHERNEXT_FULL_REFRESH_ENABLED=false POLYBOT_WEATHERNEXT_FULL_ROOT=/var/lib/polybot/weathernext/full POLYBOT_WEATHERNEXT_SNAPSHOT_INDEX_PATH=/var/lib/polybot/weathernext/full/latest-index.json POLYBOT_WEATHERNEXT_FULL_MAX_TARGETS=32 POLYBOT_WEATHERNEXT_FULL_MAX_NETWORK_BYTES=2000000000 POLYBOT_WEATHERNEXT_FULL_MAX_OBJECTS=4096 POLYBOT_WEATHERNEXT_FULL_MAX_OBJECT_BYTES=512000000 POLYBOT_WEATHERNEXT_FULL_REFRESH_INTERVAL_SECONDS=3600 POLYBOT_DATABASE_PATH=data/polybot.sqlite3