Pawsome Photo Fetcher 指令拆解:用 Actions 打造基于公共狗狗图片 API 的 Custom GPT
Pawsome Photo Fetcher 指令拆解:用 Actions 打造基于公共狗狗图片 API 的 Custom GPT
《Pawsome Photo Fetcher》是一份典型的“单功能 + Actions”型 Custom GPT 指令,收录于本仓库 CustomInstructions/ChatGPT/QZ5U6dzcK_Pawsome_Photo_Fetcher.md。它通过三条 Action 规则(GetDogPhoto、GetAllBreeds、GetBreedPhoto)把“随机狗狗图片、品种列表、指定品种图片”三种能力封装成一个轻量、愉悦的对话机器人。本文以该文档为主体,结合仓库中的 GPT 文件格式约定与工具链,完整拆解它的指令骨架、底层 API 映射,并给出用 OpenAPI 规范在 ChatGPT 中落地同类 Actions 的实操方法。
1. 文档速览:这份 GPT 指令长什么样
仓库内的 Custom Instructions 采用统一的 GPT + 字段 标记格式,由 gptparser.py 中定义的 SUPPORTED_FIELDS 约束:url、title、description、logo、instructions、actions 等字段按固定顺序排列。Pawsome Photo Fetcher 文件开头即遵循这一约定:
- GPT URL:
https://chat.openai.com/g/g-QZ5U6dzcK-pawsome-photo-fetcher,其中QZ5U6dzcK是 9 位 GPT ID,文件名也按{id}_{name}.md命名(对应 gptparser.py 的GPT_FILE_ID_RE正则); - GPT Title:Pawsome Photo Fetcher;
- GPT Description:"Expert in dog-onomics. I fetch random dog photos to improve your day.",作者标注为 ai-chad.com;
- GPT instructions:正文是一段 Markdown 指令块,含
MISSION与ACTIONS两个小节,是本文拆解的核心对象。
文件中的 Logo 与 URL 属于 ChatGPT 元数据,真正的技术含量集中在 instructions 段落里:它只用约十句话,就定义了一个完整的“对话守卫 + 行为路由 + 输出装饰”流程。
2. MISSION 小节:角色定位与对话守门
MISSION 段落首先确立身份与边界:
- 角色定位:自称“Pawsome Photo Fetcher”,擅长检索随机狗狗照片,也擅长按具体品种(breed)检索照片;核心目标是给用户带来快乐,展示不同犬种的风采。
- 能力矩阵:既支持“惊喜模式”(随机照片,覆盖广谱犬种),也支持“指定模式”(用户点名某个品种)。
- 越界处理:被请求与狗狗照片无关的内容时,礼貌拒绝并把话题拉回“狗狗摄影”,随后从
GetAllBreeds中给出 5 个随机品种作为引导。 - 内容基调:回复必须生动、有信息量、始终以狗为中心;主动规避冒犯或不适当的内容,维持积极、家庭友好的氛围。
这段设计有两个值得借鉴的点。第一,职责单一:整个 GPT 只做“取狗狗图片”一件事,不贪多;第二,守门规则前置:在 MISSION 阶段就声明“非狗内容一律拒绝并重定向”,大幅减少被用户带入无关话题的概率,也天然降低了被用于其他用途的风险。
3. ACTIONS 小节:三个方法的行为路由
ACTIONS 段落用三条规则把用户意图映射到具体方法(原文逐条收录如下):
- When I get asked for a photo or a random photo, I use GetDogPhoto method
- When I get asked about the breeds I can show, I give 3-8 random breeds from the GetAllBreeds method
- When I get given a specific breed, I use the GetBreedPhoto method to find a photo of the breed
- Anytime I generate a photo of a dog, I give the user one sentence about the breed, then I tell the user a short but fun and heart warming story about the dog in the photo
可以归纳为一张“意图 → 方法 → 输出”的决策表:
| 用户意图 | 调用方法 | 输出行为 |
|---|---|---|
| 要一张照片 / 随机照片 | GetDogPhoto |
随机狗狗照片 |
| 问“你能展示哪些品种” | GetAllBreeds |
3–8 个随机品种列表 |
| 给定具体品种 | GetBreedPhoto |
该品种的狗狗照片 |
第四条规则不是独立方法,而是全局输出约定:每当输出一张狗狗照片,必须先给一句品种介绍,再讲一个简短、有趣、暖心的关于照片中狗狗的小故事。这构成了该 GPT 的“差异化体验”——同样是取图 API,配合文案包装后便有了人格化温度。
4. 底层 API 还原:方法名与公共狗狗图片接口的对应关系
文档只给出方法名,并未在 instructions 中直接写出 API 地址。从方法命名(GetDogPhoto / GetAllBreeds / GetBreedPhoto)与行为模式可以推断:它们大概率对应某个公开的狗狗图片 REST 接口,这类接口的经典实现是 Dog CEO API(dog.ceo)。若以该 API 为基准,可以还原出如下等价端点:
| 指令方法 | 推断的 REST 端点 | 返回内容 |
|---|---|---|
GetDogPhoto |
GET /api/breeds/image/random |
单张随机狗狗图片 URL |
GetAllBreeds |
GET /api/breeds/list/all |
品种字典(breed → sub-breed 列表) |
GetBreedPhoto |
GET /api/breed/{breed}/images/random |
指定品种的随机图片 URL |
需要说明的是,这一段映射是从方法语义推断的还原,不是原文档明文内容;原 GPT 作者在 ChatGPT 后台配置的具体 OpenAPI 端点不在仓库可见范围内。但对于想要复刻该 GPT 的读者,上述端点即可作为一份可用的实现蓝本。
5. 在 ChatGPT 中落地 Actions:OpenAPI 3.1.0 规范实操
要让 GetDogPhoto 等方法真正可调用,需要在 ChatGPT 的“Actions(操作)”配置中上传一份 OpenAPI 规范。本仓库的 TYEliDU6A_ActionsGPT.md 恰好提供了官方关于生成此类规范的指导,核心要求包括:
- 使用 OpenAPI 3.1.0 版本,输出 YAML;
- 每个
path下的操作必须包含operationId——它通常就是指令中引用的方法名(如GetDogPhoto),应为不含空格的单次描述性标识(建议 camelCase); - 规范需包含
info(title、description、version)与servers(基础 URL)区块。
针对 Pawsome Photo Fetcher,可以按下面这样组织一份精简规范({breed} 路径参数即为 GetBreedPhoto 的输入):
openapi: 3.1.0
info:
title: Dog Photos API
description: 随机与按品种检索狗狗图片
version: 1.0.0
servers:
- url: https://dog.ceo
paths:
/api/breeds/image/random:
get:
operationId: GetDogPhoto
summary: 返回一张随机狗狗图片
responses:
'200':
description: 随机狗狗图片 JSON
/api/breeds/list/all:
get:
operationId: GetAllBreeds
summary: 返回全部品种列表
responses:
'200':
description: 品种字典
/api/breed/{breed}/images/random:
get:
operationId: GetBreedPhoto
summary: 返回指定品种的随机图片
parameters:
- name: breed
in: path
required: true
schema:
type: string
responses:
'200':
description: 指定品种图片 JSON
把这份 YAML 配置到 GPT 的 Actions 后,指令中 ACTIONS 小节的“When...I use...”规则就有了真实可调用的后端,方法名与 operationId 一一对应,模型才能正确路由。
6. 输出层设计:为什么每张图都配“一句话介绍 + 一个暖心故事”
该 GPT 最有辨识度的设计在第四条规则:照片永远不是孤立的。每次出图都附带两类内容——一句品种事实(informative),一个简短、有趣、暖心的故事(engaging)。这实际上是把“取图 API”升级成了“内容体验”:图片本身是随机的,但模型通过品种知识的即时生成让每次输出都像是有备而来。对于开发者而言,这是可以复用的模式:任何“随机内容型”GPT,都可以用“数据随机 + 文案本地化生成”来制造差异化,而不需要改任何后端。
7. 仓库内同类对比:狗狗主题 GPT 的三种玩法
本仓库 CustomInstructions/ChatGPT/ 目录下还有多个狗狗主题 GPT,可以横向对比它们的职责划分:
| 文件 | 核心职责 | 能力载体 |
|---|---|---|
| QZ5U6dzcK_Pawsome_Photo_Fetcher.md | 随机 / 按品种取狗狗图片 | Actions 调用图片 API |
| aCHU043UY_Pawspective_Analyzer.md | 分析狗狗照片,结合动物行为学与幽默解读 | 视觉理解能力 + 文案 |
| svWzlmAK0_Puppy_Profiler.md | 从照片识别品种并给出健康、性情等完整档案 | 图像识别 + 知识库 |
| Nq7ZmZxgG_Best_Dog_Breed_Determination.md | 品种成分百分比评估 + 饼图可视化 | Code Interpreter 绘图 |
可见“狗狗”只是领域标签,四者分别用 Actions、视觉分析、知识检索、代码执行四条技术路线实现。Pawsome Photo Fetcher 是其中唯一以外部 API 为内容来源的例子,适合作为学习“GPT Actions 最小闭环”的入门样本。
8. 仓库工具链:这类 GPT 文件如何生成与维护
如果你想把某个公开 GPT 的元数据抓取成本仓库同款 Markdown,可以使用 Tools/openai_gpts/README.md 中介绍的脚本:
gen_gpt_templ.py:通过 ChatGPT URL 或 9 位 GPT ID 下载页面并解析标题、描述、作者、头像,生成标准模板。例如:
解析核心在python gen_gpt_templ.py g-QZ5U6dzcK --debug --dumpCustomGPTParser(gen_gpt_templ.py),它从页面 HTML 的streamController.enqueue(...)调用中提取 Gizmo 元数据 JSON;idxtool.py:提供--find-gpt(按 ID/URL 检索 GPT 文件)、--toc(重建目录)、--rename(将文件名统一为{id}_{name}.md)等管理功能;gptparser.py:定义字段解析与校验规则,负责把 Markdown 文件解析为GptMarkdownFile对象(gptparser.py)。
换言之,Pawsome Photo Fetcher 这类文件既可直接阅读学习,也可以通过上述工具链批量生成与检索,作为自定义 GPT 提示词编写的参考素材库。
9. 总结:从这份指令中可以带走什么
Pawsome Photo Fetcher 的全部精华浓缩在约 250 词内,却完整示范了一个“小而美”的 Actions 型 GPT 的三种最佳实践:
- 意图路由表先行:用
When...I use...句式把每种用户输入映射到确定方法,减少模型自由发挥空间; - 守门规则写入 MISSION:非主题请求的拒绝与重定向逻辑在角色定义阶段即固定下来;
- 输出差异化靠文案而非数据:随机 API + 模型本地生成的品种介绍与暖心故事,是体验与辨识度的真正来源。
对想复刻或改进它的开发者,建议路径是:先对照第 4 节还原 API 端点,按第 5 节的 OpenAPI 规范配置 Actions,最后结合第 7 节的同类对比决定是否叠加视觉分析或代码执行能力,把“取图”升级为更完整的狗狗领域助手。