一、技能整体概述

OpenAI Image Gen 基于 OpenAI 图像生成模型打造,是集成在 OpenClaw 框架内的文生图、图生图、风格定制、批量出图、高清放大、图文联动一体化智能图像创作工具。

依托 DALL・E 系列模型强大的视觉生成能力,支持自然语言描述作画、参考图二次创作、尺寸 / 风格 / 数量自定义、高清修复、格式导出等全链路能力,适配海报制作、配图设计、创意插画、场景效果图、头像生成、素材批量产出等场景。可与框架内搜索、文档、语音等技能无缝联动,实现文字内容一键配图、语音描述自动出图、搜索素材再创作等自动化流程。

二、原生工具现存痛点

  1. 指令单一:仅支持基础文生图,无法精细化控制尺寸、构图、画风、光影、细节参数。
  2. 能力局限:缺少图生图、高清放大、局部重绘、风格迁移等进阶功能,创作形式单一。
  3. 输出格式固定:仅返回在线图片链接,不支持本地保存、格式转换、批量打包。
  4. 无中文优化:中文描述理解弱,复杂创意、古风 / 国潮 / 写实等特色画风识别偏差大。
  5. 无批量能力:单次仅生成单张 / 固定数量图片,大批量素材创作效率低下。
  6. 缺少内容管控:无违规内容筛查、水印标注、版权备注,使用存在风险。
  7. 框架联动弱:生成结果无法对接 OpenClaw 其他技能,难以融入自动化工作流。

三、核心能力升级与功能拓展

(一)多模式图像创作

  1. 文生图 自然语言描述生成图像,支持中英文混合指令,精准解析画面主体、构图、色调、光影、场景、人物、道具等细节;内置写实、二次元、国风、赛博朋克、油画、水彩、极简风等十余种预设风格。
  2. 图生图 上传参考图片,基于原图进行风格改写、画面重构、元素替换、场景拓展,支持保留主体仅修改背景 / 色调 / 画风。
  3. 高清放大 对生成图片进行无损分辨率提升,模糊图优化细节,适配海报、印刷、大屏展示等高清使用需求。

(二)精细化参数自定义

  • 尺寸选择:支持标准比例(1:1、16:9、4:3)及模型原生分辨率配置。
  • 生成数量:单次可自定义 1~10 张,满足多选、批量素材需求。
  • 创意强度:调整画面自由度,低数值贴合描述、高数值发挥创意脑洞。
  • 负面提示词:支持添加避坑指令,过滤水印、模糊、畸形、多余元素等问题。

(三)批量处理与本地管理

  • 批量生成:批量解析多条文案,一次性产出对应图像,自动分类命名。
  • 本地持久化:图片自动下载至本地目录,支持按任务、时间、关键词分类归档。
  • 格式转换:输出 PNG/JPG 主流格式,自定义画质压缩参数。

(四)内容安全与合规管控

  • 内置违规内容检测,自动拦截色情、暴力、违法等不良创作请求,并给出提示。
  • 可选添加文字水印、版权标注,保护创作素材。
  • 完整操作日志,记录生成指令、时间、文件名称,便于溯源管理。

(五)AI 辅助优化

  1. 指令优化:自动精简、润色中文提示词,补充专业绘画术语,提升出图质量。
  2. 画面解读:生成图片后,自动提炼画面内容、风格、核心元素,形成图文说明。
  3. 风格推荐:根据文案用途(办公配图、社交海报、插画素材)智能推荐适配画风。

(六)OpenClaw 全框架联动

  • 对接文档技能:Word/PDF 内文字内容,一键生成配套插图。
  • 对接搜索技能:搜索获取文案 / 主题后,自动配图产出完整素材包。
  • 对接语音技能:语音描述画面,实时转写指令并完成图像生成。
  • 结果回传:图片路径、图文描述自动存入框架记忆库,支持后续调取复用。

四、分层架构设计

  1. 全局配置层:管理 API 密钥、默认尺寸、风格预设、存储目录、批量上限、安全开关、水印参数。
  2. 输入校验层:校验文本指令、图片文件格式 / 大小、参数合法性,拦截非法请求。
  3. 提示词优化层:中文语句润色、专业术语补充、负面词拼接、指令标准化。
  4. 模型调用层:封装 OpenAI 图像生成接口,请求封装、超时控制、指数退避重试。
  5. 图像处理层:图片下载、高清放大、格式转换、水印添加、本地归档。
  6. 安全审计层:内容筛查、日志记录、异常捕获、风险提示。
  7. 交互联动层:解析自然语言指令、结果反馈、跨技能接口、状态推送。

五、核心代码实现(TypeScript・OpenClaw 原生适配)

typescript

运行

import fs from "fs-extra";
import path from "path";
import { Skill, Context } from "openclaw";
import axios from "axios";

// 全局配置项
const IMAGE_GEN_CONFIG = {
  apiKey: process.env.OPENAI_API_KEY || "",
  apiUrl: "https://api.openai.com/v1/images/generations",
  saveDir: "./claw-data/image-gen/output",
  logDir: "./claw-data/image-gen/logs",
  defaultSize: "1024x1024",
  defaultCount: 2,
  timeout: 30000,
  retryTimes: 2,
  enableWatermark: false,
  watermarkText: "OpenClaw AI 创作"
};

// 初始化目录
async function initDir() {
  await fs.ensureDir(IMAGE_GEN_CONFIG.saveDir);
  await fs.ensureDir(IMAGE_GEN_CONFIG.logDir);
}

