carepath-api / .env.example
tranth3truong's picture
Deploy CP-UX-17: public demo hub, same-origin API, one design world
aacc29a
Raw
History Blame Contribute Delete
4.73 kB
# CarePath unified runtime — one FastAPI service, two products.
# Defaults below are the keyless demo profile: the whole app must boot with no
# API keys (mock interpreter providers, mock ASR + offline LLM for the scriber).
# Ready-made profiles: .env.local.example (keyless demo), .env.ckey.example
# (real Gipformer ASR + CKey LLM).
# --- Scriber (scribe/carepath, routes /api/v1/*) ---
APP_ENV=local
ASR_PROVIDER=gipformer
GIPFORMER_QUANTIZE=int8
GIPFORMER_NUM_THREADS=4
GIPFORMER_DECODING_METHOD=modified_beam_search
GIPFORMER_CHUNK_SECONDS=20
# Long-audio segmentation: overlap (default) | vad | fixed.
# overlap = overlapping windows merged with seam de-duplication (no word loss
# at chunk boundaries; no extra model).
# vad = split on silence; requires GIPFORMER_VAD_MODEL (repo_id:filename or
# a local silero_vad.onnx path). Falls back to overlap if unavailable.
# fixed = legacy non-overlapping 20s windows.
GIPFORMER_SEGMENTATION=overlap
GIPFORMER_OVERLAP_SECONDS=2
GIPFORMER_MAX_SEGMENT_SECONDS=20
GIPFORMER_VAD_MODEL=
# Set LLM_PROVIDER=offline for a deterministic no-key fallback.
# Set LLM_PROVIDER=ckey for CKey OpenAI-compatible chat completions.
LLM_PROVIDER=offline
LLM_BASE_URL=https://api.openai.com/v1
LLM_MODEL=gpt-4.1-mini
LLM_API_KEY=
LLM_TIMEOUT_SECONDS=60
# If a network LLM provider fails, fall back to the offline generator so a
# request never errors out (recommended for live demos).
LLM_FALLBACK_OFFLINE=true
# Vietnamese speech synthesis (patient -> clinician direction).
# A default Windows or macOS install has no vi-VN browser voice, so without this
# half of a bilingual visit is silent. Uses sherpa-onnx, which is already a
# dependency for Gipformer ASR; no extra package. The 63 MB Piper voice
# (VAIS-1000 corpus, CC BY 4.0) downloads on first use.
# Keep TTS_MODEL_DIR SHORT: espeak-ng reads its data with a native call that
# fails past the Windows MAX_PATH limit.
TTS_PROVIDER=piper
TTS_MODEL_DIR=models/vi-tts
TTS_REPO_ID=csukuangfj/vits-piper-vi_VN-vais1000-medium
# Some gateways hang when asked for response_format=json_object (measured on
# CKey gpt-5.4). Off by default; the prompts demand JSON and parsers validate it.
LLM_JSON_RESPONSE_FORMAT=false
# Retrieval
MEDICAL_LEXICON_PATH=data/medical_lexicon.json
RETRIEVAL_TOP_K=5
# Backend: lexical (default) | semantic | hybrid. semantic/hybrid use the
# Vietnamese bi-encoder and need the optional sentence-transformers + pyvi deps.
RETRIEVAL_BACKEND=lexical
SEMANTIC_MODEL_NAME=bkai-foundation-models/vietnamese-bi-encoder
# Safety/demo
ALLOW_MOCK_ASR=false
TEAM_CODE=
SOAP_RATE_LIMIT_PER_IP_HOUR=3
SOAP_RATE_LIMIT_PER_IP_DAY=10
SOAP_RATE_LIMIT_GLOBAL_DAY=100
# Cross-origin frontends for both APIs. Clear this value for same-origin-only
# production; list every Vite development origin when developing against either API.
CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173
# Public Vercel site used by the Interpreter's “Tất cả chức năng” link when
# its frontend is built into the Space image. Set as a Docker build arg.
VITE_PUBLIC_SITE_URL=https://carepath-omega.vercel.app
# --- Interpreter (interpreter/app, routes /api/* + /ws/*) ---
# PROVIDER_MODE=mock runs deterministic providers with zero keys. Note that
# mock "translation" is the source text with a "[vi->en] " prefix, so it is a
# plumbing check, not a demoable translation.
# PROVIDER_MODE=demo replays a scripted consultation
# (interpreter/app/providers/demo_scenario.json) with realistic translations
# and no network. The normalizer, glossary, risk engine, confirmation gate and
# persistence all still run for real; only the model calls are scripted. Use
# it for rehearsal and as the fallback if the venue network dies.
# PROVIDER_MODE=ckey runs real translation over the OpenAI-compatible CKey
# gateway and reuses the LLM_BASE_URL / LLM_MODEL / LLM_API_KEY values above,
# so one key configures both modules. Speech capture happens in the browser
# on this path; audio turns fail closed rather than inventing a transcript.
# PROVIDER_MODE=cloud is the Anthropic + OpenAI track and needs the two keys
# below instead.
# Both ckey and cloud require a non-default ADMIN_TOKEN (startup refuses
# "change-me").
PROVIDER_MODE=mock
ANTHROPIC_API_KEY=
OPENAI_API_KEY=
ADMIN_TOKEN=change-me
CONFIDENCE_THRESHOLD=0.7
RETENTION_DAYS=30
MAX_TURN_AUDIO_BYTES=10485760
# sqlite is fine for the demo (ephemeral on HF Spaces); point at Postgres etc.
# for anything that must survive a container restart.
DATABASE_URL=sqlite:///./carepath.db
OPENAI_TRANSCRIBE_MODEL=gpt-4o-transcribe
CLAUDE_MT_MODEL=claude-sonnet-5
CLAUDE_REVIEWER_MODEL=claude-sonnet-5
PROVIDER_TIMEOUT_SECONDS=30