当前位置: 首页 > news >正文

手搓 Skill 之使用硅基流动 API 免费生图

SKILL 是什么

SKILL 在我看来就是可以让大模型随时看到的说明文档。文档说明了这个 SKILL 可以干什么,有什么工具可以用,应该怎么做。

开始做 SKILL

所以 Skill 的文件结构就必然有 Skill 说明(SKILL.md)以及 Skill 相关代码(Scripts)

skills-01

至于 references,其实就是一个简易化的 RAG,至于什么是 RAG,问 AI 就行。

然后先编写 SKILL.md 骨架,结构化数据 name 和 description 是描述SKILL。然后后面就可以附加这套 SKILL 怎么做,有什么约束,比如参数格式和失败处理。

---
name: siliconflow-image-generation
description: 通过 SiliconFlow API 、调用 Kwai-Kolors/Kolors 模型生成图片,另外可调整分辨率、步数、数量。
---# SiliconFlow 生图
## 概述
## 生成图片
## 参数格式
## 结果与失败处理

编写概述

概述的话和 description 不一样,要具体说明。比如

通过 SiliconFlow 生成 1 至 4 张图片,并返回 API 响应或将图片保存到本地。具体通过 uv 运行附带脚本,并从环境变量 SILICONFLOW_API_KEY 读取密钥,避免将密钥写入命令行参数。

但是我建议直接在脚本里指定从 SILICONFLOW_API_KEY 环境变量读取,没必要再 SKILL.md 里说明,除非你有很多 KEY 要逐个使用。所以我的最终版是

通过 SiliconFlow 生成 1 至 4 张图片,并返回 API 响应或将图片保存到本地。。

生成图片说明

直接告诉大模型怎么做就可以了,比如:

通过 uv 运行脚本

uv run scripts/generate_image.py --prompt "一只坐在阳光图书馆里的电影感橘猫" --size 1024x1024 --steps 20 --count 1 --output-dir .\generated-images

编写清晰的生图提示词:主体、环境、构图、光线、媒介或风格,以及质量要求。如果这些因子会影响生图效果,请先确认用户期望的画面比例、风格、图片中的文字和不希望出现的元素。

编写参数说明

说明脚本的每个参数代表什么,其实这个主要是生图 API 支持什么参数,比如:

prompt: 提示词
size:控制参数的图像分辨率,API请求时候,可以自定义多种分辨率。
steps:控制图像生成的步长。
count:一次生成图像的个数,默认值是1,最大值可以设置为 4
output-dir:指定图片存储路径./相对路径会存放到 SKILL 目录下
seed:如果想要每次都生成固定的图片,可以把seed设置为固定值。

编写结果与失败处理

示例嘛,我就不写了,当然比如说遇到429可以等待1分钟后重试。

编写脚本

把 API 说明文档丢给 AI。

# /// script
# requires-python = ">=3.10"
# dependencies = ["openai>=1.0.0"]
# ///"""Generate images with SiliconFlow's OpenAI-compatible API."""from __future__ import annotationsimport argparse
import base64
import os
import sys
from pathlib import Path
from urllib.request import urlopenfrom openai import APIError, OpenAIDEFAULT_BASE_URL = "https://api.siliconflow.cn/v1"
DEFAULT_MODEL = "Kwai-Kolors/Kolors"def parse_args() -> argparse.Namespace:parser = argparse.ArgumentParser(description="Generate images with SiliconFlow's OpenAI-compatible API.")parser.add_argument("--prompt", required=True, help="Description of the desired image.")parser.add_argument("--model", default=DEFAULT_MODEL, help="SiliconFlow model ID.")parser.add_argument("--size", default="1024x1024", help="Image resolution, such as 1024x1024.")parser.add_argument("--steps", type=int, default=20, help="Inference steps.")parser.add_argument("--count", type=int, default=1, choices=range(1, 5), help="Number of images (1-4).")parser.add_argument("--negative-prompt", help="Elements to exclude from the image.")parser.add_argument("--seed", type=int, help="Seed for reproducible output when supported.")parser.add_argument("--parameter-format",choices=("openai", "model"),default="openai",help="Use OpenAI-compatible names or native model parameter names.",)parser.add_argument("--base-url", default=DEFAULT_BASE_URL, help="API base URL.")parser.add_argument("--output-dir", type=Path, help="Directory for downloaded or base64 images.")return parser.parse_args()def build_extra_body(args: argparse.Namespace) -> dict[str, object]:if args.parameter_format == "openai":parameters: dict[str, object] = {"step": args.steps}else:parameters = {"image_size": args.size,"num_inference_steps": args.steps,"batch_size": args.count,}if args.negative_prompt:parameters["negative_prompt"] = args.negative_promptif args.seed is not None:parameters["seed"] = args.seedreturn parametersdef save_images(response: object, output_dir: Path) -> None:output_dir.mkdir(parents=True, exist_ok=True)images = getattr(response, "data", [])for index, image in enumerate(images, start=1):target_path = output_dir / f"image-{index}.png"encoded_image = getattr(image, "b64_json", None)image_url = getattr(image, "url", None)if encoded_image:target_path.write_bytes(base64.b64decode(encoded_image))elif image_url:with urlopen(image_url, timeout=60) as download_response:target_path.write_bytes(download_response.read())else:print(f"Image {index} has no URL or base64 payload; not saved.", file=sys.stderr)continueprint(f"Saved {target_path}")def main() -> int:args = parse_args()api_key = os.environ.get("SILICONFLOW_API_KEY")if not api_key:print("Set SILICONFLOW_API_KEY before generating images.", file=sys.stderr)return 2client = OpenAI(api_key=api_key, base_url=args.base_url)request: dict[str, object] = {"model": args.model,"prompt": args.prompt,"extra_body": build_extra_body(args),}if args.parameter_format == "openai":request["size"] = args.sizerequest["n"] = args.counttry:response = client.images.generate(**request)except APIError as error:print(f"SiliconFlow image generation failed: {error}", file=sys.stderr)return 1print(response.model_dump_json(indent=2))if args.output_dir:save_images(response, args.output_dir)return 0if __name__ == "__main__":raise SystemExit(main())

