# 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