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"
# 获取最新生成的图片路径
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
分批提交 Git 变更的完整工作流。当用户说"提交这个文件"、"帮我 commit"、"分批提交"、"整理提交计划"、"staged 的文件"、"git 提交"时触发
tools
从用户给出的文档片段中,提取"进阶必知"的深层知识,当用户提到"太简单了,给我几条秘密","面试必备的那种","八股文进阶"时触发
data-ai
批量给技能目录添加 disable-model-invocation,节省 token 开销。只保留需要 LLM 生成/分析/决策的技能有模型调用能力。
tools
open understand dashboard for user