File size: 4,789 Bytes
92bfe31
 
 
 
 
 
b5cb5bb
 
de4b0cd
b5cb5bb
92bfe31
 
 
b5cb5bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92bfe31
b5cb5bb
 
 
 
 
 
92bfe31
b5cb5bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92bfe31
b5cb5bb
92bfe31
b5cb5bb
 
 
92bfe31
b5cb5bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92bfe31
b5cb5bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# DeepSeek AI API (OpenAI-compatible)
DEEPSEEK_API_KEY=your_deepseek_api_key_here
DEEPSEEK_BASE_URL=https://api.deepseek.com
DEEPSEEK_MODEL=deepseek-chat
DEEPSEEK_REASONER_MODEL=deepseek-reasoner

# Inference provider selection
# CI trigger marker: keep this file touchable to force backend deploy workflow runs when needed.
INFERENCE_PROVIDER=deepseek
INFERENCE_PRO_ENABLED=true
INFERENCE_PRO_PROVIDER=deepseek
INFERENCE_GPU_PROVIDER=deepseek
INFERENCE_CPU_PROVIDER=deepseek
INFERENCE_ENABLE_PROVIDER_FALLBACK=true
INFERENCE_PRO_PRIORITY_TASKS=chat,verify_solution
INFERENCE_PRO_ROUTE_HEADER_NAME=
INFERENCE_PRO_ROUTE_HEADER_VALUE=true

# task policy sets, comma-separated
INFERENCE_GPU_REQUIRED_TASKS=chat
INFERENCE_CPU_ONLY_TASKS=risk_classification,analytics_aggregation,file_parsing,auth,default_cpu
INFERENCE_INTERACTIVE_TASKS=chat,verify_solution,daily_insight
ENABLE_LLM_RISK_RECOMMENDATIONS=true

# local_space provider settings
# Accepts either runtime host (https://<owner>-<space>.hf.space) or
# Space page URL (https://huggingface.co/spaces/<owner>/<space>).
# Example: https://huggingface.co/spaces/Deign86/mathpulse-ai
INFERENCE_LOCAL_SPACE_URL=http://127.0.0.1:7860
INFERENCE_LOCAL_SPACE_GENERATE_PATH=/gradio_api/call/generate
INFERENCE_LOCAL_SPACE_TIMEOUT_SEC=180

# HF_TOKEN kept for Hugging Face Space deployment and dataset push only
# Alternative env names accepted by runtime/startup checks: HUGGING_FACE_API_TOKEN, HUGGINGFACE_API_TOKEN
HF_TOKEN=your_hf_token
FIREBASE_AUTH_PROJECT_ID=mathpulse-ai-2026
# Prefer one of the options below for backend Firestore/Admin access in deployment:
# FIREBASE_SERVICE_ACCOUNT_JSON={"type":"service_account",...}
# FIREBASE_SERVICE_ACCOUNT_FILE=/path/to/service-account.json
# DeepSeek timeout settings
INFERENCE_HF_TIMEOUT_SEC=90
INFERENCE_INTERACTIVE_TIMEOUT_SEC=55
INFERENCE_BACKGROUND_TIMEOUT_SEC=120

# Curriculum PDF storage
# Store the binary curriculum files in a Hugging Face dataset or Space repo,
# then point the backend at that repo so it downloads them at build/startup time.
CURRICULUM_SOURCE_REPO_ID=Deign86/mathpulse-curriculum
CURRICULUM_SOURCE_REPO_TYPE=dataset
CURRICULUM_SOURCE_REVISION=main