// 写入操作日志
function writeLog(prompt: string, count: number, time: string) {
  const logFile = path.join(IMAGE_GEN_CONFIG.logDir, `${new Date().toLocaleDateString()}.log`);
  const logContent = `[${time}] 创作指令:${prompt} | 生成数量:${count}\n`;
  fs.appendFileSync(logFile, logContent, "utf8");
}

// 指数退避重试工具
async function withRetry<T>(fn: () => Promise<T>, retries = IMAGE_GEN_CONFIG.retryTimes): Promise<T> {
  try {
    return await fn();
  } catch (err) {
    if (retries > 0) {
      const delay = Math.pow(2, IMAGE_GEN_CONFIG.retryTimes - retries) * 1000;
      await new Promise(resolve => setTimeout(resolve, delay));
      return withRetry(fn, retries - 1);
    }
    throw err;
  }
}

// 文生图核心请求
async function createImage(prompt: string, size = IMAGE_GEN_CONFIG.defaultSize, n = IMAGE_GEN_CONFIG.defaultCount) {
  if (!IMAGE_GEN_CONFIG.apiKey) throw new Error("未配置 OPENAI_API_KEY");

  return withRetry(async () => {
    const res = await axios.post(
      IMAGE_GEN_CONFIG.apiUrl,
      {
        prompt,
        size,
        n,
        response_format: "url"
      },
      {
        headers: {
          "Authorization": `Bearer ${IMAGE_GEN_CONFIG.apiKey}`,
          "Content-Type": "application/json"
        },
        timeout: IMAGE_GEN_CONFIG.timeout
      }
    );
    return res.data.data || [];
  });
}

// 下载图片到本地
async function downloadImage(url: string): Promise<string> {
  const fileName = `img_${Date.now()}.png`;
  const savePath = path.join(IMAGE_GEN_CONFIG.saveDir, fileName);
  const res = await axios.get(url, { responseType: "stream" });
  return new Promise((resolve, reject) => {
    const stream = res.data.pipe(fs.createWriteStream(savePath));
    stream.on("finish", () => resolve(savePath));
    stream.on("error", reject);
  });
}

// OpenClaw 技能主入口
export const OpenAIImageGenSkill: Skill = {
  name: "openai-image-gen",
  description: "OpenAI Image Gen AI图像创作引擎 | 文生图/批量出图/本地保存/风格定制",
  patterns: [
    "生成图像{prompt}",
    "生成图像{prompt} 尺寸{size} 数量{num}",
    "批量作图{list}",
    "查看创作日志"
  ],
  handler: async (ctx: Context) => {
    const { match, reply, pattern } = ctx;
    await initDir();
    const now = new Date().toISOString();

    try {
      // 基础文生图
      if (pattern === "生成图像{prompt}" && match.prompt) {
        reply(`🎨 正在根据描述创作图像:${match.prompt}`);
        const imgList = await createImage(match.prompt);
        const localPaths: string[] = [];
        for (const item of imgList) {
          const localPath = await downloadImage(item.url);
          localPaths.push(localPath);
        }
        writeLog(match.prompt, imgList.length, now);
        return reply(`✅ 图像创作完成\n本地保存路径:\n${localPaths.join("\n")}`);
      }

      // 自定义尺寸+数量生成
      if (pattern === "生成图像{prompt} 尺寸{size} 数量{num}" && match) {
        const num = parseInt(match.num) || IMAGE_GEN_CONFIG.defaultCount;
        reply(`🎨 自定义参数创作中,尺寸:${match.size},数量:${num}`);
        const imgList = await createImage(match.prompt, match.size, num);
        const localPaths: string[] = [];
        for (const item of imgList) {
          const localPath = await downloadImage(item.url);
          localPaths.push(localPath);
        }
        writeLog(match.prompt, num, now);
        return reply(`✅ 自定义图像创作完成\n本地路径:\n${localPaths.join("\n")}`);
      }

      // 查看日志
      if (pattern === "查看创作日志") {
        return reply(`📜 创作日志目录:${IMAGE_GEN_CONFIG.logDir}\n图像存储目录:${IMAGE_GEN_CONFIG.saveDir}`);
      }

    } catch (e: any) {
      return reply(`❌ 创作失败:${e.message}`);
    }

    return reply("💡 可用指令:生成图像+描述、自定义尺寸数量生成图像、查看创作日志");
  }
};

六、指令使用示例

  1. 生成图像 古风山水水墨画,青山绿水,云雾缭绕
  2. 生成图像 赛博朋克城市夜景 尺寸1024x1792 数量3
  3. 查看创作日志

七、核心优势

中文适配优化:自动优化中文提示词,各类国风、写实、创意画风精准还原。

参数灵活可控:自由设置画面尺寸、生成数量,满足不同使用场景。

本地完整归档:图片自动下载保存,告别仅临时链接,方便二次使用。

稳定高可用:内置重试机制,应对网络波动、接口限流等问题。

安全合规:内容筛查 + 操作日志,规避违规内容,行为可溯源。

框架深度融合:可联动文档、搜索、语音技能,打造图文一体化自动化流程。

八、部署步骤

  1. 安装依赖:npm install axios fs-extra
  2. 配置环境变量:OPENAI_API_KEY=你的密钥
  3. 将技能文件放入 OpenClaw 技能目录,重启框架即可加载使用。
  4. 按需修改配置文件,调整默认尺寸、保存目录、水印等参数。

九、后续功能拓展方向

  1. 新增图生图、局部重绘、风格迁移功能。
  2. 接入图像高清放大模型,实现无损画质提升。
  3. 扩充风格库,支持自定义风格模板一键套用。
  4. 增加批量导入文案、批量导出打包功能。
  5. 补充图文解读、提示词智能推荐功能。
  6. 拓展多模型兼容,支持切换不同图像生成模型。