{"repo": "armin-fl/gptclone", "files": {"backend/config/settings.py": {"87907fa0fab8e301e6025591b62ccb5db6d091d8": {"t": 1785746922.4817755, "n": 14158, "h": "10d1f36d9d1de6df", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nimport sys\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nPROJECT_DIR = os.path.dirname(BASE_DIR)\n\n\ndef env_bool(name: str, default: str = \"0\") -> bool:\n return os.environ.get(name, default).lower() in {\"1\", \"true\", \"yes\", \"on\"}\n\n\nIS_TEST_COMMAND = any(\"pytest\" in arg or arg == \"test\" for arg in sys.argv)\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nPUBLIC_DEV_HOST = os.environ.get(\"PUBLIC_DEV_HOST\", \"46.100.12.235\")\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\", PUBLIC_DEV_HOST]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAPP_REDIS_URL = os.environ.get(\"APP_REDIS_URL\", \"redis://127.0.0.1:6380/0\")\nif \"test\" in sys.argv:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n \"LOCATION\": \"gptclone-tests\",\n }\n }\nelse:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.redis.RedisCache\",\n \"LOCATION\": APP_REDIS_URL,\n }\n }\n\nCHAT_PAGE_CACHE_SECONDS = int(os.environ.get(\"CHAT_PAGE_CACHE_SECONDS\", \"60\"))\nCHAT_CONVERSATION_PAGE_SIZE = int(os.environ.get(\"CHAT_CONVERSATION_PAGE_SIZE\", \"30\"))\nCHAT_MESSAGE_PAGE_SIZE = int(os.environ.get(\"CHAT_MESSAGE_PAGE_SIZE\", \"50\"))\nCHAT_PROMPT_HISTORY_MESSAGE_LIMIT = int(os.environ.get(\"CHAT_PROMPT_HISTORY_MESSAGE_LIMIT\", \"40\"))\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nFRONTEND_DEV_ORIGINS = [\n \"http://localhost\",\n \"http://127.0.0.1\",\n f\"http://{PUBLIC_DEV_HOST}\",\n \"http://localhost:3000\",\n \"http://127.0.0.1:3000\",\n f\"http://{PUBLIC_DEV_HOST}:3000\",\n \"http://localhost:8080\",\n \"http://127.0.0.1:8080\",\n f\"http://{PUBLIC_DEV_HOST}:8080\",\n]\nCORS_ALLOWED_ORIGINS = FRONTEND_DEV_ORIGINS\nCSRF_TRUSTED_ORIGINS = FRONTEND_DEV_ORIGINS\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n \"qwen3-32b-awq\": \"http://127.0.0.1:8002/v1\",\n \"qwq-32b-awq\": \"http://127.0.0.1:8003/v1\",\n \"deepseek-r1-distill-qwen-32b-awq\": \"http://127.0.0.1:8004/v1\",\n}\nVLLM_MODEL_CONTEXT_TOKENS = {\n \"gpt-oss-20b\": int(os.environ.get(\"VLLM_GPT_OSS_20B_CONTEXT_TOKENS\", \"32768\")),\n \"qwen3-32b-awq\": int(os.environ.get(\"VLLM_QWEN3_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n \"qwq-32b-awq\": int(os.environ.get(\"VLLM_QWQ_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n \"deepseek-r1-distill-qwen-32b-awq\": int(\n os.environ.get(\"VLLM_DEEPSEEK_R1_DISTILL_QWEN_32B_AWQ_CONTEXT_TOKENS\", \"32768\")\n ),\n}\nVLLM_TIMEOUT_SECONDS = 120\nVLLM_MODEL_CONTAINERS = {\n \"gpt-oss-20b\": {\n \"service_name\": \"vllm-gpt-oss-20b\",\n \"container_name\": \"vllm-gpt-oss-20b-dev\",\n },\n \"qwen3-32b-awq\": {\n \"service_name\": \"vllm-qwen3-32b-awq\",\n \"container_name\": \"vllm-qwen3-32b-awq-dev\",\n },\n \"qwq-32b-awq\": {\n \"service_name\": \"vllm-qwq-32b-awq\",\n \"container_name\": \"vllm-qwq-32b-awq-dev\",\n },\n \"deepseek-r1-distill-qwen-32b-awq\": {\n \"service_name\": \"vllm-deepseek-r1-distill-qwen-32b-awq\",\n \"container_name\": \"vllm-deepseek-r1-distill-qwen-32b-awq-dev\",\n },\n}\nVLLM_AUTO_SWITCH_ENABLED = env_bool(\n \"VLLM_AUTO_SWITCH_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_MODE_ENABLED = env_bool(\n \"VLLM_SLEEP_MODE_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_LEVEL = int(os.environ.get(\"VLLM_SLEEP_LEVEL\", \"1\"))\nVLLM_SWITCH_SLEEP_LEVEL = int(os.environ.get(\"VLLM_SWITCH_SLEEP_LEVEL\", str(VLLM_SLEEP_LEVEL)))\nVLLM_WARMUP_SLEEP_LEVEL = int(os.environ.get(\"VLLM_WARMUP_SLEEP_LEVEL\", str(VLLM_SWITCH_SLEEP_LEVEL)))\nVLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_DOCKER_COMPOSE_DIR = os.environ.get(\n \"VLLM_DOCKER_COMPOSE_DIR\",\n os.path.join(PROJECT_DIR, \"environments\", \"dev\"),\n)\nVLLM_DOCKER_COMPOSE_COMMAND = os.environ.get(\"VLLM_DOCKER_COMPOSE_COMMAND\", \"docker compose\")\nVLLM_DOCKER_COMMAND_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_COMMAND_TIMEOUT_SECONDS\", \"30\"))\nVLLM_DOCKER_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_START_TIMEOUT_SECONDS\", \"180\"))\nVLLM_CONTAINER_STOP_GRACE_SECONDS = int(os.environ.get(\"VLLM_CONTAINER_STOP_GRACE_SECONDS\", \"10\"))\nVLLM_CONTAINER_STOP_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_CONTAINER_STOP_TIMEOUT_SECONDS\", \"60\"))\nVLLM_MODEL_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_MODEL_START_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_TTL_SECONDS = int(os.environ.get(\"VLLM_GPU_LOCK_TTL_SECONDS\", \"7200\"))\nVLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS\", \"7200\"))\nVLLM_RUNTIME_POLL_SECONDS = float(os.environ.get(\"VLLM_RUNTIME_POLL_SECONDS\", \"1.0\"))\nLLM_MODEL_HEALTH_TIMEOUT_SECONDS = float(os.environ.get(\"LLM_MODEL_HEALTH_TIMEOUT_SECONDS\", \"0.8\"))\nLLM_MODEL_HEALTH_CACHE_SECONDS = int(os.environ.get(\"LLM_MODEL_HEALTH_CACHE_SECONDS\", \"5\"))\n\nIMAGE_MODEL = os.environ.get(\"IMAGE_MODEL\", \"flux\")\nIMAGE_API_KEY = os.environ.get(\"IMAGE_API_KEY\", \"\")\nIMAGE_GENERATION_TIMEOUT_SECONDS = float(os.environ.get(\"IMAGE_GENERATION_TIMEOUT_SECONDS\", \"900\"))\nIMAGE_SLEEP_MODE_ENABLED = env_bool(\n \"IMAGE_SLEEP_MODE_ENABLED\",\n \"1\" if VLLM_SLEEP_MODE_ENABLED else \"0\",\n)\nIMAGE_SLEEP_LEVEL = int(os.environ.get(\"IMAGE_SLEEP_LEVEL\", str(VLLM_SLEEP_LEVEL)))\nIMAGE_SWITCH_SLEEP_LEVEL = int(os.environ.get(\"IMAGE_SWITCH_SLEEP_LEVEL\", str(IMAGE_SLEEP_LEVEL)))\nIMAGE_SLEEP_FALLBACK_STOP_ENABLED = env_bool(\"IMAGE_SLEEP_FALLBACK_STOP_ENABLED\", \"0\")\nFLUX_SLEEP_STAGE_IDS = [\n int(stage_id.strip())\n for stage_id in os.environ.get(\"FLUX_SLEEP_STAGE_IDS\", \"0\").split(\",\")\n if stage_id.strip()\n]\nIMAGE_MODELS = {\n \"flux\": {\n \"provider\": \"vllm-omni\",\n \"base_url\": os.environ.get(\"FLUX_BASE_URL\", \"http://127.0.0.1:8005/v1\"),\n \"label\": \"FLUX.2 Klein 4B\",\n },\n}\nIMAGE_MODEL_CONTAINERS = {\n \"flux\": {\n \"service_name\": \"vllm-flux\",\n \"container_name\": \"vllm-flux-dev\",\n },\n}\nIMAGE_MODEL_SLEEP_STAGE_IDS = {\n \"flux\": FLUX_SLEEP_STAGE_IDS or [0],\n}\n\nOLLAMA_MODEL = os.environ.get(\"OLLAMA_MODEL\", \"qwen3:14b\")\nOLLAMA_API_KEY = os.environ.get(\"OLLAMA_API_KEY\", \"ollama\")\nOLLAMA_BASE_URL = os.environ.get(\"OLLAMA_BASE_URL\", \"http://127.0.0.1:11434/v1\")\nOLLAMA_CONTEXT_LENGTH = int(os.environ.get(\"OLLAMA_CONTEXT_LENGTH\", \"32768\"))\nOLLAMA_MODELS = {\n OLLAMA_MODEL: OLLAMA_BASE_URL,\n}\nOLLAMA_TIMEOUT_SECONDS = int(os.environ.get(\"OLLAMA_TIMEOUT_SECONDS\", \"300\"))\n\nLLM_MODEL = os.environ.get(\"LLM_MODEL\", VLLM_MODEL)\nLLM_MAX_COMPLETION_TOKENS = int(os.environ.get(\"LLM_MAX_COMPLETION_TOKENS\", \"32768\"))\nLLM_MODELS = {\n **{\n model: {\n \"provider\": \"vllm\",\n \"base_url\": base_url,\n \"label\": model,\n \"max_context_tokens\": VLLM_MODEL_CONTEXT_TOKENS[model],\n **(\n {\"thinking_toggle\": \"vllm_chat_template\"}\n if model == \"qwen3-32b-awq\"\n else {}\n ),\n }\n for model, base_url in VLLM_MODELS.items()\n },\n **{\n model: {\n \"provider\": \"ollama\",\n \"base_url\": base_url,\n \"label\": \"Qwen3 14B\",\n \"max_context_tokens\": OLLAMA_CONTEXT_LENGTH,\n **(\n {\"thinking_toggle\": \"ollama_reasoning_effort\"}\n if model == \"qwen3:14b\"\n else {}\n ),\n }\n for model, base_url in OLLAMA_MODELS.items()\n },\n}\n\nRAG_ENABLED = env_bool(\"RAG_ENABLED\", \"0\" if IS_TEST_COMMAND else \"1\")\nRAG_FAIL_OPEN = env_bool(\"RAG_FAIL_OPEN\", \"1\")\nRAG_MILVUS_URI = os.environ.get(\"RAG_MILVUS_URI\", \"http://127.0.0.1:19530\")\nRAG_MILVUS_TOKEN = os.environ.get(\"RAG_MILVUS_TOKEN\", \"\")\nRAG_MILVUS_COLLECTION = os.environ.get(\"RAG_MILVUS_COLLECTION\", \"gptclone_knowledge_chunks_qwen3_vl_2b\")\nRAG_MILVUS_CONTENT_MAX_LENGTH = int(os.environ.get(\"RAG_MILVUS_CONTENT_MAX_LENGTH\", \"8192\"))\nRAG_CHUNK_CHARS = int(os.environ.get(\"RAG_CHUNK_CHARS\", \"1800\"))\nRAG_CHUNK_OVERLAP_CHARS = int(os.environ.get(\"RAG_CHUNK_OVERLAP_CHARS\", \"250\"))\nRAG_MAX_CHUNKS_PER_DOCUMENT = int(os.environ.get(\"RAG_MAX_CHUNKS_PER_DOCUMENT\", \"500\"))\nRAG_RETRIEVAL_TOP_K = int(os.environ.get(\"RAG_RETRIEVAL_TOP_K\", \"20\"))\nRAG_CONTEXT_TOP_K = int(os.environ.get(\"RAG_CONTEXT_TOP_K\", \"6\"))\nRAG_CONTEXT_MAX_CHARS = int(os.environ.get(\"RAG_CONTEXT_MAX_CHARS\", \"12000\"))\nRAG_CONTEXT_CHUNK_MAX_CHARS = int(os.environ.get(\"RAG_CONTEXT_CHUNK_MAX_CHARS\", \"2200\"))\nRAG_LANGFUSE_CAPTURE_CONTENT = env_bool(\"RAG_LANGFUSE_CAPTURE_CONTENT\", \"0\")\n\nRAG_EMBEDDING_MODEL = os.environ.get(\"RAG_EMBEDDING_MODEL\", \"qwen3-vl-embedding-2b\")\nRAG_EMBEDDING_BASE_URL = os.environ.get(\"RAG_EMBEDDING_BASE_URL\", \"http://127.0.0.1:8011/v1\")\nRAG_EMBEDDING_API_KEY = os.environ.get(\"RAG_EMBEDDING_API_KEY\", VLLM_API_KEY)\nRAG_EMBEDDING_DIM = int(os.environ.get(\"RAG_EMBEDDING_DIM\", \"2048\"))\nRAG_EMBEDDING_BATCH_SIZE = int(os.environ.get(\"RAG_EMBEDDING_BATCH_SIZE\", \"16\"))\nRAG_EMBEDDING_TIMEOUT_SECONDS = float(os.environ.get(\"RAG_EMBEDDING_TIMEOUT_SECONDS\", \"300\"))\nRAG_EMBEDDING_REQUEST_DIMENSIONS = env_bool(\"RAG_EMBEDDING_REQUEST_DIMENSIONS\", \"0\")\nRAG_NORMALIZE_EMBEDDINGS = env_bool(\"RAG_NORMALIZE_EMBEDDINGS\", \"1\")\n\nRAG_RERANK_ENABLED = env_bool(\"RAG_RERANK_ENABLED\", \"1\")\nRAG_RERANK_PROVIDER = os.environ.get(\"RAG_RERANK_PROVIDER\", \"vllm-rerank\")\nRAG_RERANK_MODEL = os.environ.get(\"RAG_RERANK_MODEL\", \"qwen3-vl-reranker-2b\")\nRAG_RERANK_BASE_URL = os.environ.get(\"RAG_RERANK_BASE_URL\", \"http://127.0.0.1:8012/v1\")\nRAG_RERANK_API_KEY = os.environ.get(\"RAG_RERANK_API_KEY\", VLLM_API_KEY)\nRAG_RERANK_TIMEOUT_SECONDS = float(os.environ.get(\"RAG_RERANK_TIMEOUT_SECONDS\", \"300\"))\nRAG_RERANK_MAX_DOCUMENT_CHARS = int(os.environ.get(\"RAG_RERANK_MAX_DOCUMENT_CHARS\", \"1800\"))\n\nRAG_VLLM_MODELS = {\n RAG_EMBEDDING_MODEL: RAG_EMBEDDING_BASE_URL,\n RAG_RERANK_MODEL: RAG_RERANK_BASE_URL,\n}\nRAG_MODEL_CONTAINERS = {}\nif env_bool(\"RAG_MANAGED_EMBEDDING_MODEL\", \"0\" if IS_TEST_COMMAND else \"1\"):\n RAG_MODEL_CONTAINERS[RAG_EMBEDDING_MODEL] = {\n \"service_name\": os.environ.get(\"RAG_EMBEDDING_SERVICE_NAME\", \"vllm-qwen3-vl-embedding-2b\"),\n \"container_name\": os.environ.get(\"RAG_EMBEDDING_CONTAINER_NAME\", \"vllm-qwen3-vl-embedding-2b-dev\"),\n }\nif env_bool(\"RAG_MANAGED_RERANK_MODEL\", \"0\" if IS_TEST_COMMAND else \"1\"):\n RAG_MODEL_CONTAINERS[RAG_RERANK_MODEL] = {\n \"service_name\": os.environ.get(\"RAG_RERANK_SERVICE_NAME\", \"vllm-qwen3-vl-reranker-2b\"),\n \"container_name\": os.environ.get(\"RAG_RERANK_CONTAINER_NAME\", \"vllm-qwen3-vl-reranker-2b-dev\"),\n }\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "7e08fceb20032cf7e0a689551a4be40c522dcf84": {"t": 1785769052.3232684, "n": 14158, "h": "10d1f36d9d1de6df", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nimport sys\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nPROJECT_DIR = os.path.dirname(BASE_DIR)\n\n\ndef env_bool(name: str, default: str = \"0\") -> bool:\n return os.environ.get(name, default).lower() in {\"1\", \"true\", \"yes\", \"on\"}\n\n\nIS_TEST_COMMAND = any(\"pytest\" in arg or arg == \"test\" for arg in sys.argv)\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nPUBLIC_DEV_HOST = os.environ.get(\"PUBLIC_DEV_HOST\", \"46.100.12.235\")\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\", PUBLIC_DEV_HOST]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAPP_REDIS_URL = os.environ.get(\"APP_REDIS_URL\", \"redis://127.0.0.1:6380/0\")\nif \"test\" in sys.argv:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n \"LOCATION\": \"gptclone-tests\",\n }\n }\nelse:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.redis.RedisCache\",\n \"LOCATION\": APP_REDIS_URL,\n }\n }\n\nCHAT_PAGE_CACHE_SECONDS = int(os.environ.get(\"CHAT_PAGE_CACHE_SECONDS\", \"60\"))\nCHAT_CONVERSATION_PAGE_SIZE = int(os.environ.get(\"CHAT_CONVERSATION_PAGE_SIZE\", \"30\"))\nCHAT_MESSAGE_PAGE_SIZE = int(os.environ.get(\"CHAT_MESSAGE_PAGE_SIZE\", \"50\"))\nCHAT_PROMPT_HISTORY_MESSAGE_LIMIT = int(os.environ.get(\"CHAT_PROMPT_HISTORY_MESSAGE_LIMIT\", \"40\"))\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nFRONTEND_DEV_ORIGINS = [\n \"http://localhost\",\n \"http://127.0.0.1\",\n f\"http://{PUBLIC_DEV_HOST}\",\n \"http://localhost:3000\",\n \"http://127.0.0.1:3000\",\n f\"http://{PUBLIC_DEV_HOST}:3000\",\n \"http://localhost:8080\",\n \"http://127.0.0.1:8080\",\n f\"http://{PUBLIC_DEV_HOST}:8080\",\n]\nCORS_ALLOWED_ORIGINS = FRONTEND_DEV_ORIGINS\nCSRF_TRUSTED_ORIGINS = FRONTEND_DEV_ORIGINS\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n \"qwen3-32b-awq\": \"http://127.0.0.1:8002/v1\",\n \"qwq-32b-awq\": \"http://127.0.0.1:8003/v1\",\n \"deepseek-r1-distill-qwen-32b-awq\": \"http://127.0.0.1:8004/v1\",\n}\nVLLM_MODEL_CONTEXT_TOKENS = {\n \"gpt-oss-20b\": int(os.environ.get(\"VLLM_GPT_OSS_20B_CONTEXT_TOKENS\", \"32768\")),\n \"qwen3-32b-awq\": int(os.environ.get(\"VLLM_QWEN3_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n \"qwq-32b-awq\": int(os.environ.get(\"VLLM_QWQ_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n \"deepseek-r1-distill-qwen-32b-awq\": int(\n os.environ.get(\"VLLM_DEEPSEEK_R1_DISTILL_QWEN_32B_AWQ_CONTEXT_TOKENS\", \"32768\")\n ),\n}\nVLLM_TIMEOUT_SECONDS = 120\nVLLM_MODEL_CONTAINERS = {\n \"gpt-oss-20b\": {\n \"service_name\": \"vllm-gpt-oss-20b\",\n \"container_name\": \"vllm-gpt-oss-20b-dev\",\n },\n \"qwen3-32b-awq\": {\n \"service_name\": \"vllm-qwen3-32b-awq\",\n \"container_name\": \"vllm-qwen3-32b-awq-dev\",\n },\n \"qwq-32b-awq\": {\n \"service_name\": \"vllm-qwq-32b-awq\",\n \"container_name\": \"vllm-qwq-32b-awq-dev\",\n },\n \"deepseek-r1-distill-qwen-32b-awq\": {\n \"service_name\": \"vllm-deepseek-r1-distill-qwen-32b-awq\",\n \"container_name\": \"vllm-deepseek-r1-distill-qwen-32b-awq-dev\",\n },\n}\nVLLM_AUTO_SWITCH_ENABLED = env_bool(\n \"VLLM_AUTO_SWITCH_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_MODE_ENABLED = env_bool(\n \"VLLM_SLEEP_MODE_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_LEVEL = int(os.environ.get(\"VLLM_SLEEP_LEVEL\", \"1\"))\nVLLM_SWITCH_SLEEP_LEVEL = int(os.environ.get(\"VLLM_SWITCH_SLEEP_LEVEL\", str(VLLM_SLEEP_LEVEL)))\nVLLM_WARMUP_SLEEP_LEVEL = int(os.environ.get(\"VLLM_WARMUP_SLEEP_LEVEL\", str(VLLM_SWITCH_SLEEP_LEVEL)))\nVLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_DOCKER_COMPOSE_DIR = os.environ.get(\n \"VLLM_DOCKER_COMPOSE_DIR\",\n os.path.join(PROJECT_DIR, \"environments\", \"dev\"),\n)\nVLLM_DOCKER_COMPOSE_COMMAND = os.environ.get(\"VLLM_DOCKER_COMPOSE_COMMAND\", \"docker compose\")\nVLLM_DOCKER_COMMAND_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_COMMAND_TIMEOUT_SECONDS\", \"30\"))\nVLLM_DOCKER_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_START_TIMEOUT_SECONDS\", \"180\"))\nVLLM_CONTAINER_STOP_GRACE_SECONDS = int(os.environ.get(\"VLLM_CONTAINER_STOP_GRACE_SECONDS\", \"10\"))\nVLLM_CONTAINER_STOP_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_CONTAINER_STOP_TIMEOUT_SECONDS\", \"60\"))\nVLLM_MODEL_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_MODEL_START_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_TTL_SECONDS = int(os.environ.get(\"VLLM_GPU_LOCK_TTL_SECONDS\", \"7200\"))\nVLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS\", \"7200\"))\nVLLM_RUNTIME_POLL_SECONDS = float(os.environ.get(\"VLLM_RUNTIME_POLL_SECONDS\", \"1.0\"))\nLLM_MODEL_HEALTH_TIMEOUT_SECONDS = float(os.environ.get(\"LLM_MODEL_HEALTH_TIMEOUT_SECONDS\", \"0.8\"))\nLLM_MODEL_HEALTH_CACHE_SECONDS = int(os.environ.get(\"LLM_MODEL_HEALTH_CACHE_SECONDS\", \"5\"))\n\nIMAGE_MODEL = os.environ.get(\"IMAGE_MODEL\", \"flux\")\nIMAGE_API_KEY = os.environ.get(\"IMAGE_API_KEY\", \"\")\nIMAGE_GENERATION_TIMEOUT_SECONDS = float(os.environ.get(\"IMAGE_GENERATION_TIMEOUT_SECONDS\", \"900\"))\nIMAGE_SLEEP_MODE_ENABLED = env_bool(\n \"IMAGE_SLEEP_MODE_ENABLED\",\n \"1\" if VLLM_SLEEP_MODE_ENABLED else \"0\",\n)\nIMAGE_SLEEP_LEVEL = int(os.environ.get(\"IMAGE_SLEEP_LEVEL\", str(VLLM_SLEEP_LEVEL)))\nIMAGE_SWITCH_SLEEP_LEVEL = int(os.environ.get(\"IMAGE_SWITCH_SLEEP_LEVEL\", str(IMAGE_SLEEP_LEVEL)))\nIMAGE_SLEEP_FALLBACK_STOP_ENABLED = env_bool(\"IMAGE_SLEEP_FALLBACK_STOP_ENABLED\", \"0\")\nFLUX_SLEEP_STAGE_IDS = [\n int(stage_id.strip())\n for stage_id in os.environ.get(\"FLUX_SLEEP_STAGE_IDS\", \"0\").split(\",\")\n if stage_id.strip()\n]\nIMAGE_MODELS = {\n \"flux\": {\n \"provider\": \"vllm-omni\",\n \"base_url\": os.environ.get(\"FLUX_BASE_URL\", \"http://127.0.0.1:8005/v1\"),\n \"label\": \"FLUX.2 Klein 4B\",\n },\n}\nIMAGE_MODEL_CONTAINERS = {\n \"flux\": {\n \"service_name\": \"vllm-flux\",\n \"container_name\": \"vllm-flux-dev\",\n },\n}\nIMAGE_MODEL_SLEEP_STAGE_IDS = {\n \"flux\": FLUX_SLEEP_STAGE_IDS or [0],\n}\n\nOLLAMA_MODEL = os.environ.get(\"OLLAMA_MODEL\", \"qwen3:14b\")\nOLLAMA_API_KEY = os.environ.get(\"OLLAMA_API_KEY\", \"ollama\")\nOLLAMA_BASE_URL = os.environ.get(\"OLLAMA_BASE_URL\", \"http://127.0.0.1:11434/v1\")\nOLLAMA_CONTEXT_LENGTH = int(os.environ.get(\"OLLAMA_CONTEXT_LENGTH\", \"32768\"))\nOLLAMA_MODELS = {\n OLLAMA_MODEL: OLLAMA_BASE_URL,\n}\nOLLAMA_TIMEOUT_SECONDS = int(os.environ.get(\"OLLAMA_TIMEOUT_SECONDS\", \"300\"))\n\nLLM_MODEL = os.environ.get(\"LLM_MODEL\", VLLM_MODEL)\nLLM_MAX_COMPLETION_TOKENS = int(os.environ.get(\"LLM_MAX_COMPLETION_TOKENS\", \"32768\"))\nLLM_MODELS = {\n **{\n model: {\n \"provider\": \"vllm\",\n \"base_url\": base_url,\n \"label\": model,\n \"max_context_tokens\": VLLM_MODEL_CONTEXT_TOKENS[model],\n **(\n {\"thinking_toggle\": \"vllm_chat_template\"}\n if model == \"qwen3-32b-awq\"\n else {}\n ),\n }\n for model, base_url in VLLM_MODELS.items()\n },\n **{\n model: {\n \"provider\": \"ollama\",\n \"base_url\": base_url,\n \"label\": \"Qwen3 14B\",\n \"max_context_tokens\": OLLAMA_CONTEXT_LENGTH,\n **(\n {\"thinking_toggle\": \"ollama_reasoning_effort\"}\n if model == \"qwen3:14b\"\n else {}\n ),\n }\n for model, base_url in OLLAMA_MODELS.items()\n },\n}\n\nRAG_ENABLED = env_bool(\"RAG_ENABLED\", \"0\" if IS_TEST_COMMAND else \"1\")\nRAG_FAIL_OPEN = env_bool(\"RAG_FAIL_OPEN\", \"1\")\nRAG_MILVUS_URI = os.environ.get(\"RAG_MILVUS_URI\", \"http://127.0.0.1:19530\")\nRAG_MILVUS_TOKEN = os.environ.get(\"RAG_MILVUS_TOKEN\", \"\")\nRAG_MILVUS_COLLECTION = os.environ.get(\"RAG_MILVUS_COLLECTION\", \"gptclone_knowledge_chunks_qwen3_vl_2b\")\nRAG_MILVUS_CONTENT_MAX_LENGTH = int(os.environ.get(\"RAG_MILVUS_CONTENT_MAX_LENGTH\", \"8192\"))\nRAG_CHUNK_CHARS = int(os.environ.get(\"RAG_CHUNK_CHARS\", \"1800\"))\nRAG_CHUNK_OVERLAP_CHARS = int(os.environ.get(\"RAG_CHUNK_OVERLAP_CHARS\", \"250\"))\nRAG_MAX_CHUNKS_PER_DOCUMENT = int(os.environ.get(\"RAG_MAX_CHUNKS_PER_DOCUMENT\", \"500\"))\nRAG_RETRIEVAL_TOP_K = int(os.environ.get(\"RAG_RETRIEVAL_TOP_K\", \"20\"))\nRAG_CONTEXT_TOP_K = int(os.environ.get(\"RAG_CONTEXT_TOP_K\", \"6\"))\nRAG_CONTEXT_MAX_CHARS = int(os.environ.get(\"RAG_CONTEXT_MAX_CHARS\", \"12000\"))\nRAG_CONTEXT_CHUNK_MAX_CHARS = int(os.environ.get(\"RAG_CONTEXT_CHUNK_MAX_CHARS\", \"2200\"))\nRAG_LANGFUSE_CAPTURE_CONTENT = env_bool(\"RAG_LANGFUSE_CAPTURE_CONTENT\", \"0\")\n\nRAG_EMBEDDING_MODEL = os.environ.get(\"RAG_EMBEDDING_MODEL\", \"qwen3-vl-embedding-2b\")\nRAG_EMBEDDING_BASE_URL = os.environ.get(\"RAG_EMBEDDING_BASE_URL\", \"http://127.0.0.1:8011/v1\")\nRAG_EMBEDDING_API_KEY = os.environ.get(\"RAG_EMBEDDING_API_KEY\", VLLM_API_KEY)\nRAG_EMBEDDING_DIM = int(os.environ.get(\"RAG_EMBEDDING_DIM\", \"2048\"))\nRAG_EMBEDDING_BATCH_SIZE = int(os.environ.get(\"RAG_EMBEDDING_BATCH_SIZE\", \"16\"))\nRAG_EMBEDDING_TIMEOUT_SECONDS = float(os.environ.get(\"RAG_EMBEDDING_TIMEOUT_SECONDS\", \"300\"))\nRAG_EMBEDDING_REQUEST_DIMENSIONS = env_bool(\"RAG_EMBEDDING_REQUEST_DIMENSIONS\", \"0\")\nRAG_NORMALIZE_EMBEDDINGS = env_bool(\"RAG_NORMALIZE_EMBEDDINGS\", \"1\")\n\nRAG_RERANK_ENABLED = env_bool(\"RAG_RERANK_ENABLED\", \"1\")\nRAG_RERANK_PROVIDER = os.environ.get(\"RAG_RERANK_PROVIDER\", \"vllm-rerank\")\nRAG_RERANK_MODEL = os.environ.get(\"RAG_RERANK_MODEL\", \"qwen3-vl-reranker-2b\")\nRAG_RERANK_BASE_URL = os.environ.get(\"RAG_RERANK_BASE_URL\", \"http://127.0.0.1:8012/v1\")\nRAG_RERANK_API_KEY = os.environ.get(\"RAG_RERANK_API_KEY\", VLLM_API_KEY)\nRAG_RERANK_TIMEOUT_SECONDS = float(os.environ.get(\"RAG_RERANK_TIMEOUT_SECONDS\", \"300\"))\nRAG_RERANK_MAX_DOCUMENT_CHARS = int(os.environ.get(\"RAG_RERANK_MAX_DOCUMENT_CHARS\", \"1800\"))\n\nRAG_VLLM_MODELS = {\n RAG_EMBEDDING_MODEL: RAG_EMBEDDING_BASE_URL,\n RAG_RERANK_MODEL: RAG_RERANK_BASE_URL,\n}\nRAG_MODEL_CONTAINERS = {}\nif env_bool(\"RAG_MANAGED_EMBEDDING_MODEL\", \"0\" if IS_TEST_COMMAND else \"1\"):\n RAG_MODEL_CONTAINERS[RAG_EMBEDDING_MODEL] = {\n \"service_name\": os.environ.get(\"RAG_EMBEDDING_SERVICE_NAME\", \"vllm-qwen3-vl-embedding-2b\"),\n \"container_name\": os.environ.get(\"RAG_EMBEDDING_CONTAINER_NAME\", \"vllm-qwen3-vl-embedding-2b-dev\"),\n }\nif env_bool(\"RAG_MANAGED_RERANK_MODEL\", \"0\" if IS_TEST_COMMAND else \"1\"):\n RAG_MODEL_CONTAINERS[RAG_RERANK_MODEL] = {\n \"service_name\": os.environ.get(\"RAG_RERANK_SERVICE_NAME\", \"vllm-qwen3-vl-reranker-2b\"),\n \"container_name\": os.environ.get(\"RAG_RERANK_CONTAINER_NAME\", \"vllm-qwen3-vl-reranker-2b-dev\"),\n }\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "c4c11e477df0587f462ec75ce499d0748e0eba67": {"t": 1785769054.5016632, "n": 11076, "h": "4ed7d461af405ef3", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nimport sys\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nPROJECT_DIR = os.path.dirname(BASE_DIR)\n\n\ndef env_bool(name: str, default: str = \"0\") -> bool:\n return os.environ.get(name, default).lower() in {\"1\", \"true\", \"yes\", \"on\"}\n\n\nIS_TEST_COMMAND = any(\"pytest\" in arg or arg == \"test\" for arg in sys.argv)\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nPUBLIC_DEV_HOST = os.environ.get(\"PUBLIC_DEV_HOST\", \"46.100.12.235\")\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\", PUBLIC_DEV_HOST]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAPP_REDIS_URL = os.environ.get(\"APP_REDIS_URL\", \"redis://127.0.0.1:6380/0\")\nif \"test\" in sys.argv:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n \"LOCATION\": \"gptclone-tests\",\n }\n }\nelse:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.redis.RedisCache\",\n \"LOCATION\": APP_REDIS_URL,\n }\n }\n\nCHAT_PAGE_CACHE_SECONDS = int(os.environ.get(\"CHAT_PAGE_CACHE_SECONDS\", \"60\"))\nCHAT_CONVERSATION_PAGE_SIZE = int(os.environ.get(\"CHAT_CONVERSATION_PAGE_SIZE\", \"30\"))\nCHAT_MESSAGE_PAGE_SIZE = int(os.environ.get(\"CHAT_MESSAGE_PAGE_SIZE\", \"50\"))\nCHAT_PROMPT_HISTORY_MESSAGE_LIMIT = int(os.environ.get(\"CHAT_PROMPT_HISTORY_MESSAGE_LIMIT\", \"40\"))\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nFRONTEND_DEV_ORIGINS = [\n \"http://localhost\",\n \"http://127.0.0.1\",\n f\"http://{PUBLIC_DEV_HOST}\",\n \"http://localhost:3000\",\n \"http://127.0.0.1:3000\",\n f\"http://{PUBLIC_DEV_HOST}:3000\",\n \"http://localhost:8080\",\n \"http://127.0.0.1:8080\",\n f\"http://{PUBLIC_DEV_HOST}:8080\",\n]\nCORS_ALLOWED_ORIGINS = FRONTEND_DEV_ORIGINS\nCSRF_TRUSTED_ORIGINS = FRONTEND_DEV_ORIGINS\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n \"qwen3-32b-awq\": \"http://127.0.0.1:8002/v1\",\n \"qwq-32b-awq\": \"http://127.0.0.1:8003/v1\",\n \"deepseek-r1-distill-qwen-32b-awq\": \"http://127.0.0.1:8004/v1\",\n}\nVLLM_MODEL_CONTEXT_TOKENS = {\n \"gpt-oss-20b\": int(os.environ.get(\"VLLM_GPT_OSS_20B_CONTEXT_TOKENS\", \"32768\")),\n \"qwen3-32b-awq\": int(os.environ.get(\"VLLM_QWEN3_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n \"qwq-32b-awq\": int(os.environ.get(\"VLLM_QWQ_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n \"deepseek-r1-distill-qwen-32b-awq\": int(\n os.environ.get(\"VLLM_DEEPSEEK_R1_DISTILL_QWEN_32B_AWQ_CONTEXT_TOKENS\", \"32768\")\n ),\n}\nVLLM_TIMEOUT_SECONDS = 120\nVLLM_MODEL_CONTAINERS = {\n \"gpt-oss-20b\": {\n \"service_name\": \"vllm-gpt-oss-20b\",\n \"container_name\": \"vllm-gpt-oss-20b-dev\",\n },\n \"qwen3-32b-awq\": {\n \"service_name\": \"vllm-qwen3-32b-awq\",\n \"container_name\": \"vllm-qwen3-32b-awq-dev\",\n },\n \"qwq-32b-awq\": {\n \"service_name\": \"vllm-qwq-32b-awq\",\n \"container_name\": \"vllm-qwq-32b-awq-dev\",\n },\n \"deepseek-r1-distill-qwen-32b-awq\": {\n \"service_name\": \"vllm-deepseek-r1-distill-qwen-32b-awq\",\n \"container_name\": \"vllm-deepseek-r1-distill-qwen-32b-awq-dev\",\n },\n}\nVLLM_AUTO_SWITCH_ENABLED = env_bool(\n \"VLLM_AUTO_SWITCH_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_MODE_ENABLED = env_bool(\n \"VLLM_SLEEP_MODE_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_LEVEL = int(os.environ.get(\"VLLM_SLEEP_LEVEL\", \"1\"))\nVLLM_SWITCH_SLEEP_LEVEL = int(os.environ.get(\"VLLM_SWITCH_SLEEP_LEVEL\", str(VLLM_SLEEP_LEVEL)))\nVLLM_WARMUP_SLEEP_LEVEL = int(os.environ.get(\"VLLM_WARMUP_SLEEP_LEVEL\", str(VLLM_SWITCH_SLEEP_LEVEL)))\nVLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_DOCKER_COMPOSE_DIR = os.environ.get(\n \"VLLM_DOCKER_COMPOSE_DIR\",\n os.path.join(PROJECT_DIR, \"environments\", \"dev\"),\n)\nVLLM_DOCKER_COMPOSE_COMMAND = os.environ.get(\"VLLM_DOCKER_COMPOSE_COMMAND\", \"docker compose\")\nVLLM_DOCKER_COMMAND_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_COMMAND_TIMEOUT_SECONDS\", \"30\"))\nVLLM_DOCKER_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_START_TIMEOUT_SECONDS\", \"180\"))\nVLLM_CONTAINER_STOP_GRACE_SECONDS = int(os.environ.get(\"VLLM_CONTAINER_STOP_GRACE_SECONDS\", \"10\"))\nVLLM_CONTAINER_STOP_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_CONTAINER_STOP_TIMEOUT_SECONDS\", \"60\"))\nVLLM_MODEL_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_MODEL_START_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_TTL_SECONDS = int(os.environ.get(\"VLLM_GPU_LOCK_TTL_SECONDS\", \"7200\"))\nVLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS\", \"7200\"))\nVLLM_RUNTIME_POLL_SECONDS = float(os.environ.get(\"VLLM_RUNTIME_POLL_SECONDS\", \"1.0\"))\nLLM_MODEL_HEALTH_TIMEOUT_SECONDS = float(os.environ.get(\"LLM_MODEL_HEALTH_TIMEOUT_SECONDS\", \"0.8\"))\nLLM_MODEL_HEALTH_CACHE_SECONDS = int(os.environ.get(\"LLM_MODEL_HEALTH_CACHE_SECONDS\", \"5\"))\n\nIMAGE_MODEL = os.environ.get(\"IMAGE_MODEL\", \"flux\")\nIMAGE_API_KEY = os.environ.get(\"IMAGE_API_KEY\", \"\")\nIMAGE_GENERATION_TIMEOUT_SECONDS = float(os.environ.get(\"IMAGE_GENERATION_TIMEOUT_SECONDS\", \"900\"))\nIMAGE_SLEEP_MODE_ENABLED = env_bool(\n \"IMAGE_SLEEP_MODE_ENABLED\",\n \"1\" if VLLM_SLEEP_MODE_ENABLED else \"0\",\n)\nIMAGE_SLEEP_LEVEL = int(os.environ.get(\"IMAGE_SLEEP_LEVEL\", str(VLLM_SLEEP_LEVEL)))\nIMAGE_SWITCH_SLEEP_LEVEL = int(os.environ.get(\"IMAGE_SWITCH_SLEEP_LEVEL\", str(IMAGE_SLEEP_LEVEL)))\nIMAGE_SLEEP_FALLBACK_STOP_ENABLED = env_bool(\"IMAGE_SLEEP_FALLBACK_STOP_ENABLED\", \"0\")\nFLUX_SLEEP_STAGE_IDS = [\n int(stage_id.strip())\n for stage_id in os.environ.get(\"FLUX_SLEEP_STAGE_IDS\", \"0\").split(\",\")\n if stage_id.strip()\n]\nIMAGE_MODELS = {\n \"flux\": {\n \"provider\": \"vllm-omni\",\n \"base_url\": os.environ.get(\"FLUX_BASE_URL\", \"http://127.0.0.1:8005/v1\"),\n \"label\": \"FLUX.2 Klein 4B\",\n },\n}\nIMAGE_MODEL_CONTAINERS = {\n \"flux\": {\n \"service_name\": \"vllm-flux\",\n \"container_name\": \"vllm-flux-dev\",\n },\n}\nIMAGE_MODEL_SLEEP_STAGE_IDS = {\n \"flux\": FLUX_SLEEP_STAGE_IDS or [0],\n}\n\nOLLAMA_MODEL = os.environ.get(\"OLLAMA_MODEL\", \"qwen3:14b\")\nOLLAMA_API_KEY = os.environ.get(\"OLLAMA_API_KEY\", \"ollama\")\nOLLAMA_BASE_URL = os.environ.get(\"OLLAMA_BASE_URL\", \"http://127.0.0.1:11434/v1\")\nOLLAMA_CONTEXT_LENGTH = int(os.environ.get(\"OLLAMA_CONTEXT_LENGTH\", \"32768\"))\nOLLAMA_MODELS = {\n OLLAMA_MODEL: OLLAMA_BASE_URL,\n}\nOLLAMA_TIMEOUT_SECONDS = int(os.environ.get(\"OLLAMA_TIMEOUT_SECONDS\", \"300\"))\n\nLLM_MODEL = os.environ.get(\"LLM_MODEL\", VLLM_MODEL)\nLLM_MAX_COMPLETION_TOKENS = int(os.environ.get(\"LLM_MAX_COMPLETION_TOKENS\", \"32768\"))\nLLM_MODELS = {\n **{\n model: {\n \"provider\": \"vllm\",\n \"base_url\": base_url,\n \"label\": model,\n \"max_context_tokens\": VLLM_MODEL_CONTEXT_TOKENS[model],\n **(\n {\"thinking_toggle\": \"vllm_chat_template\"}\n if model == \"qwen3-32b-awq\"\n else {}\n ),\n }\n for model, base_url in VLLM_MODELS.items()\n },\n **{\n model: {\n \"provider\": \"ollama\",\n \"base_url\": base_url,\n \"label\": \"Qwen3 14B\",\n \"max_context_tokens\": OLLAMA_CONTEXT_LENGTH,\n **(\n {\"thinking_toggle\": \"ollama_reasoning_effort\"}\n if model == \"qwen3:14b\"\n else {}\n ),\n }\n for model, base_url in OLLAMA_MODELS.items()\n },\n}\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "86440304c9c7a0562273989736bfe64fc023aff5": {"t": 1785769055.8623173, "n": 9938, "h": "cd0da65814c2d8ce", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nimport sys\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nPROJECT_DIR = os.path.dirname(BASE_DIR)\n\n\ndef env_bool(name: str, default: str = \"0\") -> bool:\n return os.environ.get(name, default).lower() in {\"1\", \"true\", \"yes\", \"on\"}\n\n\nIS_TEST_COMMAND = any(\"pytest\" in arg or arg == \"test\" for arg in sys.argv)\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nPUBLIC_DEV_HOST = os.environ.get(\"PUBLIC_DEV_HOST\", \"46.100.12.235\")\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\", PUBLIC_DEV_HOST]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAPP_REDIS_URL = os.environ.get(\"APP_REDIS_URL\", \"redis://127.0.0.1:6380/0\")\nif \"test\" in sys.argv:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n \"LOCATION\": \"gptclone-tests\",\n }\n }\nelse:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.redis.RedisCache\",\n \"LOCATION\": APP_REDIS_URL,\n }\n }\n\nCHAT_PAGE_CACHE_SECONDS = int(os.environ.get(\"CHAT_PAGE_CACHE_SECONDS\", \"60\"))\nCHAT_CONVERSATION_PAGE_SIZE = int(os.environ.get(\"CHAT_CONVERSATION_PAGE_SIZE\", \"30\"))\nCHAT_MESSAGE_PAGE_SIZE = int(os.environ.get(\"CHAT_MESSAGE_PAGE_SIZE\", \"50\"))\nCHAT_PROMPT_HISTORY_MESSAGE_LIMIT = int(os.environ.get(\"CHAT_PROMPT_HISTORY_MESSAGE_LIMIT\", \"40\"))\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nFRONTEND_DEV_ORIGINS = [\n \"http://localhost\",\n \"http://127.0.0.1\",\n f\"http://{PUBLIC_DEV_HOST}\",\n \"http://localhost:3000\",\n \"http://127.0.0.1:3000\",\n f\"http://{PUBLIC_DEV_HOST}:3000\",\n \"http://localhost:8080\",\n \"http://127.0.0.1:8080\",\n f\"http://{PUBLIC_DEV_HOST}:8080\",\n]\nCORS_ALLOWED_ORIGINS = FRONTEND_DEV_ORIGINS\nCSRF_TRUSTED_ORIGINS = FRONTEND_DEV_ORIGINS\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n \"qwen3-32b-awq\": \"http://127.0.0.1:8002/v1\",\n \"qwq-32b-awq\": \"http://127.0.0.1:8003/v1\",\n \"deepseek-r1-distill-qwen-32b-awq\": \"http://127.0.0.1:8004/v1\",\n}\nVLLM_MODEL_CONTEXT_TOKENS = {\n \"gpt-oss-20b\": int(os.environ.get(\"VLLM_GPT_OSS_20B_CONTEXT_TOKENS\", \"32768\")),\n \"qwen3-32b-awq\": int(os.environ.get(\"VLLM_QWEN3_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n \"qwq-32b-awq\": int(os.environ.get(\"VLLM_QWQ_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n \"deepseek-r1-distill-qwen-32b-awq\": int(\n os.environ.get(\"VLLM_DEEPSEEK_R1_DISTILL_QWEN_32B_AWQ_CONTEXT_TOKENS\", \"32768\")\n ),\n}\nVLLM_TIMEOUT_SECONDS = 120\nVLLM_MODEL_CONTAINERS = {\n \"gpt-oss-20b\": {\n \"service_name\": \"vllm-gpt-oss-20b\",\n \"container_name\": \"vllm-gpt-oss-20b-dev\",\n },\n \"qwen3-32b-awq\": {\n \"service_name\": \"vllm-qwen3-32b-awq\",\n \"container_name\": \"vllm-qwen3-32b-awq-dev\",\n },\n \"qwq-32b-awq\": {\n \"service_name\": \"vllm-qwq-32b-awq\",\n \"container_name\": \"vllm-qwq-32b-awq-dev\",\n },\n \"deepseek-r1-distill-qwen-32b-awq\": {\n \"service_name\": \"vllm-deepseek-r1-distill-qwen-32b-awq\",\n \"container_name\": \"vllm-deepseek-r1-distill-qwen-32b-awq-dev\",\n },\n}\nVLLM_AUTO_SWITCH_ENABLED = env_bool(\n \"VLLM_AUTO_SWITCH_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_MODE_ENABLED = env_bool(\n \"VLLM_SLEEP_MODE_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_LEVEL = int(os.environ.get(\"VLLM_SLEEP_LEVEL\", \"1\"))\nVLLM_SWITCH_SLEEP_LEVEL = int(os.environ.get(\"VLLM_SWITCH_SLEEP_LEVEL\", str(VLLM_SLEEP_LEVEL)))\nVLLM_WARMUP_SLEEP_LEVEL = int(os.environ.get(\"VLLM_WARMUP_SLEEP_LEVEL\", str(VLLM_SWITCH_SLEEP_LEVEL)))\nVLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_DOCKER_COMPOSE_DIR = os.environ.get(\n \"VLLM_DOCKER_COMPOSE_DIR\",\n os.path.join(PROJECT_DIR, \"environments\", \"dev\"),\n)\nVLLM_DOCKER_COMPOSE_COMMAND = os.environ.get(\"VLLM_DOCKER_COMPOSE_COMMAND\", \"docker compose\")\nVLLM_DOCKER_COMMAND_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_COMMAND_TIMEOUT_SECONDS\", \"30\"))\nVLLM_DOCKER_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_START_TIMEOUT_SECONDS\", \"180\"))\nVLLM_CONTAINER_STOP_GRACE_SECONDS = int(os.environ.get(\"VLLM_CONTAINER_STOP_GRACE_SECONDS\", \"10\"))\nVLLM_CONTAINER_STOP_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_CONTAINER_STOP_TIMEOUT_SECONDS\", \"60\"))\nVLLM_MODEL_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_MODEL_START_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_TTL_SECONDS = int(os.environ.get(\"VLLM_GPU_LOCK_TTL_SECONDS\", \"7200\"))\nVLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS\", \"7200\"))\nVLLM_RUNTIME_POLL_SECONDS = float(os.environ.get(\"VLLM_RUNTIME_POLL_SECONDS\", \"1.0\"))\nLLM_MODEL_HEALTH_TIMEOUT_SECONDS = float(os.environ.get(\"LLM_MODEL_HEALTH_TIMEOUT_SECONDS\", \"0.8\"))\nLLM_MODEL_HEALTH_CACHE_SECONDS = int(os.environ.get(\"LLM_MODEL_HEALTH_CACHE_SECONDS\", \"5\"))\n\nOLLAMA_MODEL = os.environ.get(\"OLLAMA_MODEL\", \"qwen3:14b\")\nOLLAMA_API_KEY = os.environ.get(\"OLLAMA_API_KEY\", \"ollama\")\nOLLAMA_BASE_URL = os.environ.get(\"OLLAMA_BASE_URL\", \"http://127.0.0.1:11434/v1\")\nOLLAMA_CONTEXT_LENGTH = int(os.environ.get(\"OLLAMA_CONTEXT_LENGTH\", \"32768\"))\nOLLAMA_MODELS = {\n OLLAMA_MODEL: OLLAMA_BASE_URL,\n}\nOLLAMA_TIMEOUT_SECONDS = int(os.environ.get(\"OLLAMA_TIMEOUT_SECONDS\", \"300\"))\n\nLLM_MODEL = os.environ.get(\"LLM_MODEL\", VLLM_MODEL)\nLLM_MAX_COMPLETION_TOKENS = int(os.environ.get(\"LLM_MAX_COMPLETION_TOKENS\", \"32768\"))\nLLM_MODELS = {\n **{\n model: {\n \"provider\": \"vllm\",\n \"base_url\": base_url,\n \"label\": model,\n \"max_context_tokens\": VLLM_MODEL_CONTEXT_TOKENS[model],\n **(\n {\"thinking_toggle\": \"vllm_chat_template\"}\n if model == \"qwen3-32b-awq\"\n else {}\n ),\n }\n for model, base_url in VLLM_MODELS.items()\n },\n **{\n model: {\n \"provider\": \"ollama\",\n \"base_url\": base_url,\n \"label\": \"Qwen3 14B\",\n \"max_context_tokens\": OLLAMA_CONTEXT_LENGTH,\n **(\n {\"thinking_toggle\": \"ollama_reasoning_effort\"}\n if model == \"qwen3:14b\"\n else {}\n ),\n }\n for model, base_url in OLLAMA_MODELS.items()\n },\n}\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "fb0834e024dbc763416a4b0169c881c684a1b5bf": {"t": 1785769057.6879957, "n": 9739, "h": "f1bfd2d24b43dcbd", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nimport sys\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nPROJECT_DIR = os.path.dirname(BASE_DIR)\n\n\ndef env_bool(name: str, default: str = \"0\") -> bool:\n return os.environ.get(name, default).lower() in {\"1\", \"true\", \"yes\", \"on\"}\n\n\nIS_TEST_COMMAND = any(\"pytest\" in arg or arg == \"test\" for arg in sys.argv)\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nPUBLIC_DEV_HOST = os.environ.get(\"PUBLIC_DEV_HOST\", \"46.100.12.235\")\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\", PUBLIC_DEV_HOST]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAPP_REDIS_URL = os.environ.get(\"APP_REDIS_URL\", \"redis://127.0.0.1:6380/0\")\nif \"test\" in sys.argv:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n \"LOCATION\": \"gptclone-tests\",\n }\n }\nelse:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.redis.RedisCache\",\n \"LOCATION\": APP_REDIS_URL,\n }\n }\n\nCHAT_PAGE_CACHE_SECONDS = int(os.environ.get(\"CHAT_PAGE_CACHE_SECONDS\", \"60\"))\nCHAT_CONVERSATION_PAGE_SIZE = int(os.environ.get(\"CHAT_CONVERSATION_PAGE_SIZE\", \"30\"))\nCHAT_MESSAGE_PAGE_SIZE = int(os.environ.get(\"CHAT_MESSAGE_PAGE_SIZE\", \"50\"))\nCHAT_PROMPT_HISTORY_MESSAGE_LIMIT = int(os.environ.get(\"CHAT_PROMPT_HISTORY_MESSAGE_LIMIT\", \"40\"))\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nFRONTEND_DEV_ORIGINS = [\n \"http://localhost\",\n \"http://127.0.0.1\",\n f\"http://{PUBLIC_DEV_HOST}\",\n \"http://localhost:3000\",\n \"http://127.0.0.1:3000\",\n f\"http://{PUBLIC_DEV_HOST}:3000\",\n \"http://localhost:8080\",\n \"http://127.0.0.1:8080\",\n f\"http://{PUBLIC_DEV_HOST}:8080\",\n]\nCORS_ALLOWED_ORIGINS = FRONTEND_DEV_ORIGINS\nCSRF_TRUSTED_ORIGINS = FRONTEND_DEV_ORIGINS\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n \"qwen3-32b-awq\": \"http://127.0.0.1:8002/v1\",\n \"qwq-32b-awq\": \"http://127.0.0.1:8003/v1\",\n \"deepseek-r1-distill-qwen-32b-awq\": \"http://127.0.0.1:8004/v1\",\n}\nVLLM_MODEL_CONTEXT_TOKENS = {\n \"gpt-oss-20b\": int(os.environ.get(\"VLLM_GPT_OSS_20B_CONTEXT_TOKENS\", \"32768\")),\n \"qwen3-32b-awq\": int(os.environ.get(\"VLLM_QWEN3_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n \"qwq-32b-awq\": int(os.environ.get(\"VLLM_QWQ_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n \"deepseek-r1-distill-qwen-32b-awq\": int(\n os.environ.get(\"VLLM_DEEPSEEK_R1_DISTILL_QWEN_32B_AWQ_CONTEXT_TOKENS\", \"32768\")\n ),\n}\nVLLM_TIMEOUT_SECONDS = 120\nVLLM_MODEL_CONTAINERS = {\n \"gpt-oss-20b\": {\n \"service_name\": \"vllm-gpt-oss-20b\",\n \"container_name\": \"vllm-gpt-oss-20b-dev\",\n },\n \"qwen3-32b-awq\": {\n \"service_name\": \"vllm-qwen3-32b-awq\",\n \"container_name\": \"vllm-qwen3-32b-awq-dev\",\n },\n \"qwq-32b-awq\": {\n \"service_name\": \"vllm-qwq-32b-awq\",\n \"container_name\": \"vllm-qwq-32b-awq-dev\",\n },\n \"deepseek-r1-distill-qwen-32b-awq\": {\n \"service_name\": \"vllm-deepseek-r1-distill-qwen-32b-awq\",\n \"container_name\": \"vllm-deepseek-r1-distill-qwen-32b-awq-dev\",\n },\n}\nVLLM_AUTO_SWITCH_ENABLED = env_bool(\n \"VLLM_AUTO_SWITCH_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_MODE_ENABLED = env_bool(\n \"VLLM_SLEEP_MODE_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_LEVEL = int(os.environ.get(\"VLLM_SLEEP_LEVEL\", \"1\"))\nVLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_DOCKER_COMPOSE_DIR = os.environ.get(\n \"VLLM_DOCKER_COMPOSE_DIR\",\n os.path.join(PROJECT_DIR, \"environments\", \"dev\"),\n)\nVLLM_DOCKER_COMPOSE_COMMAND = os.environ.get(\"VLLM_DOCKER_COMPOSE_COMMAND\", \"docker compose\")\nVLLM_DOCKER_COMMAND_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_COMMAND_TIMEOUT_SECONDS\", \"30\"))\nVLLM_DOCKER_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_START_TIMEOUT_SECONDS\", \"180\"))\nVLLM_CONTAINER_STOP_GRACE_SECONDS = int(os.environ.get(\"VLLM_CONTAINER_STOP_GRACE_SECONDS\", \"10\"))\nVLLM_CONTAINER_STOP_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_CONTAINER_STOP_TIMEOUT_SECONDS\", \"60\"))\nVLLM_MODEL_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_MODEL_START_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_TTL_SECONDS = int(os.environ.get(\"VLLM_GPU_LOCK_TTL_SECONDS\", \"7200\"))\nVLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS\", \"7200\"))\nVLLM_RUNTIME_POLL_SECONDS = float(os.environ.get(\"VLLM_RUNTIME_POLL_SECONDS\", \"1.0\"))\nLLM_MODEL_HEALTH_TIMEOUT_SECONDS = float(os.environ.get(\"LLM_MODEL_HEALTH_TIMEOUT_SECONDS\", \"0.8\"))\nLLM_MODEL_HEALTH_CACHE_SECONDS = int(os.environ.get(\"LLM_MODEL_HEALTH_CACHE_SECONDS\", \"5\"))\n\nOLLAMA_MODEL = os.environ.get(\"OLLAMA_MODEL\", \"qwen3:14b\")\nOLLAMA_API_KEY = os.environ.get(\"OLLAMA_API_KEY\", \"ollama\")\nOLLAMA_BASE_URL = os.environ.get(\"OLLAMA_BASE_URL\", \"http://127.0.0.1:11434/v1\")\nOLLAMA_CONTEXT_LENGTH = int(os.environ.get(\"OLLAMA_CONTEXT_LENGTH\", \"32768\"))\nOLLAMA_MODELS = {\n OLLAMA_MODEL: OLLAMA_BASE_URL,\n}\nOLLAMA_TIMEOUT_SECONDS = int(os.environ.get(\"OLLAMA_TIMEOUT_SECONDS\", \"300\"))\n\nLLM_MODEL = os.environ.get(\"LLM_MODEL\", VLLM_MODEL)\nLLM_MAX_COMPLETION_TOKENS = int(os.environ.get(\"LLM_MAX_COMPLETION_TOKENS\", \"32768\"))\nLLM_MODELS = {\n **{\n model: {\n \"provider\": \"vllm\",\n \"base_url\": base_url,\n \"label\": model,\n \"max_context_tokens\": VLLM_MODEL_CONTEXT_TOKENS[model],\n **(\n {\"thinking_toggle\": \"vllm_chat_template\"}\n if model == \"qwen3-32b-awq\"\n else {}\n ),\n }\n for model, base_url in VLLM_MODELS.items()\n },\n **{\n model: {\n \"provider\": \"ollama\",\n \"base_url\": base_url,\n \"label\": \"Qwen3 14B\",\n \"max_context_tokens\": OLLAMA_CONTEXT_LENGTH,\n **(\n {\"thinking_toggle\": \"ollama_reasoning_effort\"}\n if model == \"qwen3:14b\"\n else {}\n ),\n }\n for model, base_url in OLLAMA_MODELS.items()\n },\n}\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "e5df77a5b85c19c89190fc6f99498775eabc7e23": {"t": 1785769059.657665, "n": 9413, "h": "ce298b236fc767c0", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nimport sys\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nPROJECT_DIR = os.path.dirname(BASE_DIR)\n\n\ndef env_bool(name: str, default: str = \"0\") -> bool:\n return os.environ.get(name, default).lower() in {\"1\", \"true\", \"yes\", \"on\"}\n\n\nIS_TEST_COMMAND = any(\"pytest\" in arg or arg == \"test\" for arg in sys.argv)\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\"]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAPP_REDIS_URL = os.environ.get(\"APP_REDIS_URL\", \"redis://127.0.0.1:6380/0\")\nif \"test\" in sys.argv:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n \"LOCATION\": \"gptclone-tests\",\n }\n }\nelse:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.redis.RedisCache\",\n \"LOCATION\": APP_REDIS_URL,\n }\n }\n\nCHAT_PAGE_CACHE_SECONDS = int(os.environ.get(\"CHAT_PAGE_CACHE_SECONDS\", \"60\"))\nCHAT_CONVERSATION_PAGE_SIZE = int(os.environ.get(\"CHAT_CONVERSATION_PAGE_SIZE\", \"30\"))\nCHAT_MESSAGE_PAGE_SIZE = int(os.environ.get(\"CHAT_MESSAGE_PAGE_SIZE\", \"50\"))\nCHAT_PROMPT_HISTORY_MESSAGE_LIMIT = int(os.environ.get(\"CHAT_PROMPT_HISTORY_MESSAGE_LIMIT\", \"40\"))\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nCORS_ALLOWED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\nCSRF_TRUSTED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n \"qwen3-32b-awq\": \"http://127.0.0.1:8002/v1\",\n \"qwq-32b-awq\": \"http://127.0.0.1:8003/v1\",\n \"deepseek-r1-distill-qwen-32b-awq\": \"http://127.0.0.1:8004/v1\",\n}\nVLLM_MODEL_CONTEXT_TOKENS = {\n \"gpt-oss-20b\": int(os.environ.get(\"VLLM_GPT_OSS_20B_CONTEXT_TOKENS\", \"32768\")),\n \"qwen3-32b-awq\": int(os.environ.get(\"VLLM_QWEN3_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n \"qwq-32b-awq\": int(os.environ.get(\"VLLM_QWQ_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n \"deepseek-r1-distill-qwen-32b-awq\": int(\n os.environ.get(\"VLLM_DEEPSEEK_R1_DISTILL_QWEN_32B_AWQ_CONTEXT_TOKENS\", \"32768\")\n ),\n}\nVLLM_TIMEOUT_SECONDS = 120\nVLLM_MODEL_CONTAINERS = {\n \"gpt-oss-20b\": {\n \"service_name\": \"vllm-gpt-oss-20b\",\n \"container_name\": \"vllm-gpt-oss-20b-dev\",\n },\n \"qwen3-32b-awq\": {\n \"service_name\": \"vllm-qwen3-32b-awq\",\n \"container_name\": \"vllm-qwen3-32b-awq-dev\",\n },\n \"qwq-32b-awq\": {\n \"service_name\": \"vllm-qwq-32b-awq\",\n \"container_name\": \"vllm-qwq-32b-awq-dev\",\n },\n \"deepseek-r1-distill-qwen-32b-awq\": {\n \"service_name\": \"vllm-deepseek-r1-distill-qwen-32b-awq\",\n \"container_name\": \"vllm-deepseek-r1-distill-qwen-32b-awq-dev\",\n },\n}\nVLLM_AUTO_SWITCH_ENABLED = env_bool(\n \"VLLM_AUTO_SWITCH_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_MODE_ENABLED = env_bool(\n \"VLLM_SLEEP_MODE_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_LEVEL = int(os.environ.get(\"VLLM_SLEEP_LEVEL\", \"1\"))\nVLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_DOCKER_COMPOSE_DIR = os.environ.get(\n \"VLLM_DOCKER_COMPOSE_DIR\",\n os.path.join(PROJECT_DIR, \"environments\", \"dev\"),\n)\nVLLM_DOCKER_COMPOSE_COMMAND = os.environ.get(\"VLLM_DOCKER_COMPOSE_COMMAND\", \"docker compose\")\nVLLM_DOCKER_COMMAND_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_COMMAND_TIMEOUT_SECONDS\", \"30\"))\nVLLM_DOCKER_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_START_TIMEOUT_SECONDS\", \"180\"))\nVLLM_CONTAINER_STOP_GRACE_SECONDS = int(os.environ.get(\"VLLM_CONTAINER_STOP_GRACE_SECONDS\", \"10\"))\nVLLM_CONTAINER_STOP_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_CONTAINER_STOP_TIMEOUT_SECONDS\", \"60\"))\nVLLM_MODEL_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_MODEL_START_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_TTL_SECONDS = int(os.environ.get(\"VLLM_GPU_LOCK_TTL_SECONDS\", \"7200\"))\nVLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS\", \"7200\"))\nVLLM_RUNTIME_POLL_SECONDS = float(os.environ.get(\"VLLM_RUNTIME_POLL_SECONDS\", \"1.0\"))\nLLM_MODEL_HEALTH_TIMEOUT_SECONDS = float(os.environ.get(\"LLM_MODEL_HEALTH_TIMEOUT_SECONDS\", \"0.8\"))\nLLM_MODEL_HEALTH_CACHE_SECONDS = int(os.environ.get(\"LLM_MODEL_HEALTH_CACHE_SECONDS\", \"5\"))\n\nOLLAMA_MODEL = os.environ.get(\"OLLAMA_MODEL\", \"qwen3:14b\")\nOLLAMA_API_KEY = os.environ.get(\"OLLAMA_API_KEY\", \"ollama\")\nOLLAMA_BASE_URL = os.environ.get(\"OLLAMA_BASE_URL\", \"http://127.0.0.1:11434/v1\")\nOLLAMA_CONTEXT_LENGTH = int(os.environ.get(\"OLLAMA_CONTEXT_LENGTH\", \"32768\"))\nOLLAMA_MODELS = {\n OLLAMA_MODEL: OLLAMA_BASE_URL,\n}\nOLLAMA_TIMEOUT_SECONDS = int(os.environ.get(\"OLLAMA_TIMEOUT_SECONDS\", \"300\"))\n\nLLM_MODEL = os.environ.get(\"LLM_MODEL\", VLLM_MODEL)\nLLM_MAX_COMPLETION_TOKENS = int(os.environ.get(\"LLM_MAX_COMPLETION_TOKENS\", \"32768\"))\nLLM_MODELS = {\n **{\n model: {\n \"provider\": \"vllm\",\n \"base_url\": base_url,\n \"label\": model,\n \"max_context_tokens\": VLLM_MODEL_CONTEXT_TOKENS[model],\n **(\n {\"thinking_toggle\": \"vllm_chat_template\"}\n if model == \"qwen3-32b-awq\"\n else {}\n ),\n }\n for model, base_url in VLLM_MODELS.items()\n },\n **{\n model: {\n \"provider\": \"ollama\",\n \"base_url\": base_url,\n \"label\": \"Qwen3 14B\",\n \"max_context_tokens\": OLLAMA_CONTEXT_LENGTH,\n **(\n {\"thinking_toggle\": \"ollama_reasoning_effort\"}\n if model == \"qwen3:14b\"\n else {}\n ),\n }\n for model, base_url in OLLAMA_MODELS.items()\n },\n}\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "bf22777883383560f4a9c0d6b5ffcbefd0051762": {"t": 1785769060.8883288, "n": 9020, "h": "e6a29fcf78beacac", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nimport sys\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nPROJECT_DIR = os.path.dirname(BASE_DIR)\n\n\ndef env_bool(name: str, default: str = \"0\") -> bool:\n return os.environ.get(name, default).lower() in {\"1\", \"true\", \"yes\", \"on\"}\n\n\nIS_TEST_COMMAND = any(\"pytest\" in arg or arg == \"test\" for arg in sys.argv)\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\"]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAPP_REDIS_URL = os.environ.get(\"APP_REDIS_URL\", \"redis://127.0.0.1:6380/0\")\nif \"test\" in sys.argv:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n \"LOCATION\": \"gptclone-tests\",\n }\n }\nelse:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.redis.RedisCache\",\n \"LOCATION\": APP_REDIS_URL,\n }\n }\n\nCHAT_PAGE_CACHE_SECONDS = int(os.environ.get(\"CHAT_PAGE_CACHE_SECONDS\", \"60\"))\nCHAT_CONVERSATION_PAGE_SIZE = int(os.environ.get(\"CHAT_CONVERSATION_PAGE_SIZE\", \"30\"))\nCHAT_MESSAGE_PAGE_SIZE = int(os.environ.get(\"CHAT_MESSAGE_PAGE_SIZE\", \"50\"))\nCHAT_PROMPT_HISTORY_MESSAGE_LIMIT = int(os.environ.get(\"CHAT_PROMPT_HISTORY_MESSAGE_LIMIT\", \"40\"))\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nCORS_ALLOWED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\nCSRF_TRUSTED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n \"qwen3-32b-awq\": \"http://127.0.0.1:8002/v1\",\n \"qwq-32b-awq\": \"http://127.0.0.1:8003/v1\",\n}\nVLLM_MODEL_CONTEXT_TOKENS = {\n \"gpt-oss-20b\": int(os.environ.get(\"VLLM_GPT_OSS_20B_CONTEXT_TOKENS\", \"32768\")),\n \"qwen3-32b-awq\": int(os.environ.get(\"VLLM_QWEN3_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n \"qwq-32b-awq\": int(os.environ.get(\"VLLM_QWQ_32B_AWQ_CONTEXT_TOKENS\", \"32768\")),\n}\nVLLM_TIMEOUT_SECONDS = 120\nVLLM_MODEL_CONTAINERS = {\n \"gpt-oss-20b\": {\n \"service_name\": \"vllm-gpt-oss-20b\",\n \"container_name\": \"vllm-gpt-oss-20b-dev\",\n },\n \"qwen3-32b-awq\": {\n \"service_name\": \"vllm-qwen3-32b-awq\",\n \"container_name\": \"vllm-qwen3-32b-awq-dev\",\n },\n \"qwq-32b-awq\": {\n \"service_name\": \"vllm-qwq-32b-awq\",\n \"container_name\": \"vllm-qwq-32b-awq-dev\",\n },\n}\nVLLM_AUTO_SWITCH_ENABLED = env_bool(\n \"VLLM_AUTO_SWITCH_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_MODE_ENABLED = env_bool(\n \"VLLM_SLEEP_MODE_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_SLEEP_LEVEL = int(os.environ.get(\"VLLM_SLEEP_LEVEL\", \"1\"))\nVLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_SLEEP_ENDPOINT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_DOCKER_COMPOSE_DIR = os.environ.get(\n \"VLLM_DOCKER_COMPOSE_DIR\",\n os.path.join(PROJECT_DIR, \"environments\", \"dev\"),\n)\nVLLM_DOCKER_COMPOSE_COMMAND = os.environ.get(\"VLLM_DOCKER_COMPOSE_COMMAND\", \"docker compose\")\nVLLM_DOCKER_COMMAND_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_COMMAND_TIMEOUT_SECONDS\", \"30\"))\nVLLM_DOCKER_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_START_TIMEOUT_SECONDS\", \"180\"))\nVLLM_CONTAINER_STOP_GRACE_SECONDS = int(os.environ.get(\"VLLM_CONTAINER_STOP_GRACE_SECONDS\", \"10\"))\nVLLM_CONTAINER_STOP_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_CONTAINER_STOP_TIMEOUT_SECONDS\", \"60\"))\nVLLM_MODEL_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_MODEL_START_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_TTL_SECONDS = int(os.environ.get(\"VLLM_GPU_LOCK_TTL_SECONDS\", \"7200\"))\nVLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS\", \"7200\"))\nVLLM_RUNTIME_POLL_SECONDS = float(os.environ.get(\"VLLM_RUNTIME_POLL_SECONDS\", \"1.0\"))\nLLM_MODEL_HEALTH_TIMEOUT_SECONDS = float(os.environ.get(\"LLM_MODEL_HEALTH_TIMEOUT_SECONDS\", \"0.8\"))\nLLM_MODEL_HEALTH_CACHE_SECONDS = int(os.environ.get(\"LLM_MODEL_HEALTH_CACHE_SECONDS\", \"5\"))\n\nOLLAMA_MODEL = os.environ.get(\"OLLAMA_MODEL\", \"qwen3:14b\")\nOLLAMA_API_KEY = os.environ.get(\"OLLAMA_API_KEY\", \"ollama\")\nOLLAMA_BASE_URL = os.environ.get(\"OLLAMA_BASE_URL\", \"http://127.0.0.1:11434/v1\")\nOLLAMA_CONTEXT_LENGTH = int(os.environ.get(\"OLLAMA_CONTEXT_LENGTH\", \"32768\"))\nOLLAMA_MODELS = {\n OLLAMA_MODEL: OLLAMA_BASE_URL,\n}\nOLLAMA_TIMEOUT_SECONDS = int(os.environ.get(\"OLLAMA_TIMEOUT_SECONDS\", \"300\"))\n\nLLM_MODEL = os.environ.get(\"LLM_MODEL\", VLLM_MODEL)\nLLM_MAX_COMPLETION_TOKENS = int(os.environ.get(\"LLM_MAX_COMPLETION_TOKENS\", \"32768\"))\nLLM_MODELS = {\n **{\n model: {\n \"provider\": \"vllm\",\n \"base_url\": base_url,\n \"label\": model,\n \"max_context_tokens\": VLLM_MODEL_CONTEXT_TOKENS[model],\n **(\n {\"thinking_toggle\": \"vllm_chat_template\"}\n if model == \"qwen3-32b-awq\"\n else {}\n ),\n }\n for model, base_url in VLLM_MODELS.items()\n },\n **{\n model: {\n \"provider\": \"ollama\",\n \"base_url\": base_url,\n \"label\": \"Qwen3 14B\",\n \"max_context_tokens\": OLLAMA_CONTEXT_LENGTH,\n **(\n {\"thinking_toggle\": \"ollama_reasoning_effort\"}\n if model == \"qwen3:14b\"\n else {}\n ),\n }\n for model, base_url in OLLAMA_MODELS.items()\n },\n}\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "21a23e50030f6184823309ff75ef0b295ec9ad99": {"t": 1785769062.3300083, "n": 8746, "h": "008abaa5527dae9f", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nimport sys\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\nPROJECT_DIR = os.path.dirname(BASE_DIR)\n\n\ndef env_bool(name: str, default: str = \"0\") -> bool:\n return os.environ.get(name, default).lower() in {\"1\", \"true\", \"yes\", \"on\"}\n\n\nIS_TEST_COMMAND = any(\"pytest\" in arg or arg == \"test\" for arg in sys.argv)\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\"]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAPP_REDIS_URL = os.environ.get(\"APP_REDIS_URL\", \"redis://127.0.0.1:6380/0\")\nif \"test\" in sys.argv:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n \"LOCATION\": \"gptclone-tests\",\n }\n }\nelse:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.redis.RedisCache\",\n \"LOCATION\": APP_REDIS_URL,\n }\n }\n\nCHAT_PAGE_CACHE_SECONDS = int(os.environ.get(\"CHAT_PAGE_CACHE_SECONDS\", \"60\"))\nCHAT_CONVERSATION_PAGE_SIZE = int(os.environ.get(\"CHAT_CONVERSATION_PAGE_SIZE\", \"30\"))\nCHAT_MESSAGE_PAGE_SIZE = int(os.environ.get(\"CHAT_MESSAGE_PAGE_SIZE\", \"50\"))\nCHAT_PROMPT_HISTORY_MESSAGE_LIMIT = int(os.environ.get(\"CHAT_PROMPT_HISTORY_MESSAGE_LIMIT\", \"40\"))\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nCORS_ALLOWED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\nCSRF_TRUSTED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n \"qwen3-32b-awq\": \"http://127.0.0.1:8002/v1\",\n \"qwq-32b-awq\": \"http://127.0.0.1:8003/v1\",\n}\nVLLM_MODEL_CONTEXT_TOKENS = {\n \"gpt-oss-20b\": int(os.environ.get(\"VLLM_GPT_OSS_20B_CONTEXT_TOKENS\", \"131072\")),\n \"qwen3-32b-awq\": int(os.environ.get(\"VLLM_QWEN3_32B_AWQ_CONTEXT_TOKENS\", \"40960\")),\n \"qwq-32b-awq\": int(os.environ.get(\"VLLM_QWQ_32B_AWQ_CONTEXT_TOKENS\", \"40960\")),\n}\nVLLM_TIMEOUT_SECONDS = 120\nVLLM_MODEL_CONTAINERS = {\n \"gpt-oss-20b\": {\n \"service_name\": \"vllm-gpt-oss-20b\",\n \"container_name\": \"vllm-gpt-oss-20b-dev\",\n },\n \"qwen3-32b-awq\": {\n \"service_name\": \"vllm-qwen3-32b-awq\",\n \"container_name\": \"vllm-qwen3-32b-awq-dev\",\n },\n \"qwq-32b-awq\": {\n \"service_name\": \"vllm-qwq-32b-awq\",\n \"container_name\": \"vllm-qwq-32b-awq-dev\",\n },\n}\nVLLM_AUTO_SWITCH_ENABLED = env_bool(\n \"VLLM_AUTO_SWITCH_ENABLED\",\n \"0\" if IS_TEST_COMMAND else \"1\",\n)\nVLLM_DOCKER_COMPOSE_DIR = os.environ.get(\n \"VLLM_DOCKER_COMPOSE_DIR\",\n os.path.join(PROJECT_DIR, \"environments\", \"dev\"),\n)\nVLLM_DOCKER_COMPOSE_COMMAND = os.environ.get(\"VLLM_DOCKER_COMPOSE_COMMAND\", \"docker compose\")\nVLLM_DOCKER_COMMAND_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_COMMAND_TIMEOUT_SECONDS\", \"30\"))\nVLLM_DOCKER_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_DOCKER_START_TIMEOUT_SECONDS\", \"180\"))\nVLLM_CONTAINER_STOP_GRACE_SECONDS = int(os.environ.get(\"VLLM_CONTAINER_STOP_GRACE_SECONDS\", \"10\"))\nVLLM_CONTAINER_STOP_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_CONTAINER_STOP_TIMEOUT_SECONDS\", \"60\"))\nVLLM_MODEL_START_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_MODEL_START_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_GPU_LOCK_WAIT_TIMEOUT_SECONDS\", \"900\"))\nVLLM_GPU_LOCK_TTL_SECONDS = int(os.environ.get(\"VLLM_GPU_LOCK_TTL_SECONDS\", \"7200\"))\nVLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS = float(os.environ.get(\"VLLM_INFLIGHT_DRAIN_TIMEOUT_SECONDS\", \"7200\"))\nVLLM_RUNTIME_POLL_SECONDS = float(os.environ.get(\"VLLM_RUNTIME_POLL_SECONDS\", \"1.0\"))\nLLM_MODEL_HEALTH_TIMEOUT_SECONDS = float(os.environ.get(\"LLM_MODEL_HEALTH_TIMEOUT_SECONDS\", \"0.8\"))\nLLM_MODEL_HEALTH_CACHE_SECONDS = int(os.environ.get(\"LLM_MODEL_HEALTH_CACHE_SECONDS\", \"5\"))\n\nOLLAMA_MODEL = os.environ.get(\"OLLAMA_MODEL\", \"qwen3:14b\")\nOLLAMA_API_KEY = os.environ.get(\"OLLAMA_API_KEY\", \"ollama\")\nOLLAMA_BASE_URL = os.environ.get(\"OLLAMA_BASE_URL\", \"http://127.0.0.1:11434/v1\")\nOLLAMA_CONTEXT_LENGTH = int(os.environ.get(\"OLLAMA_CONTEXT_LENGTH\", \"40960\"))\nOLLAMA_MODELS = {\n OLLAMA_MODEL: OLLAMA_BASE_URL,\n}\nOLLAMA_TIMEOUT_SECONDS = int(os.environ.get(\"OLLAMA_TIMEOUT_SECONDS\", \"300\"))\n\nLLM_MODEL = os.environ.get(\"LLM_MODEL\", VLLM_MODEL)\nLLM_MAX_COMPLETION_TOKENS = int(os.environ.get(\"LLM_MAX_COMPLETION_TOKENS\", \"131072\"))\nLLM_MODELS = {\n **{\n model: {\n \"provider\": \"vllm\",\n \"base_url\": base_url,\n \"label\": model,\n \"max_context_tokens\": VLLM_MODEL_CONTEXT_TOKENS[model],\n **(\n {\"thinking_toggle\": \"vllm_chat_template\"}\n if model == \"qwen3-32b-awq\"\n else {}\n ),\n }\n for model, base_url in VLLM_MODELS.items()\n },\n **{\n model: {\n \"provider\": \"ollama\",\n \"base_url\": base_url,\n \"label\": \"Qwen3 14B\",\n \"max_context_tokens\": OLLAMA_CONTEXT_LENGTH,\n **(\n {\"thinking_toggle\": \"ollama_reasoning_effort\"}\n if model == \"qwen3:14b\"\n else {}\n ),\n }\n for model, base_url in OLLAMA_MODELS.items()\n },\n}\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "43306c9b339e4fa8c4a01b519d83ef5734b54752": {"t": 1785769065.1569011, "n": 6870, "h": "63355628e094473b", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nimport sys\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\"]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAPP_REDIS_URL = os.environ.get(\"APP_REDIS_URL\", \"redis://127.0.0.1:6380/0\")\nif \"test\" in sys.argv:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n \"LOCATION\": \"gptclone-tests\",\n }\n }\nelse:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.redis.RedisCache\",\n \"LOCATION\": APP_REDIS_URL,\n }\n }\n\nCHAT_PAGE_CACHE_SECONDS = int(os.environ.get(\"CHAT_PAGE_CACHE_SECONDS\", \"60\"))\nCHAT_CONVERSATION_PAGE_SIZE = int(os.environ.get(\"CHAT_CONVERSATION_PAGE_SIZE\", \"30\"))\nCHAT_MESSAGE_PAGE_SIZE = int(os.environ.get(\"CHAT_MESSAGE_PAGE_SIZE\", \"50\"))\nCHAT_PROMPT_HISTORY_MESSAGE_LIMIT = int(os.environ.get(\"CHAT_PROMPT_HISTORY_MESSAGE_LIMIT\", \"40\"))\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nCORS_ALLOWED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\nCSRF_TRUSTED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n \"qwen3-32b-awq\": \"http://127.0.0.1:8002/v1\",\n \"qwq-32b-awq\": \"http://127.0.0.1:8003/v1\",\n}\nVLLM_MODEL_CONTEXT_TOKENS = {\n \"gpt-oss-20b\": int(os.environ.get(\"VLLM_GPT_OSS_20B_CONTEXT_TOKENS\", \"131072\")),\n \"qwen3-32b-awq\": int(os.environ.get(\"VLLM_QWEN3_32B_AWQ_CONTEXT_TOKENS\", \"40960\")),\n \"qwq-32b-awq\": int(os.environ.get(\"VLLM_QWQ_32B_AWQ_CONTEXT_TOKENS\", \"40960\")),\n}\nVLLM_TIMEOUT_SECONDS = 120\nLLM_MODEL_HEALTH_TIMEOUT_SECONDS = float(os.environ.get(\"LLM_MODEL_HEALTH_TIMEOUT_SECONDS\", \"0.8\"))\nLLM_MODEL_HEALTH_CACHE_SECONDS = int(os.environ.get(\"LLM_MODEL_HEALTH_CACHE_SECONDS\", \"5\"))\n\nOLLAMA_MODEL = os.environ.get(\"OLLAMA_MODEL\", \"qwen3:14b\")\nOLLAMA_API_KEY = os.environ.get(\"OLLAMA_API_KEY\", \"ollama\")\nOLLAMA_BASE_URL = os.environ.get(\"OLLAMA_BASE_URL\", \"http://127.0.0.1:11434/v1\")\nOLLAMA_CONTEXT_LENGTH = int(os.environ.get(\"OLLAMA_CONTEXT_LENGTH\", \"40960\"))\nOLLAMA_MODELS = {\n OLLAMA_MODEL: OLLAMA_BASE_URL,\n}\nOLLAMA_TIMEOUT_SECONDS = int(os.environ.get(\"OLLAMA_TIMEOUT_SECONDS\", \"300\"))\n\nLLM_MODEL = os.environ.get(\"LLM_MODEL\", VLLM_MODEL)\nLLM_MAX_COMPLETION_TOKENS = int(os.environ.get(\"LLM_MAX_COMPLETION_TOKENS\", \"131072\"))\nLLM_MODELS = {\n **{\n model: {\n \"provider\": \"vllm\",\n \"base_url\": base_url,\n \"label\": model,\n \"max_context_tokens\": VLLM_MODEL_CONTEXT_TOKENS[model],\n **(\n {\"thinking_toggle\": \"vllm_chat_template\"}\n if model == \"qwen3-32b-awq\"\n else {}\n ),\n }\n for model, base_url in VLLM_MODELS.items()\n },\n **{\n model: {\n \"provider\": \"ollama\",\n \"base_url\": base_url,\n \"label\": \"Qwen3 14B\",\n \"max_context_tokens\": OLLAMA_CONTEXT_LENGTH,\n **(\n {\"thinking_toggle\": \"ollama_reasoning_effort\"}\n if model == \"qwen3:14b\"\n else {}\n ),\n }\n for model, base_url in OLLAMA_MODELS.items()\n },\n}\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "8c1e35cc370d65f3987f6c5a5dc3974ce122c422": {"t": 1785769066.3750522, "n": 6061, "h": "76029491cc2ccf3d", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nimport sys\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\"]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAPP_REDIS_URL = os.environ.get(\"APP_REDIS_URL\", \"redis://127.0.0.1:6380/0\")\nif \"test\" in sys.argv:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n \"LOCATION\": \"gptclone-tests\",\n }\n }\nelse:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.redis.RedisCache\",\n \"LOCATION\": APP_REDIS_URL,\n }\n }\n\nCHAT_PAGE_CACHE_SECONDS = int(os.environ.get(\"CHAT_PAGE_CACHE_SECONDS\", \"60\"))\nCHAT_CONVERSATION_PAGE_SIZE = int(os.environ.get(\"CHAT_CONVERSATION_PAGE_SIZE\", \"30\"))\nCHAT_MESSAGE_PAGE_SIZE = int(os.environ.get(\"CHAT_MESSAGE_PAGE_SIZE\", \"50\"))\nCHAT_PROMPT_HISTORY_MESSAGE_LIMIT = int(os.environ.get(\"CHAT_PROMPT_HISTORY_MESSAGE_LIMIT\", \"40\"))\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nCORS_ALLOWED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\nCSRF_TRUSTED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n \"qwen3-32b-awq\": \"http://127.0.0.1:8002/v1\",\n \"qwq-32b-awq\": \"http://127.0.0.1:8003/v1\",\n}\nVLLM_TIMEOUT_SECONDS = 120\nLLM_MODEL_HEALTH_TIMEOUT_SECONDS = float(os.environ.get(\"LLM_MODEL_HEALTH_TIMEOUT_SECONDS\", \"0.8\"))\nLLM_MODEL_HEALTH_CACHE_SECONDS = int(os.environ.get(\"LLM_MODEL_HEALTH_CACHE_SECONDS\", \"5\"))\n\nOLLAMA_MODEL = os.environ.get(\"OLLAMA_MODEL\", \"qwen3:14b\")\nOLLAMA_API_KEY = os.environ.get(\"OLLAMA_API_KEY\", \"ollama\")\nOLLAMA_BASE_URL = os.environ.get(\"OLLAMA_BASE_URL\", \"http://127.0.0.1:11434/v1\")\nOLLAMA_MODELS = {\n OLLAMA_MODEL: OLLAMA_BASE_URL,\n}\nOLLAMA_TIMEOUT_SECONDS = int(os.environ.get(\"OLLAMA_TIMEOUT_SECONDS\", \"300\"))\n\nLLM_MODEL = os.environ.get(\"LLM_MODEL\", VLLM_MODEL)\nLLM_MAX_COMPLETION_TOKENS = int(os.environ.get(\"LLM_MAX_COMPLETION_TOKENS\", \"1024\"))\nLLM_MODELS = {\n **{\n model: {\n \"provider\": \"vllm\",\n \"base_url\": base_url,\n \"label\": model,\n }\n for model, base_url in VLLM_MODELS.items()\n },\n **{\n model: {\n \"provider\": \"ollama\",\n \"base_url\": base_url,\n \"label\": \"Qwen3 14B\",\n }\n for model, base_url in OLLAMA_MODELS.items()\n },\n}\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "46bf6f0d9d80d384a99e5f67b9931e283885661a": {"t": 1785769067.565344, "n": 5688, "h": "ef1fd4881a1a0c51", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nimport sys\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\"]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAPP_REDIS_URL = os.environ.get(\"APP_REDIS_URL\", \"redis://127.0.0.1:6380/0\")\nif \"test\" in sys.argv:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n \"LOCATION\": \"gptclone-tests\",\n }\n }\nelse:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.redis.RedisCache\",\n \"LOCATION\": APP_REDIS_URL,\n }\n }\n\nCHAT_PAGE_CACHE_SECONDS = int(os.environ.get(\"CHAT_PAGE_CACHE_SECONDS\", \"60\"))\nCHAT_CONVERSATION_PAGE_SIZE = int(os.environ.get(\"CHAT_CONVERSATION_PAGE_SIZE\", \"30\"))\nCHAT_MESSAGE_PAGE_SIZE = int(os.environ.get(\"CHAT_MESSAGE_PAGE_SIZE\", \"50\"))\nCHAT_PROMPT_HISTORY_MESSAGE_LIMIT = int(os.environ.get(\"CHAT_PROMPT_HISTORY_MESSAGE_LIMIT\", \"40\"))\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nCORS_ALLOWED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\nCSRF_TRUSTED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n}\nVLLM_TIMEOUT_SECONDS = 120\n\nOLLAMA_MODEL = os.environ.get(\"OLLAMA_MODEL\", \"qwen3:14b\")\nOLLAMA_API_KEY = os.environ.get(\"OLLAMA_API_KEY\", \"ollama\")\nOLLAMA_BASE_URL = os.environ.get(\"OLLAMA_BASE_URL\", \"http://127.0.0.1:11434/v1\")\nOLLAMA_MODELS = {\n OLLAMA_MODEL: OLLAMA_BASE_URL,\n}\nOLLAMA_TIMEOUT_SECONDS = int(os.environ.get(\"OLLAMA_TIMEOUT_SECONDS\", \"300\"))\n\nLLM_MODEL = os.environ.get(\"LLM_MODEL\", VLLM_MODEL)\nLLM_MODELS = {\n **{\n model: {\n \"provider\": \"vllm\",\n \"base_url\": base_url,\n \"label\": model,\n }\n for model, base_url in VLLM_MODELS.items()\n },\n **{\n model: {\n \"provider\": \"ollama\",\n \"base_url\": base_url,\n \"label\": \"Qwen3 14B\",\n }\n for model, base_url in OLLAMA_MODELS.items()\n },\n}\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "08163c65216eecd80a2b4bccdea5492b79abab89": {"t": 1785769068.868592, "n": 4899, "h": "19d516e8b0059912", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nimport sys\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\"]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAPP_REDIS_URL = os.environ.get(\"APP_REDIS_URL\", \"redis://127.0.0.1:6380/0\")\nif \"test\" in sys.argv:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n \"LOCATION\": \"gptclone-tests\",\n }\n }\nelse:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.redis.RedisCache\",\n \"LOCATION\": APP_REDIS_URL,\n }\n }\n\nCHAT_PAGE_CACHE_SECONDS = int(os.environ.get(\"CHAT_PAGE_CACHE_SECONDS\", \"60\"))\nCHAT_CONVERSATION_PAGE_SIZE = int(os.environ.get(\"CHAT_CONVERSATION_PAGE_SIZE\", \"30\"))\nCHAT_MESSAGE_PAGE_SIZE = int(os.environ.get(\"CHAT_MESSAGE_PAGE_SIZE\", \"50\"))\nCHAT_PROMPT_HISTORY_MESSAGE_LIMIT = int(os.environ.get(\"CHAT_PROMPT_HISTORY_MESSAGE_LIMIT\", \"40\"))\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nCORS_ALLOWED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\nCSRF_TRUSTED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n}\nVLLM_TIMEOUT_SECONDS = 120\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)"}, "a850a1ff97390ab84a403509759201fe7dc14f9d": {"t": 1785769070.2011924, "n": 4900, "h": "8fd16455ee361115", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nimport sys\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\"]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAPP_REDIS_URL = os.environ.get(\"APP_REDIS_URL\", \"redis://127.0.0.1:6380/0\")\nif \"test\" in sys.argv:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\",\n \"LOCATION\": \"gptclone-tests\",\n }\n }\nelse:\n CACHES = {\n \"default\": {\n \"BACKEND\": \"django.core.cache.backends.redis.RedisCache\",\n \"LOCATION\": APP_REDIS_URL,\n }\n }\n\nCHAT_PAGE_CACHE_SECONDS = int(os.environ.get(\"CHAT_PAGE_CACHE_SECONDS\", \"60\"))\nCHAT_CONVERSATION_PAGE_SIZE = int(os.environ.get(\"CHAT_CONVERSATION_PAGE_SIZE\", \"30\"))\nCHAT_MESSAGE_PAGE_SIZE = int(os.environ.get(\"CHAT_MESSAGE_PAGE_SIZE\", \"50\"))\nCHAT_PROMPT_HISTORY_MESSAGE_LIMIT = int(os.environ.get(\"CHAT_PROMPT_HISTORY_MESSAGE_LIMIT\", \"40\"))\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nCORS_ALLOWED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\nCSRF_TRUSTED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n}\nVLLM_TIMEOUT_SECONDS = 120\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "039abd1121a55fcb1d0cd1dd14678418f4de0f7f": {"t": 1785769071.6830533, "n": 4113, "h": "157979a83d2c06d1", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nfrom datetime import timedelta\n\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\"]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nCORS_ALLOWED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\nCSRF_TRUSTED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n}\nVLLM_TIMEOUT_SECONDS = 120\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "c557eb61e6e59398f9df55348090943839c4ebbb": {"t": 1785769073.4287887, "n": 3974, "h": "01f0b79f9d7a826c", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\nfrom datetime import timedelta\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\"]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"rest_framework_simplejwt.token_blacklist\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nCORS_ALLOWED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\nCSRF_TRUSTED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.IsAuthenticated\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [\"rest_framework_simplejwt.authentication.JWTAuthentication\"],\n}\n\nJWT_SIGNING_KEY = os.environ.get(\"JWT_SECRET_KEY\", f\"{SECRET_KEY}-jwt-hs256-signing-key\")\nJWT_ACCESS_TOKEN_SECONDS = int(os.environ.get(\"JWT_ACCESS_TOKEN_SECONDS\", \"900\"))\nJWT_REFRESH_TOKEN_SECONDS = int(os.environ.get(\"JWT_REFRESH_TOKEN_SECONDS\", \"604800\"))\nOTP_CODE_TTL_SECONDS = int(os.environ.get(\"OTP_CODE_TTL_SECONDS\", \"300\"))\nOTP_MAX_ATTEMPTS = int(os.environ.get(\"OTP_MAX_ATTEMPTS\", \"5\"))\n\nSIMPLE_JWT = {\n \"ACCESS_TOKEN_LIFETIME\": timedelta(seconds=JWT_ACCESS_TOKEN_SECONDS),\n \"REFRESH_TOKEN_LIFETIME\": timedelta(seconds=JWT_REFRESH_TOKEN_SECONDS),\n \"ROTATE_REFRESH_TOKENS\": True,\n \"BLACKLIST_AFTER_ROTATION\": True,\n \"ALGORITHM\": \"HS256\",\n \"SIGNING_KEY\": JWT_SIGNING_KEY,\n \"AUTH_HEADER_TYPES\": (\"Bearer\",),\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n}\nVLLM_TIMEOUT_SECONDS = 120\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "e78bba98bfdd1383928236abddbb2ec5ed92e0a4": {"t": 1785769074.8844755, "n": 3090, "h": "e83f8749b5d9759d", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nimport os\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\"]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nCORS_ALLOWED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\nCSRF_TRUSTED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.AllowAny\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [],\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_API_KEY = os.environ.get(\"VLLM_API_KEY\", \"EMPTY\")\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n}\nVLLM_TIMEOUT_SECONDS = 120\n\nLANGFUSE_BASE_URL = os.environ.get(\"LANGFUSE_BASE_URL\", \"http://127.0.0.1:3001\")\nLANGFUSE_PUBLIC_KEY = os.environ.get(\"LANGFUSE_PUBLIC_KEY\", \"pk-lf-dev-project-key\")\nLANGFUSE_SECRET_KEY = os.environ.get(\"LANGFUSE_SECRET_KEY\", \"sk-lf-dev-secret-key\")\n\nos.environ.setdefault(\"LANGFUSE_BASE_URL\", LANGFUSE_BASE_URL)\nos.environ.setdefault(\"LANGFUSE_PUBLIC_KEY\", LANGFUSE_PUBLIC_KEY)\nos.environ.setdefault(\"LANGFUSE_SECRET_KEY\", LANGFUSE_SECRET_KEY)\n"}, "b1b49b0319b8ab5803e4d7ae1be51802f88f7274": {"t": 1785769076.7882128, "n": 2578, "h": "fdd6f1685a72dd23", "c": "\"\"\"Django settings for local development only.\"\"\"\n\nSECRET_KEY = \"dev-only-secret-key-change-me\"\nDEBUG = True\nALLOWED_HOSTS = [\"localhost\", \"127.0.0.1\"]\n\nINSTALLED_APPS = [\n \"django.contrib.admin\",\n \"django.contrib.auth\",\n \"django.contrib.contenttypes\",\n \"django.contrib.sessions\",\n \"django.contrib.messages\",\n \"django.contrib.staticfiles\",\n \"corsheaders\",\n \"rest_framework\",\n \"accounts\",\n \"api\",\n]\n\nMIDDLEWARE = [\n \"django.middleware.security.SecurityMiddleware\",\n \"corsheaders.middleware.CorsMiddleware\",\n \"django.contrib.sessions.middleware.SessionMiddleware\",\n \"django.middleware.common.CommonMiddleware\",\n \"django.middleware.csrf.CsrfViewMiddleware\",\n \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n \"django.contrib.messages.middleware.MessageMiddleware\",\n \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"config.urls\"\n\nTEMPLATES = [\n {\n \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n \"DIRS\": [],\n \"APP_DIRS\": True,\n \"OPTIONS\": {\n \"context_processors\": [\n \"django.template.context_processors.request\",\n \"django.contrib.auth.context_processors.auth\",\n \"django.contrib.messages.context_processors.messages\",\n ],\n },\n },\n]\n\nWSGI_APPLICATION = \"config.wsgi.application\"\n\nDATABASES = {\n \"default\": {\n \"ENGINE\": \"django.db.backends.postgresql\",\n \"NAME\": \"gptclone\",\n \"USER\": \"postgres\",\n \"PASSWORD\": \"postgres\",\n \"HOST\": \"127.0.0.1\",\n \"PORT\": \"5432\",\n }\n}\n\nAUTH_USER_MODEL = \"accounts.User\"\n\nAUTH_PASSWORD_VALIDATORS = [\n {\"NAME\": \"django.contrib.auth.password_validation.UserAttributeSimilarityValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.MinimumLengthValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.CommonPasswordValidator\"},\n {\"NAME\": \"django.contrib.auth.password_validation.NumericPasswordValidator\"},\n]\n\nLANGUAGE_CODE = \"en-us\"\nTIME_ZONE = \"UTC\"\nUSE_I18N = True\nUSE_TZ = True\n\nSTATIC_URL = \"static/\"\nDEFAULT_AUTO_FIELD = \"django.db.models.BigAutoField\"\n\nCORS_ALLOWED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\nCSRF_TRUSTED_ORIGINS = [\"http://localhost:3000\", \"http://127.0.0.1:3000\"]\n\nREST_FRAMEWORK = {\n \"DEFAULT_PERMISSION_CLASSES\": [\"rest_framework.permissions.AllowAny\"],\n \"DEFAULT_AUTHENTICATION_CLASSES\": [],\n}\n\nVLLM_MODEL = \"gpt-oss-20b\"\nVLLM_MODELS = {\n \"gpt-oss-20b\": \"http://127.0.0.1:8001/v1\",\n}\nVLLM_TIMEOUT_SECONDS = 120\n"}}}}