# Transactional email settings for admin-created accounts
# Primary provider: Brevo Transactional API
BREVO_API_KEY=
# Optional: Brevo MCP token (base64 JSON containing api_key) if BREVO_API_KEY is not set
BREVO_MCP_TOKEN=
# Optional SMTP fallback provider (Brevo SMTP relay)
BREVO_SMTP_LOGIN=
BREVO_SMTP_KEY=
BREVO_SMTP_HOST=smtp-relay.brevo.com
BREVO_SMTP_PORT=587
MAIL_FROM_ADDRESS=noreply@mathpulse.ai
MAIL_FROM_NAME=MathPulse AI
MAIL_SEND_TIMEOUT_SEC=15
APP_LOGIN_URL=https://mathpulse.ai
# Optional: absolute http(s) URL used as the email header avatar image.
# If unset, backend derives this from APP_LOGIN_URL + /avatar/avatar_icon.png.
APP_BRAND_AVATAR_URL=

# model defaults
# Global default model for all tasks.
INFERENCE_MODEL_ID=deepseek-chat
INFERENCE_ENFORCE_QWEN_ONLY=true
INFERENCE_QWEN_LOCK_MODEL=deepseek-chat
INFERENCE_MAX_NEW_TOKENS=8192
INFERENCE_TEMPERATURE=0.2
INFERENCE_TOP_P=0.9
INFERENCE_CHAT_MODEL_ID=deepseek-chat
# Temporary chat-only override for experiments (clear to roll back instantly).
# Example: Qwen/Qwen3-32B
INFERENCE_CHAT_MODEL_TEMP_OVERRIDE=
INFERENCE_CHAT_STRICT_MODEL_ONLY=true
INFERENCE_CHAT_HARD_MODEL_ID=meta-llama/Meta-Llama-3-70B-Instruct
INFERENCE_CHAT_HARD_TRIGGER_ENABLED=false
INFERENCE_CHAT_HARD_PROMPT_CHARS=650
INFERENCE_CHAT_HARD_HISTORY_CHARS=1500
INFERENCE_CHAT_HARD_KEYWORDS=step-by-step,show all steps,explain each step,justify each step,derive,derivation,proof,prove,rigorous,multi-step,word problem
CHAT_MAX_NEW_TOKENS=8192
CHAT_STREAM_NO_TOKEN_TIMEOUT_SEC=90
CHAT_STREAM_TOTAL_TIMEOUT_SEC=900
CHAT_STREAM_CONTINUATION_ENABLED=true
CHAT_STREAM_CONTINUATION_MAX_ROUNDS=2
CHAT_STREAM_CONTINUATION_MIN_NEW_CHARS=24
CHAT_STREAM_CONTINUATION_TAIL_CHARS=900
CHAT_STREAM_COMPLETION_MODE_DEFAULT=auto
# Optional: force quiz-generation model. Leave empty to use routing.task_model_map.quiz_generation.
HF_QUIZ_MODEL_ID=
HF_QUIZ_JSON_REPAIR_MODEL_ID=deepseek-chat

# retry behavior
INFERENCE_MAX_RETRIES=3
INFERENCE_BACKOFF_SEC=1.5
INFERENCE_INTERACTIVE_MAX_RETRIES=1
INFERENCE_BACKGROUND_MAX_RETRIES=3
INFERENCE_INTERACTIVE_BACKOFF_SEC=1.0
INFERENCE_BACKGROUND_BACKOFF_SEC=1.75
INFERENCE_INTERACTIVE_MAX_FALLBACK_DEPTH=1
# Max simultaneous blocking HF calls allowed from async endpoints.
HF_BLOCKING_CALL_CONCURRENCY=16
HF_ASYNC_MAX_CONNECTIONS=64
HF_ASYNC_MAX_KEEPALIVE_CONNECTIONS=32
HF_ASYNC_CONNECT_TIMEOUT_SEC=10.0
HF_ASYNC_WRITE_TIMEOUT_SEC=30.0
HF_ASYNC_POOL_TIMEOUT_SEC=10.0

# fallback model ids, comma-separated
INFERENCE_FALLBACK_MODELS=

# async generation controls
ENABLE_ASYNC_GENERATION=true
ASYNC_TASK_TTL_SECONDS=3600
ASYNC_TASK_MAX_ITEMS=400