Files
ai-worker-platform/config.py
T
hz4th_coder eb92a4e591 V3.0 交付体系 + 精准权限系统
交付环节优化:
- 新建项目必填送达者(人)邮箱,项目完成/遇到无法绕开的难关时自动邮件及时通知
- 每个项目独立工作目录 data/workspace/project_<id>/,交付物分类存放互不污染(上传/下载/删除)
- 网页交付物一键部署到 /demo/<id>/ 免登录公开 Demo,送达者直接打开链接查看
- 非网页交付物 zip 打包 data/packages/,随邮件附件发送送达者(含手动交付/完成交付/自动交付)
- 任务全部完成自动收尾交付;失败任务触发难关通知(30分钟限频去重)

用户(人)管理 + 精准权限:
- 管理员增删改用户,管理用户项目所属与 Worker 权限(授权弹窗 + 授权总览矩阵)
- 角色体系:admin 全部 / auditor 全量只读 / member 按授权
- 项目授权 view/manage/admin;Worker 授权 view/use/manage;创建者自动成为项目管理员
- 仪表盘/成本报表/日志/协作/评估全部按权限过滤,越权访问 403

新表:project_deliverables / user_projects / user_workers;新模块 delivery.py
2026-08-13 12:38:38 +08:00

106 lines
4.1 KiB
Python

# -*- 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('<NAME>_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