{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
assets
Create or reuse an asset over existing bytes
Zero-byte fast-path: creates or reuses an asset over a blob the
platform already has, identified by its blake3 hash.
On Comfy Cloud, the caller must already own the content in the
current workspace. Content owned only by another member of that
workspace does not satisfy the ownership check and returns 404blob_not_found, just like an absent hash. A matching caller-owned
Cloud asset is reused with 200, created_new: false and its UUID,
name and tags, even when the request supplies a different valid
file_path or tags.
On a deployment, reuse matches both the hash and the exact path in
the build’s scope. A match returns 200 with created_new: false;
a different path over content the caller may use creates a new
reference with 201 and created_new: true. The self-hosted proxy
returns its existing hash-indexed record with 200 and
created_new: false, without applying the requested path or tags.
Reuse keeps the existing name and tags. Cloud and deployment
validation still applies to submitted metadata before reuse;
metadata is not exempt from validation because it will not replace
stored values. Retention may refresh, and content URLs are generated
for the response, so reuse does not promise an unchanged response.
Trust boundary: resolves only against blobs the platform itself
ingested and hashed, and only those the calling account is authorized
to use — the client hash is a lookup key, never an authority to
register new content. A miss and “exists but not yours” are
deliberately indistinguishable (404blob_not_found).
The lookup key is the hash an upload returned, which is the hash of
the stored bytes. When location metadata was removed from an image
before it was stored, that differs from the client’s digest of the
file it sent, and the client’s digest finds nothing.
Authorization: Bearer <credential>. The credential is one of: an account-scoped API key (comfyui-…), accepted on Cloud and serverless; a Comfy Cloud session JWT; or an OAuth access token issued for the Comfy Cloud resource. Which kinds a given deployment accepts is deployment configuration — an API key always works on Cloud and serverless, and a deployment that does not accept JWT bearers answers 401 with a message saying so. Self-hosted accepts unauthenticated requests by default and can be configured with a static bearer token.
Placement path / filename for a new reference. Comfy Cloud uses its last segment as the name; a deployment uses the full path. Both default to the bare hash digest when omitted or empty. Cloud reuse keeps the existing name even if a different valid path is supplied; a deployment also matches the path when deciding reuse. The self-hosted proxy keeps its indexed record's path. On Comfy Cloud a file_path that fails path validation, or whose last segment breaks the file_path rules of POST /api/v2/assets, is answered with 404 blob_not_found, the same as an unknown hash. The UTF-8 rule cannot fire here: invalid UTF-8 bytes and lone surrogate escapes (\ud800) are replaced with U+FFFD when the JSON body is decoded, so such a name is stored with U+FFFD in their place.
Tags for a new reference; reuse keeps the existing tags. Comfy Cloud defaults an omitted or empty set to input. Cloud and deployment validation still applies on reuse; the self-hosted proxy does not apply submitted tags. A create carries at most 64 tags, each a non-empty UTF-8 string of at most 256 bytes (surrounding whitespace included) with no NUL byte. A deployment adds input to every asset and counts it, so it takes at most 63 of the caller's own; the model_type: tags derived for a model asset are not counted. A tag set breaking a limit is refused with 422. Invalid UTF-8 or a lone surrogate escape (e.g. \ud800) inside a JSON-encoded tag is not refused: JSON decoding replaces it with U+FFFD (3 bytes each), and the 256-byte limit applies to the replaced value.
Optional retention override in seconds (60s–7d): the asset's expires_at becomes now + expires_in, replacing the platform's default retention. Implementations without configurable retention ignore it. The bounds apply to this override only — the platform default is operator-configured and may lie outside them.
必填范围: 60 <= x <= 604800
示例:
86400
响应
An existing asset was reused under the serving surface's rules above; created_new is false. Its UUID, name and tags are kept; retention may refresh and content URLs are generated for this response.
A user-owned record identified by a server-assigned UUID, backing an immutable blob whose content carries a server-computed blake3 hash. hash may be computed lazily: an asset record (and its retrievable bytes) can exist before its hash is filled in. On an output, job_metadata carries the labels its producing job was submitted with, so code holding only the asset knows which run it came from. It is absent for assets no job produced, for outputs of a job sent without labels, where the serving surface keeps no job labels, and when the labels could not be read: so job_id without job_metadata does not prove the job had no labels. A create whose file path and bytes match an existing output answers with that output, so its job_id and job_metadata are the output's.
On POST /api/v2/assets responses, distinguishes a brand-new blob (true) from a dedup hit against bytes the platform already had (false). On POST /api/v2/assets/from-hash responses, true means a new asset reference was created over existing bytes (201); false means an existing asset was reused (200).
Retention deadline for the asset itself (distinct from url_expires_at, the signed URL's validity). Null or absent means the asset is non-expiring. On a dedup-hit create response the deadline may be later than now + the requested/default retention: re-referencing content extends its retention, never shortens it.
The labels the producing job was submitted with, read through job_id on each read. Absent for assets no job produced, for outputs of a job sent without labels, where the serving surface keeps no job labels, when the job is gone, and when the labels could not be read: so job_id without job_metadata does not prove the job had no labels.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"ComfyUI","colors":{"primary":"#49378B","light":"#F2FF59","dark":"#F2FF59"},"logo":{"light":"https://mintcdn.com/dripart/WCFdTagRdhtvk9-o/logo/light.svg?fit=max\u0026auto=format\u0026n=WCFdTagRdhtvk9-o\u0026q=85\u0026s=ec112de87239058f5a931a7e4b594965","dark":"https://mintcdn.com/dripart/QzWbjSCBG7w61rR3/logo/dark.svg?fit=max\u0026auto=format\u0026n=QzWbjSCBG7w61rR3\u0026q=85\u0026s=62b4d879fb3aadbd7a468d1539032d6f","href":"/"},"favicon":"https://mintcdn.com/dripart/maKDA164-rrTfyxY/favicon.ico?fit=max\u0026auto=format\u0026n=maKDA164-rrTfyxY\u0026q=85\u0026s=94f3a697cf4c9a1ee3961b69219d0942","appearance":{"default":"dark"},"navbar":{"links":[{"href":"https://blog.comfy.org/?utm_source=docs","label":"Blog"},{"href":"/tutorials/partner-nodes/pricing","label":"Pricing"},{"href":"https://platform.comfy.org/?utm_source=docs","label":"Platform"},{"href":"https://comfy.org/download?utm_source=docs","label":"Download"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"Resources","items":[{"label":"installation","href":"/installation/system_requirements"},{"label":"Tutorials","href":"/tutorials/basic/text-to-image"},{"label":"Development","href":"/development/overview"}]},{"header":"Products","items":[{"label":"Features","href":"https://www.comfy.org/?utm_source=docs"},{"label":"Gallery","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"Download","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"Company","items":[{"label":"About","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"Careers","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"Terms of Service","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"Privacy Policy","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"search":{"prompt":"Search Comfy documentation..."},"seo":{"metatags":{"googlebot":"max-video-preview:0"}},"icons":{"library":"fontawesome"},"integrations":{"ga4":{"measurementId":"G-MXC01ZDDHQ"},"posthog":{"apiKey":"phc_iKfK86id4xVYws9LybMje0h44eGtfwFgRPIBehmy8rO"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"languages":[{"language":"en","href":""},{"language":"zh","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"资源","items":[{"label":"安装","href":"/zh/installation/system_requirements"},{"label":"教程","href":"/zh/tutorials/basic/text-to-image"},{"label":"开发","href":"/zh/development/overview"}]},{"header":"产品","items":[{"label":"功能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"画廊","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"下载","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"公司","items":[{"label":"关于","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"招聘","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"服务条款","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"隐私政策","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"href":"zh"},{"language":"ja","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"リソース","items":[{"label":"インストール","href":"/ja/installation/system_requirements"},{"label":"チュートリアル","href":"/ja/tutorials/basic/text-to-image"},{"label":"開発","href":"/ja/development/overview"}]},{"header":"プロダクト","items":[{"label":"機能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"ギャラリー","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"ダウンロード","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"会社情報","items":[{"label":"概要","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"採用情報","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"利用規約","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"プライバシーポリシー","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ja/tutorials/partner-nodes/pricing","label":"料金"},{"href":"https://comfy.org/download?utm_source=docs","label":"ダウンロード"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"href":"ja"},{"language":"ko","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"리소스","items":[{"label":"설치","href":"/ko/installation/system_requirements"},{"label":"튜토리얼","href":"/ko/tutorials/basic/text-to-image"},{"label":"개발","href":"/ko/development/overview"}]},{"header":"제품","items":[{"label":"기능","href":"https://www.comfy.org/?utm_source=docs"},{"label":"갤러리","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"다운로드","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"회사 정보","items":[{"label":"소개","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"채용","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"이용약관","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"개인정보 처리방침","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ko/tutorials/partner-nodes/pricing","label":"가격 정책"},{"href":"https://comfy.org/download?utm_source=docs","label":"다운로드"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"href":"ko"},{"language":"es","href":"es"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"dripart","hasAudioNarration":false,"actualSubdomain":"dripart","customDomains":["docs.comfy.org"],"gitSource":{"type":"github","owner":"comfy-org","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"feedback":{"thumbs":true,"edits":true,"issues":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6af11043198d4fbfea6f29e8","clientVersion":"0.0.4088","searchFilterCounts":[{"language":"en","tag":"Built-in Nodes","count":1166},{"language":"ja","tag":"組み込みノード","count":1166},{"language":"zh","tag":"内置节点","count":1166},{"language":"en","tag":"Nodes","count":1165},{"language":"ja","tag":"ノード","count":1165},{"language":"zh","tag":"节点","count":1165},{"language":"ko","tag":"내장 노드 (Built-in Nodes)","count":1124},{"language":"ko","tag":"노드","count":1123},{"language":"es","tag":"Nodos integrados","count":1058},{"language":"es","tag":"Nodos","count":1057},{"language":"en","tag":"Tutorials","count":414},{"language":"es","tag":"Tutoriales","count":414},{"language":"en","tag":"Model","count":381},{"language":"ja","tag":"Model","count":381},{"language":"ko","tag":"Model","count":381},{"language":"zh","tag":"Model","count":381},{"language":"es","tag":"Modelo","count":378},{"language":"en","tag":"Image","count":353},{"language":"en","tag":"Partner","count":348},{"language":"ja","tag":"Partner","count":348},{"language":"ko","tag":"Partner","count":348},{"language":"zh","tag":"Partner","count":348},{"language":"es","tag":"Partner","count":346},{"language":"es","tag":"Imagen","count":323},{"language":"ja","tag":"はじめに","count":308},{"language":"ko","tag":"시작하기","count":308},{"language":"zh","tag":"开始使用","count":308},{"language":"ja","tag":"API 開発","count":295},{"language":"ko","tag":"API 개발","count":295},{"language":"zh","tag":"API 开发","count":295},{"language":"en","tag":"Video","count":289},{"language":"en","tag":"Comfy Router","count":287},{"language":"es","tag":"Comfy Router","count":267},{"language":"es","tag":"Video","count":264},{"language":"ja","tag":"Comfy Router","count":258},{"language":"ko","tag":"Comfy Router","count":258},{"language":"zh","tag":"Comfy Router","count":258},{"language":"en","tag":"Models","count":257},{"language":"en","tag":"All Models","count":254},{"language":"es","tag":"Models","count":228},{"language":"ja","tag":"Models","count":228},{"language":"ko","tag":"Models","count":228},{"language":"zh","tag":"Models","count":228},{"language":"es","tag":"All Models","count":225},{"language":"ja","tag":"画像","count":205},{"language":"ko","tag":"이미지","count":205},{"language":"zh","tag":"图像","count":205},{"language":"ja","tag":"Video","count":193},{"language":"zh","tag":"Video","count":193},{"language":"ko","tag":"Video","count":176}],"searchSettings":{"maxResults":10}},"assistantConfig":{"enableStarterQuestions":false},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","content":":root{--ink-900: #151417;--hub-shell-light: #f7f6f9;--accent-purple: #49378b;--accent-yellow: #f2ff59;--primary: 73 55 139 !important;--primary-light: 242 255 89 !important;--primary-dark: 242 255 89 !important}html.dark{--primary: 242 255 89 !important;--background-dark: 14 14 13 !important}html.dark body{background-color:#0e0e0d!important}html.dark #navbar,html.dark #navbar-transition{background-color:var(--ink-900)!important}html.dark #sidebar,html.dark #sidebar-content{background-color:rgb(var(--background-dark))!important}html.dark #navbar,html.dark #navbar-transition{box-shadow:none!important;filter:none!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important}html.dark #navbar-transition{border-bottom:1px solid rgba(255, 255, 255, 0.08)!important;opacity:1!important}html.dark img.nav-logo{filter:none}html.dark #sidebar-content a:not([aria-current=\"page\"]){color:rgba(255, 255, 255, 0.72)!important}html.dark #sidebar-content a:not([aria-current=\"page\"]) *{color:inherit!important}html.dark #sidebar-content a[aria-current=\"page\"]{color:var(--accent-yellow)!important;background-color:rgba(242, 255, 89, 0.10)!important}html.dark #sidebar-content a[aria-current=\"page\"] *{color:inherit!important}html.dark .nav-tabs-item[data-active],html.dark mobile-nav-tabs-item[data-active]{color:var(--accent-yellow)!important}html.dark #navbar a[href*=\"comfy.org/cloud\"] span.absolute{background-color:var(--accent-yellow)!important}html.dark #navbar a[href*=\"comfy.org/cloud\"] span.text-white{color:#151417!important}html:not(.dark) #background-color,html:not(.dark) #navbar,html:not(.dark) #navbar-transition,html:not(.dark) #sidebar,html:not(.dark) #sidebar-content{background-color:var(--hub-shell-light)!important}html:not(.dark) .nav-tabs-item[data-active],html:not(.dark) mobile-nav-tabs-item[data-active],html:not(.dark) nav-dropdown-item[data-active]{background-color:transparent!important;box-shadow:none!important;color:var(--accent-purple)!important;font-weight:600!important}html:not(.dark) .nav-tabs-item[data-active] *,html:not(.dark) mobile-nav-tabs-item[data-active] *,html:not(.dark) nav-dropdown-item[data-active] *{color:inherit!important}html:not(.dark) #sidebar-content li:has(>a[aria-current=\"page\"]){background-color:transparent!important;box-shadow:none!important}html:not(.dark) #sidebar-content a[aria-current=\"page\"]{color:var(--accent-purple)!important;background-color:rgba(73, 55, 139, 0.1)!important;font-weight:600!important}html:not(.dark) #sidebar-content a[aria-current=\"page\"] *{color:inherit!important}html:not(.dark) toc-item[data-active],html:not(.dark) toc-item[data-active-deepest],html:not(.dark) toc-item[data-active] a,html:not(.dark) toc-item[data-active-deepest] a{background-color:transparent!important;color:var(--accent-purple)!important;font-weight:600!important}html:not(.dark) #header :where(h1,h2,h3,h4,h5,h6),html:not(.dark) #content-area :where(h1,h2,h3,h4,h5,h6){color:#151417!important}html:not(.dark) #navbar a[href*=\"comfy.org/cloud\"]{background-color:transparent!important;color:var(--accent-purple)!important;border-radius:0.75rem;box-shadow:inset 0 0 0 1px var(--accent-purple)!important}html:not(.dark) #navbar a[href*=\"comfy.org/cloud\"] span.absolute{background-color:transparent!important}html:not(.dark) #navbar a[href*=\"comfy.org/cloud\"] *{color:inherit!important}#sidebar .sticky.top-0.pointer-events-none.bg-linear-to-b{background-image:none!important}@media (min-width: 1024px){#navbar.is-not-custom.is-not-center+div:has(>#sidebar),.max-w-8xl.mx-auto.relative,.max-w-8xl.mx-auto{max-width:none!important;width:100%!important;margin-left:0!important;margin-right:0!important;padding-left:0!important;padding-right:0!important}#navbar [class*=\"px-12\"],#navbar [class*=\"mx-4\"]{padding-left:0!important;padding-right:1.5rem!important;margin-left:0!important;margin-right:0!important}#navbar a.select-none,#navbar .nav-logo{margin-left:1rem!important}#navbar .nav-tabs{padding-left:2rem!important}#sidebar{left:0!important;margin-left:0!important;box-shadow:none!important}#sidebar-content{margin-left:0!important;padding-left:1rem!important;box-sizing:border-box!important}#navbar,#navbar-transition{left:0!important;right:0!important;width:100%!important;max-width:none!important}#content-area{margin-left:0!important;max-width:none!important;width:100%!important;padding-left:18rem!important}#sidebar.sticky~#content-container #content-area{padding-left:2rem!important;padding-right:2rem!important}#content-container,#body-content{max-width:none!important;width:100%!important}:root{--content-width: 100%;--sidebar-width: 18rem}}@media (min-width: 1024px){nav#sidebar,#sidebar[style]{left:0!important;right:auto!important;margin-left:0!important;transform:none!important}#navbar li.navbar-link:has(a[href*=\"comfy.org/download\"]){margin-right:0!important}#navbar a[href*=\"comfy.org/download\"]{box-sizing:border-box;border:1px solid rgb(255 255 255 / 0.22);border-radius:0.75rem;padding:7px 0.875rem!important;color:#fff!important;font-size:0.875rem;line-height:1.25rem}html:not(.dark) #navbar a[href*=\"comfy.org/download\"]{border-color:rgb(0 0 0 / 0.16);color:#151417!important}#navbar a[href*=\"comfy.org/download\"]:hover{background:rgb(255 255 255 / 0.06)}html:not(.dark) #navbar a[href*=\"comfy.org/download\"]:hover{background:rgb(0 0 0 / 0.04)}#navbar li.navbar-link:has(a[href*=\"comfy.org/download\"])+.whitespace-nowrap,#navbar .flex.space-x-6>.whitespace-nowrap.hidden{margin-left:0.5rem!important}}body:has(.router-api-reference-marker) #content,body:has(.router-api-reference-marker) #header{max-width:48rem}body:has(.router-api-reference-marker) #content-area table{width:100%;table-layout:auto}body:has(.router-api-reference-marker) #content-area th,body:has(.router-api-reference-marker) #content-area td{min-width:4rem!important;overflow-wrap:anywhere}body:has(.router-api-reference-marker) #content-area table:has(th:nth-child(6)) th:nth-child(3),body:has(.router-api-reference-marker) #content-area table:has(th:nth-child(6)) td:nth-child(3){min-width:5rem!important}@media (max-width: 1535px){body:has(.router-api-reference-marker) #content-side-layout{display:none!important}}body:has(.router-provider-coverage-marker) #content,body:has(.router-provider-coverage-marker) #header{max-width:64rem}body:has(.router-provider-coverage-marker) #content-area table{width:100%;table-layout:auto}body:has(.router-provider-coverage-marker) #content-area th,body:has(.router-provider-coverage-marker) #content-area td{min-width:5rem!important;overflow-wrap:anywhere}body:has(.router-provider-coverage-marker) #content-area th:first-child,body:has(.router-provider-coverage-marker) #content-area td:first-child{min-width:12rem!important}body:has(.router-quickstart-marker) [data-component-part=\"card-content\"] [data-component-part=\"code-block-root\"][style*=\"height:190px\"],body:has(.router-quickstart-marker) [data-component-part=\"card-content\"] [data-component-part=\"code-block-root\"][style*=\"height: 190px\"]{height:86px!important}"},{"filePath":"samples-cards.css","content":".sample-card-grid{display:grid;gap:20px;grid-template-columns:repeat(2, minmax(0, 1fr));margin-top:28px}.sample-card{min-width:0;perspective:1200px}.sample-card-inner{height:565px;position:relative;transform-style:preserve-3d;transition:transform 560ms cubic-bezier(.2, .75, .3, 1)}.sample-card[data-flipped=\"true\"] .sample-card-inner{transform:rotateY(180deg)}.sample-card-face{backface-visibility:hidden;background:#fff;border:1px solid #e5e1eb;border-radius:12px;box-sizing:border-box;height:100%;inset:0;overflow:hidden;position:absolute;width:100%}.sample-card-front{display:flex;flex-direction:column}.sample-card-back{opacity:0;pointer-events:none;transform:rotateY(180deg);visibility:hidden}.sample-card[data-flipped=\"true\"] .sample-card-front{pointer-events:none;transition:visibility 0s linear 280ms;visibility:hidden}.sample-card[data-flipped=\"true\"][data-active-path=\"api\"] .sample-card-back[data-sample-path=\"api\"],.sample-card[data-flipped=\"true\"][data-active-path=\"endpoint\"] .sample-card-back[data-sample-path=\"endpoint\"]{opacity:1;pointer-events:auto;visibility:visible}.sample-card-preview{border-bottom:1px solid #e5e1eb;cursor:pointer;display:block;width:100%}.sample-card-body{display:flex;flex:1;flex-direction:column;padding:20px}.sample-card-body h2,.sample-path-body h2{color:#49378b;font-size:18px;font-weight:700;letter-spacing:-.02em;margin:0 0 8px}.sample-path-body h2{text-align:center}.sample-card-body>p{color:#5f5966;font-size:14px;line-height:1.55;margin:0;min-height:66px}.sample-card-actions{display:flex;gap:8px;margin-top:20px}.sample-card-actions button{background:#fff;border:1px solid #cfc8de;border-radius:6px;color:#49378b;cursor:pointer;flex:1;font-size:13px;font-weight:700;padding:10px 12px}.sample-card-links{border-top:1px solid #eeeaf1;display:flex;gap:8px;margin-top:16px;padding-top:12px}.sample-card-links a{color:#625b6c;font-size:12px;font-weight:650;text-decoration:none}.sample-card-links span{color:#b3adba}.sample-path-body{padding:20px}.sample-path-body>button{background:transparent;border:0;color:#625b6c;cursor:pointer;font-size:12px;font-weight:700;padding:0}.sample-path-eyebrow{color:#857a9e;font-size:10px;font-weight:700;letter-spacing:.08em;margin:19px 0 5px;text-align:center;text-transform:uppercase}.sample-path-body>p:not(.sample-path-eyebrow){color:#5f5966;font-size:12px;line-height:1.5;margin:0 0 15px}.sample-path-steps{display:grid;gap:8px}.sample-path-step{align-items:center;background:#faf9fc;border:1px solid #e5e1ea;border-radius:8px;display:flex;gap:10px;padding:10px 11px}.sample-path-number{align-items:center;background:#49378b;border-radius:999px;color:#fff;display:inline-flex;flex:0 0 21px;font-size:11px;font-weight:700;height:21px;justify-content:center}.sample-path-copy{flex:1;min-width:0}.sample-path-copy strong{color:#312c36;display:block;font-size:12px}.sample-path-copy span{color:#706a75;display:block;font-size:11px;line-height:1.35;margin-top:2px}.sample-path-step a{color:#49378b;flex:0 0 auto;font-size:11px;font-weight:700;text-decoration:none}@media (max-width: 768px){.sample-card-grid{grid-template-columns:1fr}.sample-card-inner{height:clamp(620px, 180vw, 760px)}}"}],"page":{"pagePath":"zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes","slug":"/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes","pageMetadata":{"title":"Create or reuse an asset over existing bytes","description":"Zero-byte fast-path: creates or reuses an asset over a blob the\nplatform already has, identified by its blake3 hash.\n\nOn Comfy Cloud, the caller must already own the content in the\ncurrent workspace. Content owned only by another member of that\nworkspace does not satisfy the ownership check and returns `404`\n`blob_not_found`, just like an absent hash. A matching caller-owned\nCloud asset is reused with `200`, `created_new: false` and its UUID,\nname and tags, even when the request supplies a different valid\n`file_path` or `tags`.\n\nOn a deployment, reuse matches both the hash and the exact path in\nthe build's scope. A match returns `200` with `created_new: false`;\na different path over content the caller may use creates a new\nreference with `201` and `created_new: true`. The self-hosted proxy\nreturns its existing hash-indexed record with `200` and\n`created_new: false`, without applying the requested path or tags.\n\nReuse keeps the existing name and tags. Cloud and deployment\nvalidation still applies to submitted metadata before reuse;\nmetadata is not exempt from validation because it will not replace\nstored values. Retention may refresh, and content URLs are generated\nfor the response, so reuse does not promise an unchanged response.\n\nTrust boundary: resolves only against blobs the platform itself\ningested and hashed, and only those the calling account is authorized\nto use — the client hash is a lookup key, never an authority to\nregister new content. A miss and \"exists but not yours\" are\ndeliberately indistinguishable (`404` `blob_not_found`).\n\nThe lookup key is the `hash` an upload returned, which is the hash of\nthe stored bytes. When location metadata was removed from an image\nbefore it was stored, that differs from the client's digest of the\nfile it sent, and the client's digest finds nothing.\n","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/assets/from-hash","href":"/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Zero-byte fast-path: creates or reuses an asset over a blob the\\nplatform already has, identified by its blake3 hash.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"On Comfy Cloud, the caller must already own the content in the\\ncurrent workspace. Content owned only by another member of that\\nworkspace does not satisfy the ownership check and returns \", _jsx(_components.code, {\n children: \"404\"\n }), \"\\n\", _jsx(_components.code, {\n children: \"blob_not_found\"\n }), \", just like an absent hash. A matching caller-owned\\nCloud asset is reused with \", _jsx(_components.code, {\n children: \"200\"\n }), \", \", _jsx(_components.code, {\n children: \"created_new: false\"\n }), \" and its UUID,\\nname and tags, even when the request supplies a different valid\\n\", _jsx(_components.code, {\n children: \"file_path\"\n }), \" or \", _jsx(_components.code, {\n children: \"tags\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"On a deployment, reuse matches both the hash and the exact path in\\nthe build’s scope. A match returns \", _jsx(_components.code, {\n children: \"200\"\n }), \" with \", _jsx(_components.code, {\n children: \"created_new: false\"\n }), \";\\na different path over content the caller may use creates a new\\nreference with \", _jsx(_components.code, {\n children: \"201\"\n }), \" and \", _jsx(_components.code, {\n children: \"created_new: true\"\n }), \". The self-hosted proxy\\nreturns its existing hash-indexed record with \", _jsx(_components.code, {\n children: \"200\"\n }), \" and\\n\", _jsx(_components.code, {\n children: \"created_new: false\"\n }), \", without applying the requested path or tags.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Reuse keeps the existing name and tags. Cloud and deployment\\nvalidation still applies to submitted metadata before reuse;\\nmetadata is not exempt from validation because it will not replace\\nstored values. Retention may refresh, and content URLs are generated\\nfor the response, so reuse does not promise an unchanged response.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Trust boundary: resolves only against blobs the platform itself\\ningested and hashed, and only those the calling account is authorized\\nto use — the client hash is a lookup key, never an authority to\\nregister new content. A miss and “exists but not yours” are\\ndeliberately indistinguishable (\", _jsx(_components.code, {\n children: \"404\"\n }), \" \", _jsx(_components.code, {\n children: \"blob_not_found\"\n }), \").\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The lookup key is the \", _jsx(_components.code, {\n children: \"hash\"\n }), \" an upload returned, which is the hash of\\nthe stored bytes. When location metadata was removed from an image\\nbefore it was stored, that differs from the client’s digest of the\\nfile it sent, and the client’s digest finds nothing.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Create or reuse an asset over existing bytes","description":"Zero-byte fast-path: creates or reuses an asset over a blob the\nplatform already has, identified by its blake3 hash.\n\nOn Comfy Cloud, the caller must already own the content in the\ncurrent workspace. Content owned only by another member of that\nworkspace does not satisfy the ownership check and returns `404`\n`blob_not_found`, just like an absent hash. A matching caller-owned\nCloud asset is reused with `200`, `created_new: false` and its UUID,\nname and tags, even when the request supplies a different valid\n`file_path` or `tags`.\n\nOn a deployment, reuse matches both the hash and the exact path in\nthe build's scope. A match returns `200` with `created_new: false`;\na different path over content the caller may use creates a new\nreference with `201` and `created_new: true`. The self-hosted proxy\nreturns its existing hash-indexed record with `200` and\n`created_new: false`, without applying the requested path or tags.\n\nReuse keeps the existing name and tags. Cloud and deployment\nvalidation still applies to submitted metadata before reuse;\nmetadata is not exempt from validation because it will not replace\nstored values. Retention may refresh, and content URLs are generated\nfor the response, so reuse does not promise an unchanged response.\n\nTrust boundary: resolves only against blobs the platform itself\ningested and hashed, and only those the calling account is authorized\nto use — the client hash is a lookup key, never an authority to\nregister new content. A miss and \"exists but not yours\" are\ndeliberately indistinguishable (`404` `blob_not_found`).\n\nThe lookup key is the `hash` an upload returned, which is the hash of\nthe stored bytes. When location metadata was removed from an image\nbefore it was stored, that differs from the client's digest of the\nfile it sent, and the client's digest finds nothing.\n","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/assets/from-hash","href":"/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/dripart/9d6bf2b2531e904c/giscus-comments.js","/_mintlify/custom/dripart/bd0341946f3c75a6/syft.js","/_mintlify/custom/dripart/042392a43b5e681e/samples-cards.js"],"openApiReferenceData":{"operation":{"operationId":"assetFromHash","tags":["assets"],"summary":"Create or reuse an asset over existing bytes","description":"Zero-byte fast-path: creates or reuses an asset over a blob the\nplatform already has, identified by its blake3 hash.\n\nOn Comfy Cloud, the caller must already own the content in the\ncurrent workspace. Content owned only by another member of that\nworkspace does not satisfy the ownership check and returns `404`\n`blob_not_found`, just like an absent hash. A matching caller-owned\nCloud asset is reused with `200`, `created_new: false` and its UUID,\nname and tags, even when the request supplies a different valid\n`file_path` or `tags`.\n\nOn a deployment, reuse matches both the hash and the exact path in\nthe build's scope. A match returns `200` with `created_new: false`;\na different path over content the caller may use creates a new\nreference with `201` and `created_new: true`. The self-hosted proxy\nreturns its existing hash-indexed record with `200` and\n`created_new: false`, without applying the requested path or tags.\n\nReuse keeps the existing name and tags. Cloud and deployment\nvalidation still applies to submitted metadata before reuse;\nmetadata is not exempt from validation because it will not replace\nstored values. Retention may refresh, and content URLs are generated\nfor the response, so reuse does not promise an unchanged response.\n\nTrust boundary: resolves only against blobs the platform itself\ningested and hashed, and only those the calling account is authorized\nto use — the client hash is a lookup key, never an authority to\nregister new content. A miss and \"exists but not yours\" are\ndeliberately indistinguishable (`404` `blob_not_found`).\n\nThe lookup key is the `hash` an upload returned, which is the hash of\nthe stored bytes. When location metadata was removed from an image\nbefore it was stored, that differs from the client's digest of the\nfile it sent, and the client's digest finds nothing.\n","requestBody":"88100e30-b0dd-42b1-9c15-991e7c5ad141","responses":{"200":"8c0c3e11-bb8b-41e2-8b63-95c78e2fab0f","201":"31c4d2d3-5c79-4090-bca0-2c691b33a622","401":"39e39a3a-ec07-4629-8f5a-8a4bf6243ff2","403":"b731a114-49dc-429f-afe3-5d9ecf2d6f83","404":"fc573a06-8d41-444d-84d7-e664d6db7276","422":"4ad5b39e-2f4f-407e-bcdc-35b6a085446a","429":"f0da25a7-fb03-4818-8a8d-d461302acf9f","500":"a7b1dcee-6439-4ae6-91be-0edf17fb2a29","503":"10577407-bcaf-430a-8aa6-53fabd8c04a9"},"method":"post","type":"path","servers":["ddabda62-d3c9-40f8-881d-a751e619aff3","62680931-7b02-4daf-b27f-819e4c14ed64","0a142380-c92c-4874-83af-7dc79bfcdc68"],"security":["e83e9dfc-ebdf-4caa-994b-25be4bb53550","78687c62-3745-43d4-a655-7ff88a24d9ae"],"path":"/api/v2/assets/from-hash","baseUrlOptions":["http://127.0.0.1:8189","https://cloud.comfy.org","https://{deployment}.run.comfy.app"],"title":"Create or reuse an asset over existing bytes","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["hash"],"properties":{"hash":{"type":"string","example":"blake3:9f8a1c0d...","isRequired":true,"uniqueKey":"hash","typeLabel":"string"},"file_path":{"type":"string","description":"Placement path / filename for a new reference. Comfy Cloud uses its last segment as the name; a deployment uses the full path. Both default to the bare hash digest when omitted or empty. Cloud reuse keeps the existing name even if a different valid path is supplied; a deployment also matches the path when deciding reuse. The self-hosted proxy keeps its indexed record's path. On Comfy Cloud a `file_path` that fails path validation, or whose last segment breaks the `file_path` rules of `POST /api/v2/assets`, is answered with 404 `blob_not_found`, the same as an unknown hash. The UTF-8 rule cannot fire here: invalid UTF-8 bytes and lone surrogate escapes (`\\ud800`) are replaced with U+FFFD when the JSON body is decoded, so such a name is stored with U+FFFD in their place.","example":"photo.png","uniqueKey":"file_path","typeLabel":"string"},"tags":{"type":"array","items":{"type":"string","uniqueKey":"tags.items.[INDEX]","typeLabel":"string"},"description":"Tags for a new reference; reuse keeps the existing tags. Comfy Cloud defaults an omitted or empty set to `input`. Cloud and deployment validation still applies on reuse; the self-hosted proxy does not apply submitted tags. A create carries at most 64 tags, each a non-empty UTF-8 string of at most 256 bytes (surrounding whitespace included) with no NUL byte. A deployment adds `input` to every asset and counts it, so it takes at most 63 of the caller's own; the `model_type:` tags derived for a model asset are not counted. A tag set breaking a limit is refused with 422. Invalid UTF-8 or a lone surrogate escape (e.g. `\\ud800`) inside a JSON-encoded tag is not refused: JSON decoding replaces it with U+FFFD (3 bytes each), and the 256-byte limit applies to the replaced value.","uniqueKey":"tags","typeLabel":"string[]"},"expires_in":{"type":"integer","minimum":60,"maximum":604800,"description":"Optional retention override in seconds (60s–7d): the asset's `expires_at` becomes now + `expires_in`, replacing the platform's default retention. Implementations without configurable retention ignore it. The bounds apply to this override only — the platform default is operator-configured and may lie outside them.","example":86400,"uniqueKey":"expires_in","typeLabel":"integer"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"hash":"blake3:9f8a1c0d...","file_path":"photo.png","tags":["\u003cstring>"],"expires_in":86400}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"8c0c3e11-bb8b-41e2-8b63-95c78e2fab0f":{"description":"An existing asset was reused under the serving surface's rules above; `created_new` is false. Its UUID, name and tags are kept; retention may refresh and content URLs are generated for this response.","content":{"application/json":{"schema":{"type":"object","description":"A user-owned record identified by a server-assigned UUID, backing an immutable blob whose content carries a server-computed blake3 hash. `hash` may be computed lazily: an asset record (and its retrievable bytes) can exist before its hash is filled in. On an output, `job_metadata` carries the labels its producing job was submitted with, so code holding only the asset knows which run it came from. It is absent for assets no job produced, for outputs of a job sent without labels, where the serving surface keeps no job labels, and when the labels could not be read: so `job_id` without `job_metadata` does not prove the job had no labels. A create whose file path and bytes match an existing output answers with that output, so its `job_id` and `job_metadata` are the output's.","required":["id","hash","size_bytes","content_type","created_at","url","url_expires_at"],"properties":{"id":{"type":"string","example":"9f8a1c0d-2b3e-4f56-8a7b-1c2d3e4f5a6b","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"hash":{"oneOf":[{"type":"string","description":"`blake3:\u003chex>`; null while lazily computed.","example":"blake3:9f8a1c0d...","isRequired":true,"uniqueKey":"hash.oneOf.0","typeLabel":"string"},{"type":"null","description":"`blake3:\u003chex>`; null while lazily computed.","example":"blake3:9f8a1c0d...","isRequired":true,"uniqueKey":"hash.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hash","typeLabel":"string | null"},"size_bytes":{"type":"integer","format":"int64","example":4816293,"isRequired":true,"uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"content_type":{"type":"string","example":"image/png","isRequired":true,"uniqueKey":"content_type","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"url":{"type":"string","format":"uri","description":"Short-lived content URL (signed, or proxy-served).","isRequired":true,"uniqueKey":"url","typeLabel":"string\u003curi>"},"url_expires_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"url_expires_at","typeLabel":"string\u003cdate-time>"},"file_path":{"oneOf":[{"type":"string","example":"photo.png","uniqueKey":"file_path.oneOf.0","typeLabel":"string"},{"type":"null","example":"photo.png","uniqueKey":"file_path.oneOf.1","typeLabel":"null"}],"uniqueKey":"file_path","typeLabel":"string | null"},"created_new":{"type":"boolean","description":"On `POST /api/v2/assets` responses, distinguishes a brand-new blob (true) from a dedup hit against bytes the platform already had (false). On `POST /api/v2/assets/from-hash` responses, true means a new asset reference was created over existing bytes (201); false means an existing asset was reused (200).","uniqueKey":"created_new","typeLabel":"boolean"},"expires_at":{"oneOf":[{"type":"string","format":"date-time","description":"Retention deadline for the asset itself (distinct from `url_expires_at`, the signed URL's validity). Null or absent means the asset is non-expiring. On a dedup-hit create response the deadline may be later than now + the requested/default retention: re-referencing content extends its retention, never shortens it.","uniqueKey":"expires_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Retention deadline for the asset itself (distinct from `url_expires_at`, the signed URL's validity). Null or absent means the asset is non-expiring. On a dedup-hit create response the deadline may be later than now + the requested/default retention: re-referencing content extends its retention, never shortens it.","uniqueKey":"expires_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"expires_at","typeLabel":"string\u003cdate-time> | null"},"job_id":{"oneOf":[{"type":"string","description":"ID of the job that produced this asset. Absent for assets no job produced, such as a fresh upload.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"ID of the job that produced this asset. Absent for assets no job produced, such as a fresh upload.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_metadata":{"type":"object","description":"The labels the producing job was submitted with, read through `job_id` on each read. Absent for assets no job produced, for outputs of a job sent without labels, where the serving surface keeps no job labels, when the job is gone, and when the labels could not be read: so `job_id` without `job_metadata` does not prove the job had no labels.","example":{"client":"acme"},"additionalProperties":{"type":"string","uniqueKey":"job_metadata.additionalProperties","typeLabel":"string"},"uniqueKey":"job_metadata","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"9f8a1c0d-2b3e-4f56-8a7b-1c2d3e4f5a6b","hash":"blake3:9f8a1c0d...","size_bytes":4816293,"content_type":"image/png","created_at":"2023-11-07T05:31:56Z","url":"\u003cstring>","url_expires_at":"2023-11-07T05:31:56Z","file_path":"photo.png","created_new":true,"expires_at":"2023-11-07T05:31:56Z","job_id":"\u003cstring>","job_metadata":{"client":"acme"}}}},"exampleType":"generated"}},"exampleType":"generated"},"31c4d2d3-5c79-4090-bca0-2c691b33a622":{"description":"A new asset reference with a new UUID was created over existing bytes; `created_new` is true. Supplied metadata and defaults apply as described above.","content":{"application/json":{"schema":{"type":"object","description":"A user-owned record identified by a server-assigned UUID, backing an immutable blob whose content carries a server-computed blake3 hash. `hash` may be computed lazily: an asset record (and its retrievable bytes) can exist before its hash is filled in. On an output, `job_metadata` carries the labels its producing job was submitted with, so code holding only the asset knows which run it came from. It is absent for assets no job produced, for outputs of a job sent without labels, where the serving surface keeps no job labels, and when the labels could not be read: so `job_id` without `job_metadata` does not prove the job had no labels. A create whose file path and bytes match an existing output answers with that output, so its `job_id` and `job_metadata` are the output's.","required":["id","hash","size_bytes","content_type","created_at","url","url_expires_at"],"properties":{"id":{"type":"string","example":"9f8a1c0d-2b3e-4f56-8a7b-1c2d3e4f5a6b","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"hash":{"oneOf":[{"type":"string","description":"`blake3:\u003chex>`; null while lazily computed.","example":"blake3:9f8a1c0d...","isRequired":true,"uniqueKey":"hash.oneOf.0","typeLabel":"string"},{"type":"null","description":"`blake3:\u003chex>`; null while lazily computed.","example":"blake3:9f8a1c0d...","isRequired":true,"uniqueKey":"hash.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hash","typeLabel":"string | null"},"size_bytes":{"type":"integer","format":"int64","example":4816293,"isRequired":true,"uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"content_type":{"type":"string","example":"image/png","isRequired":true,"uniqueKey":"content_type","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"url":{"type":"string","format":"uri","description":"Short-lived content URL (signed, or proxy-served).","isRequired":true,"uniqueKey":"url","typeLabel":"string\u003curi>"},"url_expires_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"url_expires_at","typeLabel":"string\u003cdate-time>"},"file_path":{"oneOf":[{"type":"string","example":"photo.png","uniqueKey":"file_path.oneOf.0","typeLabel":"string"},{"type":"null","example":"photo.png","uniqueKey":"file_path.oneOf.1","typeLabel":"null"}],"uniqueKey":"file_path","typeLabel":"string | null"},"created_new":{"type":"boolean","description":"On `POST /api/v2/assets` responses, distinguishes a brand-new blob (true) from a dedup hit against bytes the platform already had (false). On `POST /api/v2/assets/from-hash` responses, true means a new asset reference was created over existing bytes (201); false means an existing asset was reused (200).","uniqueKey":"created_new","typeLabel":"boolean"},"expires_at":{"oneOf":[{"type":"string","format":"date-time","description":"Retention deadline for the asset itself (distinct from `url_expires_at`, the signed URL's validity). Null or absent means the asset is non-expiring. On a dedup-hit create response the deadline may be later than now + the requested/default retention: re-referencing content extends its retention, never shortens it.","uniqueKey":"expires_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Retention deadline for the asset itself (distinct from `url_expires_at`, the signed URL's validity). Null or absent means the asset is non-expiring. On a dedup-hit create response the deadline may be later than now + the requested/default retention: re-referencing content extends its retention, never shortens it.","uniqueKey":"expires_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"expires_at","typeLabel":"string\u003cdate-time> | null"},"job_id":{"oneOf":[{"type":"string","description":"ID of the job that produced this asset. Absent for assets no job produced, such as a fresh upload.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"ID of the job that produced this asset. Absent for assets no job produced, such as a fresh upload.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_metadata":{"type":"object","description":"The labels the producing job was submitted with, read through `job_id` on each read. Absent for assets no job produced, for outputs of a job sent without labels, where the serving surface keeps no job labels, when the job is gone, and when the labels could not be read: so `job_id` without `job_metadata` does not prove the job had no labels.","example":{"client":"acme"},"additionalProperties":{"type":"string","uniqueKey":"job_metadata.additionalProperties","typeLabel":"string"},"uniqueKey":"job_metadata","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"9f8a1c0d-2b3e-4f56-8a7b-1c2d3e4f5a6b","hash":"blake3:9f8a1c0d...","size_bytes":4816293,"content_type":"image/png","created_at":"2023-11-07T05:31:56Z","url":"\u003cstring>","url_expires_at":"2023-11-07T05:31:56Z","file_path":"photo.png","created_new":true,"expires_at":"2023-11-07T05:31:56Z","job_id":"\u003cstring>","job_metadata":{"client":"acme"}}}},"exampleType":"generated"}},"exampleType":"generated"},"39e39a3a-ec07-4629-8f5a-8a4bf6243ff2":{"description":"`unauthorized`: missing or invalid credentials. A credential that could not be checked answers `auth_unavailable` (503) instead.","content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"},"b731a114-49dc-429f-afe3-5d9ecf2d6f83":{"description":"`forbidden` — authenticated but not allowed. On a serverless deployment, also `sso_required` — the key is valid, but the account must sign in through its organization's single sign-on, which does not accept this key; it can come back on any operation.","content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"},"fc573a06-8d41-444d-84d7-e664d6db7276":{"description":"`blob_not_found` — no blob the caller may mint from.","content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"},"4ad5b39e-2f4f-407e-bcdc-35b6a085446a":{"description":"The `tags` or `expires_in` is malformed, `tags` breaks the limits above or holds a disallowed tag, or (on a deployment) the `file_path` is malformed: `invalid_request` on a deployment. On Cloud a tag with a malformed shape is `invalid_body`, and a refusal by the platform (for example a disallowed tag) is `validation_error`. Cloud answers a malformed `file_path` with 404 `blob_not_found` instead (see `file_path`). A deployment checks the tags even when an identical reference exists.","content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"},"f0da25a7-fb03-4818-8a8d-d461302acf9f":{"description":"`rate_limited` — the caller has exceeded a request rate limit for this account. Account/rate-scoped, not resource-specific — this can be returned even for a job, asset or deployment the caller doesn't own or that doesn't exist.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying."}},"content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"},"a7b1dcee-6439-4ae6-91be-0edf17fb2a29":{"description":"`upstream_error` — an unexpected failure reaching or processing the request in this implementation's backing services. The message is always a generic, safe-to-display string; implementation detail (the specific upstream, its error text, transport failures) is never included here — see each implementation's own error-mapping notes. Every operation in this contract can fail this way.","content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"},"10577407-bcaf-430a-8aa6-53fabd8c04a9":{"description":"On deployment-scoped surfaces, `deployment_lookup_unavailable`: the deployment this address names could not be looked up just now. The request was refused before it did anything (nothing was created, read, changed or canceled), so the same request can be sent again after `Retry-After`. Every operation at a deployment's address can answer this way. A job submit can also answer this 503 with `database_unavailable`: the job could not be saved just now and nothing was started, so the same request can be sent again after `Retry-After`. No other operation answers `database_unavailable`. On Comfy Cloud an asset upload can also answer this 503 with `upload_busy`: the server is busy with other uploads and nothing was stored, so the same upload can be sent again after `Retry-After`. Any operation can also answer this 503 with `auth_unavailable`: the credential could not be checked just now, so the same request can be sent again after `Retry-After`. A job status read can also answer it with `output_unavailable`: an output of the job could not be prepared just now, and the job is unchanged. A transient storage failure clears on a later read after `Retry-After`; an output whose stored address is broken answers it on every read until the platform repairs the output.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying."}},"content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"e83e9dfc-ebdf-4caa-994b-25be4bb53550":{"bearerAuth":{"type":"http","scheme":"bearer","description":"`Authorization: Bearer \u003ccredential>`. The credential is one of: an account-scoped API key (`comfyui-…`), accepted on Cloud and serverless; a Comfy Cloud session JWT; or an OAuth access token issued for the Comfy Cloud resource. Which kinds a given deployment accepts is deployment configuration — an API key always works on Cloud and serverless, and a deployment that does not accept JWT bearers answers `401` with a message saying so. Self-hosted accepts unauthenticated requests by default and can be configured with a static bearer token.","scopes":[],"schemeName":"bearerAuth"}},"78687c62-3745-43d4-a655-7ff88a24d9ae":{}},"servers":{"ddabda62-d3c9-40f8-881d-a751e619aff3":{"url":"http://127.0.0.1:8189","description":"Self-hosted (comfy-api-proxy)"},"62680931-7b02-4daf-b27f-819e4c14ed64":{"url":"https://cloud.comfy.org","description":"Comfy Cloud"},"0a142380-c92c-4874-83af-7dc79bfcdc68":{"url":"https://{deployment}.run.comfy.app","description":"Serverless deployment","variables":{"deployment":{"description":"DNS-safe deployment id (subdomain label). Staging uses {deployment}.stg.run.comfy.app.","default":"dep-1234abcd-56ef-7890-abcd-ef1234567890"}}}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"`Authorization: Bearer \u003ccredential>`. The credential is one of: an account-scoped API key (`comfyui-…`), accepted on Cloud and serverless; a Comfy Cloud session JWT; or an OAuth access token issued for the Comfy Cloud resource. Which kinds a given deployment accepts is deployment configuration — an API key always works on Cloud and serverless, and a deployment that does not accept JWT bearers answers `401` with a message saying so. Self-hosted accepts unauthenticated requests by default and can be configured with a static bearer token.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"`Authorization: Bearer \u003ccredential>`. The credential is one of: an account-scoped API key (`comfyui-…`), accepted on Cloud and serverless; a Comfy Cloud session JWT; or an OAuth access token issued for the Comfy Cloud resource. Which kinds a given deployment accepts is deployment configuration — an API key always works on Cloud and serverless, and a deployment that does not accept JWT bearers answers `401` with a message saying so. Self-hosted accepts unauthenticated requests by default and can be configured with a static bearer token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"openapi-v2.yaml"},"subdomain":"dripart","siteName":"ComfyUI","title":"Create or reuse an asset over existing bytes - ComfyUI","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes","matchLevel":1},"zh":{"href":"/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes","matchLevel":0},"ja":{"href":"/ja/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes","matchLevel":1},"ko":{"href":"/ko/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes","matchLevel":1},"es":{"href":"/es/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes","matchLevel":1}}},"lastModified":"2026-11-08T23:54:12.572Z","originalFileLocation":"zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes.mdx","locale":"zh"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Zero-byte fast-path: creates or reuses an asset over a blob the platform already has, identified by its blake3 hash. On Comfy Cloud, the caller must already own the content in the current workspace. Content owned only by another member of that workspace does not satisfy the ownership check and returns 404 blob_not_found, just like an absent hash. A matching caller-owned Cloud asset is reused with 200, created_new: false and its UUID, name and tags, even when the request supplies a different valid file_path or tags. On a deployment, reuse matches both the hash and the exact path in the build\u0026#x27;s scope. A match returns 200 with created_new: false; a different path over content the caller may use creates a new reference with 201 and created_new: true. The self-hosted proxy returns its existing hash-indexed record with 200 and created_new: false, without applying the requested path or tags. Reuse keeps the existing name and tags. Cloud and deployment validation still applies to submitted metadata before reuse; metadata is not exempt from validation because it will not replace stored values. Retention may refresh, and content URLs are generated for the response, so reuse does not promise an unchanged response. Trust boundary: resolves only against blobs the platform itself ingested and hashed, and only those the calling account is authorized to use — the client hash is a lookup key, never an authority to register new content. A miss and \u0026quot;exists but not yours\u0026quot; are deliberately indistinguishable (404 blob_not_found). The lookup key is the hash an upload returned, which is the hash of the stored bytes. When location metadata was removed from an image before it was stored, that differs from the client\u0026#x27;s digest of the file it sent, and the client\u0026#x27;s digest finds nothing.\">\u003cmeta data-mint-head name=\"application-name\" content=\"ComfyUI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create or reuse an asset over existing bytes - ComfyUI\">\u003cmeta data-mint-head property=\"og:description\" content=\"Zero-byte fast-path: creates or reuses an asset over a blob the platform already has, identified by its blake3 hash. On Comfy Cloud, the caller must already own the content in the current workspace. Content owned only by another member of that workspace does not satisfy the ownership check and returns 404 blob_not_found, just like an absent hash. A matching caller-owned Cloud asset is reused with 200, created_new: false and its UUID, name and tags, even when the request supplies a different valid file_path or tags. On a deployment, reuse matches both the hash and the exact path in the build\u0026#x27;s scope. A match returns 200 with created_new: false; a different path over content the caller may use creates a new reference with 201 and created_new: true. The self-hosted proxy returns its existing hash-indexed record with 200 and created_new: false, without applying the requested path or tags. Reuse keeps the existing name and tags. Cloud and deployment validation still applies to submitted metadata before reuse; metadata is not exempt from validation because it will not replace stored values. Retention may refresh, and content URLs are generated for the response, so reuse does not promise an unchanged response. Trust boundary: resolves only against blobs the platform itself ingested and hashed, and only those the calling account is authorized to use — the client hash is a lookup key, never an authority to register new content. A miss and \u0026quot;exists but not yours\u0026quot; are deliberately indistinguishable (404 blob_not_found). The lookup key is the hash an upload returned, which is the hash of the stored bytes. When location metadata was removed from an image before it was stored, that differs from the client\u0026#x27;s digest of the file it sent, and the client\u0026#x27;s digest finds nothing.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"ComfyUI\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.comfy.org/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://dripart.mintlify.site/_mintlify/api/og/v2?division=assets\u0026amp;title=Create+or+reuse+an+asset+over+existing+bytes\u0026amp;description=Zero-byte+fast-path%3A+creates+or+reuses+an+asset+over+a+blob+the%0Aplatform+already+has%2C+identified+by+its+blake3+hash.%0A%0AOn+Comfy+Cloud%2C+the+caller+must+already+ow\u0026amp;theme=a03fed56f9a178c9b893031e\u0026amp;signature=eaf075e82a8a0a69dcae51303bcd7accea4c928c79c04c3234ff6d49e7e9df0d\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Create or reuse an asset over existing bytes - ComfyUI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Zero-byte fast-path: creates or reuses an asset over a blob the platform already has, identified by its blake3 hash. On Comfy Cloud, the caller must already own the content in the current workspace. Content owned only by another member of that workspace does not satisfy the ownership check and returns 404 blob_not_found, just like an absent hash. A matching caller-owned Cloud asset is reused with 200, created_new: false and its UUID, name and tags, even when the request supplies a different valid file_path or tags. On a deployment, reuse matches both the hash and the exact path in the build\u0026#x27;s scope. A match returns 200 with created_new: false; a different path over content the caller may use creates a new reference with 201 and created_new: true. The self-hosted proxy returns its existing hash-indexed record with 200 and created_new: false, without applying the requested path or tags. Reuse keeps the existing name and tags. Cloud and deployment validation still applies to submitted metadata before reuse; metadata is not exempt from validation because it will not replace stored values. Retention may refresh, and content URLs are generated for the response, so reuse does not promise an unchanged response. Trust boundary: resolves only against blobs the platform itself ingested and hashed, and only those the calling account is authorized to use — the client hash is a lookup key, never an authority to register new content. A miss and \u0026quot;exists but not yours\u0026quot; are deliberately indistinguishable (404 blob_not_found). The lookup key is the hash an upload returned, which is the hash of the stored bytes. When location metadata was removed from an image before it was stored, that differs from the client\u0026#x27;s digest of the file it sent, and the client\u0026#x27;s digest finds nothing.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://dripart.mintlify.site/_mintlify/api/og/v2?division=assets\u0026amp;title=Create+or+reuse+an+asset+over+existing+bytes\u0026amp;description=Zero-byte+fast-path%3A+creates+or+reuses+an+asset+over+a+blob+the%0Aplatform+already+has%2C+identified+by+its+blake3+hash.%0A%0AOn+Comfy+Cloud%2C+the+caller+must+already+ow\u0026amp;theme=a03fed56f9a178c9b893031e\u0026amp;signature=eaf075e82a8a0a69dcae51303bcd7accea4c928c79c04c3234ff6d49e7e9df0d\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"ComfyUI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#49378B\">\u003cmeta data-mint-head name=\"googlebot\" content=\"max-video-preview:0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.comfy.org/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://docs.comfy.org/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.comfy.org/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://docs.comfy.org/ja/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://docs.comfy.org/ko/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.comfy.org/es/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.comfy.org/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.comfy.org/#organization\",\"name\":\"ComfyUI\",\"url\":\"https://docs.comfy.org\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/dripart/WCFdTagRdhtvk9-o/logo/light.svg?fit=max\u0026auto=format\u0026n=WCFdTagRdhtvk9-o\u0026q=85\u0026s=ec112de87239058f5a931a7e4b594965\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.comfy.org#website\",\"name\":\"ComfyUI\",\"url\":\"https://docs.comfy.org\",\"publisher\":{\"@id\":\"https://docs.comfy.org/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.comfy.org/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes#webpage\",\"url\":\"https://docs.comfy.org/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes\",\"name\":\"Create or reuse an asset over existing bytes\",\"description\":\"Zero-byte fast-path: creates or reuses an asset over a blob the platform already has, identified by its blake3 hash. On Comfy Cloud, the caller must already own the content in the current workspace. Content owned only by another member of that workspace does not satisfy the ownership check and returns 404 blob_not_found, just like an absent hash. A matching caller-owned Cloud asset is reused with 200, created_new: false and its UUID, name and tags, even when the request supplies a different valid file_path or tags. On a deployment, reuse matches both the hash and the exact path in the build's scope. A match returns 200 with created_new: false; a different path over content the caller may use creates a new reference with 201 and created_new: true. The self-hosted proxy returns its existing hash-indexed record with 200 and created_new: false, without applying the requested path or tags. Reuse keeps the existing name and tags. Cloud and deployment validation still applies to submitted metadata before reuse; metadata is not exempt from validation because it will not replace stored values. Retention may refresh, and content URLs are generated for the response, so reuse does not promise an unchanged response. Trust boundary: resolves only against blobs the platform itself ingested and hashed, and only those the calling account is authorized to use — the client hash is a lookup key, never an authority to register new content. A miss and \\\"exists but not yours\\\" are deliberately indistinguishable (404 blob_not_found). The lookup key is the hash an upload returned, which is the hash of the stored bytes. When location metadata was removed from an image before it was stored, that differs from the client's digest of the file it sent, and the client's digest finds nothing.\",\"dateModified\":\"2026-11-08T23:54:12.572Z\",\"isPartOf\":{\"@id\":\"https://docs.comfy.org#website\"},\"breadcrumb\":{\"@id\":\"https://docs.comfy.org/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.comfy.org/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"运行工作流\",\"item\":\"https://docs.comfy.org/zh/development/run-workflows/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Comfy API v2 参考文档\",\"item\":\"https://docs.comfy.org/zh/api-reference/v2/assets/upload-an-asset-single-call-multipart\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"assets\",\"item\":\"https://docs.comfy.org/zh/api-reference/v2/assets/upload-an-asset-single-call-multipart\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Create or reuse an asset over existing bytes\",\"item\":\"https://docs.comfy.org/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.comfy.org/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes#apireference\",\"headline\":\"Create or reuse an asset over existing bytes\",\"name\":\"Create or reuse an asset over existing bytes\",\"description\":\"Zero-byte fast-path: creates or reuses an asset over a blob the platform already has, identified by its blake3 hash. On Comfy Cloud, the caller must already own the content in the current workspace. Content owned only by another member of that workspace does not satisfy the ownership check and returns 404 blob_not_found, just like an absent hash. A matching caller-owned Cloud asset is reused with 200, created_new: false and its UUID, name and tags, even when the request supplies a different valid file_path or tags. On a deployment, reuse matches both the hash and the exact path in the build's scope. A match returns 200 with created_new: false; a different path over content the caller may use creates a new reference with 201 and created_new: true. The self-hosted proxy returns its existing hash-indexed record with 200 and created_new: false, without applying the requested path or tags. Reuse keeps the existing name and tags. Cloud and deployment validation still applies to submitted metadata before reuse; metadata is not exempt from validation because it will not replace stored values. Retention may refresh, and content URLs are generated for the response, so reuse does not promise an unchanged response. Trust boundary: resolves only against blobs the platform itself ingested and hashed, and only those the calling account is authorized to use — the client hash is a lookup key, never an authority to register new content. A miss and \\\"exists but not yours\\\" are deliberately indistinguishable (404 blob_not_found). The lookup key is the hash an upload returned, which is the hash of the stored bytes. When location metadata was removed from an image before it was stored, that differs from the client's digest of the file it sent, and the client's digest finds nothing.\",\"url\":\"https://docs.comfy.org/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes\",\"mainEntityOfPage\":{\"@id\":\"https://docs.comfy.org/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes#webpage\"},\"dateModified\":\"2026-11-08T23:54:12.572Z\",\"publisher\":{\"@id\":\"https://docs.comfy.org/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.comfy.org#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"ComfyUI\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"ComfyUI","nav":{"global":null,"languages":[{"language":"en","pages":[{"title":"en","href":"/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes"}]},{"language":"zh","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"资源","items":[{"label":"安装","href":"/zh/installation/system_requirements"},{"label":"教程","href":"/zh/tutorials/basic/text-to-image"},{"label":"开发","href":"/zh/development/overview"}]},{"header":"产品","items":[{"label":"功能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"画廊","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"下载","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"公司","items":[{"label":"关于","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"招聘","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"服务条款","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"隐私政策","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"tabs":[{"tab":"开始使用","pages":[{"title":"开始使用","href":"/zh"}]},{"tab":"内置节点","pages":[{"title":"内置节点","href":"/zh/built-in-nodes/overview"}]},{"tab":"API 开发","pages":[{"group":"使用 Comfy 开发","pages":[{"title":"ComfyUI 开发者指南:SDK、服务器 API 与云端","sidebarTitle":"开发者概览","href":"/zh/development/overview"},{"group":"Comfy Cloud","pages":[{"title":"v1 Cloud API 概述","sidebarTitle":"概述","href":"/zh/development/cloud/overview"},{"title":"Cloud API 参考","icon":"book-open","href":"/zh/development/cloud/api-reference"},{"title":"OpenAPI 规范","icon":"file-lines","openapi":"/openapi-cloud.yaml","href":"/zh/development/cloud/openapi"}]},{"group":"自托管服务器","pages":[{"title":"服务器概述","sidebarTitle":"服务器概览","href":"/zh/development/comfyui-server/comms_overview"},{"title":"ComfyUI Server API 示例:HTTP、WebSocket 与历史记录","sidebarTitle":"API 示例","href":"/zh/development/comfyui-server/api-examples"},{"title":"ComfyUI 服务器路由(HTTP 和 WebSocket API)","sidebarTitle":"HTTP 与 WebSocket 路由","icon":"route","href":"/zh/development/comfyui-server/comms_routes"},{"title":"ComfyUI 服务器消息(WebSocket API)","sidebarTitle":"WebSocket 消息","icon":"comment","href":"/zh/development/comfyui-server/comms_messages"},{"title":"ComfyUI 启动参数:命令行参考","sidebarTitle":"启动参数","icon":"terminal","href":"/zh/development/comfyui-server/startup-flags"},{"title":"自托管选项","sidebarTitle":"部署方式","icon":"server","href":"/zh/development/deploy/self-hosting"}]},{"title":"部署 ComfyUI","sidebarTitle":"概述","icon":"map","href":"/zh/development/deploy/overview"},{"title":"Comfy Cloud 快速开始","sidebarTitle":"快速开始","icon":"cloud","href":"/zh/development/deploy/cloud"},{"title":"Comfy API 和 Router 示例","sidebarTitle":"示例","icon":"code","mode":"wide","href":"/zh/development/examples"}]},{"group":"运行工作流","pages":[{"title":"运行工作流","sidebarTitle":"概述","icon":"play","href":"/zh/development/run-workflows/overview"},{"title":"运行你的第一个工作流","sidebarTitle":"首个工作流","href":"/zh/development/api-development/quickstart"},{"title":"Comfy SDK:ComfyUI 的 Python 与 TypeScript 客户端","sidebarTitle":"SDK","icon":"code","href":"/zh/development/api-development/sdks"},{"title":"自托管 ComfyUI 的 API 代理","sidebarTitle":"API 代理","icon":"plug","href":"/zh/development/comfyui-server/api-proxy"},{"title":"Comfy API:Serverless 部署","icon":"cloud-arrow-up","href":"/zh/development/serverless/overview"},{"title":"获取 API Key","sidebarTitle":"API 密钥","icon":"key","href":"/zh/development/api-development/getting-an-api-key"},{"title":"Comfy API v2 概览","sidebarTitle":"Overview","href":"/zh/api-reference/v2/overview"},{"group":"Comfy API v2 参考文档","pages":[{"group":"assets","pages":[{"title":"Upload an asset (single-call multipart)","description":"Single-call `multipart/form-data` upload. The platform streams the\nbytes through its trusted byte-path, dedups by the server-computed\nhash, and mints the asset record.\n\nThe blake3 hash is always computed server-side from the received\nbytes — a client-declared `expected_hash` is verified, never trusted\n(on Comfy Cloud and serverless, only when sent before `file` — see below).\nIf location metadata (GPS, XMP, IPTC) is removed from an image before\nit is stored, the asset's `hash` is the hash of the stored bytes and\ncan differ from `expected_hash`. On Comfy Cloud, an upload whose\nbytes open as a JPEG, PNG, WebP or classic TIFF (including TIFF-based\ncamera RAW such as DNG, NEF, ARW and CR2, but not BigTIFF) and that\nis over 50 MiB is refused with 422 `validation_error`, whatever its\n`content_type` and whether or not it carries location metadata. A\nrequest that declares a `Content-Length` over Comfy Cloud's 200 MB\n(200,000,000-byte) body limit is refused before that check with a\nplain 413 that does not use the `ErrorEnvelope` shape. A body sent\nwithout a declared length is cut off when it passes that limit, and\nno 413 is sent: a cut-off while the fields before `file` are read\nfails with 422 `invalid_body`, and a cut-off inside the file usually\nfails with 500 `upstream_error`. Nothing after the `file` field is\nread, so a body that only passes the limit there is uploaded\nnormally.\nDeployment-scoped surfaces neither strip location metadata nor apply\nthe 50 MiB image cap; they limit the request body to 110 MB\n(110,000,000 bytes). A request that declares a `Content-Length` over\nthat limit is refused with the same plain 413; a body sent without a\ndeclared length is cut off when it passes the limit, and the upload\nthen fails with an error response that is not guaranteed to be a 413.\nThe uploaded asset is referenceable immediately; any content scanning\nruns in the background and does not block the response.\n\nSend `file` as the last part. Comfy Cloud and serverless deployments\nstream it straight into storage and read the other fields only up to\nit, so a part sent after `file` is never read: a `content_type` or\n`file_path` sent only after it is refused as missing (422); an\noptional field (`expected_hash` or `tags`) is silently ignored — the\nupload succeeds without the hash check or the caller's tags; on\nserverless deployments, a trailing `expires_in` is likewise ignored,\nlosing the retention override; and a second `file` part is dropped,\nso only the first part's bytes are stored. Comfy Cloud ignores\n`expires_in` wherever it is sent, before or after `file`. The\nresponse does not say any of these were skipped.\n\nAn upload is a single request. v1 expects files of up to ~100 MB;\nthe hard cap is the body limit of the surface it is sent to (above).\nChunked/resumable large uploads are a deliberate open question.\n\nCloud's hosted API caps every part sent before `file` at 8 KiB,\nincluding a part it does not recognise (which it otherwise\nignores), so an extra field over 8 KiB, such as file bytes sent\nunder a misspelled name, is refused with 422 `invalid_body`. Parts\nsent after `file` are never read: the 8 KiB cap does not apply to\nthem, and a metadata field sent there is treated as absent, so send\nevery metadata field before `file`. A declared `Content-Length`\nstill counts those bytes toward the size limit above; without one,\na body that only exceeds the limit there is uploaded normally,\nsince nothing after `file` is read.\n\nOn Comfy Cloud an upload fails with 422 `upload_timed_out` when no\nrequest bytes arrive for 30 seconds, or when the whole request takes\nlonger than 10 minutes, however steadily bytes keep arriving.\nOn Comfy Cloud an upload can also be refused with 503 `upload_busy`\nand `Retry-After` when the server is busy with other uploads: nothing\nwas stored, so the same upload can be sent again after `Retry-After`.\nOn a Developer Platform deployment the same 422 `upload_timed_out`\napplies when no request bytes arrive for 30 seconds, or when the whole\nrequest takes longer than 20 minutes.\n","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/assets","href":"/zh/api-reference/v2/assets/upload-an-asset-single-call-multipart"},{"title":"Create or reuse an asset over existing bytes","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/assets/from-hash","href":"/zh/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes"},{"title":"Existence check for a blob by blake3 hash","description":"`200` if the calling account can mint from this blob, `404` otherwise. Same account-scoping as `from-hash`; lets a client decide between the dedup fast-path and a full upload before sending bytes. Use the `hash` an upload returned: for an image whose location metadata was removed before storage, the client's digest of the file it sent names no stored blob. A refusal answers its status with no body, so a `403`'s code is not readable here.","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml head /api/v2/assets/by-hash/{hash}","href":"/zh/api-reference/v2/assets/existence-check-for-a-blob-by-blake3-hash"},{"title":"Asset metadata","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/assets/{id}","href":"/zh/api-reference/v2/assets/asset-metadata"},{"title":"Delete an asset record","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml delete /api/v2/assets/{id}","href":"/zh/api-reference/v2/assets/delete-an-asset-record"},{"title":"Asset bytes","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/assets/{id}/content","href":"/zh/api-reference/v2/assets/asset-bytes"}]},{"group":"jobs","pages":[{"title":"List jobs, newest first","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs","href":"/zh/api-reference/v2/jobs/list-jobs-newest-first"},{"title":"Submit a workflow for execution","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/jobs","href":"/zh/api-reference/v2/jobs/submit-a-workflow-for-execution"},{"title":"Job status (the polling workhorse)","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs/{id}","href":"/zh/api-reference/v2/jobs/job-status-the-polling-workhorse"},{"title":"The workflow behind a job — authoring version if pinned, executed graph otherwise","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs/{id}/workflow","href":"/zh/api-reference/v2/jobs/the-workflow-behind-a-job-—-authoring-version-if-pinned-executed-graph-otherwise"},{"title":"What the run printed","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs/{id}/logs","href":"/zh/api-reference/v2/jobs/what-the-run-printed"},{"title":"Live event stream (SSE)","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs/{id}/events","href":"/zh/api-reference/v2/jobs/live-event-stream-sse"},{"title":"Request cancellation","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/jobs/{id}/cancel","href":"/zh/api-reference/v2/jobs/request-cancellation"}]}]},{"title":"设计说明","sidebarTitle":"设计说明","icon":"compass","href":"/zh/development/api-development/sdks-design"},{"title":"工作流 API 格式","icon":"file-code","href":"/zh/development/api-development/workflow-api-format"},{"title":"工作流元数据:ComfyUI 输出文件中嵌入的工作流","sidebarTitle":"工作流元数据","icon":"file-code","href":"/zh/development/api-development/workflow-metadata"},{"title":"ComfyUI 账户 API 密钥集成","sidebarTitle":"API 密钥集成","icon":"puzzle-piece","href":"/zh/development/comfyui-server/api-key-integration"},{"group":"Comfy API Reference","pages":[{"title":"Comfy API 版本:v2 与已弃用的 v1 Cloud API","sidebarTitle":"概述","href":"/zh/development/comfy-api/overview"}]}]},{"group":"Comfy Router","pages":[{"title":"Comfy Router 快速入门","sidebarTitle":"快速入门","href":"/zh/development/comfy-router/quickstart"},{"title":"Comfy Router API 概览","sidebarTitle":"概览","href":"/zh/development/comfy-router/api"},{"title":"发现 Comfy Router 模型","sidebarTitle":"发现模型","href":"/zh/development/comfy-router/discover-models"},{"title":"Comfy Router 模型 schema 与结果","sidebarTitle":"Schema 与结果","href":"/zh/development/comfy-router/schemas"},{"title":"Comfy Router 请求排队","sidebarTitle":"排队的请求","href":"/zh/development/comfy-router/queue"},{"title":"Comfy Router 错误与重试","sidebarTitle":"错误与重试","href":"/zh/development/comfy-router/errors"},{"title":"Comfy Router 计费","sidebarTitle":"计费","href":"/zh/development/comfy-router/billing"},{"title":"将 Comfy Router 与 LiteLLM 配合使用","sidebarTitle":"LiteLLM","href":"/zh/development/comfy-router/litellm"},{"title":"Comfy Router 实时语音会话","sidebarTitle":"实时语音","href":"/zh/development/comfy-router/realtime"},{"title":"Comfy Router 请求头","sidebarTitle":"请求头","href":"/zh/development/comfy-router/headers"},{"title":"Comfy Router API 参考","sidebarTitle":"API 参考","href":"/zh/development/comfy-router/reference"},{"title":"Comfy Router 的能力与限制","sidebarTitle":"能力与限制","href":"/zh/development/comfy-router/limitations"},{"group":"Comfy Router API 参考文档","pages":[{"group":"Comfy Router","pages":[{"title":"List the models Comfy Router can run.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml get /v2/models","href":"/zh/api-reference/router/comfy-router/list-the-models-comfy-router-can-run"},{"title":"Read one partner model's catalog entry by canonical model ID.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml get /v2/models/{provider}/{model}","href":"/zh/api-reference/router/comfy-router/read-one-partner-models-catalog-entry-by-canonical-model-id"},{"title":"Run a partner model synchronously by canonical model ID.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml post /v2/models/{provider}/{model}","href":"/zh/api-reference/router/comfy-router/run-a-partner-model-synchronously-by-canonical-model-id"},{"title":"Price a model call before running it, without running it.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml post /v2/models/{provider}/{model}/estimate","href":"/zh/api-reference/router/comfy-router/price-a-model-call-before-running-it-without-running-it"},{"title":"Read one partner model's input and output schemas as an OpenAPI document.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml get /v2/models/{provider}/{model}/openapi.json","href":"/zh/api-reference/router/comfy-router/read-one-partner-models-input-and-output-schemas-as-an-openapi-document"},{"title":"Submit a partner model run to the queue and return immediately.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml post /v2/models/{provider}/{model}/requests","href":"/zh/api-reference/router/comfy-router/submit-a-partner-model-run-to-the-queue-and-return-immediately"},{"title":"Collect the result of one submitted request.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml get /v2/models/{provider}/{model}/requests/{request_id}","href":"/zh/api-reference/router/comfy-router/collect-the-result-of-one-submitted-request"},{"title":"Ask for one submitted request to be cancelled.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml put /v2/models/{provider}/{model}/requests/{request_id}/cancel","href":"/zh/api-reference/router/comfy-router/ask-for-one-submitted-request-to-be-cancelled"},{"title":"Read the queue state of one submitted request.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml get /v2/models/{provider}/{model}/requests/{request_id}/status","href":"/zh/api-reference/router/comfy-router/read-the-queue-state-of-one-submitted-request"}]}]},{"group":"Models","pages":[{"title":"Comfy Router 模型","sidebarTitle":"所有模型","href":"/zh/development/comfy-router/models"},{"title":"Comfy Router 定价","sidebarTitle":"定价","mode":"wide","href":"/zh/development/comfy-router/pricing"},{"title":"Comfy Router 服务提供商","sidebarTitle":"服务提供商","href":"/zh/development/comfy-router/providers"},{"group":"Anthropic","pages":[{"title":"将 Claude Fable 5.1 与 Comfy Router 配合使用","sidebarTitle":"Claude Fable 5.1","href":"/zh/development/comfy-router/models/anthropic/claude-fable-5-1/code"},{"title":"将 Claude Fable 5 与 Comfy Router 配合使用","sidebarTitle":"Claude Fable 5","href":"/zh/development/comfy-router/models/anthropic/claude-fable-5/code"},{"title":"将 Claude Haiku 4.5 20251001 与 Comfy Router 配合使用","sidebarTitle":"Claude Haiku 4.5 20251001","href":"/zh/development/comfy-router/models/anthropic/claude-haiku-4-5-20251001/code"},{"title":"将 Claude Opus 4.6 与 Comfy Router 配合使用","sidebarTitle":"Claude Opus 4.6","href":"/zh/development/comfy-router/models/anthropic/claude-opus-4-6/code"},{"title":"将 Claude Opus 4.7 与 Comfy Router 配合使用","sidebarTitle":"Claude Opus 4.7","href":"/zh/development/comfy-router/models/anthropic/claude-opus-4-7/code"},{"title":"配合 Comfy Router 使用 Claude Opus 4.8","sidebarTitle":"Claude Opus 4.8","href":"/zh/development/comfy-router/models/anthropic/claude-opus-4-8/code"},{"title":"使用 Claude Opus 5.5 搭配 Comfy Router","sidebarTitle":"Claude Opus 5.5","href":"/zh/development/comfy-router/models/anthropic/claude-opus-5-5/code"},{"title":"将 Claude Opus 5 与 Comfy Router 配合使用","sidebarTitle":"Claude Opus 5","href":"/zh/development/comfy-router/models/anthropic/claude-opus-5/code"},{"title":"将 Claude Sonnet 4.5 20250929 与 Comfy Router 配合使用","sidebarTitle":"Claude Sonnet 4.5 20250929","href":"/zh/development/comfy-router/models/anthropic/claude-sonnet-4-5-20250929/code"},{"title":"使用 Comfy Router 调用 Claude Sonnet 4.6","sidebarTitle":"Claude Sonnet 4.6","href":"/zh/development/comfy-router/models/anthropic/claude-sonnet-4-6/code"},{"title":"结合 Comfy Router 使用 Claude Sonnet 5.5","sidebarTitle":"Claude Sonnet 5.5","href":"/zh/development/comfy-router/models/anthropic/claude-sonnet-5-5/code"},{"title":"将 Claude Sonnet 5 与 Comfy Router 配合使用","sidebarTitle":"Claude Sonnet 5","href":"/zh/development/comfy-router/models/anthropic/claude-sonnet-5/code"}]},{"group":"Beeble","pages":[{"title":"将 SwitchX 与 Comfy Router 配合使用","sidebarTitle":"SwitchX","href":"/zh/development/comfy-router/models/beeble/switchx/code"}]},{"group":"Black Forest Labs","pages":[{"title":"搭配 Comfy Router 使用 Erase V1","sidebarTitle":"Erase V1","href":"/zh/development/comfy-router/models/black-forest-labs/erase-v1/code"},{"title":"使用 Flux 1.1 Pro Ultra Image 与 Comfy Router","sidebarTitle":"Flux 1.1 Pro Ultra Image","href":"/zh/development/comfy-router/models/black-forest-labs/flux-1-1-pro-ultra-image/code"},{"title":"通过 Comfy Router 使用 FLUX.1 Kontext","sidebarTitle":"FLUX.1 Kontext","href":"/zh/development/comfy-router/models/black-forest-labs/flux-1-kontext/code"},{"title":"使用 Comfy Router 调用 FLUX 2 Max","sidebarTitle":"FLUX 2 Max","href":"/zh/development/comfy-router/models/black-forest-labs/flux-2-max/code"},{"title":"将 FLUX 2 Pro 与 Comfy Router 配合使用","sidebarTitle":"FLUX 2 Pro","href":"/zh/development/comfy-router/models/black-forest-labs/flux-2-pro/code"},{"title":"配合 Comfy Router 使用 FLUX 3 Image","sidebarTitle":"FLUX 3 Image","href":"/zh/development/comfy-router/models/black-forest-labs/flux-3-image/code"},{"title":"使用 Comfy Router 调用 FLUX 3 Video","sidebarTitle":"FLUX 3 Video","href":"/zh/development/comfy-router/models/black-forest-labs/flux-3-video/code"},{"title":"使用 Comfy Router 调用 FLUX Pro 1.0 Expand","sidebarTitle":"FLUX Pro 1.0 Expand","href":"/zh/development/comfy-router/models/black-forest-labs/flux-pro-1-0-expand/code"},{"title":"使用 Comfy Router 调用 FLUX Pro 1.0 Fill","sidebarTitle":"FLUX Pro 1.0 Fill","href":"/zh/development/comfy-router/models/black-forest-labs/flux-pro-1-0-fill/code"},{"title":"通过 Comfy Router 使用 FLUX Video Upscale","sidebarTitle":"FLUX Video Upscale","href":"/zh/development/comfy-router/models/black-forest-labs/flux-video-upscale/code"},{"title":"将 Video Edit V1 与 Comfy Router 配合使用","sidebarTitle":"Video Edit V1","href":"/zh/development/comfy-router/models/black-forest-labs/video-edit-v1/code"},{"title":"将 VTO V1 与 Comfy Router 搭配使用","sidebarTitle":"VTO V1","href":"/zh/development/comfy-router/models/black-forest-labs/vto-v1/code"}]},{"group":"Bria","pages":[{"title":"将 Fibo 与 Comfy Router 配合使用","sidebarTitle":"Fibo","href":"/zh/development/comfy-router/models/bria/fibo/code"},{"title":"将 Image Edit Add Object By Text 与 Comfy Router 配合使用","sidebarTitle":"Image Edit Add Object By Text","href":"/zh/development/comfy-router/models/bria/image-edit-add-object-by-text/code"},{"title":"结合 Comfy Router 使用 Image Edit Erase By Text","sidebarTitle":"Image Edit Erase By Text","href":"/zh/development/comfy-router/models/bria/image-edit-erase-by-text/code"},{"title":"配合 Comfy Router 使用 Image Edit Erase Foreground","sidebarTitle":"Image Edit Erase Foreground","href":"/zh/development/comfy-router/models/bria/image-edit-erase-foreground/code"},{"title":"在 Comfy Router 中使用 Image Edit Erase","sidebarTitle":"Image Edit Erase","href":"/zh/development/comfy-router/models/bria/image-edit-erase/code"},{"title":"通过 Comfy Router 使用 Image Edit Expand","sidebarTitle":"Image Edit Expand","href":"/zh/development/comfy-router/models/bria/image-edit-expand/code"},{"title":"将 Image Edit Gen Fill 与 Comfy Router 配合使用","sidebarTitle":"Image Edit Gen Fill","href":"/zh/development/comfy-router/models/bria/image-edit-gen-fill/code"},{"title":"搭配 Comfy Router 使用 Image Edit Increase Resolution","sidebarTitle":"Image Edit Increase Resolution","href":"/zh/development/comfy-router/models/bria/image-edit-increase-resolution/code"},{"title":"使用 Comfy Router 调用 Image Edit Product Holding","sidebarTitle":"Image Edit Product Holding","href":"/zh/development/comfy-router/models/bria/image-edit-product-holding/code"},{"title":"结合 Comfy Router 使用 Image Edit Product Virtual Tryon","sidebarTitle":"Image Edit Product Virtual Tryon","href":"/zh/development/comfy-router/models/bria/image-edit-product-virtual-tryon/code"},{"title":"将 Image Edit Relight 与 Comfy Router 配合使用","sidebarTitle":"Image Edit Relight","href":"/zh/development/comfy-router/models/bria/image-edit-relight/code"},{"title":"使用 Comfy Router 调用 Image Edit Remove Background Guided","sidebarTitle":"Image Edit Remove Background Guided","href":"/zh/development/comfy-router/models/bria/image-edit-remove-background-guided/code"},{"title":"通过 Comfy Router 使用 Image Edit Remove Background","sidebarTitle":"Image Edit Remove Background","href":"/zh/development/comfy-router/models/bria/image-edit-remove-background/code"},{"title":"使用 Comfy Router 调用 Image Edit Replace Background","sidebarTitle":"Image Edit Replace Background","href":"/zh/development/comfy-router/models/bria/image-edit-replace-background/code"},{"title":"配合 Comfy Router 使用 Image Edit Replace Object By Text","sidebarTitle":"Image Edit Replace Object By Text","href":"/zh/development/comfy-router/models/bria/image-edit-replace-object-by-text/code"},{"title":"通过 Comfy Router 使用 Image Edit Reseason","sidebarTitle":"Image Edit Reseason","href":"/zh/development/comfy-router/models/bria/image-edit-reseason/code"},{"title":"在 Comfy Router 中使用 Image Edit Restore","sidebarTitle":"Image Edit Restore","href":"/zh/development/comfy-router/models/bria/image-edit-restore/code"},{"title":"配合 Comfy Router 使用图像","sidebarTitle":"图像","href":"/zh/development/comfy-router/models/bria/image/code"},{"title":"将 Video Edit Erase 与 Comfy Router 搭配使用","sidebarTitle":"Video Edit Erase","href":"/zh/development/comfy-router/models/bria/video-edit-erase/code"},{"title":"配合 Comfy Router 使用 Video Edit Green Screen","sidebarTitle":"Video Edit Green Screen","href":"/zh/development/comfy-router/models/bria/video-edit-green-screen/code"},{"title":"使用 Comfy Router 进行视频编辑移除背景","sidebarTitle":"Video Edit Remove Background","href":"/zh/development/comfy-router/models/bria/video-edit-remove-background/code"},{"title":"使用 Comfy Router 进行视频编辑替换背景","sidebarTitle":"Video Edit Replace Background","href":"/zh/development/comfy-router/models/bria/video-edit-replace-background/code"}]},{"group":"BytePlus","pages":[{"title":"使用 Dreamina Seedance 2.0 260128 与 Comfy Router","sidebarTitle":"Dreamina Seedance 2.0 260128","href":"/zh/development/comfy-router/models/byteplus/dreamina-seedance-2-0-260128/code"},{"title":"使用 Comfy Router 调用 Dreamina Seedance 2.0 Fast 260128","sidebarTitle":"Dreamina Seedance 2.0 Fast 260128","href":"/zh/development/comfy-router/models/byteplus/dreamina-seedance-2-0-fast-260128/code"},{"title":"通过 Comfy Router 使用 Dreamina Seedance 2.0 Mini","sidebarTitle":"Dreamina Seedance 2.0 Mini","href":"/zh/development/comfy-router/models/byteplus/dreamina-seedance-2-0-mini/code"},{"title":"使用 Dreamina Seedance 2.5 260628 与 Comfy Router","sidebarTitle":"Dreamina Seedance 2.5 260628","href":"/zh/development/comfy-router/models/byteplus/dreamina-seedance-2-5-260628/code"},{"title":"将 Seed 2.0 Lite 260228 与 Comfy Router 配合使用","sidebarTitle":"Seed 2.0 Lite 260228","href":"/zh/development/comfy-router/models/byteplus/seed-2-0-lite-260228/code"},{"title":"将 Seed 2.0 Mini 260215 与 Comfy Router 配合使用","sidebarTitle":"Seed 2.0 Mini 260215","href":"/zh/development/comfy-router/models/byteplus/seed-2-0-mini-260215/code"},{"title":"将 Seed 2.0 Pro 260328 与 Comfy Router 搭配使用","sidebarTitle":"Seed 2.0 Pro 260328","href":"/zh/development/comfy-router/models/byteplus/seed-2-0-pro-260328/code"},{"title":"将 Seed Audio 1.0 Multilingual 与 Comfy Router 配合使用","sidebarTitle":"Seed Audio 1.0 Multilingual","href":"/zh/development/comfy-router/models/byteplus/seed-audio-1-0-multilingual/code"},{"title":"结合 Comfy Router 使用 Seed Audio 1.0","sidebarTitle":"Seed Audio 1.0","href":"/zh/development/comfy-router/models/byteplus/seed-audio-1-0/code"},{"title":"将 Seedance 1.0 Pro 250528 与 Comfy Router 配合使用","sidebarTitle":"Seedance 1.0 Pro 250528","href":"/zh/development/comfy-router/models/byteplus/seedance-1-0-pro-250528/code"},{"title":"使用 Comfy Router 调用 Seedance 1.0 Pro Fast 251015","sidebarTitle":"Seedance 1.0 Pro Fast 251015","href":"/zh/development/comfy-router/models/byteplus/seedance-1-0-pro-fast-251015/code"},{"title":"通过 Comfy Router 使用 Seedance 1.5 Pro 251215","sidebarTitle":"Seedance 1.5 Pro 251215","href":"/zh/development/comfy-router/models/byteplus/seedance-1-5-pro-251215/code"},{"title":"将 Seedream 4.0 250828 与 Comfy Router 配合使用","sidebarTitle":"Seedream 4.0 250828","href":"/zh/development/comfy-router/models/byteplus/seedream-4-0-250828/code"},{"title":"将 Seedream 4.5 251128 与 Comfy Router 配合使用","sidebarTitle":"Seedream 4.5 251128","href":"/zh/development/comfy-router/models/byteplus/seedream-4-5-251128/code"},{"title":"结合 Comfy Router 使用 Seedream 5.0 260128","sidebarTitle":"Seedream 5.0 260128","href":"/zh/development/comfy-router/models/byteplus/seedream-5-0-260128/code"},{"title":"将 Seedream 5.0 Flash 260915 与 Comfy Router 配合使用","sidebarTitle":"Seedream 5.0 Flash 260915","href":"/zh/development/comfy-router/models/byteplus/seedream-5-0-flash-260915/code"},{"title":"使用 Comfy Router 调用 Seedream 5.0 Pro 260628","sidebarTitle":"Seedream 5.0 Pro 260628","href":"/zh/development/comfy-router/models/byteplus/seedream-5-0-pro-260628/code"}]},{"group":"Elevenlabs","pages":[{"title":"使用 Comfy Router 调用 Eleven Multilingual V2","sidebarTitle":"Eleven Multilingual V2","href":"/zh/development/comfy-router/models/elevenlabs/eleven-multilingual-v2/code"},{"title":"将 Eleven Sfx V2 与 Comfy Router 配合使用","sidebarTitle":"Eleven Sfx V2","href":"/zh/development/comfy-router/models/elevenlabs/eleven-sfx-v2/code"},{"title":"将 Eleven V3 与 Comfy Router 配合使用","sidebarTitle":"Eleven V3","href":"/zh/development/comfy-router/models/elevenlabs/eleven-v3/code"},{"title":"将 Eleven V4 Turbo 与 Comfy Router 搭配使用","sidebarTitle":"Eleven V4 Turbo","href":"/zh/development/comfy-router/models/elevenlabs/eleven-v4-turbo/code"},{"title":"通过 Comfy Router 使用 Eleven V4","sidebarTitle":"Eleven V4","href":"/zh/development/comfy-router/models/elevenlabs/eleven-v4/code"}]},{"group":"fal","pages":[{"title":"使用 Comfy Router 调用 Crystal Upscaler","sidebarTitle":"Crystal Upscaler","href":"/zh/development/comfy-router/models/fal/crystal-upscaler/code"},{"title":"将 Crystal Video Upscaler 与 Comfy Router 配合使用","sidebarTitle":"Crystal Video Upscaler","href":"/zh/development/comfy-router/models/fal/crystal-video-upscaler/code"},{"title":"通过 Comfy Router 使用 FLUX 3 Max","sidebarTitle":"FLUX 3 Max","href":"/zh/development/comfy-router/models/fal/flux-3-max/code"},{"title":"将 H3 Max Turbo 与 Comfy Router 搭配使用","sidebarTitle":"H3 Max Turbo","href":"/zh/development/comfy-router/models/fal/h3-max-turbo/code"},{"title":"在 Comfy Router 中使用 H3 Max","sidebarTitle":"H3 Max","href":"/zh/development/comfy-router/models/fal/h3-max/code"},{"title":"将 Patina 与 Comfy Router 配合使用","sidebarTitle":"Patina","href":"/zh/development/comfy-router/models/fal/patina/code"}]},{"group":"Freepik","pages":[{"title":"将 AI Image Upscaler Precision V2 与 Comfy Router 配合使用","sidebarTitle":"AI Image Upscaler Precision V2","href":"/zh/development/comfy-router/models/freepik/ai-image-upscaler-precision-v2/code"},{"title":"将 AI Skin Enhancer Creative 与 Comfy Router 配合使用","sidebarTitle":"AI Skin Enhancer Creative","href":"/zh/development/comfy-router/models/freepik/ai-skin-enhancer-creative/code"},{"title":"将 AI Skin Enhancer Faithful 与 Comfy Router 配合使用","sidebarTitle":"AI Skin Enhancer Faithful","href":"/zh/development/comfy-router/models/freepik/ai-skin-enhancer-faithful/code"},{"title":"搭配 Comfy Router 使用 AI Skin Enhancer Flexible","sidebarTitle":"AI Skin Enhancer Flexible","href":"/zh/development/comfy-router/models/freepik/ai-skin-enhancer-flexible/code"}]},{"group":"Gemini Interactions","pages":[{"title":"搭配 Comfy Router 使用 Gemini Omni 1.1 Flash","sidebarTitle":"Gemini Omni 1.1 Flash","href":"/zh/development/comfy-router/models/gemini-interactions/gemini-omni-1-1-flash/code"},{"title":"使用 Comfy Router 调用 Gemini Omni Flash Preview","sidebarTitle":"Gemini Omni Flash Preview","href":"/zh/development/comfy-router/models/gemini-interactions/gemini-omni-flash-preview/code"}]},{"group":"Google","pages":[{"title":"使用 Gemini 2.5 Flash Image 与 Comfy Router","sidebarTitle":"Gemini 2.5 Flash Image","href":"/zh/development/comfy-router/models/google/gemini-2-5-flash-image/code"},{"title":"使用 Gemini 3.1 Flash Lite 与 Comfy Router","sidebarTitle":"Gemini 3.1 Flash Lite","href":"/zh/development/comfy-router/models/google/gemini-3-1-flash-lite/code"},{"title":"使用 Gemini 3.7 Flash 搭配 Comfy Router","sidebarTitle":"Gemini 3.7 Flash","href":"/zh/development/comfy-router/models/google/gemini-3-7-flash/code"},{"title":"搭配 Comfy Router 使用 Gemini 3.8 Flash","sidebarTitle":"Gemini 3.8 Flash","href":"/zh/development/comfy-router/models/google/gemini-3-8-flash/code"},{"title":"将 Gemini Nano Banana 2.1 与 Comfy Router 配合使用","sidebarTitle":"Gemini Nano Banana 2.1","href":"/zh/development/comfy-router/models/google/gemini-nano-banana-2-1/code"},{"title":"通过 Comfy Router 使用 Google Gemini","sidebarTitle":"Google Gemini","href":"/zh/development/comfy-router/models/google/gemini/code"},{"title":"将 Nano Banana 2 Lite 与 Comfy Router 配合使用","sidebarTitle":"Nano Banana 2 Lite","href":"/zh/development/comfy-router/models/google/nano-banana-2-lite/code"},{"title":"将 Nano Banana 2 与 Comfy Router 配合使用","sidebarTitle":"Nano Banana 2","href":"/zh/development/comfy-router/models/google/nano-banana-2/code"},{"title":"搭配 Comfy Router 使用 Nano Banana Pro","sidebarTitle":"Nano Banana Pro","href":"/zh/development/comfy-router/models/google/nano-banana-pro/code"}]},{"group":"HeyGen","pages":[{"title":"将 Starfish 与 Comfy Router 配合使用","sidebarTitle":"Starfish","href":"/zh/development/comfy-router/models/heygen/starfish/code"}]},{"group":"Higgsfield","pages":[{"title":"Higgsfield Genjutsu Motion Transfer V1.0:通过 Comfy Router 调用","sidebarTitle":"Higgsfield Genjutsu Motion Transfer V1.0","href":"/zh/development/comfy-router/models/higgsfield/higgsfield-genjutsu-motion-transfer-v1-0/code"},{"title":"将 Higgsfield Kling 3.4k 与 Comfy Router 搭配使用","sidebarTitle":"Higgsfield Kling 3.4k","href":"/zh/development/comfy-router/models/higgsfield/higgsfield-kling-3-4k/code"},{"title":"将 Higgsfield Kling 3 Pro 与 Comfy Router 配合使用","sidebarTitle":"Higgsfield Kling 3 Pro","href":"/zh/development/comfy-router/models/higgsfield/higgsfield-kling-3-pro/code"}]},{"group":"Ideogram","pages":[{"title":"将 Ideogram 4.5 与 Comfy Router 配合使用","sidebarTitle":"Ideogram 4.5","href":"/zh/development/comfy-router/models/ideogram/ideogram-4-5/code"},{"title":"将 Ideogram V3 与 Comfy Router 配合使用","sidebarTitle":"Ideogram V3","href":"/zh/development/comfy-router/models/ideogram/ideogram-v3/code"},{"title":"结合 Comfy Router 使用 Ideogram 4.0","sidebarTitle":"Ideogram 4.0","href":"/zh/development/comfy-router/models/ideogram/ideogram-v4/code"},{"title":"配合 Comfy Router 使用 P Image Ideogram","sidebarTitle":"P Image Ideogram","href":"/zh/development/comfy-router/models/ideogram/p-image-ideogram/code"}]},{"group":"Kling","pages":[{"title":"通过 Comfy Router 使用 Kling 3.0 Turbo","sidebarTitle":"Kling 3.0 Turbo","href":"/zh/development/comfy-router/models/kling/kling-3-0-turbo/code"},{"title":"使用 Comfy Router 调用 Kling Image O1","sidebarTitle":"Kling Image O1","href":"/zh/development/comfy-router/models/kling/kling-image-o1/code"},{"title":"将 Kling V2.5 Turbo 与 Comfy Router 搭配使用","sidebarTitle":"Kling V2.5 Turbo","href":"/zh/development/comfy-router/models/kling/kling-v2-5-turbo/code"},{"title":"通过 Comfy Router 使用 Kling V2.6","sidebarTitle":"Kling V2.6","href":"/zh/development/comfy-router/models/kling/kling-v2-6/code"},{"title":"通过 Comfy Router 使用 Kling V3 Omni","sidebarTitle":"Kling V3 Omni","href":"/zh/development/comfy-router/models/kling/kling-v3-omni/code"},{"title":"通过 Comfy Router 使用 Kling V3","sidebarTitle":"Kling V3","href":"/zh/development/comfy-router/models/kling/kling-v3/code"},{"title":"将 Kling Video O1 与 Comfy Router 配合使用","sidebarTitle":"Kling Video O1","href":"/zh/development/comfy-router/models/kling/kling-video-o1/code"},{"title":"配合 Comfy Router 使用 Videos Avatar Image 2video","sidebarTitle":"Videos Avatar Image 2video","href":"/zh/development/comfy-router/models/kling/videos-avatar-image2video/code"},{"title":"通过 Comfy Router 使用视频唇形同步","sidebarTitle":"视频唇形同步","href":"/zh/development/comfy-router/models/kling/videos-lip-sync/code"},{"title":"使用 Videos Video Extend 搭配 Comfy Router","sidebarTitle":"Videos Video Extend","href":"/zh/development/comfy-router/models/kling/videos-video-extend/code"}]},{"group":"Krea","pages":[{"title":"使用 Comfy Router 调用 Krea 2 Large","sidebarTitle":"Krea 2 Large","href":"/zh/development/comfy-router/models/krea/krea-2-large/code"},{"title":"将 Krea 2 Medium Turbo 与 Comfy Router 搭配使用","sidebarTitle":"Krea 2 Medium Turbo","href":"/zh/development/comfy-router/models/krea/krea-2-medium-turbo/code"},{"title":"配合 Comfy Router 使用 Krea 2 Medium","sidebarTitle":"Krea 2 Medium","href":"/zh/development/comfy-router/models/krea/krea-2-medium/code"},{"title":"在 Comfy Router 中使用 Krea 2","sidebarTitle":"Krea 2","href":"/zh/development/comfy-router/models/krea/krea-2/code"},{"title":"通过 Comfy Router 使用 Krea 3","sidebarTitle":"Krea 3","href":"/zh/development/comfy-router/models/krea/krea-3/code"}]},{"group":"LTX","pages":[{"title":"通过 Comfy Router 使用 LTX 2.5 Fast","sidebarTitle":"LTX 2.5 Fast","href":"/zh/development/comfy-router/models/ltx/ltx-2-5-fast/code"},{"title":"使用 Comfy Router 调用 LTX 2.5 Pro","sidebarTitle":"LTX 2.5 Pro","href":"/zh/development/comfy-router/models/ltx/ltx-2-5-pro/code"}]},{"group":"Luma","pages":[{"title":"将 Photon 1 与 Comfy Router 配合使用","sidebarTitle":"Photon 1","href":"/zh/development/comfy-router/models/luma/photon-1/code"},{"title":"将 Photon Flash 1 与 Comfy Router 配合使用","sidebarTitle":"Photon Flash 1","href":"/zh/development/comfy-router/models/luma/photon-flash-1/code"}]},{"group":"Luma 2","pages":[{"title":"搭配 Comfy Router 使用 Ray 3.2","sidebarTitle":"Ray 3.2","href":"/zh/development/comfy-router/models/luma_2/ray-3-2/code"},{"title":"搭配 Comfy Router 使用 Uni 1 Max","sidebarTitle":"Uni 1 Max","href":"/zh/development/comfy-router/models/luma_2/uni-1-max/code"},{"title":"将 Uni 1 与 Comfy Router 配合使用","sidebarTitle":"Uni 1","href":"/zh/development/comfy-router/models/luma_2/uni-1/code"}]},{"group":"Meshy","pages":[{"title":"将 Animations 与 Comfy Router 配合使用","sidebarTitle":"Animations","href":"/zh/development/comfy-router/models/meshy/animations/code"},{"title":"搭配 Comfy Router 使用 Meshy 6","sidebarTitle":"Meshy 6","href":"/zh/development/comfy-router/models/meshy/meshy-6/code"},{"title":"将 Meshy 7.1 与 Comfy Router 配合使用","sidebarTitle":"Meshy 7.1","href":"/zh/development/comfy-router/models/meshy/meshy-7-1/code"},{"title":"将 Meshy 7 与 Comfy Router 配合使用","sidebarTitle":"Meshy 7","href":"/zh/development/comfy-router/models/meshy/meshy-7/code"},{"title":"将 Remesh 与 Comfy Router 配合使用","sidebarTitle":"Remesh","href":"/zh/development/comfy-router/models/meshy/remesh/code"},{"title":"通过 Comfy Router 使用 Rigging","sidebarTitle":"Rigging","href":"/zh/development/comfy-router/models/meshy/rigging/code"}]},{"group":"MiniMax","pages":[{"title":"配合 Comfy Router 使用 MiniMax H3","sidebarTitle":"MiniMax H3","href":"/zh/development/comfy-router/models/minimax/minimax-h3/code"}]},{"group":"Moonvalley","pages":[{"title":"使用 Comfy Router 进行图生视频","sidebarTitle":"图生视频","href":"/zh/development/comfy-router/models/moonvalley/image-to-video/code"},{"title":"使用 Comfy Router 进行文生视频","sidebarTitle":"文生视频","href":"/zh/development/comfy-router/models/moonvalley/text-to-video/code"},{"title":"通过 Comfy Router 使用视频转视频","sidebarTitle":"视频转视频","href":"/zh/development/comfy-router/models/moonvalley/video-to-video/code"}]},{"group":"OpenAI","pages":[{"title":"将 GPT 4.1 Mini 与 Comfy Router 配合使用","sidebarTitle":"GPT 4.1 Mini","href":"/zh/development/comfy-router/models/openai/gpt-4-1-mini/code"},{"title":"将 GPT 4.1 与 Comfy Router 配合使用","sidebarTitle":"GPT 4.1","href":"/zh/development/comfy-router/models/openai/gpt-4-1/code"},{"title":"将 GPT 4o 与 Comfy Router 配合使用","sidebarTitle":"GPT 4o","href":"/zh/development/comfy-router/models/openai/gpt-4o/code"},{"title":"使用 GPT 5.5 Pro 搭配 Comfy Router","sidebarTitle":"GPT 5.5 Pro","href":"/zh/development/comfy-router/models/openai/gpt-5-5-pro/code"},{"title":"将 GPT 5.5 与 Comfy Router 配合使用","sidebarTitle":"GPT 5.5","href":"/zh/development/comfy-router/models/openai/gpt-5-5/code"},{"title":"将 GPT 5.6 Luna 与 Comfy Router 配合使用","sidebarTitle":"GPT 5.6 Luna","href":"/zh/development/comfy-router/models/openai/gpt-5-6-luna/code"},{"title":"通过 Comfy Router 使用 GPT 5.6 Sol","sidebarTitle":"GPT 5.6 Sol","href":"/zh/development/comfy-router/models/openai/gpt-5-6-sol/code"},{"title":"将 GPT 5.6 Terra 与 Comfy Router 配合使用","sidebarTitle":"GPT 5.6 Terra","href":"/zh/development/comfy-router/models/openai/gpt-5-6-terra/code"},{"title":"在 Comfy Router 中使用 GPT 5 Mini","sidebarTitle":"GPT 5 Mini","href":"/zh/development/comfy-router/models/openai/gpt-5-mini/code"},{"title":"将 GPT 5 Nano 与 Comfy Router 结合使用","sidebarTitle":"GPT 5 Nano","href":"/zh/development/comfy-router/models/openai/gpt-5-nano/code"},{"title":"将 GPT 5 与 Comfy Router 搭配使用","sidebarTitle":"GPT 5","href":"/zh/development/comfy-router/models/openai/gpt-5/code"},{"title":"使用 GPT 6.1 Sol 与 Comfy Router","sidebarTitle":"GPT 6.1 Sol","href":"/zh/development/comfy-router/models/openai/gpt-6-1-sol/code"},{"title":"使用 GPT 6.1 Terra 搭配 Comfy Router","sidebarTitle":"GPT 6.1 Terra","href":"/zh/development/comfy-router/models/openai/gpt-6-1-terra/code"},{"title":"将 GPT 6 Astra 与 Comfy Router 配合使用","sidebarTitle":"GPT 6 Astra","href":"/zh/development/comfy-router/models/openai/gpt-6-astra/code"},{"title":"将 GPT 6 Luna 与 Comfy Router 配合使用","sidebarTitle":"GPT 6 Luna","href":"/zh/development/comfy-router/models/openai/gpt-6-luna/code"},{"title":"将 GPT 6 Sol 与 Comfy Router 配合使用","sidebarTitle":"GPT 6 Sol","href":"/zh/development/comfy-router/models/openai/gpt-6-sol/code"},{"title":"将 GPT Image 1.5 与 Comfy Router 配合使用","sidebarTitle":"GPT Image 1.5","href":"/zh/development/comfy-router/models/openai/gpt-image-1-5/code"},{"title":"将 GPT Image 2.5 Flare 与 Comfy Router 搭配使用","sidebarTitle":"GPT Image 2.5 Flare","href":"/zh/development/comfy-router/models/openai/gpt-image-2-5-flare/code"},{"title":"通过 Comfy Router 使用 GPT Image 2.5 Sunburst","sidebarTitle":"GPT Image 2.5 Sunburst","href":"/zh/development/comfy-router/models/openai/gpt-image-2-5-sunburst/code"},{"title":"将 GPT Image 2 与 Comfy Router 配合使用","sidebarTitle":"GPT Image 2","href":"/zh/development/comfy-router/models/openai/gpt-image-2/code"},{"title":"将 o3 与 Comfy Router 配合使用","sidebarTitle":"o3","href":"/zh/development/comfy-router/models/openai/o3/code"}]},{"group":"Pika","pages":[{"title":"使用 Pika 2.5 图生视频与 Comfy Router","sidebarTitle":"Pika 2.5 图生视频","href":"/zh/development/comfy-router/models/pika/pika-2-5-image-to-video/code"},{"title":"使用 Comfy Router 调用 Pika Soundtrack","sidebarTitle":"Pika Soundtrack","href":"/zh/development/comfy-router/models/pika/pika-soundtrack/code"},{"title":"通过 Comfy Router 使用 Pika Sfx","sidebarTitle":"Pika Sfx","href":"/zh/development/comfy-router/models/pika/pika-sfx/code"},{"title":"通过 Comfy Router 使用 Pika Music","sidebarTitle":"Pika Music","href":"/zh/development/comfy-router/models/pika/pika-music/code"},{"title":"使用 Pika 2.5 文生视频与 Comfy Router","sidebarTitle":"Pika 2.5 文生视频","href":"/zh/development/comfy-router/models/pika/pika-2-5-text-to-video/code"}]},{"group":"Pruna","pages":[{"title":"结合 Comfy Router 使用 P Video 2","sidebarTitle":"P Video 2","href":"/zh/development/comfy-router/models/pruna/p-video-2/code"}]},{"group":"Qwen","pages":[{"title":"搭配 Comfy Router 使用 Qwen Image 3.0 Pro","sidebarTitle":"Qwen Image 3.0 Pro","href":"/zh/development/comfy-router/models/qwen/qwen-image-3-0-pro/code"},{"title":"使用 Qwen Image 3.0 搭配 Comfy Router","sidebarTitle":"Qwen Image 3.0","href":"/zh/development/comfy-router/models/qwen/qwen-image-3-0/code"}]},{"group":"Recraft","pages":[{"title":"配合 Comfy Router 使用 Recraft V2","sidebarTitle":"Recraft V2","href":"/zh/development/comfy-router/models/recraft/recraftv2/code"},{"title":"使用 Comfy Router 调用 Recraft V3","sidebarTitle":"Recraft V3","href":"/zh/development/comfy-router/models/recraft/recraftv3/code"},{"title":"将 Recraft V4.1 Pro Vector 与 Comfy Router 配合使用","sidebarTitle":"Recraft V4.1 Pro Vector","href":"/zh/development/comfy-router/models/recraft/recraftv4-1-pro-vector/code"},{"title":"将 Recraft V4.1 Pro 与 Comfy Router 配合使用","sidebarTitle":"Recraft V4.1 Pro","href":"/zh/development/comfy-router/models/recraft/recraftv4-1-pro/code"},{"title":"通过 Comfy Router 使用 Recraft V4.1 Utility Pro Vector","sidebarTitle":"Recraft V4.1 Utility Pro Vector","href":"/zh/development/comfy-router/models/recraft/recraftv4-1-utility-pro-vector/code"},{"title":"将 Recraft V4.1 Utility Pro 与 Comfy Router 配合使用","sidebarTitle":"Recraft V4.1 Utility Pro","href":"/zh/development/comfy-router/models/recraft/recraftv4-1-utility-pro/code"},{"title":"使用 Recraft V4.1 Utility Vector 搭配 Comfy Router","sidebarTitle":"Recraft V4.1 Utility Vector","href":"/zh/development/comfy-router/models/recraft/recraftv4-1-utility-vector/code"},{"title":"将 Recraft V4.1 Utility 与 Comfy Router 搭配使用","sidebarTitle":"Recraft V4.1 Utility","href":"/zh/development/comfy-router/models/recraft/recraftv4-1-utility/code"},{"title":"结合 Comfy Router 使用 Recraft V4.1 Vector","sidebarTitle":"Recraft V4.1 Vector","href":"/zh/development/comfy-router/models/recraft/recraftv4-1-vector/code"},{"title":"搭配 Comfy Router 使用 Recraft V4.1","sidebarTitle":"Recraft V4.1","href":"/zh/development/comfy-router/models/recraft/recraftv4-1/code"},{"title":"在 Comfy Router 中使用 Recraft V4 Pro","sidebarTitle":"Recraft V4 Pro","href":"/zh/development/comfy-router/models/recraft/recraftv4-pro/code"},{"title":"将 Recraft V4 Styles Pro Vector 与 Comfy Router 配合使用","sidebarTitle":"Recraft V4 Styles Pro Vector","href":"/zh/development/comfy-router/models/recraft/recraftv4-styles-pro-vector/code"},{"title":"将 Recraft V4 Styles Pro 与 Comfy Router 配合使用","sidebarTitle":"Recraft V4 Styles Pro","href":"/zh/development/comfy-router/models/recraft/recraftv4-styles-pro/code"},{"title":"使用 Recraft V4 Styles Vector 与 Comfy Router","sidebarTitle":"Recraft V4 Styles Vector","href":"/zh/development/comfy-router/models/recraft/recraftv4-styles-vector/code"},{"title":"使用 Recraft V4 Styles 搭配 Comfy Router","sidebarTitle":"Recraft V4 Styles","href":"/zh/development/comfy-router/models/recraft/recraftv4-styles/code"},{"title":"搭配 Comfy Router 使用 Recraft V4","sidebarTitle":"Recraft V4","href":"/zh/development/comfy-router/models/recraft/recraftv4/code"}]},{"group":"Runway","pages":[{"title":"将 Aleph 2 与 Comfy Router 配合使用","sidebarTitle":"Aleph 2","href":"/zh/development/comfy-router/models/runway/aleph2/code"},{"title":"通过 Comfy Router 使用 Gen 4 Image","sidebarTitle":"Gen 4 Image","href":"/zh/development/comfy-router/models/runway/gen4-image/code"},{"title":"将 Gen 4 Turbo 与 Comfy Router 配合使用","sidebarTitle":"Gen 4 Turbo","href":"/zh/development/comfy-router/models/runway/gen4-turbo/code"}]},{"group":"Synclabs","pages":[{"title":"通过 Comfy Router 使用 Sync 3","sidebarTitle":"Sync 3","href":"/zh/development/comfy-router/models/synclabs/sync-3/code"}]},{"group":"Tencent","pages":[{"title":"使用混元 3D Part 配合 Comfy Router","sidebarTitle":"混元 3D Part","href":"/zh/development/comfy-router/models/tencent/hunyuan-3d-part/code"},{"title":"通过 Comfy Router 使用混元3D智能拓扑","sidebarTitle":"混元3D智能拓扑","href":"/zh/development/comfy-router/models/tencent/hunyuan-3d-smart-topology/code"},{"title":"使用 Comfy Router 调用混元3D 纹理编辑","sidebarTitle":"混元 3D Texture Edit","href":"/zh/development/comfy-router/models/tencent/hunyuan-3d-texture-edit/code"},{"title":"通过 Comfy Router 使用混元 3D Uv","sidebarTitle":"混元 3D Uv","href":"/zh/development/comfy-router/models/tencent/hunyuan-3d-uv/code"}]},{"group":"Veed","pages":[{"title":"通过 Comfy Router 使用 Clean Audio Video","sidebarTitle":"Clean Audio Video","href":"/zh/development/comfy-router/models/veed/clean-audio-video/code"},{"title":"通过 Comfy Router 使用 Clean Audio","sidebarTitle":"Clean Audio","href":"/zh/development/comfy-router/models/veed/clean-audio/code"},{"title":"使用 Fabric 1.0 与 Comfy Router","sidebarTitle":"Fabric 1.0","href":"/zh/development/comfy-router/models/veed/fabric-1-0/code"},{"title":"使用 Comfy Router 调用 Lipsync 2.0","sidebarTitle":"Lipsync 2.0","href":"/zh/development/comfy-router/models/veed/lipsync-2-0/code"},{"title":"使用 Comfy Router 进行快速视频背景移除","sidebarTitle":"快速视频背景移除","href":"/zh/development/comfy-router/models/veed/video-background-removal-fast/code"},{"title":"使用 Comfy Router 进行视频背景移除绿幕处理","sidebarTitle":"视频背景移除绿幕","href":"/zh/development/comfy-router/models/veed/video-background-removal-green-screen/code"},{"title":"通过 Comfy Router 使用视频背景移除","sidebarTitle":"视频背景移除","href":"/zh/development/comfy-router/models/veed/video-background-removal/code"}]},{"group":"Veo","pages":[{"title":"将 Veo 3.1 Fast Generate 001 与 Comfy Router 配合使用","sidebarTitle":"Veo 3.1 Fast Generate 001","href":"/zh/development/comfy-router/models/veo/veo-3-1-fast-generate-001/code"},{"title":"使用 Comfy Router 调用 Veo 3.1 Generate 001","sidebarTitle":"Veo 3.1 Generate 001","href":"/zh/development/comfy-router/models/veo/veo-3-1-generate-001/code"},{"title":"使用 Comfy Router 调用 Veo 3.1 Lite Generate 001","sidebarTitle":"Veo 3.1 Lite Generate 001","href":"/zh/development/comfy-router/models/veo/veo-3-1-lite-generate-001/code"}]},{"group":"Wan","pages":[{"title":"通过 Comfy Router 使用 HappyHorse 1.0 I2V","sidebarTitle":"HappyHorse 1.0 I2V","href":"/zh/development/comfy-router/models/wan/happyhorse-1-0-i2v/code"},{"title":"使用 HappyHorse 1.0 R2V 搭配 Comfy Router","sidebarTitle":"HappyHorse 1.0 R2V","href":"/zh/development/comfy-router/models/wan/happyhorse-1-0-r2v/code"},{"title":"使用 Comfy Router 调用 HappyHorse 1.0 T2V","sidebarTitle":"HappyHorse 1.0 T2V","href":"/zh/development/comfy-router/models/wan/happyhorse-1-0-t2v/code"},{"title":"使用 Comfy Router 调用 HappyHorse 1.0 Video Edit","sidebarTitle":"HappyHorse 1.0 视频编辑","href":"/zh/development/comfy-router/models/wan/happyhorse-1-0-video-edit/code"},{"title":"将 HappyHorse 1.1 I2V 与 Comfy Router 配合使用","sidebarTitle":"HappyHorse 1.1 I2V","href":"/zh/development/comfy-router/models/wan/happyhorse-1-1-i2v/code"},{"title":"通过 Comfy Router 使用 HappyHorse 1.1 R2V","sidebarTitle":"HappyHorse 1.1 R2V","href":"/zh/development/comfy-router/models/wan/happyhorse-1-1-r2v/code"},{"title":"使用 Comfy Router 调用 HappyHorse 1.1 T2V","sidebarTitle":"HappyHorse 1.1 T2V","href":"/zh/development/comfy-router/models/wan/happyhorse-1-1-t2v/code"},{"title":"通过 Comfy Router 使用 Wan 2.5 I2I Preview","sidebarTitle":"Wan 2.5 I2I Preview","href":"/zh/development/comfy-router/models/wan/wan2-5-i2i-preview/code"},{"title":"使用 Comfy Router 调用 Wan 2.5 I2V Preview","sidebarTitle":"Wan 2.5 I2V Preview","href":"/zh/development/comfy-router/models/wan/wan2-5-i2v-preview/code"},{"title":"将 Wan 2.5 T2I Preview 与 Comfy Router 配合使用","sidebarTitle":"Wan 2.5 T2I Preview","href":"/zh/development/comfy-router/models/wan/wan2-5-t2i-preview/code"},{"title":"使用 Comfy Router 调用 Wan 2.5 T2V Preview","sidebarTitle":"Wan 2.5 T2V Preview","href":"/zh/development/comfy-router/models/wan/wan2-5-t2v-preview/code"},{"title":"使用 Comfy Router 调用 Wan 2.6 I2V","sidebarTitle":"Wan 2.6 I2V","href":"/zh/development/comfy-router/models/wan/wan2-6-i2v/code"},{"title":"通过 Comfy Router 使用 Wan 2.6 R2V","sidebarTitle":"Wan 2.6 R2V","href":"/zh/development/comfy-router/models/wan/wan2-6-r2v/code"},{"title":"通过 Comfy Router 使用 Wan 2.6 T2V","sidebarTitle":"Wan 2.6 T2V","href":"/zh/development/comfy-router/models/wan/wan2-6-t2v/code"},{"title":"使用 Comfy Router 调用 Wan 2.7 I2V","sidebarTitle":"Wan 2.7 I2V","href":"/zh/development/comfy-router/models/wan/wan2-7-i2v/code"},{"title":"使用 Comfy Router 调用 Wan 2.7 R2V","sidebarTitle":"Wan 2.7 R2V","href":"/zh/development/comfy-router/models/wan/wan2-7-r2v/code"},{"title":"使用 Comfy Router 调用 Wan 2.7 T2V","sidebarTitle":"Wan 2.7 T2V","href":"/zh/development/comfy-router/models/wan/wan2-7-t2v/code"},{"title":"搭配 Comfy Router 使用 Wan 2.7 Video Edit","sidebarTitle":"Wan 2.7 Video Edit","href":"/zh/development/comfy-router/models/wan/wan2-7-videoedit/code"},{"title":"将 Wan 3.0 Video Prime 与 Comfy Router 配合使用","sidebarTitle":"Wan 3.0 Video Prime","href":"/zh/development/comfy-router/models/wan/wan3-0-video-prime/code"},{"title":"通过 Comfy Router 使用 Wan 3.0 Video","sidebarTitle":"Wan 3.0 Video","href":"/zh/development/comfy-router/models/wan/wan3-0-video/code"}]},{"group":"WaveSpeed","pages":[{"title":"将 Flashvsr 与 Comfy Router 配合使用","sidebarTitle":"Flashvsr","href":"/zh/development/comfy-router/models/wavespeed/flashvsr/code"},{"title":"将 Seedvr 2 与 Comfy Router 配合使用","sidebarTitle":"Seedvr 2","href":"/zh/development/comfy-router/models/wavespeed/seedvr2/code"},{"title":"将 Ultimate Image Upscaler 与 Comfy Router 配合使用","sidebarTitle":"Ultimate Image Upscaler","href":"/zh/development/comfy-router/models/wavespeed/ultimate-image-upscaler/code"}]},{"group":"xAI","pages":[{"title":"将 Grok Imagine Image 2.0 与 Comfy Router 配合使用","sidebarTitle":"Grok Imagine Image 2.0","href":"/zh/development/comfy-router/models/xai/grok-imagine-image-2-0/code"},{"title":"配合 Comfy Router 使用 Grok Imagine Image Pro","sidebarTitle":"Grok Imagine Image Pro","href":"/zh/development/comfy-router/models/xai/grok-imagine-image-pro/code"},{"title":"配合 Comfy Router 使用 Grok Imagine Image Quality","sidebarTitle":"Grok Imagine Image Quality","href":"/zh/development/comfy-router/models/xai/grok-imagine-image-quality/code"},{"title":"使用 Grok Imagine Image 与 Comfy Router","sidebarTitle":"Grok Imagine Image","href":"/zh/development/comfy-router/models/xai/grok-imagine-image/code"},{"title":"将 Grok Imagine Video 1.5 Lite 与 Comfy Router 配合使用","sidebarTitle":"Grok Imagine Video 1.5 Lite","href":"/zh/development/comfy-router/models/xai/grok-imagine-video-1-5-lite/code"},{"title":"结合 Comfy Router 使用 Grok Imagine Video 1.5 Preview","sidebarTitle":"Grok Imagine Video 1.5 Preview","href":"/zh/development/comfy-router/models/xai/grok-imagine-video-1-5-preview/code"},{"title":"将 Grok Imagine Video 1.5 与 Comfy Router 配合使用","sidebarTitle":"Grok Imagine Video 1.5","href":"/zh/development/comfy-router/models/xai/grok-imagine-video-1-5/code"},{"title":"搭配 Comfy Router 使用 Grok Imagine Video","sidebarTitle":"Grok Imagine Video","href":"/zh/development/comfy-router/models/xai/grok-imagine-video/code"}]},{"group":"Openrouter","pages":[{"title":"配合 Comfy Router 使用 Chat Completions","sidebarTitle":"Chat Completions","href":"/zh/development/comfy-router/models/openrouter/chat-completions/code"}]}]}]},{"group":"Comfy CLI","pages":[{"title":"Comfy CLI 入门","sidebarTitle":"快速开始","href":"/zh/comfy-cli/getting-started"},{"title":"Comfy CLI 命令参考","sidebarTitle":"命令参考","href":"/zh/comfy-cli/reference"},{"title":"Comfy CLI 故障排查:安装与环境修复","sidebarTitle":"故障排除","href":"/zh/comfy-cli/troubleshooting"}]},{"group":"规范","pages":[{"group":"Workflow JSON","pages":[{"title":"工作流 JSON","href":"/zh/specs/workflow_json"},{"title":"工作流 JSON 0.4","href":"/zh/specs/workflow_json_0.4"}]},{"group":"节点定义","pages":[{"title":"节点定义 JSON","href":"/zh/specs/nodedef_json"},{"title":"节点定义 JSON 1.0","href":"/zh/specs/nodedef_json_1_0"}]}]},{"group":"Demo Apps","pages":[{"title":"演示应用","mode":"wide","href":"/zh/development/samples/overview"}]}]},{"tab":"自定义节点","pages":[{"title":"自定义节点","href":"/zh/custom-nodes/intro"}]},{"tab":"支持","pages":[{"title":"支持","href":"/zh/support/contact-support"}]},{"tab":"Cloud API 参考文档","pages":[{"title":"Cloud API 参考文档","href":"/zh/api-reference/cloud/workflow/get-information-about-current-prompt-executions"}]}]},{"language":"ja","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"リソース","items":[{"label":"インストール","href":"/ja/installation/system_requirements"},{"label":"チュートリアル","href":"/ja/tutorials/basic/text-to-image"},{"label":"開発","href":"/ja/development/overview"}]},{"header":"プロダクト","items":[{"label":"機能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"ギャラリー","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"ダウンロード","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"会社情報","items":[{"label":"概要","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"採用情報","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"利用規約","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"プライバシーポリシー","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ja/tutorials/partner-nodes/pricing","label":"料金"},{"href":"https://comfy.org/download?utm_source=docs","label":"ダウンロード"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"pages":[{"title":"ja","href":"/ja/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes"}]},{"language":"ko","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"리소스","items":[{"label":"설치","href":"/ko/installation/system_requirements"},{"label":"튜토리얼","href":"/ko/tutorials/basic/text-to-image"},{"label":"개발","href":"/ko/development/overview"}]},{"header":"제품","items":[{"label":"기능","href":"https://www.comfy.org/?utm_source=docs"},{"label":"갤러리","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"다운로드","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"회사 정보","items":[{"label":"소개","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"채용","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"이용약관","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"개인정보 처리방침","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ko/tutorials/partner-nodes/pricing","label":"가격 정책"},{"href":"https://comfy.org/download?utm_source=docs","label":"다운로드"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"pages":[{"title":"ko","href":"/ko/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes"}]},{"language":"es","pages":[{"title":"es","href":"/es/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes"}]}]},"basePath":"","title":"Create or reuse an asset over existing bytes - ComfyUI","buildId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","deploymentId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-5FCzAcfS.js","utils-SLtAG4EZ.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-2DZi8ZMu.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-D7J3nkzE.js","snippetPresets-D0Alv0AH.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BI4qNJ2c.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BD3uyr8j.js","shallow-D8iEBr5z.js","getApiPlaygroundDisplay-CgNP4lzR.js","CodeSnippet-CX-QHuMs.js","CodeSnippets-VlXE-ZUf.js","Page-D9ithiIZ.js","getPastedJson-DYNQkZ1M.js","icon-CzacdwOi.js","MethodPill-2JVqoYKi.js","DuplicateIcon-_xVXs-U8.js","createIcon-BRHrweLo.js","DynamicMarkdown-mQG_iQiE.js","SectionHeading-DMpJzv8f.js","axios-vUo_bRtp.js","Markdown-5FGIym-8.js","clsx-D-TRO5q5.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CdrJecqK.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-CHlcWBLM.js"]}