local-link/skills/prompt-to-image/SKILL.md
从上下文提取提示词,为用户生成并打开图片。
npx skillsauth add lionad-morotar/simple-local-llm-server prompt-to-imageInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Flags:
--model — 指定生成图片的模型。可选值:gpt-image-2-all(默认优先路径)、gpt-image-2、gemini-3-pro-image-preview。省略时默认使用 gpt-image-2-all。经过实际验证的调用路径如下:
| 场景 | 推荐模型 | API 端点 | 原因 |
|---|---|---|---|
| 默认/用户未指定 | gpt-image-2-all | /v1/images/generations (dall-e-3 格式) | 已通过验证,约 50 秒返回,稳定性优于直接走 image-generation 端点的 gpt-image-2 |
| 用户明确要求 gpt-image-2 | gpt-image-2-all | /v1/images/generations (dall-e-3 格式) | 同模型家族兼容替代,gpt-image-2 直接调用反复出现 60 秒连接被关闭 |
| 用户明确要求 Gemini | gemini-3-pro-image-preview | /v1beta/models/{model}:generateContent | 按 Gemini 原生格式调用 |
重要约束:除非得到用户明确确认,不得擅自切换到其他异构模型(如 qwen-image-max、doubao-seedream、flux 等)。优先在同一模型家族内寻找兼容替代(如 gpt-image-2 → gpt-image-2-all)。可用模型清单见 References。
按照以下优先级自动提取提示词:
提示词来源(二选一,优先级从高到低):
提示词格式(三选一,优先级从高到低):
提取策略:
🚨 绝对禁止: 提示词禁止转写和简化!
必须处理:提取的提示词可能包含换行符、引号等特殊字符,直接嵌入 JSON 会导致解析错误(如 invalid character '\n' in string literal)。
转义方式:
# 将提示词中的换行符替换为空格,双引号转义
# 注意:这只是格式转义,提示词内容必须保持原样!
processed_prompt=$(echo "$raw_prompt" | tr '\n' ' ' | sed 's/"/\\"/g')
转义规则示例:
| 字符 | 处理方式 | 原因 |
|------|----------|------|
| 换行符 \n | 替换为空格 | JSON string 中不允许未转义的换行 |
| 双引号 " | 转义为 \" | 避免提前结束 JSON string |
| 反斜杠 \ | 转义为 \\ | 避免转义序列被错误解析 |
模型检测:根据用户输入中的关键词确定模型和 API 调用方式。默认优先走 gpt-image-2-all 的 dall-e-3 端点。
| 关键词 | 模型名称 | API 类型 | 端点 |
|--------|----------|----------|------|
| (默认,无关键词) | gpt-image-2-all | GPT Image (dall-e-3 格式) | /v1/images/generations |
| gpt-image-2 | gpt-image-2-all | GPT Image (dall-e-3 格式) | /v1/images/generations |
| gemini, gemini-3-pro, gemini-3 | gemini-3-pro-image-preview | Gemini | /v1beta/models/{model}:generateContent |
使用示例:
/prompt-to-image → 默认使用 gpt-image-2-all
/prompt-to-image 用 gpt-image-2 生成 → 实际使用 gpt-image-2-all(同家族兼容)
/prompt-to-image 用 gemini-3-pro 生成 → 使用 gemini-3-pro-image-preview
用户也可指定其他 Gemini 系列模型:"用 gemini-2.0-flash-exp 生成图片",但 必须先经用户确认,不得擅自切换。
关键: 读取密钥和调用 API 必须在同一个 shell 脚本/代码块中执行,否则 API 调用会找不到 $API_KEY 环境变量。
完整流程代码:
#!/bin/bash
# ============================================
# 步骤 1: 预处理提示词(已在上一步完成)
# ============================================
# 假设 $processed_prompt 已包含转义后的提示词
# ============================================
# 步骤 2: 在同一脚本中加载密钥并调用 API
# ============================================
# 安全地展开 ~ 路径(兼容所有 shell)
CONFIG_FILE="${HOME}/.config/prompt-to-image/.env"
# 检查文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
echo "❌ 配置文件不存在: $CONFIG_FILE"
echo "请创建配置文件并设置 API_KEY"
exit 1
fi
# 使用 source 加载环境变量(比 export + xargs 更可靠)
set -a
source "$CONFIG_FILE"
set +a
# 验证 API_KEY 是否加载成功
if [ -z "$API_KEY" ]; then
echo "❌ API_KEY 未设置或为空"
exit 1
fi
echo "✅ API 密钥已加载"
# ============================================
# 步骤 3: 根据模型选择 API 端点并调用(确保在同一脚本上下文中)
# ============================================
# MODEL_NAME 由步骤 3 确定,默认 "gpt-image-2"
DATE_DIR=$(date +%Y-%m-%d)
TIME_STAMP=$(date +%H-%M-%S.%3N)
OUTPUT_DIR="${HOME}/.prompt-to-image/${DATE_DIR}/grsapi.xyz/${MODEL_NAME}"
mkdir -p "$OUTPUT_DIR"
RESPONSE_FILE="${OUTPUT_DIR}/${TIME_STAMP}.json"
echo "🎨 正在调用 API 生成图片 (模型: ${MODEL_NAME})..."
if [[ "$MODEL_NAME" == "gemini-3-pro-image-preview" ]]; then
# Gemini API
curl -s --location --request POST \
"https://grsapi.xyz/v1beta/models/${MODEL_NAME}:generateContent" \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer $API_KEY" \
--data-raw "{
\"contents\": [{
\"role\": \"user\",
\"parts\": [{\"text\": \"$processed_prompt\"}]
}],
\"generationConfig\": {
\"responseModalities\": [\"TEXT\", \"IMAGE\"]
}
}" > "$RESPONSE_FILE"
else
# GPT Image API (默认,使用 gpt-image-2-all 走 dall-e-3 端点)
curl -s --location --request POST \
"https://grsapi.xyz/v1/images/generations" \
--header 'Accept: application/json' \
--header "Authorization: Bearer $API_KEY" \
--header 'Content-Type: application/json' \
--data-raw "{
\"size\": \"1792x1024\",
\"prompt\": \"$processed_prompt\",
\"model\": \"gpt-image-2-all\",
\"n\": 1
}" > "$RESPONSE_FILE"
fi
echo "✅ API 调用完成,响应保存至: $RESPONSE_FILE"
配置文件格式 (~/.config/prompt-to-image/.env):
API_KEY=sk-your-api-key-here
⚠️ 路径安全提示:
"${HOME}/path" 替代 "~/path",确保在所有上下文(脚本、函数、引号内)都能正确展开~,因为在双引号内或某些 shell 函数中可能无法正确展开~,确保进行显式展开:"${path/#\~/$HOME}"⚠️ 密钥加载提示:
set -a; source "$CONFIG_FILE"; set +a 方式加载,比 export $(grep ... | xargs) 更可靠set -a 会自动导出所有变量,避免 xargs 处理特殊字符的问题$API_KEY 在同一 shell 上下文中可用重要:
-s (silent) 参数确保输出纯净 JSON,不包含 curl 进度信息创建目录结构并保存完整响应:
${HOME}/.prompt-to-image/
└── <YYYY-MM-DD>/
└── grsapi.xyz/
└── <model-name>/
├── <hh:mm:ss.sss>.json (完整 API 响应)
└── image_xxx.jpg (提取的图片)
时间戳格式:
2026-02-2415-30-45.123 (小时-分钟-秒.毫秒)路径安全: 在脚本中使用 ${HOME} 而非 ~,确保路径在所有上下文中正确解析
保存后必须验证 JSON 有效性:
python3 -c "import json; json.load(open('<response>.json'))" && echo "JSON valid"
如果验证失败,说明响应可能损坏,应检查文件内容而非直接重新调用 API。
使用 scripts/extract_images.py 从响应中提取图片。脚本自动检测响应格式(Gemini inlineData 或 GPT Image URL/base64):
python3 scripts/extract_images.py <response.json> <output_dir>
问题背景: 文件写入和打开之间存在时间差,可能导致图片查看器加载失败。这在以下场景尤为明显:
泛化解决方案 - 使用 wait_for_file.sh 脚本:
# 定义安全的输出目录路径(使用 ${HOME} 而非 ~)
OUTPUT_DIR="${HOME}/.prompt-to-image/$(date +%Y-%m-%d)/grsapi.xyz/${MODEL_NAME}"
mkdir -p "$OUTPUT_DIR"
# 提取图片后,等待文件完全就绪
python3 scripts/extract_images.py "$JSON_FILE" "$OUTPUT_DIR"
# 获取最新生成的图片路径(在 zsh 中避免 NOMATCH 导致无匹配 globs 时脚本中断)
if [ -n "$ZSH_VERSION" ]; then
setopt local_options nullglob
fi
IMAGE_FILE=$(ls -t "$OUTPUT_DIR"/image_*.jpg "$OUTPUT_DIR"/image_*.png 2>/dev/null | head -1)
# 等待文件写入完成(检测文件大小稳定 + 系统同步)
# wait_for_file.sh 会自动处理路径中的 ~ 字符
scripts/wait_for_file.sh "$IMAGE_FILE" 10 # 10秒超时
检测机制(跨平台泛化):
sync 命令刷新文件系统缓存备选方案(如果 wait_for_file.sh 不可用):
# 简单延迟方案(不够精确但通用)
sleep 0.5
sync # 强制刷新文件系统缓存
文件同步完成后,使用以下命令打开:
# 优先检查并使用 code
if command -v code &> /dev/null; then
code <图片路径>
else
open <图片所在目录>
fi
向用户返回 Markdown 格式的图片链接,并确认已自动打开:

✅ 图片已自动打开
注意: Markdown 中 ${HOME} 不会自动展开,实际使用时应替换为完整路径或使用 shell 展开后的值
${HOME}/.config/prompt-to-image/.env 文件并设置 API_KEY${HOME} 而非 ~,特别是在双引号内的字符串中$API_KEY 环境变量在 API 调用时可用gpt-image-2-all。若用户指定 gpt-image-2,可在同家族内 fallback 到 gpt-image-2-all。严禁因"某个模型可能更好"而擅自切换到 qwen-image-max、doubao-seedream、flux、grok 等异构模型;任何跨家族切换必须先得到用户明确确认-s 静默模式: curl 必须加 -s 参数,确保输出纯净 JSON${HOME} 替代 ~,确保路径在所有 shell 上下文中正确展开从 API 响应中提取图片并保存为文件。支持 Gemini 和 GPT Image 两种响应格式,自动检测并处理。
用法:
python3 scripts/extract_images.py <response.json> <output_dir>
功能:
candidates[].content.parts[].inlineData 中的 base64 数据data[].url(下载图片)或 data[].b64_json(解码 base64).jpg、.png 等文件os.fsync() 确保数据刷写到磁盘泛化的文件写入完成检测脚本,解决文件写入与读取之间的时间差问题。
用法:
scripts/wait_for_file.sh <文件路径> [超时秒数]
检测机制(跨平台泛化):
sync 命令刷新文件系统缓存适用场景:
路径展开:
该脚本会自动处理路径中的 ~ 字符,将其展开为 ${HOME}:
# 脚本内部实现
FILE_PATH="${FILE_PATH/#\~/$HOME}"
因此你可以安全地传入包含 ~ 的路径,或直接使用 ${HOME}。
返回值:
0 - 文件就绪1 - 超时或错误references/2026-06-11-grsapi-image-models.md — grsapi.xyz 图像生成模型速查表,包含 46 个图像模型的 ID、支持端点、标签和描述。references/2026-06-11-grsapi-models.json — /v1/models 完整原始响应(493 个模型)。使用约束:References 仅用于查询和用户确认后的模型选择。未经用户明确同意,不得擅自切换模型。默认优先路径始终是
gpt-image-2-all。
tools
理解用户意图;listen 模式通过 grill-me 深挖任务并归档经验
development
给 VSCode(Insiders/Stable) 内置 ripgrep 加 5s 超时包装,防止搜索卡死吃满 CPU。--on 包装(幂等) / --off 还原 / 不带参数查状态。Use when VSCode 搜索卡死、rg 进程占满 CPU,或 VSCode 更新后超时保护失效需要重包。
development
为指定项目创建完全隔离的 hapi(Claude Code On the Go)实例,包括独立数据目录、LaunchAgent 持久化、zsh wrapper 和 app.hapi.run 直连 URL。与全局 ~/.hapi 互不干扰。
development
关闭承载当前 Claude Code 会话的宿主(VSCode 窗口或其终端面板),连同 claude 一起退出。通过 close-host-window 扩展触发:先 SIGTERM claude(走完 SessionEnd hooks)再关 host,不抢焦点、不丢 hooks。--host vscode 关窗口、--host terminal(默认)只关终端面板。Use when 任务结束要随宿主退出,或需精确关闭某 claude 终端所在窗口/面板。