e262134148
删除内容: - KlingAI Provider、MiniMax Provider - Kling 视频/图片/TTS/语音克隆/形象克隆 Service 和 Scheduler Handler - 已废弃的 TTSService、VoiceCloneService - config 中 KLINGAI_*/MINIMAX_* 配置项 - ai_models.yaml 中 klingai 平台和模型配置 - docker-compose 中相关环境变量 - .env.example 中相关配置示例 - deploy-test.sh 中相关检查 - Makefile 中 klingai 语义检查排除规则 - KlingTaskStatus 枚举 修改内容: - model_router.py 移除 KlingAI 平台分支 - voice.py 重写,修复批量合成/文件保存中 service 未定义的 Bug - vidu_service.py 移除 MiniMax 相关注释 - script_handler.py 更新注释
145 lines
4.5 KiB
Makefile
145 lines
4.5 KiB
Makefile
# 美家卡智影 API - 常用命令
|
||
# ==========================
|
||
|
||
.PHONY: help install dev install-hooks update-lock lint format test security clean docker
|
||
|
||
help: ## 显示帮助信息
|
||
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
|
||
|
||
# ========== 依赖管理 ==========
|
||
|
||
install: ## 安装生产依赖(使用 lock 文件)
|
||
uv pip sync requirements.lock
|
||
|
||
dev: ## 安装开发依赖(包含 dev extras)
|
||
uv pip install -e ".[dev]"
|
||
pre-commit install
|
||
|
||
install-hooks: ## 安装 Git pre-commit 钩子
|
||
pre-commit install
|
||
|
||
update-lock: ## 更新 requirements.lock(修改 pyproject.toml 后执行)
|
||
uv pip compile pyproject.toml -o requirements.lock --upgrade
|
||
|
||
update-lock-no-upgrade: ## 重新生成 lock 文件(不升级版本)
|
||
uv pip compile pyproject.toml -o requirements.lock
|
||
|
||
# ========== 代码质量 ==========
|
||
|
||
lint: ## 运行代码检查 (ruff + mypy)
|
||
ruff check app/
|
||
mypy app/
|
||
|
||
format: ## 格式化代码 (black + ruff)
|
||
black app/
|
||
ruff check --fix app/
|
||
|
||
format-check: ## 检查代码格式(不修改)
|
||
black --check app/
|
||
ruff check app/
|
||
|
||
# ========== 测试 ==========
|
||
|
||
test: ## 运行测试
|
||
pytest -v
|
||
|
||
test-cov: ## 运行测试并生成覆盖率报告
|
||
pytest --cov=app --cov-report=html --cov-report=term
|
||
|
||
# ========== 安全扫描 ==========
|
||
|
||
security: ## 运行安全扫描 (bandit + pip-audit)
|
||
@echo "🔍 运行 Bandit 安全扫描..."
|
||
bandit -r app/ -c pyproject.toml
|
||
@echo "🔍 运行依赖漏洞扫描..."
|
||
pip-audit
|
||
|
||
# ========== 开发服务器 ==========
|
||
|
||
run: ## 启动开发服务器
|
||
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
|
||
|
||
scheduler: ## 启动 Async Engine Scheduler
|
||
python -m app.scheduler.main
|
||
|
||
# ========== Docker ==========
|
||
# ⚠️ 注意:db + redis 是共享基础设施(另一个项目管理),
|
||
# 当前项目只管理 api + scheduler,禁止用 docker-compose down。
|
||
|
||
docker: ## 构建 Docker 镜像
|
||
docker build -t meijiaka-api:latest .
|
||
|
||
docker-run: ## 启动 api + scheduler(共享 db/redis,不动基础设施)
|
||
docker-compose -p meijiaka-zj up -d
|
||
|
||
docker-rebuild: ## 强制重建 api + scheduler(代码更新后使用)
|
||
docker-compose -p meijiaka-zj up -d --build --force-recreate api scheduler
|
||
|
||
docker-stop: ## 停止 api + scheduler(保留 db/redis)
|
||
docker-compose -p meijiaka-zj down
|
||
|
||
docker-rm: ## 删除 api + scheduler 容器(保留 db/redis)
|
||
docker-compose -p meijiaka-zj rm -f
|
||
|
||
docker-logs: ## 查看 Docker 日志
|
||
docker-compose logs -f
|
||
|
||
docker-logs-api: ## 查看 api 日志
|
||
docker-compose logs -f api
|
||
|
||
docker-logs-scheduler: ## 查看 scheduler 日志
|
||
docker-compose logs -f scheduler
|
||
|
||
# ========== 清理 ==========
|
||
|
||
clean: ## 清理缓存文件
|
||
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
|
||
find . -type f -name "*.pyc" -delete 2>/dev/null || true
|
||
find . -type d -name ".pytest_cache" -exec rm -rf {} + 2>/dev/null || true
|
||
find . -type d -name ".mypy_cache" -exec rm -rf {} + 2>/dev/null || true
|
||
rm -rf htmlcov/ .coverage 2>/dev/null || true
|
||
|
||
# ========== 语义层防护网 ==========
|
||
|
||
lint-semantic: ## 语义层禁词检查(防止供应商术语泄漏到业务层)
|
||
@echo "🔍 检查 Layer 3+ 是否泄漏供应商术语..."
|
||
@# API 层禁止 element_id 作为字段/参数名
|
||
@errs=$$(grep -rn 'element_id' app/api --include='*.py' \
|
||
| grep -v 'provider_element_id' \
|
||
| grep -v '__pycache__' \
|
||
| grep -v '#' \
|
||
| grep -v '".*element_id.*"' \
|
||
| grep -v "'.*element_id.*'"); \
|
||
if [ -n "$$errs" ]; then \
|
||
echo "$$errs"; \
|
||
echo "❌ API 层发现 element_id(应使用 provider_element_id 或 human_id)"; \
|
||
exit 1; \
|
||
fi
|
||
@# Scheduler 层禁止 task_id 作为内部变量/Redis key(读取 Provider 返回除外)
|
||
@errs=$$(grep -rn '\btask_id\b' app/scheduler --include='*.py' \
|
||
| grep -v 'job_id' \
|
||
| grep -v '__pycache__' \
|
||
| grep -v '\.get("task_id")' \
|
||
| grep -v 'result.get("task_id")' \
|
||
| grep -v 'task_type' \
|
||
| grep -v '"task_id"' \
|
||
| grep -v "'task_id'"); \
|
||
if [ -n "$$errs" ]; then \
|
||
echo "$$errs"; \
|
||
echo "❌ Scheduler 层发现 task_id(应使用 job_id)"; \
|
||
exit 1; \
|
||
fi
|
||
@# Scheduler 层 Redis key 必须使用 job: 而非 task:
|
||
@errs=$$(grep -rn 'redis.*task:' app/scheduler --include='*.py' \
|
||
| grep -v '__pycache__'); \
|
||
if [ -n "$$errs" ]; then \
|
||
echo "$$errs"; \
|
||
echo "❌ Scheduler Redis key 使用 task:(应使用 job:)"; \
|
||
exit 1; \
|
||
fi
|
||
@echo "✅ 语义层检查通过"
|
||
|
||
# ========== CI 检查 ==========
|
||
|
||
ci: format-check lint lint-semantic test security ## 运行所有 CI 检查
|