fix(pricing): update HeyGen, OpenRouter, and Anthropic pricing - #1314
Conversation
87e9d96 to
b048960
Compare
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughChangesPartner-node pricing pages update model and provider credit tables, add HeyGen pricing, revise localized provider content and metadata, and tighten heading-based translation reuse to avoid positional mismatches. Partner pricing documentation
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 2✅ Passed checks (2 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@tutorials/partner-nodes/pricing.mdx`:
- Around line 303-310: Replace the em-dash placeholders in the Condition column
of the HeyGen pricing table with the approved plain-text placeholder “N/A” or
“None,” including the rows for Talking Photo, Create Avatar, and Text to Speech.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 7de85d1e-caed-49f8-904d-95e4e00fcbda
📒 Files selected for processing (1)
tutorials/partner-nodes/pricing.mdx
b048960 to
b5d5eb3
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@tutorials/partner-nodes/pricing.mdx`:
- Around line 20-22: Update the changed Anthropic and OpenRouter pricing rows in
the pricing table to use the documented 211 credits per dollar conversion,
recalculating each credit value from its public API price. Ensure entries such
as anthropic/claude-fable-5 reflect 2110 input credits per 1M for a $10 price,
or clearly document any intentional markup rule if different rates must remain.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 0a60c5d4-2735-4d89-9042-b998f70053a0
📒 Files selected for processing (1)
tutorials/partner-nodes/pricing.mdx
b5d5eb3 to
1be7707
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@ko/tutorials/partner-nodes/pricing.mdx`:
- Around line 696-733: Remove the stale duplicate Ideogram, Krea, and OpenRouter
pricing sections across ko/tutorials/partner-nodes/pricing.mdx lines 455-486 and
696-733, and zh/tutorials/partner-nodes/pricing.mdx lines 696-733; retain
exactly one updated section for each provider in every ja/, ko/, and zh/ pricing
page, preserving the current model and rate data in the retained sections.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: bc87c2af-c7f7-4a3c-9ce0-c4cc3119a8da
📒 Files selected for processing (4)
ja/tutorials/partner-nodes/pricing.mdxko/tutorials/partner-nodes/pricing.mdxtutorials/partner-nodes/pricing.mdxzh/tutorials/partner-nodes/pricing.mdx
1be7707 to
d2e5b32
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
tutorials/partner-nodes/pricing.mdx (1)
18-25: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winPrune the retired ClaudeNode rows in every pricing page. The refresh added Opus 4.8 / Fable 5 / Sonnet 5 but left the previous Opus 4.7/4.6, Sonnet 4.6/4.5, and Haiku 4.5 rows in place, so each table now stacks new and stale models together, risking outdated or conflicting charges. The English source is the root; translations inherit the clutter, so trim it at the top and let the fix trickle down.
tutorials/partner-nodes/pricing.mdx#L18-L25: remove the superseded rows at Lines 21–25 if the three new models replace them (or explicitly document why both generations remain).ja/tutorials/partner-nodes/pricing.mdx#L69-L76: delete the stale rows at Lines 72–76 after the source is corrected.ko/tutorials/partner-nodes/pricing.mdx#L69-L76: delete the stale rows at Lines 72–76.zh/tutorials/partner-nodes/pricing.mdx#L69-L76: delete the stale rows at Lines 72–76.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tutorials/partner-nodes/pricing.mdx` around lines 18 - 25, Remove the superseded ClaudeNode pricing rows for Opus 4.7/4.6, Sonnet 4.6/4.5, and Haiku 4.5 from the source table in tutorials/partner-nodes/pricing.mdx (lines 18-25), retaining the newly added Opus 4.8, Fable 5, and Sonnet 5 rows. Apply the same stale-row removal in ja/tutorials/partner-nodes/pricing.mdx (lines 69-76), ko/tutorials/partner-nodes/pricing.mdx (lines 69-76), and zh/tutorials/partner-nodes/pricing.mdx (lines 69-76) so all translations match the corrected English source.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@tutorials/partner-nodes/pricing.mdx`:
- Around line 702-703: Synchronize the Opus 4.7 pricing rows across the
OpenRouter tables in the English and ja/ko/zh locale copies. Update the rows
identified by anthropic/claude-opus-4.7 to use the intended rate consistently,
including both split rows in translated tables, and align them with the
ClaudeNode table’s 1055 / 5275 per 1M values.
---
Outside diff comments:
In `@tutorials/partner-nodes/pricing.mdx`:
- Around line 18-25: Remove the superseded ClaudeNode pricing rows for Opus
4.7/4.6, Sonnet 4.6/4.5, and Haiku 4.5 from the source table in
tutorials/partner-nodes/pricing.mdx (lines 18-25), retaining the newly added
Opus 4.8, Fable 5, and Sonnet 5 rows. Apply the same stale-row removal in
ja/tutorials/partner-nodes/pricing.mdx (lines 69-76),
ko/tutorials/partner-nodes/pricing.mdx (lines 69-76), and
zh/tutorials/partner-nodes/pricing.mdx (lines 69-76) so all translations match
the corrected English source.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 644d5ecc-80e2-4457-a39c-e572d69a58fa
📒 Files selected for processing (4)
ja/tutorials/partner-nodes/pricing.mdxko/tutorials/partner-nodes/pricing.mdxtutorials/partner-nodes/pricing.mdxzh/tutorials/partner-nodes/pricing.mdx
d2e5b32 to
443fe2e
Compare
…d/Pixverse) and KO (Kling/Pixverse/Tripo)
…h table headers, row labels, and descriptions in ZH/JA/KO
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
.github/scripts/i18n/translate-i18n.ts (1)
797-800: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winDon’t let the positional gremlin reuse content on failures.
The initial pass now maps heading sections by stored label order, but
existingByIndex[i]is still used as the translation reference and as the fallback when validation fails. If an existing label is missing/shifted on the EN side, a later section can reuse the previous target section’s content on retry. Derive the header-section fallback fromstoredLabels/targetHeadingSectionsinstead ofexistingByIndex, or make the fallback fail-fast. No more Tencent-to-Topaz tag-teaming!🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/scripts/i18n/translate-i18n.ts around lines 797 - 800, Update the heading_sections branch in the existingBlock selection so fallback content is derived from storedLabels/targetHeadingSections rather than existingByIndex[i]. Ensure missing or shifted English labels cannot reuse a neighboring section’s content during validation retries; use a fail-fast empty fallback if no matching stored section exists. Keep the non-heading_sections label lookup unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@ko/tutorials/partner-nodes/pricing.mdx`:
- Line 448: Remove the stray leading pipe from the Ideogram header row at
ko/tutorials/partner-nodes/pricing.mdx lines 448-448 and the DALL·E separator
row at lines 673-673, so both rows begin with a single pipe and align with their
tables.
- Around line 775-777: Insert a blank line between the two Korean explanatory
sentences and another blank line before the Pixverse table beginning with “| 모델
|”. Preserve the existing text and table content while matching the spacing used
by the corresponding ja/zh sections.
- Around line 479-515: Remove the surplus leading `작업` cell from every data row
in the affected Kling tables: `kling-video-o1`, `kling-v3-omni`, and the
generation rows under `kling-v3`. Make each row begin with its actual operation
value (`생성` or `비디오 → 비디오, 편집`) so it matches the three- or four-column header
and preserves the credit-per-second value.
In `@tutorials/partner-nodes/pricing.mdx`:
- Line 715: Split the combined x-ai/grok-4.20 and x-ai/grok-4.3 entry into two
separate pricing-table rows, preserving the same input and output prices for
each model ID and keeping each Model cell valid.
- Around line 14-18: Add a concise partner-credit conversion formula/markup note
beneath the relevant pricing sections in the pricing documentation, explicitly
showing how listed dollar prices convert to credits for both token-based
OpenRouter/Claude entries and the HeyGen per-second/run entries. Keep the
existing pricing tables unchanged and make the arithmetic auditable without
investigating or documenting the markup’s origin.
---
Outside diff comments:
In @.github/scripts/i18n/translate-i18n.ts:
- Around line 797-800: Update the heading_sections branch in the existingBlock
selection so fallback content is derived from storedLabels/targetHeadingSections
rather than existingByIndex[i]. Ensure missing or shifted English labels cannot
reuse a neighboring section’s content during validation retries; use a fail-fast
empty fallback if no matching stored section exists. Keep the
non-heading_sections label lookup unchanged.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 91b5387c-c7a6-4e41-92e0-2e13dce9b654
📒 Files selected for processing (5)
.github/scripts/i18n/translate-i18n.tsja/tutorials/partner-nodes/pricing.mdxko/tutorials/partner-nodes/pricing.mdxtutorials/partner-nodes/pricing.mdxzh/tutorials/partner-nodes/pricing.mdx
| | Model | Input credits / 1K | 5m Cache Write credits / 1K | 1h Cache Write credits / 1K | Cache Hit credits / 1K | Output credits / 1K | | ||
| | :--------- | -----------------: | --------------------------: | --------------------------: | ---------------------: | :------------------ | | ||
| | Opus 4.8 | 1.509 | 1.886 | 3.017 | 0.151 | 7.543 | | ||
| | Fable 5 | 3.017 | 3.772 | 6.035 | 0.302 | 15.087 | | ||
| | Sonnet 5 | 0.603 | 0.754 | 1.207 | 0.060 | 3.017 | |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Files matching pricing.mdx:"
fd -a 'pricing\.mdx$' . | sed 's#^\./##'
file="$(fd 'pricing\.mdx$' . | head -n 1)"
if [ -n "${file:-}" ]; then
echo
echo "Line count:"
wc -l "$file"
echo
echo "Relevant sections around requested line ranges:"
for start in 1 260 600 680; do
end=$((start+45))
echo "--- $start-$end ---"
sed -n "${start},${end}p" "$file" | nl -ba -v "$start"
done
fi
echo
echo "Search credit conversion/markup terms in file:"
rg -n "credit|Credits|USD|211|301|markup|Provider|OpenRouter|HeyGen|OpenAI|Anthropic" "$file" || trueRepository: Comfy-Org/docs
Length of output: 571
🏁 Script executed:
#!/bin/bash
set -euo pipefail
file="tutorials/partner-nodes/pricing.mdx"
echo "file=$file"
wc -l "$file"
echo
for range in "1,50" "255,315" "595,635" "690,740"; do
echo "--- lines ${range} ---"
sed -n "${range}p" "$file" | awk '{printf "%6d %s\n", NR+offset, $0}' offset=0
done
echo
echo "Credit conversion related terms:"
rg -n -i "credit|credits|USD|usd|211|301|markup|partner|Provider|OpenRouter|HeyGen|OpenAI|Anthropic" "$file" || true
echo
echo "Markdown table rows in Anthropic/OpenRouter/HeyGen sections:"
python3 - <<'PY'
from pathlib import Path
p=Path("tutorials/partner-nodes/pricing.mdx")
lines=p.read_text().splitlines()
for header in ["## Anthropic","## HeyGen","## OpenAI","## OpenRouter"]:
print(f"--- {header} ---")
for i,l in enumerate(lines,1):
if l.startswith(header):
start=i
end=i+80
for row in lines[start-1:end]:
if row.strip().startswith("|"):
print(f"{row}")
PYRepository: Comfy-Org/docs
Length of output: 43853
🏁 Script executed:
#!/bin/bash
set -euo pipefail
file="tutorials/partner-nodes/pricing.mdx"
echo "Mathematical relationships in pricing rows:"
python3 - <<'PY'
from pathlib import Path
import re
def parse_number(s):
s = s.strip()
if not s or s == "~":
return None
# take first signed float in string
m = re.search(r'([+-]?\d+(?:\.\d+)?)', s)
return float(m.group(1)) if m else None
for header in ["## Anthropic","## HeyGen","## OpenAI","## OpenRouter","## Beeble","## BFL","## Kling","## Seed","## Hunyuan3D: Embeds"]:
lines = Path(file).read_text().splitlines()
print(f"\n--- {header} ---")
hits = []
for i,l in enumerate(lines):
if l.strip() == header:
section_start = i
for j in range(section_start+1, min(section_start+80, len(lines))):
row = lines[j].strip()
if j == section_start + 1 or not row.startswith("|"):
continue
if header == "## OpenRouter" and not row.startswith("| anthropic"):
continue
if header == "## OpenRouter" and not re.match(r"^ anthropic/claude-", row.split("|",3)[2].strip()):
continue
values = [x.strip() for x in row.split("|") if x.strip() and x != row]
nums = parse_number(values[-1])
if nums and (nums < 10 or header in ("## Beeble","## BFL","## Hunyuan3D: Embeds")):
hits.append((j+1, nums))
print(hits)
ratios = [x/0.211 if y < 0.212 else y/x for x,y in zip(hits, hits[1:]) if x and y]
print("first two ratio (x1 or next/value):", ratios[:2])
PY
echo
echo "Nearby credit conversion notes anywhere:"
rg -n "credits per USD|credits/USD|USD to credit|credit conversion|211 credits|301|markup|partner markup|Partner Node" tutorials/partner-nodes/pricing.mdx . --glob '!**/.git/**' --glob '!**/node_modules/**' | head -n 200Repository: Comfy-Org/docs
Length of output: 308
🏁 Script executed:
#!/bin/bash
set -euo pipefail
file="tutorials/partner-nodes/pricing.mdx"
echo "Mathematical relationships for Anthropic credit values:"
python3 - <<'PY'
from pathlib import Path
import re
def parse_number(s):
s = s.strip()
if not s or s == "~":
return None
m = re.search(r'%([+-]?\d+(?:\.\d+)?)%|(?:sora-v3|sora-2)-0626', s)
if m:
return float(m.group(1))
s = m.group(2) if m else s
m = re.search(r'^([+-]?\d+(?:\.\d+)?)', s)
return float(m.group(1)) if m else None
text = Path("tutorials/partner-nodes/pricing.mdx").read_text().splitlines()
sections = {"# Anthropic": None, "## OpenRouter": None, "## HeyGen": None}
for i, line in enumerate(text):
if line in sections:
sections[line] = i
print("# Anthropic numeric rows:")
for i in range(sections["# Anthropic"]+1, sections["## OpenRouter"]):
line = text[i].strip()
if not line.startswith("|") or "Model" in line:
continue
nums = sorted({parse_number(part) for part in line.split("|") if parse_number(part)}, key=lambda x: (x is None, x))
print(f"{i+1}: {nums}")
print("\n## OpenRouter Anthropic numeric rows:")
for i in range(sections["## OpenRouter"]+1, len(text)):
line = text[i].strip()
if not line.startswith("|") or "Model" in line:
continue
if not re.match(r"^ anthropic/claude", line.split("|",3)[2].strip()):
continue
nums = [parse_number(part) for part in line.split("|") if parse_number(part)]
print(f"{i+1}: {nums}")
print("\n## HeyGen numeric rows:")
for i in range(sections["## HeyGen"]+1, len(text)):
line = text[i].strip()
if not line.startswith("|") or "HeyGen" in line:
continue
nums = [parse_number(part) for part in line.split("|") if parse_number(part)]
if nums:
print(f"{i+1}: {nums}")
PY
echo
echo "All credit conversion/market markup references:"
rg -n -i "credits per (?:USD|dollar)|credit conversion|211 credits|301|markup|partner markup|Partner Node" tutorials/partner-nodes/pricing.mdx --glob '!**/.git/**' --glob '!**/node_modules/**' || trueRepository: Comfy-Org/docs
Length of output: 375
🌐 Web query:
OpenRouter Claude Opus 4.8 $5 $25 per 1M tokens
💡 Result:
As of July 23, 2026, the pricing for Claude Opus 4.8 on OpenRouter is $5.00 per 1 million input tokens and $25.00 per 1 million output tokens [1][2][3]. This pricing structure is consistent with Anthropic's official rates [4][5]. OpenRouter maintains a "no markup on inference" policy, meaning the rates charged are the pass-through provider rates [6]. Key details regarding Claude Opus 4.8 on OpenRouter include: - Context Window: 1 million tokens [1][2]. - Fast-Mode Variant: There is also a "Claude Opus 4.8 (Fast)" model available, which offers identical capabilities but provides higher output speeds at double the price ($10.00/1M input and $50.00/1M output) [7][3][5]. - Effective Pricing: Actual costs can be significantly lower than the listed rates due to prompt caching, depending on the amount of repeated context sent in requests [2][8]. It is important to note that while OpenRouter does not add a markup to the inference cost itself, users should be aware of platform-level fees, such as a 5.5% credit card processing fee for top-ups or potential 5% charges for "Bring Your Own Key" (BYOK) usage over 1 million tokens per month [6].
Citations:
- 1: https://openrouter.ai/anthropic/claude-opus-4.8/pricing
- 2: https://openrouter.ai/anthropic/claude-opus-4.8
- 3: https://tokenrate.dev/blog/comparisons/opus-4-8-vs-gpt-5-5-vs-gemini-3-5-flash-price-comparison
- 4: https://platform.claude.com/docs/en/about-claude/pricing?hsLang=en
- 5: https://tokenrate.dev/providers/anthropic
- 6: https://dev.to/owen_fox/openrouter-pricing-2026-complete-model-cost-guide-hidden-markup-breakdown-4opm
- 7: https://openrouter.ai/anthropic/claude-opus-4.8-fast
- 8: https://openrouter.ai/anthropic/claude-4.8-opus-20260528
Add the partner-credit conversion formula to the pricing doc.
This page lists values in credits without saying how prices become credits. The OpenRouter/Claude rows match $5/$25 per 1M, but the listed credits equal ~1508.65/7543.25; HeyGen shows $0.05/sec and 301.73/run mapping to 15.09 and 301.73. Add a short formula/markup note under the relevant sections so users can audit charges. No markup archaeology required, just keep the price math visible so users do not get lost in the credits forest.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@tutorials/partner-nodes/pricing.mdx` around lines 14 - 18, Add a concise
partner-credit conversion formula/markup note beneath the relevant pricing
sections in the pricing documentation, explicitly showing how listed dollar
prices convert to credits for both token-based OpenRouter/Claude entries and the
HeyGen per-second/run entries. Keep the existing pricing tables unchanged and
make the arithmetic auditable without investigating or documenting the markup’s
origin.
Summary
Updated the partner node pricing page with new providers and price changes from recent ComfyUI PRs.
Changes
New Section — HeyGen
Added 5 HeyGen nodes with per-second/per-run pricing. Source: PR #14958.
Anthropic — New Models
Added 3 new Claude models from PR #15023: Opus 4.8, Fable 5, Sonnet 5 with cache pricing.
OpenRouter — Full Rewrite
Updated all model prices and added new models from PR #15021: Claude Opus 4.8, Fable 5, Sonnet 5, Haiku 4.5, GPT-5.6 family (sol/terra/luna), Grok 4.5, Kimi K3.
Checklist