编写元数据

元数据固定路径 agents/openai.yaml。照着改就行。

interface:display_name: "SiliconFlow 生图"short_description: "使用 SiliconFlow OpenAI 兼容接口生成图片并调整关键参数"default_prompt: "使用 $siliconflow-image-generation 通过 SiliconFlow 创建一张图片。"

前边实际不用管

现在大模型都很好用了,你直接丢给他 API 文档,然后编写技能就可以了,比如把下面在 AGENT 丢进去,等一会就写好了。

 client = OpenAI(api_key="Your-api_key", base_url="https://api.siliconflow.cn/v1")response = client.images.generate(model="Kwai-Kolors/Kolors",prompt="a cat",size="1024x1024",n=1,extra_body={"step": 20})print(response)重点参数介绍image_size:控制参数的图像分辨率,API请求时候,可以自定义多种分辨率。num_inference_steps:控制图像生成的步长。batch_size:一次生成图像的个数,默认值是1,最大值可以设置为4negative_prompt:这里可以输入图像中不想出现的某些元素,消除一些影响影响因素。seed:如果想要每次都生成固定的图片,可以把seed设置为固定值。根据这个创建一个生图技能
http://www.jsqmd.com/news/1335793/

相关文章:

  • 如何快速上手React Native Owl?5分钟完成视觉回归测试环境搭建
  • IntelliJ IDEA高效开发环境配置全攻略:从安装调优到性能提升
  • Marvell 88Q5152 车载交换机:从配置生成到固件烧录实战指南
  • Unity 2.5D肉鸽游戏架构设计:核心技术实现与性能优化指南
  • 2026年宁波包车租赁公司推荐:企业用车/商务包车/旅游包车/大巴中巴租赁 - 海棠依旧大
  • 【独家首发】全球首份《AI学习者神经认知负荷图谱》:揭示深度学习知识吸收效率峰值窗口(仅开放前500名下载)
  • 前端架构揭秘:etcd-browser的AngularJS交互逻辑与xeditable组件应用
  • 为什么你的微调总失败?开源大模型适配性红黑榜(含17款主流基座模型CUDA内存峰值/FlashAttention-3支持状态/PyTorch 2.4兼容性速查表)
  • 从安装到精通:vim-numbertoggle完整使用教程
  • 5分钟掌握smartcd:自动激活虚拟环境与版本控制工具的终极配置指南
  • 2026年安平县丝网防护与降噪制品靠谱厂家推荐:安平县三聚丝网制品有限公司 - 海棠依旧大
  • 网络变压器怎么看端口和供电对数
  • 2026年推荐:优秀靠谱的二辊卷板机厂家/正规诚信的弯管机生产厂家 - 硬核推荐
  • TagUI与Robocorp:从快速原型到企业级RPA机器人的完整实践指南
  • 领麦微W系列MLX90615国产替代:MEMS红外测温传感器在中距离场景的全景产品矩阵
  • Exo核心设计揭秘:为什么它能彻底改变硬件编程
  • jwt库完全指南:如何在Go中安全快速实现JSON Web Tokens
  • Unity-URP-Outlines参数调优指南:10个技巧让你的描边效果脱颖而出
  • 【AI模板变现黄金法则】:20年实战总结的7大避坑指南与月入5万实操路径
  • Jmeter压测newbee-mall-plus:10万请求0异常!家用电脑6核12线程性能优化实践
  • Git提交注释修改全攻略:从amend到rebase的实战指南
  • TensorStore分布式Checkpoint:Levanter如何保障大规模训练的可靠性
  • nixCats-nvim核心功能全解析:从Nix包装到Lua配置无缝衔接
  • OFD文件解析全攻略:从ZIP容器到XML结构的技术拆解与实践
  • DreamerV3与SAC在HumanoidBench上的性能对比:训练曲线与百万步实验分析
  • etcd-browser安全配置:HTTP Basic Auth与TLS加密实战教程
  • 二元关系核心概念全解析:从定义域、值域到合成运算
  • 2026年抚州本地住宅窗边防水维修正规服务商盘点 实力合规机构甄选及合作避坑指南FAQ - U渠道
  • 淘宝sign参数逆向实战:JS加密分析与Python集成指南
  • 深入React-H5-Audio-Player源码:核心组件与状态管理解析