fix: структура под платформу — код в site/, requirements.txt в корне
This commit is contained in:
-16
@@ -1,16 +0,0 @@
|
|||||||
FROM python:3.12-slim
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
# Зависимости
|
|
||||||
COPY requirements.txt .
|
|
||||||
RUN pip install --no-cache-dir -r requirements.txt
|
|
||||||
|
|
||||||
# Код
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
# Порт
|
|
||||||
EXPOSE 5000
|
|
||||||
|
|
||||||
# Запуск
|
|
||||||
CMD ["python", "app.py"]
|
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
"""
|
||||||
|
Централизованная конфигурация приложения Say.
|
||||||
|
|
||||||
|
Все настройки читаются из переменных окружения с разумными значениями по умолчанию.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# API — единый эндпоинт (aillm.ru)
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
API_BASE = os.environ.get("API_BASE", "https://api.aillm.ru")
|
||||||
|
API_KEY = os.environ.get("API_KEY", "") # ⚠️ Без ключа — только через env!
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Whisper (распознавание речи)
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
WHISPER_URL = os.environ.get(
|
||||||
|
"WHISPER_URL",
|
||||||
|
f"{API_BASE}/v1/audio/transcriptions",
|
||||||
|
)
|
||||||
|
WHISPER_KEY = os.environ.get("WHISPER_KEY", API_KEY)
|
||||||
|
WHISPER_MODEL = os.environ.get("WHISPER_MODEL", "whisper-large-v3")
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Три LLM-профиля — каждый со своим именем, моделью и системным промптом
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
LLM_PROFILES = [
|
||||||
|
{
|
||||||
|
"id": "ddm",
|
||||||
|
"name": "DDM-120",
|
||||||
|
"description": "Быстрая модель, общие вопросы",
|
||||||
|
"url": os.environ.get("LLM_URL_DDM", f"{API_BASE}/v1/chat/completions"),
|
||||||
|
"key": os.environ.get("LLM_KEY_DDM", API_KEY),
|
||||||
|
"model": os.environ.get("LLM_MODEL_DDM", "ddm-120"),
|
||||||
|
"system_prompt": os.environ.get(
|
||||||
|
"LLM_SYSTEM_DDM",
|
||||||
|
"Ты — полезный ассистент. Отвечай кратко и по делу на том же языке, что и запрос.",
|
||||||
|
),
|
||||||
|
"temperature": float(os.environ.get("LLM_TEMP_DDM", "0.7")),
|
||||||
|
"max_tokens": int(os.environ.get("LLM_TOKENS_DDM", "1024")),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "qwen",
|
||||||
|
"name": "Qwen",
|
||||||
|
"description": "Мощная модель, сложные задачи",
|
||||||
|
"url": os.environ.get("LLM_URL_QWEN", f"{API_BASE}/v1/chat/completions"),
|
||||||
|
"key": os.environ.get("LLM_KEY_QWEN", API_KEY),
|
||||||
|
"model": os.environ.get("LLM_MODEL_QWEN", "qwen-plus"),
|
||||||
|
"system_prompt": os.environ.get(
|
||||||
|
"LLM_SYSTEM_QWEN",
|
||||||
|
"Ты — эксперт-аналитик. Отвечай развернуто, структурированно, на языке запроса.",
|
||||||
|
),
|
||||||
|
"temperature": float(os.environ.get("LLM_TEMP_QWEN", "0.7")),
|
||||||
|
"max_tokens": int(os.environ.get("LLM_TOKENS_QWEN", "2048")),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "deepseek",
|
||||||
|
"name": "DeepSeek",
|
||||||
|
"description": "Глубокая аналитика, код, рассуждения",
|
||||||
|
"url": os.environ.get("LLM_URL_DEEPSEEK", f"{API_BASE}/v1/chat/completions"),
|
||||||
|
"key": os.environ.get("LLM_KEY_DEEPSEEK", API_KEY),
|
||||||
|
"model": os.environ.get("LLM_MODEL_DEEPSEEK", "deepseek-chat"),
|
||||||
|
"system_prompt": os.environ.get(
|
||||||
|
"LLM_SYSTEM_DEEPSEEK",
|
||||||
|
"Ты — глубокий аналитик и программист. Думай step-by-step, отвечай на языке запроса.",
|
||||||
|
),
|
||||||
|
"temperature": float(os.environ.get("LLM_TEMP_DEEPSEEK", "0.7")),
|
||||||
|
"max_tokens": int(os.environ.get("LLM_TOKENS_DEEPSEEK", "4096")),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Flask
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
FLASK_HOST = os.environ.get("HOST", "0.0.0.0")
|
||||||
|
FLASK_PORT = int(os.environ.get("PORT", "5000"))
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Логирование
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
LOG_LEVEL = os.environ.get("LOG_LEVEL", "INFO")
|
||||||
|
Before Width: | Height: | Size: 1017 B After Width: | Height: | Size: 1017 B |
Reference in New Issue
Block a user