Article

又往 AI 助手里塞了一个工具:现在它能帮我出小红书配图了

trial

上一篇写了怎么把本地语音识别 SenseVoice 接进 pi——有朋友在评论区问:「除了转录,pi 还能接什么?」

问得好。今天继续。

这次接进去的,是一个我做内容创作时几乎每天都用的功能:出小红书配图


问题从哪里来

我在做播客和公众号内容,每期出完稿子,都要给小红书配几张图。

以前的流程是:打开某个图片生成网站,登录,写 prompt,等待,下载,看效果不对,再改……来回三四轮,半小时就过去了。

更烦的是:我写稿在一个地方,出图在另一个地方,两件事要来回切换。

思路一旦被打断,就很难找回来了——你们有没有这种感觉?写到一半,切出去做别的事,回来之后盯着屏幕半天,不知道刚才写到哪了。

所以我想把出图这件事,也搬到 pi 的对话窗口里。


工具选型:用哪个 API?

图片生成 API 选的是 gpt-image-2,通过 berrycode.codes 调用。

选它有几个原因:

  • 出图质量对内容配图来说够用,不需要 Midjourney 级别的精细度
  • API 调用简单,返回 base64,直接解码存文件
  • 价格合理,不是按图片收费,而是按 token

参数上,小红书竖版封面选 1152×1536(接近 3:4),横版、方版可以按需切换。


踩了一个让我崩溃的坑

接入过程其实不复杂,但有一个坑耗了我将近一个小时。

明明 API key 是对的,请求格式也是对的,就是一直返回 502。

排查了半天,最后翻到了自己之前写的一份本地代理代码——里面有一行注释:

必须带 User-Agent: BerryCode-Image-Chat-Mac/1.0Connection: close,否则 502。

就这两个 header。

用 Python 的 urllib 发请求,加上这两个 header,还是 502。换成 curl,立刻好了。

最后的实现是用 subprocess.run(["curl", ...]) 来发请求——不优雅,但稳定。

有时候工程上最稳的方案,不是最优雅的那个。


Extension 的实现逻辑

和上期 SenseVoice 一样,整体分两层:

Python 脚本:负责调用 API,接收 prompt 和尺寸参数,把返回的 base64 图片解码、存文件,输出文件路径。

TypeScript Extension:注册成 pi 工具,描述里告诉 AI 什么场景用它,参数里有一个 size必填的——故意不给默认值。

为什么要让 size 必填?

因为小红书封面、正文配图、公众号头图,尺寸要求完全不同。如果工具自己随便选,大概率选错。强制让 AI 先问用户,才能确保出来的图是对的。

这是一个小设计:用参数约束来强制 AI 做正确的事


现在的体验

整好之后,流程变成这样:

我在 pi 里写稿,写到一半,顺口说一句:「帮我给这期播客出一张小红书封面,主题是 AI 算力,科技感,深色背景。」

pi 问我:「封面还是正文图?建议封面用 1152×1536,你确认一下。」

我回:「封面,用这个尺寸。」

图出来了,存在 ~/Documents/xiaohongshu-cards/,继续写稿。

没有切换,没有等待,没有打断。

如果出来不满意,跟它说「颜色太暗,再出一张,亮一点」,它接着改,不需要我重新打开任何东西。


文件结构

~/.pi/agent/
├── extensions/
│   ├── sensevoice.ts         ← 第一期接进去的
│   └── xiaohongshu_card.ts  ← 这期接进去的
└── xiaohongshu/
    └── config.json           ← 存 API key

图片输出:

~/Documents/xiaohongshu-cards/
└── xxxxxx.png

说几句题外话

有人说:这个功能直接用 ChatGPT 不也能出图吗,为什么要自己接?

原因有三:

一是流程不断。我在 pi 里工作,不想为了出一张图再切到另一个产品。

二是可控。API key 是自己的,存储路径是自己的,出来的图直接到本地文件夹,不需要手动下载。

三是可组合。今天只是出图,但明天我可以让 pi 出图之后,自动帮我写配套的小红书文案,再自动存到对应的项目文件夹——这种组合,只有自己接工具才能做到。


接下来还会接更多。

下一期预告:把 AI 配音工具接进来——用克隆的声音,把口播稿直接合成带字幕的视频。

感兴趣的点个关注,我写好就发。


本系列持续更新,记录把各种工具接进 pi 的完整过程,包括踩过的坑。

评论区告诉我你最想接的下一个工具,我来试。