从零开发 Hermes Plugin:调用 ComfyUI 接口,让 AI 智能体一键生图

12次阅读
没有评论

前面给大家科普过 Hermes Plugin 的核心能力:插件是 Hermes 智能体拓展外部能力的最佳方式,零侵入核心代码、可插拔、易维护

很多小伙伴玩 Hermes 智能体时,最刚需的功能就是AI 绘图。原生 Hermes 没有生图能力,而本地部署的 ComfyUI 生图质量高、可自定义工作流、免费无额度限制。

今天手把手带大家从零开发一款专属 Hermes 插件,实现:Hermes 对话触发指令 → 调用本地 ComfyUI 接口 → 自动生成图片 → 智能体返回图片结果。全程纯实操,代码可直接复用,新手也能一次跑通。

先上最终效果:对 Hermes 说“画一张赛博朋克城市”,智能体自动调用 ComfyUI 工作流,完成绘图并返回图片链接/本地路径。

开发前先确保环境就绪,避免后续报错:

  • 已部署 Hermes Agent 开源框架,可正常运行对话
  • 本地 ComfyUI 部署完成,开启 API 监听(默认本地地址 http://127.0.0.1:8188
  • ComfyUI 提前保存好一套可用绘图工作流,导出 API 格式 JSON
  • 设备安装 Python 环境,支持 requests 网络请求

重点提示:ComfyUI 普通保存的工作流无法用于 API 调用,必须通过「Save (API Format)」导出,否则会参数缺失、调用失败。

二、实现原理:整体流程拆解

这款自定义插件的核心逻辑非常清晰,全程 5 步闭环:

  1. 指令监听:Hermes 识别用户生图指令(画画/生成图片/绘制等)
  2. 插件触发:匹配到关键词后,加载自定义 ComfyUI 插件能力
  3. 参数组装:提取用户输入的提示词,替换工作流中的绘图参数
  4. API 调用:向后端 ComfyUI 推送绘图任务,等待队列执行
  5. 结果回传:获取 ComfyUI 生成的图片路径/链接,返回给 Hermes 前端展示

三、Hermes ComfyUI 插件完整开发实操

Hermes 插件有固定目录规范和文件格式,我们从零创建完整插件目录。

1. 创建插件目录结构

进入 Hermes 全局插件目录,新建comfyui_draw 插件文件夹,目录结构如下:

~/.hermes/plugins/comfyui_draw/
├── __init__.py      # 插件核心逻辑代码
└── plugin.yaml      # 插件配置文件(必填)

2. 编写插件配置文件 plugin.yaml

该文件是插件的身份信息,Hermes 依靠该文件识别、加载插件,配置简洁通用:

name: comfyui_draw
version: 1.0.0
description: 调用本地ComfyUI接口,实现AI智能体一键生图
author: 自定义开发
tags: ["AI绘图", "ComfyUI", "工具扩展"]
enabled: true

3. 编写核心逻辑代码 __init__.py

核心功能:注册工具、监听用户指令、替换提示词、调用 ComfyUI API、获取图片结果。代码做了精简优化,自带异常捕获,可直接复用:

import requests
import json
import os
from typing import Optional
from hermes.plugin import PluginContext, register_plugin

# 配置ComfyUI本地接口地址
COMFYUI_API_URL = "http://127.0.0.1:8188"
# 替换为你自己的ComfyUI API工作流JSON
COMFYUI_WORKFLOW = {
    "3": {
        "class_type": "KSampler",
        "inputs": {
            "seed": -1,
            "steps": 20,
            "cfg_scale": 7,
            "sampler_name": "euler",
            "scheduler": "normal",
            "denoise": 1,
            "model": ["4", 0],
            "positive": ["6", 0],
            "negative": ["7", 0]
        }
    },
    "4": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "v1-5-pruned-emaonly.safetensors"}},
    "6": {"class_type": "CLIPTextEncode", "inputs": {"text": "positive_prompt", "clip": ["4", 0]}},
    "7": {"class_type": "CLIPTextEncode", "inputs": {"text": "negative_prompt", "clip": ["4", 0]}},
    "8": {"class_type": "VAEDecode", "inputs": {"samples": ["3", 0]}},
    "9": {"class_type": "SaveImage", "inputs": {"images": ["8", 0], "filename_prefix": "hermes_draw"}}
}

# 固定负面提示词
DEFAULT_NEGATIVE = "worst quality, low quality, blurry, deformed, watermark"

