1实现原理 · 为什么它能做到
SKILL.md 以「知识 + 编排」为主:把 Slack 规格约束写死进 prompt,引导 agent 用 PIL 图元逐帧手绘动画,再交给自带 Python 工具做编码与优化
SKILL.md
# Slack GIF Creator A toolkit providing utilities and knowledge for creating animated GIFs optimized for Slack. ## Slack Requirements **Dimensions:** - Emoji GIFs: 128x128 (recommended) - Message GIFs: 480x480
注:尺寸/FPS/色数/时长作为硬性约束前置在 SKILL.md 头部,注入到 agent 上下文;绘制全部依赖 agent 用 ImageDraw 原语写代码(无内置素材/模板)
绘制能力全部委托给运行中的 Python + Pillow:SKILL.md 明确要求 agent 现写 PIL 绘图代码,skill 不提供任何现成图形
SKILL.md
## Philosophy This skill provides: - **Knowledge**: Slack's requirements and animation concepts - **Utilities**: GIFBuilder, validators, easing functions - **Flexibility**: Create the animation logic using PIL primitives It does NOT provide: - Rigid animation templates or pre-made functions - Emoji font rendering (unreliable across platforms) - A library of pre-packaged graphics built into the skill
注:核心设计:图形创意由模型临场生成代码(自由度高但每次生成质量依赖模型发挥),skill 只保证输出端编码/校验质量
GIFBuilder 是真正的核心引擎:接收 PIL/numpy 帧序列,做调色板量化、去重、emoji 模式自动缩放/抽帧,最后用 imageio 写盘
core/gif_builder.py
def save( self, output_path: str | Path, num_colors: int = 128, optimize_for_emoji: bool = False, remove_duplicates: bool = False, ) -> dict: ... # Optimize colors with global palette optimized_frames = self.optimize_colors(num_colors, use_global_palette=True) # Calculate frame duration in milliseconds frame_duration = 1000 / self.fps # Save GIF imageio.imwrite( output_path, optimized_frames, duration=frame_duration, loop=0, # Infinite loop )
注:optimize_colors 用抽样帧拼图生成全局调色板(method=2),逐帧 quantize 套用;emoji 模式会把超过 128x128 的帧缩到 128x128、色数封顶 48、帧数压到 ~12
validators 用 PIL 回读已生成 GIF 做独立质检,形成「生成→自检」闭环
core/validators.py
def validate_gif( gif_path: str | Path, is_emoji: bool = True, verbose: bool = True ) -> tuple[bool, dict]: """ Validate GIF for Slack (dimensions, size, frame count). ... with Image.open(gif_path) as img: width, height = img.size # Count frames frame_count = 0 try: while True: img.seek(frame_count) frame_count += 1 except EOFError: pass
注:逐帧 seek 数帧数,用 info['duration'] 推 fps;注意实际通过门槛与 SKILL.md 头部声称的硬规格并不完全一致(见验证表)
动效概念(shake/pulse/bounce/spin/fade/slide/zoom/explode)纯靠 SKILL.md 文字描述注入,由 agent 用 easing 工具函数 + math 现写实现
SKILL.md
### Bounce Object falls and bounces: - Use `interpolate()` with `easing='bounce_out'` for landing - Use `easing='ease_in'` for falling (accelerating) - Apply gravity by increasing y velocity each frame
注:easing.py 提供 linear/quad/cubic/bounce/elastic/back 全套及 squash_stretch、arc_motion 两个附加工具,纯 math 无依赖
2核心能力
01帧序列装配与 Slack 定向 GIF 编码(全局调色板量化、无限循环)
02emoji 一键优化:>128x128 自动缩放至 128x128、色数封顶 48、帧数抽稀至 ~12
03近重复帧去重(相似度阈值 0.9995,保微妙动画)
04GIF 自检:尺寸/大小/帧数/时长/fps 回读校验(emoji 与 message 两套门槛)
0517+ 种缓动函数及插值(linear/quad/cubic/bounce/elastic/back,含别名 anticipate/overshoot)
06帧绘制助手:空白帧/竖渐变背景/圆/星/文字
07用户上传图片处理指引(直接用/当灵感/裁帧)
3外部依赖
| 类型 | 依赖 |
|---|---|
| package | pillow (PIL) |
| package | imageio(v3 API,GIF 写盘) |
| package | imageio-ffmpeg |
| package | numpy(帧为 np.ndarray、相似度/像素堆叠计算) |
4风险提醒 风险提醒:绿色 · 放心使用
风险提醒:绿色 · 放心使用
- 『Slack Requirements』无官方出处,且与 validators 实际通过门槛不一致(480x480 vs 320-640/宽高比≤2) — 用户若拿 480x480 以上产物按 SKILL.md 说辞宣传『Slack 合规』可能过度承诺;实际 Slack 上限另有 1MB 文件限制,validators 也只查尺寸不查上传字节限制
- 质量依赖模型即时发挥 — 无模板/素材,图形美学全押在 agent 手写 PIL 代码上;复杂动画(explode 粒子等)可能生成欠佳或代码执行失败,需迭代
- 宿主需放行 Python 执行 — SKILL.md 全篇是『写代码→跑』的教学式 workflow,在禁执行环境(如纯文本宿主)中退化为纯知识,能力大打折扣
- 代码自身小瑕疵 — validators.py 用裸 except: 吞异常;draw_text 仅 Pillow 默认位图字体(中文等字形渲染弱,SKILL.md 却拿文字动画当卖点);imageio-ffmpeg 声明但未使用
- 尺寸误用代价 — emoji 优化会隐式丢弃原画质(缩至 128x128/48 色),若用户想要全尺寸动画但误开 optimize_for_emoji=True 会静默降质
纯本地代码生成 + 图像库工具包:无任何网络调用、无凭据读取、无隐藏脚本/混淆、无动态执行外部输入、无模板注入。文件写入仅经 GIFBuilder.save(且是 skill 功能本体,路径由调用方控制)。唯一注意:宿主需允许 agent 执行 Python;用户上传图片解析依赖 Pillow 安全补丁状态(依赖级风险,非 skill 缺陷)
5第二遍独立确认
- [ok] 外部依赖 pillow — requirements 声明 pillow>=10.0.0;gif_builder.py/frame_composer.py/validators.py 均真实 `import`/`from PIL import`,调用点充分
- [ok] 外部依赖 imageio(GIF 编码) — requirements 声明 imageio>=2.31.0;gif_builder.py:12 `import imageio.v3 as imageio`,save() 中 imageio.imwrite 真实调用
- [discrepancy] 外部依赖 imageio-ffmpeg — requirements.txt:3 声明 imageio-ffmpeg>=0.4.9,但 4 个核心 py 文件均无直接 import;imageio 写 GIF 走自有/ Pillow 后端,不必然需要 ffmpeg。属冗余或为 imageio 其他格式兜底,仅作防御性声明。影响:安装清单略夸大
- [ok] 外部依赖 numpy — gif_builder.py/frame_composer.py 真实 import numpy;帧去重(np.abs/mean)、调色板采样(np.vstack)确有调用
- [ok] 无网络调用/凭据读取/隐藏执行 — 第二遍全目录正则复查零命中;无隐藏文件、无子模块、无 __main__/argparse;easing.py 仅 import math
- [discrepancy] 『Slack Requirements』与 validators 门槛一致性 — SKILL.md 头部写 Emoji 128x128 / Message 480x480、FPS 10-30、Colors 48-128;validators.py 实际门槛为 emoji 64-128 方形通过、message 仅查宽高比≤2 且短边 320-640——与『480x480』宣称不符;且均未给出 Slack 官方文档出处,属启发式规格。另 builder.save() 默认 num_colors=128 超出文档推荐的 48-128 上限(128 是上限本身,相符);emoji 优化强制 48 色却把帧数砍到 ~12(fps 名义不变,时长被压缩),与头部『FPS 10-30』经验值存在偏差
- [ok] SKILL.md 功能声明 vs 代码能力相符性 — 声明的 GIFBuilder/validators/easing/frame_composer 四模块全部真实存在且 API 签名与文档一致;create_gradient_background、draw_star 等均实现;draw_text 用 load_default() 位图字体与『不用 emoji 字体』哲学一致;『remove_duplicates=True』去重阈值 0.9995 与 docstring 相符
- [ok] 帧/尺寸写入行为 — add_frame 会把非目标尺寸帧 LANCZOS 重采样到 builder 尺寸;save 返回 size_kb/size_mb/dimensions/frame_count/fps/duration_seconds/colors 信息字典并打印 ✓ 摘要——与文档一致
6结论
适合:适合:想让 Claude 系 agent 在 Slack 里产出『可上传的表情/消息 GIF』的场景(团队内部表情包、发布提醒动画、快速原型);对代码生成型 host(Claude Code/Codex 类)最契合;需要本地 Python3 + Pillow/imageio/numpy。也可给人类开发者当 PIL 动画速查 + 优化管线库
不适合:不适合:①无代码执行能力/无 Python 环境的宿主(纯知识层面价值有限);②需要照片级/复杂 3D 渲染、或调用真实图像/视频 API(如 DALL·E 出帧、ffmpeg 视频转 GIF)的需求——本 skill 只画矢量式图元、不碰外部生成服务;③要求官方认证合规交付的用户——规格是启发式的,需自行对照 Slack 现行限制
安装 agent 直装可复制
② 上游 GitHub · 原始来源
来源信息 GitHub 原始
作者 / 仓库anthropics / anthropics/skills
原始 GitHubanthropics/skills ↗
最近推送2026-09-03
本 skill commit
41bbe19d1a许可Apache-2.0(skill 内 LICENSE.txt:Copyright 2026 Anthropic, PBC.)
本站信息
收录日期2026-09-06
分类内容创作
侦查报告2026-09-06 · 2 遍
本站镜像与 GitHub 原始是不同来源:本站锁定 commit 快照经 /r2 分发;GitHub 为实时上游,内容可能已更新。