Your Name 0ef7650c09 feat: 审核体系全面改造 — 多维度评分 + 卖点优先级 + AI 语义匹配 + 品牌方 AI 状态通知
后端:
- 审核结果拆分为 4 个独立维度 (法规合规/平台规则/品牌安全/Brief匹配度)
- 卖点优先级从 required:bool 改为三级 (core/recommended/reference)
- AI 语义匹配卖点覆盖 + AI 整体 Brief 匹配度分析
- BriefMatchDetail 评分详情 (覆盖率+亮点+问题点)
- min_selling_points 代理商可配置最少卖点数 + Alembic 迁移
- AI 语境复核过滤误报
- Brief AI 解析 + 规则 AI 解析
- AI 未配置/异常时通知品牌方
- 种子数据更新 (新格式审核结果+brief_match_detail)

前端:
- 三端审核页面展示四维度评分卡片
- 卖点编辑改为三级优先级选择器
- BriefMatchDetail 展示 (覆盖率进度条+亮点+问题)
- min_selling_points 配置 UI
- AI 配置页未配置时静默处理
- 文件预览/下载/签名 URL 优化

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 19:11:54 +08:00

85 lines
1.8 KiB
TOML

[project]
name = "miaosi-backend"
version = "1.0.0"
description = "秒思智能审核平台后端服务"
requires-python = ">=3.11"
dependencies = [
"fastapi>=0.109.0",
"uvicorn>=0.27.0",
"celery>=5.3.0",
"redis>=5.0.0",
"sqlalchemy>=2.0.0",
"asyncpg>=0.29.0",
"greenlet>=3.0.0",
"httpx>=0.26.0",
"pydantic[email]>=2.5.0",
"pydantic-settings>=2.0.0",
"PyJWT>=2.8.0",
"passlib>=1.7.4",
"alembic>=1.13.0",
"cryptography>=42.0.0",
"openai>=1.12.0",
"cachetools>=5.3.0",
"sse-starlette>=2.0.0",
"pdfplumber>=0.10.0",
"python-docx>=1.1.0",
"openpyxl>=3.1.0",
"PyMuPDF>=1.24.0",
"tos>=2.7.0",
"socksio>=1.0.0",
]
[project.optional-dependencies]
dev = [
"pytest>=8.0.0",
"pytest-asyncio>=0.23.0",
"pytest-cov>=4.1.0",
"httpx>=0.26.0",
"testcontainers>=3.7.0",
"factory-boy>=3.3.0",
"faker>=22.0.0",
"respx>=0.20.0",
"aiosqlite>=0.19.0",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["app"]
[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = "test_*.py"
python_classes = "Test*"
python_functions = "test_*"
asyncio_mode = "auto"
addopts = "-v --tb=short --strict-markers"
markers = [
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
"integration: marks tests as integration tests",
"e2e: marks tests as end-to-end tests",
]
filterwarnings = [
"ignore::DeprecationWarning",
"ignore::jwt.warnings.InsecureKeyLengthWarning",
]
[tool.coverage.run]
source = ["app"]
branch = true
omit = [
"*/migrations/*",
"*/__init__.py",
"*/tests/*",
]
[tool.coverage.report]
exclude_lines = [
"pragma: no cover",
"def __repr__",
"raise NotImplementedError",
"if TYPE_CHECKING:",
]