Skip to content

feat(skills): render final cuts in the cloud on a paid HyperFrames plan - #6884

Merged
miguel-heygen merged 1 commit into
mainfrom
wenbo/skills-cloud-render-on-paid-plan
Oct 31, 2026
Merged

miguel-heygen merged 1 commit into
mainfrom
wenbo/skills-cloud-render-on-paid-plan

Conversation

@Vitozhu04

Copy link
Copy Markdown
Collaborator

What

The agent skills now send the render the person receives through hyperframes cloud render -o <path> when npx hyperframes auth status shows 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-video already gates on a paid plan but rendered locally, and references/cloud.md described local vs cloud with no reference to the plan.

Billing evidence (experiment-framework main):

  • The CLI's OAuth client (packages/cli/src/auth/config.ts:3,12) is a HyperFrames product client: heygen/core/constants/oauth_clients.py:6-7,29-31, so resolve_product returns HYPERFRAMES (heygen/core/constants/product.py:11-15), called from the render route at movio/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, which hf_render_charge.py:22-23 defines 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 Max active/trialing, or an internal plan (heygen/services/payments/hyperframes/plan_holds.py:24,69-81).
  • Without a paid-up plan: a free-tier HeyGen space with no HF plan takes one of the free monthly API renders the MCP and CLI share (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 refused hf_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 reads Free on a paid HeyGen workspace): cloud render --quality draft on a 2 s composition uploaded the zip and was refused at submit, HTTP 402 ... code: hf_subscription_required; no render was created and auth status was unchanged. That is the HF route, not HeyGen OAuth billing.

How

  • skills/hyperframes-cli/SKILL.md: loop step 5 names cloud render -o out.mp4 for 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 --fps unless given and the API defaults to 30, so pass the root's data-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 at cloud.md.
  • skills/reverse-any-video/SKILL.md: the end check renders with cloud 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.json regenerated.

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 resolve
  • bun scripts/lint-skills.ts: no issues
  • bun packages/cli/scripts/gen-skills-manifest.ts --check: in sync
  • oxfmt --check on the changed files
  • Live check on a Pro account (pending the owner's subscribe step)

— wanbi

🤖 Generated with Claude Code

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>
@miguel-heygen
miguel-heygen added this pull request to the merge queue Oct 31, 2026

@heygengenesis heygengenesis 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.

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.

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.

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.

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.

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.

Merged via the queue into main with commit 2b76e9a Oct 31, 2026
62 checks passed
@miguel-heygen
miguel-heygen deleted the wenbo/skills-cloud-render-on-paid-plan branch October 31, 2026 17:42
Vitozhu04 added a commit that referenced this pull request Oct 31, 2026
… 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>
LilMGenius pushed a commit to DaedalGames/hyperframes that referenced this pull request Oct 31, 2026
… 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>
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.

2 participants