# Copy to .env and fill in. Never commit .env. OPENAI_API_KEY= # Must be a structured-outputs model family: gpt-5*, gpt-4.1*, o3*, o4*. # "-chat-latest" variants are rejected -- they track the ChatGPT product surface and # do not expose reasoning effort. # Note gpt-4.1 is allowed but is not a reasoning model, so OPENAI_EFFORT is ignored # for it (the adapter omits the parameter rather than sending a 400). OPENAI_MODEL=gpt-5.4-mini # Covers reasoning tokens AND the visible response on a reasoning model. Too low and # the JSON truncates mid-object, failing the candidate with MODEL_RESPONSE_INVALID. # Enforced floor is 2048. Do not lower this to save cost -- lower OPENAI_EFFORT. OPENAI_MAX_OUTPUT_TOKENS=4000 # none | minimal | low | medium | high | xhigh # Per-model support varies; the API rejects a level the model does not implement. OPENAI_EFFORT=low OPENAI_MAX_RETRIES=3 OPENAI_TIMEOUT_SECONDS=120 # OpenAI prompt caching is automatic and cannot be turned off. This only controls # whether a prompt_cache_key routing hint is sent to raise the cache hit rate. OPENAI_ENABLE_PROMPT_CACHE=true SCORING_CONCURRENCY=5 MAX_RESUMES_PER_REQUEST=50 MAX_PDF_SIZE_MB=10 MAX_JD_CHARS=30000 MAX_RESUME_CHARS=60000 # text | json LOG_FORMAT=json LOG_LEVEL=INFO