def call_comfyui_draw(prompt: str) -> Optional[str]:
    """调用ComfyUI生成图片,返回图片本地路径"""
    try:
        # 替换工作流提示词
        COMFYUI_WORKFLOW["6"]["inputs"]["text"] = prompt
        COMFYUI_WORKFLOW["7"]["inputs"]["text"] = DEFAULT_NEGATIVE

        # 提交绘图任务
        resp = requests.post(
            url=f"{COMFYUI_API_URL}/prompt",
            json={"prompt": COMFYUI_WORKFLOW},
            timeout=30
        )
        resp_data = resp.json()
        prompt_id = resp_data.get("prompt_id")
        if not prompt_id:
            return "绘图失败:未获取到ComfyUI任务ID"

        # 查询任务执行状态
        output_resp = requests.get(f"{COMFYUI_API_URL}/history/{prompt_id}", timeout=60)
        history_data = output_resp.json()
        if not history_data:
            return "绘图失败:任务执行超时"

        # 解析图片路径
        task_info = history_data[prompt_id]
        images = task_info.get("outputs", {}).get("9", {}).get("images", [])
        if not images:
            return "绘图失败:未生成有效图片"
        
        img_name = images[0]["filename"]
        img_path = os.path.join(os.path.expanduser("~"), "ComfyUI", "output", img_name)
        return f"✅ 图片生成成功!\n本地路径:{img_path}"

    except Exception as e:
        return f"绘图异常:{str(e)}"

# 注册Hermes插件工具
@register_plugin
def plugin_entry(ctx: PluginContext):
    # 注册生图工具指令
    ctx.register_tool(
        name="comfyui_ai_draw",
        description="根据用户文字描述生成AI图片,可绘制风景、人物、插画、赛博朋克等所有风格图像",
        func=call_comfyui_draw
    )

四、代码核心修改说明(必看)

直接运行大概率会报错,只需修改两处个人专属配置,即可适配你的设备:

  1. 替换工作流 JSON:把代码中 COMFYUI_WORKFLOW 替换成你自己导出的 API 工作流,适配你的模型、分辨率、采样器;
  2. 修正模型名称:工作流中 ckpt_name 改为你 ComfyUI 本地真实的模型文件名;
  3. 调整图片路径:如果你的 ComfyUI 输出目录非默认,手动修改 img_path 路径。

五、插件加载与测试

1. 重启 Hermes 加载插件

插件文件配置完成后,重启 Hermes 服务,框架会自动扫描插件目录,加载 comfyui_draw 插件。可通过插件列表命令查看是否成功启用。

2. 对话测试生图功能

在 Hermes 对话窗口输入生图指令,示例:

  • 画一张赛博朋克风格的未来都市夜景,高清细节
  • 生成一张日系治愈风樱花插画,唯美清新

智能体会自动调用插件工具,请求 ComfyUI 执行绘图任务,等待数秒后返回生成成功提示与图片本地路径,直接打开即可查看成品。

六、常见问题排查

  • 插件加载失败:检查目录是否正确、yaml文件是否格式报错、是否缺少 __init__.py
  • 调用超时:确认 ComfyUI 已正常启动、8188 端口未被占用
  • 生成空白图/报错:工作流非 API 格式、模型文件名不匹配、提示词参数错误
  • 找不到图片:核对 ComfyUI 输出目录,修正代码中本地路径配置

七、进阶优化方向

基础功能跑通后,可以继续迭代升级插件,适配更多场景:

  1. 支持自定义分辨率、步数、CFG、风格参数,用户可指令控制绘图参数;
  2. 对接图床,将本地图片转为在线链接,支持前端直接预览;
  3. 添加历史绘图记录、批量生图、图生图功能;
  4. 增加异常重试机制,提升稳定性。

八、总结

通过 Hermes Plugin 对接 ComfyUI 生图,是低成本拓展 AI 智能体视觉能力的最优方案。无需修改框架源码,一个轻量插件就可以让对话智能体拥有专业 AI 绘图能力,兼顾灵活性、可控性和私密性,完全本地运行、无第三方额度限制。

掌握这套开发逻辑后,你还可以举一反三,开发插件对接视频生成、语音合成、数据分析等各类外部工具,彻底解锁 Hermes 智能体的全部拓展能力!

#Hermes插件开发 #ComfyUI教程 #AI智能体实战 #本地AI生图 #大模型应用开发

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码