快速创建一个生成漫画插图接口

更新时间:

从0到1快速创建一个生成漫画插图接口

方案概览

用户自己手动在智作工坊控制台创建对应的应用,调试需要的工作流,并且发布为一个可以调用的接口,之后使用对应的语言的 SDK 接入,并且调用获取到 ComfyUI 任务的结果。基于智作工坊的控制台和提供的各语言版本 SDK,可以快速调试自己需要的工作流,并且部署为API接口供调用。

image

部署准备

开始部署前,请按以下指引完成账号申请、账号充值。

准备账号

如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。

开通智作工坊

参考智作工坊服务开通文档:服务开通

快速体验

新建工作流

  1. 进入智作工坊控制台 ComfyUI 工作流管理界面

  2. 点击新建工作流image

  3. 填写工作流信息,以及选择需要的工作流模板,这里选择文生图模板,点击确认image

  4. 点击之后将会跳转到工作流编辑界面,等待页面加载完毕之后,显示如下:image

运行查看效果

  1. 修改节点中的正向提示词反向提示词,点击右上角运行工作流查看效果image

  2. 等待工作流执行image

  3. 执行结束,查看结果如下图image

部署工作流为接口

发布工作流

  1. 确认工作流可以执行得到结果后,点击发布,进入发布菜单

  2. 填入版本描述:填入简单文生图测试

  3. 设置工作流入参:在这里可以设置接口服务对外暴露的参数,其他未暴露的参数值默认使用工作流中的值。若调用时为传递设置的参数,也默认是工作流中的参数。

    1. 点击下方添加按钮,可以添加新的参数image

    2. 添加之后确认设置好的参数,含义如下,注意 #3会显示在工作流右上角,方便对应关系image

    3. 如果需要修改参数

      1. 点击字段对应的编辑,可以编辑参数别名image

      2. 编辑态:image

      3. 编辑好之后,回车保存

  4. 发布工作流:确认无误之后,点击提交发布。image

  5. 发布之后可以看到生成对应的接口版本管理信息image

为工作流指定别名

  1. 点击别名管理tab,点击新建别名按钮,填写接口调用别名名称,选择别名当前对应的主版本,后续更新接口版本只需要在此替换版本即可,无需修改代码中的版本ID。image

  2. 点击确认,得到如下效果:image

  3. 复制对应的别名备用,这里是 t2i_0821

应用创建获取AKSK

  1. 接口发布之后,想要调用接口,需要先新建应用,使用应用的AKSK通过SDK调用。打开智作工坊控制台应用管理tab页

  2. 点击右上角创建应用image

  3. 填写应用名称以及应用类型,点击确认image

  4. 确认后会自动跳转应用详情页,复制对应的AK、SK备用image

代码调用

  1. 获取到应用的 AKSK、以及工作流别名,需要使用对应语言的SDK调用,这里以Python为例,其余语言参考各语言SDK参考

  2. 参考指南完成接入:Python接入指南

  3. 替换 main.py 其中的 AKSK工作流ID、工作流别名参数如下:

    from client import Client
    from proto import ComfyRequest, ComfyResponse, PredictResultResponse, ProgressResponse
    import time
    import json
    
    cli = Client(
        endpoint="openai.edu-aliyun.com",
        app_key="替换AK",
        app_secret="替换SK"
    )
    
    
    # 原始调用方法
    def call(url, body, method='POST', headers=None):
        # 忽略
    
    
    def comfy_prompt(prompt: ComfyRequest, custom_resource_config_id='default') -> ComfyResponse:
        # 忽略内容
    
    
    if __name__ == '__main__':
        begin = time.time()
        # 工作流别名
        alias_id = "替换为工作流别名"
        workflow_id = "替换为控制台上的工作流 ID"
        params = {
                "prompt": "提示词"
        }
        result = comfy_prompt(ComfyRequest(alias_id=alias_id,
                                                  workflow_id=workflow_id,
                                                    inputs=params))
        print("生图结果:" + str(result))
        print("时间消耗: %.2fs" % (time.time() - begin))

查看效果

  1. 执行之后可以获取结果,示例结果为:

{
  "status": 10,
  "err_code": null,
  "err_message": null,
  "sub_err_code": null,
  "sub_err_message": null,
  "api_invoke_id": "i_66c5a89c9b80590025596496",
  "data": {
    "task_id": "01j5t1n78pcvmjsdbsp5jd52hq",
    "images": [
      "http://xxx"
    ],
    "info": {},
    "parameters": null,
    "status": "succeeded",
    "imgs_bytes": null
  }
}

返回的结果如下:image

修改工作流为漫画插画并更新接口

