Repository navigation
feat(skills): render final cuts in the cloud on a paid HyperFrames plan - #6884
Conversation
When `auth status` shows a paid HyperFrames plan, the render the person receives goes through `hyperframes cloud render -o <path>`; authoring checks stay local, Free keeps local renders unless the person asks, and a refused or failed cloud render falls back to a local one with the reason. reverse-any-video, which already requires a paid plan, now renders and diffs the cloud output; the detach guidance stays for the local fallback. — wanbi Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Verdict: REQUEST CHANGES · 1 blocker · 1 important · 0 nits · 2333617
Billing claims and the auth status strings check out (status.ts:275-308), and so do the CLI limits (integer --fps only, aspect auto-detected from 16:9/9:16/1:1). The gap is the command itself: as written, a paid user's final comes out at a different frame rate and lower quality than today's local delivery render. Details inline. Additive to @miguel-heygen's approval.
Scope
Read all 5 files at head. Checked packages/cli/src/commands/cloud/render.ts (fps default 30, quality default standard, aspect detection), auth/status.ts, render/plan.ts and engine/.../chunkEncoder.ts (standard = CRF 18, high = CRF 15; local looks = CRF 16). The Actions runs at the head are green, and check-core-skills passes locally. Not verified: a live paid-plan render.
— Genesis (for Wenbo)
| 3. `npx hyperframes snapshot` and read the PNGs (under `.hyperframes/artifacts/snapshots/`): that is how you see the video. With sub-compositions, snapshot a midpoint of every scene; tiny unstyled content or a missing hero is a mount defect (`../hyperframes/references/format.md`). | ||
| 4. `npx hyperframes preview --background`, check the URL answers 200, give the person the project URL and wait, unless they asked for the file or for no stops. Passing checks alone is not a reason to render. | ||
| 5. When it is time to render (step 4): `npx hyperframes render --quality looks --output out.mp4` (`draft` while iterating, `delivery` for the final). Confirm the file is non-empty and its `ffprobe` duration matches the root `data-duration`, then look at decoded frames. | ||
| 5. When it is time to render (step 4): `npx hyperframes render --quality looks --output out.mp4` (`draft` while iterating, `delivery` for the final, or `cloud render -o out.mp4` on a paid plan). Confirm the file is non-empty and its `ffprobe` duration matches the root `data-duration`, then look at decoded frames. |
There was a problem hiding this comment.
blocker: this is the command agents copy, and it has no --fps. cloud render defaults to 30 (cloud/render.ts:122) where local render uses the root's data-fps, so a 24 or 60 fps composition comes out at 30 on a paid plan. The step-5 ffprobe duration check still passes, so nothing catches it. The rule is only in cloud.md, which step 5 doesn't link to. Fix: cloud render --fps <data-fps> --quality high -o out.mp4 (see the quality note on cloud.md). The entry is at 7167/7168 B, so this needs a trim somewhere else, e.g. shorten the row rename at :63.
| - **`hyperframes lambda render`**: bring-your-own-AWS distributed rendering with chunked parallelism. Only worth it when you've already invested in AWS (see `lambda.md`). | ||
| - **`hyperframes cloudrun render`**: bring-your-own-GCP distributed rendering through Cloud Run and Workflows. Use only when GCP ownership is explicit (see `cloudrun.md`). | ||
|
|
||
| **Final renders on a paid plan.** When `npx hyperframes auth status` shows `Billing: HyperFrames` and a paid plan on its `HyperFrames:` line (not `Free`), the render the person receives, final or shareable, is `cloud render -o <path>`. On Free, render locally unless the person asks for cloud. Pass the root's `data-fps` as `--fps` (cloud defaults to 30); a fractional rate, or a frame that is not 16:9, 9:16 or 1:1, renders locally. If the cloud render is refused or fails (network, quota), render locally and tell the person why. |
There was a problem hiding this comment.
important: the final used to be local --quality delivery (= high, CRF 15). cloud render defaults to standard (cloud/render.ts:123; the engine preset is CRF 18), so moving the final to the cloud quietly lowers its quality for exactly the users who pay. Spell out --quality high here alongside --fps. The reverse-any-video diff render can stay at the default.
… quality Follow-up to #6884 from its review: the cloud command agents copy had no --fps, so a 24 or 60 fps composition rendered at 30, and cloud's default `standard` is below the local `delivery` final. Step 5 and cloud.md now spell out `cloud render --fps <data-fps> --quality high -o <path>`; the render table uses `-o` to stay within the entry's byte budget and restores the "Hosted, no local Chrome or FFmpeg" row. — wanbi Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… quality (heygen-com#6886) * fix(skills): paid-plan cloud final keeps the composition fps and high quality Follow-up to heygen-com#6884 from its review: the cloud command agents copy had no --fps, so a 24 or 60 fps composition rendered at 30, and cloud's default `standard` is below the local `delivery` final. Step 5 and cloud.md now spell out `cloud render --fps <data-fps> --quality high -o <path>`; the render table uses `-o` to stay within the entry's byte budget and restores the "Hosted, no local Chrome or FFmpeg" row. — wanbi Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(skills): pin --fps and --quality high on the paid-plan cloud final Review on heygen-com#6886: a later byte-budget trim of hyperframes-cli/SKILL.md or cloud.md could drop the flags silently. The test asserts both files' paid-plan command reads `cloud render --fps <data-fps> --quality high -o …`. — wanbi Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
What
The agent skills now send the render the person receives through
hyperframes cloud render -o <path>whennpx hyperframes auth statusshows a paid HyperFrames plan. Previews, snapshots and draft checks stay local; on Free the default stays local unless the person asks for cloud; a refused or failed cloud render falls back to a local one and the agent says why.Why
Owner request (Wenbo): if the person has a HyperFrames subscription, render in the cloud.
reverse-any-videoalready gates on a paid plan but rendered locally, andreferences/cloud.mddescribed local vs cloud with no reference to the plan.Billing evidence (experiment-framework
main):packages/cli/src/auth/config.ts:3,12) is a HyperFrames product client:heygen/core/constants/oauth_clients.py:6-7,29-31, soresolve_productreturnsHYPERFRAMES(heygen/core/constants/product.py:11-15), called from the render route atmovio/api_service/app/controller/hyperframes_v3.py:134.create_render,movio/api_service/app/service/hyperframes_api_render.py:785-786:if product is Product.HYPERFRAMES and hyperframes_plan_paid_up(space_id): billing_mode = HF_PLAN_RENDER_BILLING_MODE, whichhf_render_charge.py:22-23defines as "A render by a payer holding a HyperFrames plan ... it is neither admitted nor charged." The workflow skips the deduction for it (heygen/temporal/workflow/product/hyperframe_render_streaming_workflow.py:381-383). Paid-up means Pro or Maxactive/trialing, or an internal plan (heygen/services/payments/hyperframes/plan_holds.py:24,69-81).hyperframes_api_render.py:700-706,789-794); otherwise the render is admitted against and charged to the HF usage pool (:795-796,hf_render_charge.py:45-83), and a shortfall with no HF plan is refusedhf_subscription_required(heygen/services/payments/hyperframes/usage_refusals.py:39-47).Live dev check (CLI 0.8.223,
HYPERFRAMES_ENV=dev, an account whose HF line readsFreeon a paid HeyGen workspace):cloud render --quality drafton a 2 s composition uploaded the zip and was refused at submit,HTTP 402 ... code: hf_subscription_required; no render was created andauth statuswas unchanged. That is the HF route, not HeyGen OAuth billing.How
skills/hyperframes-cli/SKILL.md: loop step 5 namescloud render -o out.mp4for the final on a paid plan; the "Render where" hosted row now reads "Paid-plan finals, hosted" (the entry was 37 B under its 7168 B budget, hence the terse wording).skills/hyperframes-cli/references/cloud.md: a "Final renders on a paid plan" paragraph with the rule, the Free default, the fallback, and two cloud limits the agent has to respect: the CLI sends no--fpsunless given and the API defaults to 30, so pass the root'sdata-fps; a fractional rate or an aspect other than 16:9, 9:16 or 1:1 renders locally.skills/hyperframes-cli/references/preview-render.md: the "Where to render" line points paid-plan finals atcloud.md.skills/reverse-any-video/SKILL.md: the end check renders withcloud render --fps <data-fps> -o <out>and diffs that file; the 10-minute foreground / detached guidance is kept for the local fallback only.skills-manifest.jsonregenerated.No prices or credit numbers added.
Test plan
node scripts/check-core-skills.mjs: within budget (hyperframes-cli 7167/7168 B, reverse-any-video 5090/5120 B), commands and paths resolvebun scripts/lint-skills.ts: no issuesbun packages/cli/scripts/gen-skills-manifest.ts --check: in syncoxfmt --checkon the changed files— wanbi
🤖 Generated with Claude Code