# -*- coding: utf-8 -*- """ AI Worker 项目管理平台 - 配置文件 """ import os BASE_DIR = os.path.dirname(os.path.abspath(__file__)) DATA_DIR = os.path.join(BASE_DIR, 'data') LOG_DIR = os.path.join(BASE_DIR, 'logs') STATIC_DIR = os.path.join(BASE_DIR, 'static') for d in (DATA_DIR, LOG_DIR): os.makedirs(d, exist_ok=True) DB_PATH = os.path.join(DATA_DIR, 'aiworker.db') HOST = '0.0.0.0' PORT = 16071 # 登录口令(留空则关闭登录校验) AUTH_PASSWORD = 'admin123' SECRET_KEY = 'ai-worker-platform-mvp-secret-key-20260812' # --------------------------------------------------------------------------- # 模型供应商网关(OpenAI 兼容协议) # api_key 留空则使用 os.environ.get('_API_KEY') # --------------------------------------------------------------------------- PROVIDERS = { 'doubao': { 'name': '火山方舟 Doubao', 'base_url': 'https://ark.cn-beijing.volces.com/api/plan/v3', 'api_key': os.environ.get('DOUBAO_API_KEY', 'ark-2b06dc9d-8878-4c6e-b201-f422376e79cb-246d9'), 'timeout': 600, }, 'deepseek': { 'name': 'DeepSeek', 'base_url': 'https://api.deepseek.com', 'api_key': os.environ.get('DEEPSEEK_API_KEY', 'sk-edb9df58ff574f8c98df1cd6a425e97c'), 'timeout': 600, }, 'autodl': { 'name': 'AutoDL 多模态(视觉)', 'base_url': 'https://www.autodl.art/api/v1', 'api_key': os.environ.get('AUTODL_API_KEY', 'F9MBfolzuapqTsD4KmUf9qen720rXvUZ3Sp3IrWiCTukqonx'), 'timeout': 600, }, 'openai': { 'name': 'OpenAI', 'base_url': 'https://api.openai.com/v1', 'api_key': os.environ.get('OPENAI_API_KEY', ''), 'timeout': 600, }, 'qwen': { 'name': '阿里云通义千问', 'base_url': 'https://dashscope.aliyuncs.com/compatible-mode/v1', 'api_key': os.environ.get('QWEN_API_KEY', ''), 'timeout': 600, }, 'vllm': { 'name': '本地 vLLM(自定义地址)', 'base_url': os.environ.get('VLLM_BASE_URL', 'http://127.0.0.1:8000/v1'), 'api_key': os.environ.get('VLLM_API_KEY', 'EMPTY'), 'timeout': 600, }, } # --------------------------------------------------------------------------- # 模型定价(元 / 1M tokens),用于成本记账;未登记模型走默认价 # --------------------------------------------------------------------------- MODEL_PRICING = { 'doubao-seed-evolving': {'input': 2.0, 'output': 8.0}, 'doubao-seed-1-6-250615': {'input': 2.0, 'output': 8.0}, 'doubao-pro-32k': {'input': 2.0, 'output': 8.0}, 'deepseek-chat': {'input': 2.0, 'output': 8.0}, 'deepseek-reasoner': {'input': 4.0, 'output': 16.0}, 'deepseek-v4-flash': {'input': 0.2, 'output': 0.6}, 'gpt-4o': {'input': 17.5, 'output': 70.0}, 'gpt-4o-mini': {'input': 1.1, 'output': 4.4}, 'qwen-plus': {'input': 0.8, 'output': 2.0}, 'qwen-max': {'input': 4.0, 'output': 12.0}, 'qwen3.6-plus': {'input': 2.0, 'output': 8.0}, } DEFAULT_PRICE = {'input': 2.0, 'output': 8.0} # 引擎参数 MAX_RETRY = 1 # 失败重试次数(429/5xx/网络错误) TASK_TIMEOUT = 600 # 单任务超时(秒) # 预算告警阈值(项目预算使用率 >= 该值触发告警) BUDGET_ALERT_RATIO = 0.8 # 邮件通知配置(可选,留空 host 则禁用) EMAIL = { 'host': os.environ.get('SMTP_HOST', 'mail.tphai.com'), 'port': int(os.environ.get('SMTP_PORT', 587)), 'starttls': os.environ.get('SMTP_STARTTLS', '0') == '1', 'user': os.environ.get('SMTP_USER', 'hz4th_coder@tphai.com'), 'password': os.environ.get('SMTP_PASSWORD', 'hz4th_coder@!'), 'from_name': 'AI Worker 平台', } # 公网访问地址(Demo 链接/邮件中的回链基准;留空则用请求 host) PUBLIC_BASE_URL = os.environ.get('PUBLIC_BASE_URL', 'http://121.40.164.32:16071') # 自动路由:按模型单价升序挑选可用 Worker AUTO_ROUTE_POOL = 'enabled' # enabled | all