Files
vscode-workbench/PLANNING/PROGRESS_C-04.md
T

2.6 KiB
Raw Blame History

PROGRESS_C-04 · AI 工具(图片放大最小闭环 + 钱包方案)

日期 2026-09-13 · 范围:chunyu_project/aitool(新建)+ chunyu_project_react

选型

四件套中选图片放大做其一最小闭环:Pillow 本地 LANCZOS 2x/4x, 零 key、零外部依赖——mock 链路即生产链路,不被真实 key 阻塞。

改动

后端(chunyu_project/aitool/,新建 app,已注册 settings + api/aitool/ 路由):

  1. models.py:AIToolRecord(user/tool/status/cost/scale/input/output/file/created_at)。
  2. providers.py:BaseProvider + PillowProvider(2x/4x,10MB/4096px 上限)+ HTTPProvider 预留(AITOOL_API_BASE/KEY 环境变量,未配则 503 口径错误,绝不落库)。
  3. views/upscale_view.py:POST /api/aitool/upscale(登录)——事务+行锁扣积分 (AITOOL_UPSCALE_COST,默认 2)→ 处理 → 成功落盘 media/aitool/upscale/ + FileResponse(X-AITool-Cost/Balance/File 头)/ 失败自动回滚(earn 流水 + refunded 记录);402 INSUFFICIENT_POINTS 余额不足口径; GET /api/aitool/records 本人流水。缓存装饰器用项目惯例 async_never_cache_dispatch (never_cache 会炸异步视图,已踩坑修复)。
  4. migrations/0001_initial.py、admin.py、tests/test_upscale.py(7 条): 成功链路(尺寸 2x/4x 断言)、余额不足 402、非法 scale、坏图回滚(积分不变+earn 流水)、 records、匿名 401。

前端: 5. pages/ImageUpscaler/(新建):上传/2x|4x/预览/下载/扣费确认 + 402 引导签到。 6. utils/request.ts:aitool.upscale(blob)+ getRecords;App.tsx 路由 /utility/image-upscaler;seed 挂 AI 工具 分类 + 金币标注(描述含“2 积分/次”)。 7. docker.env.example:AITOOL_PROVIDER/AITOOL_UPSCALE_COST/API_BASE/API_KEY 说明。

钱包方案(与钱包打通仅做方案不落地计费)

  • 落地:积分(PointTransaction spend/earn,事务 + select_for_update,并发安全)。
  • 不落地:y币/现金计费、异步队列(同步+超时控制,量大再评审 Celery)、本地大模型 (rembg/Real-ESRGAN 留 Phase 2)。key 仅环境变量,grep 全仓无残留(除读取代码与示例注释)。

验证

DB_ENGINE=django.db.backends.sqlite3 DB_NAME=".../dev_db.sqlite3" \
python ".../manage.py" test tool aitool -v 1
# Ran 22 tests … OK(tool 15 + aitool 7)
tsc --noEmit  # 零报错;vite build 成功,ImageUpscaler 独立 chunk

状态

done。遗留:真实网关联调(配 key 切 AITOOL_PROVIDER=http 即切);抠图/证件照/生图三件套待排期。