让我分析两个版本的主要动作:

V56 (文生图) 的动作流程:

  1. 连接服务器
ws = websocket.WebSocket()
ws.connect(f"ws://{server_address}/ws?clientId={client_id}")
  1. 构建文生图工作流
prompt = {
    "3": { # KSampler },
    "4": { # 模型加载 },
    "5": { # 空白图像 },
    "6": { # 正面提示词 },
    "7": { # 负面提示词 },
    "8": { # VAE解码 },
    "9": { # 保存图像 }
}
  1. 提交任务
request_data = {"prompt": prompt, "client_id": client_id}
response = requests.post(f"http://{server_address}/prompt", json=request_data)
  1. 获取生成结果
response = requests.get(f"http://{server_address}/history/{prompt_id}")

V65 (图生图) 的动作流程:

  1. 上传原始图片
upload_image(image_path, server_address)
  1. 连接服务器
ws = websocket.WebSocket()
ws.connect(f"ws://{server_address}/ws?clientId={client_id}")
  1. 构建图生图工作流
prompt = {
    "3": { # KSampler },
    "4": { # 模型加载 },
    "6": { # 正面提示词 },
    "7": { # 负面提示词 },
    "8": { # VAE解码 },
    "9": { # 保存图像 },
    "10": { # VAE编码 },
    "11": { # 加载输入图片 }
}
  1. 提交任务
request_data = {"prompt": prompt, "client_id": client_id}
response = requests.post(f"http://{server_address}/prompt", json=request_data)
  1. 获取生成结果
response = requests.get(f"http://{server_address}/history/{prompt_id}")
  1. 保存结果图片
with open(full_path, "wb") as f:
    f.write(response.read())

主要区别:

  1. V65多了上传原始图片的步骤
  2. V65的工作流中多了VAE编码和加载输入图片节点
  3. V56使用空白图像节点,而V65使用上传的图片
  4. V65的工作流更复杂,需要处理输入图片的编码和解码
  5. V65需要额外处理文件上传和保存的逻辑

两者共同点:

  1. 都需要连接WebSocket
  2. 都使用相同的API提交任务和获取结果
  3. 基本的工作流结构类似
  4. 错误处理机制相似