API Node
- Image
- BFL
- Luma
- Recraft
- Save SVG
- Recraft Style - Realistic Image
- Recraft Text to Vector
- Recraft Creative Upscale
- Recraft Image to Image
- Recraft Crisp Upscale
- Recraft Color RGB
- Recraft Text to Image
- Recraft Image Inpainting
- Recraft Vectorize Image
- Recraft Style - Digital Illustration
- Recraft Remove Background
- Recraft Style - Logo Raster
- Recraft Controls
- Recraft Replace Background
- Ideogram
- Stability AI
- OpenAI
- Video
Recraft Text to Image - ComfyUI 原生节点文档
Recraft Text to Image - ComfyUI 原生节点文档
通过文本描述生成高质量图像的 Recraft API 节点
Recraft Text to Image 节点允许你通过文本提示词生成高质量图像,直接连接 Recraft AI 的图像生成 API,创建各种风格的图像作品。
参数说明
基本参数
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
prompt | 字符串 | "" | 生成图像的文本描述 |
size | 选择项 | 1024x1024 | 输出图像尺寸 |
n | 整数 | 1 | 生成图像数量(1-6) |
seed | 整数 | 0 | 随机种子值 |
可选参数
参数 | 类型 | 说明 |
---|---|---|
recraft_style | Recraft Style | 设置生成图像的风格,默认为”真实照片” |
negative_prompt | 字符串 | 指定不希望出现的元素 |
recraft_controls | Recraft Controls | 附加控制参数(颜色等) |
输出
输出 | 类型 | 说明 |
---|---|---|
IMAGE | 图像 | 生成的图像结果 |
使用示例
工作原理
本节点主要通过以下步骤处理请求:
- 整合输入参数,包括提示词、图像尺寸、生成数量和随机种子
- 如有连接,合并风格设置和控制参数
- 构建API请求并发送到Recraft服务器
- 接收返回的图像URL并下载图像数据
- 将图像数据转换为ComfyUI可用的tensor格式并输出
节点使用同步操作模式,会在处理完成前阻塞工作流执行,直到所有请求的图像都生成完毕。该节点利用Recraft的V3模型进行图像生成,能支持各种详细的文本描述和风格变化。
源码参考
[节点源码 (更新于2025-05-03)]
class RecraftTextToImageNode:
"""
Generates images synchronously based on prompt and resolution.
"""
RETURN_TYPES = (IO.IMAGE,)
DESCRIPTION = cleandoc(__doc__ or "") # Handle potential None value
FUNCTION = "api_call"
API_NODE = True
CATEGORY = "api node/image/Recraft"
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"prompt": (
IO.STRING,
{
"multiline": True,
"default": "",
"tooltip": "Prompt for the image generation.",
},
),
"size": (
[res.value for res in RecraftImageSize],
{
"default": RecraftImageSize.res_1024x1024,
"tooltip": "The size of the generated image.",
},
),
"n": (
IO.INT,
{
"default": 1,
"min": 1,
"max": 6,
"tooltip": "The number of images to generate.",
},
),
"seed": (
IO.INT,
{
"default": 0,
"min": 0,
"max": 0xFFFFFFFFFFFFFFFF,
"control_after_generate": True,
"tooltip": "Seed to determine if node should re-run; actual results are nondeterministic regardless of seed.",
},
),
},
"optional": {
"recraft_style": (RecraftIO.STYLEV3,),
"negative_prompt": (
IO.STRING,
{
"default": "",
"forceInput": True,
"tooltip": "An optional text description of undesired elements on an image.",
},
),
"recraft_controls": (
RecraftIO.CONTROLS,
{
"tooltip": "Optional additional controls over the generation via the Recraft Controls node."
},
),
},
"hidden": {
"auth_token": "AUTH_TOKEN_COMFY_ORG",
},
}
def api_call(
self,
prompt: str,
size: str,
n: int,
seed,
recraft_style: RecraftStyle = None,
negative_prompt: str = None,
recraft_controls: RecraftControls = None,
auth_token=None,
**kwargs,
):
default_style = RecraftStyle(RecraftStyleV3.realistic_image)
if recraft_style is None:
recraft_style = default_style
controls_api = None
if recraft_controls:
controls_api = recraft_controls.create_api_model()
if not negative_prompt:
negative_prompt = None
operation = SynchronousOperation(
endpoint=ApiEndpoint(
path="/proxy/recraft/image_generation",
method=HttpMethod.POST,
request_model=RecraftImageGenerationRequest,
response_model=RecraftImageGenerationResponse,
),
request=RecraftImageGenerationRequest(
prompt=prompt,
negative_prompt=negative_prompt,
model=RecraftModel.recraftv3,
size=size,
n=n,
style=recraft_style.style,
substyle=recraft_style.substyle,
style_id=recraft_style.style_id,
controls=controls_api,
),
auth_token=auth_token,
)
response: RecraftImageGenerationResponse = operation.execute()
images = []
for data in response.data:
image = bytesio_to_image_tensor(
download_url_to_bytesio(data.url, timeout=1024)
)
if len(image.shape) < 4:
image = image.unsqueeze(0)
images.append(image)
output_image = torch.cat(images, dim=0)
return (output_image,)