修改工作流

  1. 保存下面的 json 文件为 cartoon_comic.json

    {
      "3": {
        "inputs": {
          "seed": 568422393720372,
          "steps": 4,
          "cfg": 1.5,
          "sampler_name": "dpmpp_sde",
          "scheduler": "karras",
          "denoise": 1,
          "model": [
            "27",
            0
          ],
          "positive": [
            "28",
            0
          ],
          "negative": [
            "29",
            0
          ],
          "latent_image": [
            "30",
            0
          ]
        },
        "class_type": "KSampler",
        "_meta": {
          "title": "KSampler"
        }
      },
      "8": {
        "inputs": {
          "samples": [
            "3",
            0
          ],
          "vae": [
            "27",
            2
          ]
        },
        "class_type": "VAEDecode",
        "_meta": {
          "title": "VAE Decode"
        }
      },
      "15": {
        "inputs": {
          "text_positive": [
            "31",
            0
          ],
          "text_negative": [
            "26",
            0
          ],
          "milehigh": "Xilam_Comics_Animation",
          "log_prompt": false
        },
        "class_type": "MilehighStyler",
        "_meta": {
          "title": "Milehigh Styler"
        }
      },
      "25": {
        "inputs": {
          "text": "孙悟空漫画登上天堂并开始在天堂肆虐",
          "choose_to_language": "en"
        },
        "class_type": "AlibabaTransApi",
        "_meta": {
          "title": "阿里翻译Api"
        }
      },
      "26": {
        "inputs": {
          "text": "(worst quality, low quality:1.4),(depth of field, blurry:1.2),(greyscale, monochrome:1.1),cropped,lowres,text,(nsfw:1.3),(worst quality:2),(low quality:2),(normal quality:2),((grayscale)),skin spots,acnes,skin blemishes,age spot,(ugly:1.331),(duplicate:1.331),(morbid:1.21),(mutilated:1.21),(tranny:1.331),mutated hands,(poorly drawn hands:1.5),blurry,(bad anatomy:1.21),(bad proportions:1.331),(disfigured:1.331),(missing arms:1.331),(extra legs:1.331),(fused fingers:1.61051),(too many fingers:1.61051),(unclear eyes:1.331),lowers,bad hands,missing fingers,extra digit,bad hands,(((extra arms and legs))),nsfw, (worst quality, low quality:1.4),(depth of field, blurry:1.2),(greyscale, monochrome:1.1),3D face,cropped,lowres,text,(nsfw:1.3),(worst quality:2),(low quality:2),(normal quality:2),((grayscale)),skin spots,acnes,skin blemishes,age spot,(ugly:1.331),(duplicate:1.331),(morbid:1.21),(mutilated:1.21),(tranny:1.331),mutated hands,(poorly drawn hands:1.5),blurry,(bad anatomy:1.21),(bad proportions:1.331),(disfigured:1.331),(missing arms:1.331),(extra legs:1.331),(fused fingers:1.61051),(too many fingers:1.61051),(unclear eyes:1.331),lowers,bad hands,missing fingers,extra digit,bad hands,(((extra arms and legs)))",
          "choose_to_language": "en"
        },
        "class_type": "AlibabaTransApi",
        "_meta": {
          "title": "阿里翻译Api"
        }
      },
      "27": {
        "inputs": {
          "ckpt_name": "XL-Lightning-梦幻_Lightning-4Step.safetensors"
        },
        "class_type": "CheckpointLoaderSimple",
        "_meta": {
          "title": "Load Checkpoint"
        }
      },
      "28": {
        "inputs": {
          "text": [
            "15",
            0
          ],
          "clip": [
            "27",
            1
          ]
        },
        "class_type": "CLIPTextEncode",
        "_meta": {
          "title": "CLIP Text Encode (Prompt)"
        }
      },
      "29": {
        "inputs": {
          "text": [
            "15",
            1
          ],
          "clip": [
            "27",
            1
          ]
        },
        "class_type": "CLIPTextEncode",
        "_meta": {
          "title": "CLIP Text Encode (Prompt)"
        }
      },
      "30": {
        "inputs": {
          "width": 512,
          "height": 768,
          "batch_size": 1
        },
        "class_type": "EmptyLatentImage",
        "_meta": {
          "title": "Empty Latent Image"
        }
      },
      "31": {
        "inputs": {
          "safe_check": true,
          "text": [
            "25",
            0
          ]
        },
        "class_type": "AlibabaTextContentSafeApi",
        "_meta": {
          "title": "阿里文本内容安全Plus"
        }
      },
      "32": {
        "inputs": {
          "safe_check": true,
          "safe_confidence_level": 0,
          "oss_bucket_name": "sd-fc-prod",
          "images": [
            "8",
            0
          ]
        },
        "class_type": "SaveImageWithContentSafeApi",
        "_meta": {
          "title": "保存图片with阿里图片内容安全Plus"
        }
      }
    }
  2. 进入智作工坊控制台 ComfyUI 工作流管理界面

  3. 选择自己刚刚创建的工作流,点击进入工作流调试界面image

  4. 点击导入按钮,导入工作流文件:image

发布工作流 & 版本更新

  1. 导入后点击右上角运行工作流确认无误后,点击发布

    1. 由于工作流变化较大,节点之间的映射失效,需要先删除旧的映射关系,再使用新的节点路径映射,如下图操作:image

    2. 修改后的效果如下,点击提交发布image

  2. 发布之后会显示新的版本号image

  3. 由于之前设置了别名,只需要在别名管理替换新的主版本即可:image

新接口测试

  1. 直接运行刚刚的测试代码,返回的结果如下,可以看到已生效:image