Skip to content

feat(video): 被授权的账号默认就用高质量型号 - #832

Merged
xiaocheny214 merged 2 commits into
1024XEngineer:mainfrom
johnnyzhang-eng:feat/premium-account
Aug 28, 2026
Merged

feat(video): 被授权的账号默认就用高质量型号#832
xiaocheny214 merged 2 commits into
1024XEngineer:mainfrom
johnnyzhang-eng:feat/premium-account

Conversation

@johnnyzhang-eng

Copy link
Copy Markdown
Contributor

让白名单账号默认拿受限型号,不必自己去选。

Why

AI_VIDEO_VEO_USER_IDS 已在生产配好,但白名单里的账号有权限却用不上video_model 是请求体字段,而前端从不发它frontend/src 全仓搜不到 video_model / videoModel),于是 _resolve_video_model(None, uid) 返回 None → 走部署默认。

生产实测(近三天)默认那个型号的表现:agnes-video-2.5-flash 成功 1 次;实际出片一直靠兜底链上的 kling-v2-5-turbo(106 成功 / 252 失败)。也就是说白名单开了等于没开。

Changes

_resolve_video_model 在未指定型号时调 preferred_model_for(user_id):白名单用户拿受限型号,其他人拿 None(照旧走部署默认,行为一字不变)。

边界

  • 只对白名单生效。受限型号按秒计费、比链上的贵一档,不能变成所有人的默认值。
  • 显式指定优先:白名单用户仍可显式选链上的便宜型号(做对照时需要)。
  • 空白名单 = 谁都不升舱:忘配的方向是「没人拿到」,不是「所有人升舱」。
  • 多个受限型号时取登记顺序第一个,不做「挑最贵/最新」的推断 —— 那种规则会在加型号时静默改变已有用户的默认值,而账单要过一天才看得出来。

Verification

  • 7 条新用例,反向验证(去掉默认升舱)真红 2 条。
  • uv run ruff check .:All checks passed。
  • uv run python -m scripts.export_openapi:rc=0,openapi.json 无漂移。
  • uv run lint-imports:Contracts: 2 kept, 0 broken。
  • uv run pytest -q --cov=packages1837 passed, 14 skipped, 0 failed

Closes #830

@vercel

vercel Bot commented Aug 27, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
windup Ignored Ignored Preview Aug 28, 2026 2:31am

@codecov

codecov Bot commented Aug 27, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 76.92308% with 3 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...es/framework/src/windup_framework/gateway/video.py 57.14% 3 Missing ⚠️

Impacted file tree graph

@@            Coverage Diff             @@
##             main     #832      +/-   ##
==========================================
- Coverage   86.46%   86.45%   -0.02%     
==========================================
  Files         298      298              
  Lines       22600    22610      +10     
  Branches     3402     3402              
==========================================
+ Hits        19541    19547       +6     
- Misses       2109     2111       +2     
- Partials      950      952       +2     
Flag Coverage Δ
backend 91.35% <76.92%> (-0.01%) ⬇️
frontend 80.50% <ø> (-0.02%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
...app/src/windup_app/server/orchestrator/executor.py 76.46% <100.00%> (ø)
...framework/src/windup_framework/gateway/registry.py 96.15% <100.00%> (+0.26%) ⬆️
...es/framework/src/windup_framework/gateway/video.py 81.67% <57.14%> (-0.43%) ⬇️

... and 3 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审阅了默认型号解析、Gateway 路由链、用户白名单校验及相关测试。当前实现会把白名单用户解析为 veo3.1,但下游视频 Gateway 的 registry 明确将所有 USER_GATED_MODELS 从自动链中排除;因此 start_from_model="veo3.1" 不会被采用,实际仍从部署默认的链上型号开始,Issue 目标未在真实生成路径生效。

已完成固定 SHA diff 的全量变更单元检查及 git diff --check;本环境没有安装 uvpytestruff,因此无法执行声明的测试与 lint 命令。

Comment thread backend/packages/app/src/windup_app/server/orchestrator/executor.py
@johnnyzhang-eng

Copy link
Copy Markdown
Contributor Author

已 rebase 到最新 main,冲突解完,CI 全绿(check-runs 级:lint-and-test / Frontend checks / gate / Check linked issue 全 success)。

冲突只有一处,是 gateway/video.py 的 import 行:main 上新加了 UpstreamExhaustedError,本分支加了 USER_GATED_MODELS —— 两条各加各的、互不覆盖,都保留。事后核过:无文件消失,两个符号都有真实使用方(video.py:136:151)。

顺带补一份支持这个改动的线上实测。当前白名单是配好的,但它一步都没生效:

线上 veo 白名单            = [1, 2, 3]        ← 三个账号确实在里面
线上有 preferred_model_for = False            ← 本 PR 这段还没上

前端发过 video_model 吗    = 一处都没有       ← 全仓 grep 零命中
任务里 video_model 的取值  = (未传) × 558     ← 558/558
网关跑过的视频型号         = kling-v2-5-turbo 356 / agnes-video-2.5-flash 21 / …
                             veo3.1 → 0 次

三个被授权的账号一共跑了 430 个任务(354 / 60 / 16),全部走部署默认型号。也就是说白名单目前是纯装饰:既没有 UI 让他们选 veo,也没有本 PR 的默认升舱去替他们选。

这正是本 PR commit message 里那句话的实测版本 ——「点生成,走的仍是部署默认型号,白名单形同虚设」。

白名单本来只是"允许选",而前端从不发 video_model —— 2026-08-27 实测生产:
AI_VIDEO_VEO_USER_IDS 已配好,但前端全仓搜不到这个字段,于是被授权的人在产品里点
生成,走的仍是部署默认型号,白名单形同虚设。

这几个账号存在的意义就是做高质量素材,让他们再去某个下拉框里挑一次是多余的一步,
而漏挑一次就白跑一单。只对白名单生效:其他人这里仍返回 None、照旧走部署默认,
行为一个字不变。

有多个受限型号时取登记顺序的第一个,不做"挑最贵的/最新的"这类推断 —— 那种规则会在
加型号时静默改变已有用户的默认值,而账单要过一天才看得出来。

Closes 1024XEngineer#830
FennoAI 指出:VideoGateway.i2v 只在 start_from_model in chain 时才认它,而 _admitted()
恰恰把受限型号从链上滤掉了(链是兜底路径) —— 条件恒假、models 回落成整条链,授权用户
照旧走部署默认。授权、白名单、默认升舱三层全部形同虚设,而任务照常成功、产物照常交付,
没有任何一处显示你要的那个型号没被用上。

调用方能拿到受限型号,只说明这一次请求已经过了授权闸(HTTP 入口与编排层各判了一次),
故把它排到尝试序列队首,后面仍按原链兜底。链上型号的从它开始试语义不变。
@xiaocheny214
xiaocheny214 self-requested a review August 28, 2026 02:37
@xiaocheny214
xiaocheny214 merged commit 0846d2b into 1024XEngineer:main Aug 28, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(video): 被授权的账号默认就用高质量型号(白名单开了却用不上)

2 participants