Files
BountyBoard/.env.example
T
etalon 33c9c39676 feat(atomize): serve Subdivide via Anypreta Issue Atomizer
Add an optional remote atomization backend (the Anypreta "Issue Atomizer"
API) for the Subdivide flow, selected by ATOMIZER_REMOTE_BASE_URL /
ATOMIZER_REMOTE_API_KEY. When set, POST /v1/atomize is served by the remote
/v1/atomize-issue endpoint; its two-level issue→features→tasks model is mapped
onto our one-level task→children model by treating each Feature as a child and
its `estimation` as the effort coefficient (renormalized to sum to 1, even
split as a reported fallback when estimations are absent).

Extend and Summarize have no counterpart in the remote API and always stay on
ATOMIZER_BASE_URL, so the §5.1 service must keep running; readiness now probes
both backends. The mandatory `system` object is derived from the customer,
with a generic component tree (an empty tree makes the service return zero
features).

extsvc also learns the remote's flat error envelope ({error_code,message} and
FastAPI {detail}) and never swallows an unrecognized 4xx body.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 17:49:41 +02:00

66 lines
2.3 KiB
Bash

# --- core ---
# Set APP_BASE_URL to the public https URL when behind the reverse proxy.
APP_BASE_URL=http://localhost:8787
# In-network address external services use to call back into the app.
# docker-compose.yml sets this to http://app:8787; defaults to APP_BASE_URL.
#APP_INTERNAL_URL=
# Comma-separated CIDRs of trusted reverse proxies, e.g. 172.16.0.0/12,10.0.0.0/8.
# Empty = trust no proxy headers.
TRUSTED_PROXY_CIDRS=
APP_PORT=8787
MONGO_URI=mongodb://mongo:27017
MONGO_DB=bountyboard
SESSION_SECRET=change-me-32-bytes-random
# base64 of 32 random bytes; generate with: openssl rand -base64 32
CREDENTIALS_ENC_KEY=
MAX_UPLOAD_MB=25
# --- bootstrap admin ---
ADMIN_EMAIL=admin@example.com
ADMIN_INITIAL_PASSWORD=change-me-now
# --- external services (REQUIRED to be configurable here) ---
# Two independent services — separate URLs, ports, and tokens.
ATOMIZER_BASE_URL=http://atomizer-mock:8090
ATOMIZER_TOKEN=change-me-atomizer
ATOMIZER_TIMEOUT_SEC=120
# Optional: serve Subdivide from the Anypreta Issue Atomizer instead of the
# §5.1 service above. Both vars are required to enable it. Extend and Summarize
# have no counterpart in that API and always stay on ATOMIZER_BASE_URL, so the
# service above must keep running either way.
ATOMIZER_REMOTE_BASE_URL=
ATOMIZER_REMOTE_API_KEY=
WORK_PERFORMER_BASE_URL=http://work-performer:8091
WORK_PERFORMER_TOKEN=change-me-performer
# Job submission/polling only; jobs themselves are async.
WORK_PERFORMER_HTTP_TIMEOUT_SEC=30
# --- SMTP (optional; enables forgot-password + email notifications when set) ---
SMTP_HOST=
SMTP_PORT=587
SMTP_USER=
SMTP_PASSWORD=
SMTP_FROM=bountyboard@example.com
# --- hardening / tuning ---
# auto: Secure cookie flag only when APP_BASE_URL is https. Or: true | false.
COOKIE_SECURE=auto
# Cap parallel LLM calls (cost + rate-limit control).
ATOMIZE_MAX_CONCURRENCY=3
# Optional; enable Mongo auth for non-local deploys.
MONGO_USERNAME=
MONGO_PASSWORD=
# --- OIDC (optional; SSO hidden if empty) ---
OIDC_ISSUER_URL=
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
# --- mock atomizer / work performer ---
# Paste your key here; NEVER commit it.
ANTHROPIC_API_KEY=
ANTHROPIC_OPENAI_BASE_URL=https://api.anthropic.com/v1
ANTHROPIC_MODEL=claude-sonnet-4-6
# openai | anthropic (native /v1/messages fallback)
LLM_API_STYLE=openai