1仕組みと動作原理
SKILL.md は「ナレッジ + オーケストレーション」が中心:Slackの仕様制約をプロンプトにハードコードし、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の冒頭に配置し、エージェントのコンテキストに注入。描画は完全にエージェントがImageDrawプリミティブを用いてコードを書く形に依存(組み込みの素材やテンプレートは無し)。
描画機能は実行環境の Python + Pillow に全面的に委任:SKILL.md はエージェントにその場でPIL描画コードを書くよう明確に要求し、スキル側からは既成のグラフィックを一切提供しない。
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
コア設計:グラフィックの創造性はモデルがその場で生成するコードに委ねられ(自由度は高いが出力品質はモデルの腕前次第)、スキル側は出力エンドでのエンコード/検証品質のみを担保する。
GIFBuilder が実質的なコアエンジン:PIL/numpy のフレームシーケンスを受け取り、パレット減色、重複排除、絵文字モードの自動リサイズ/間引きを行い、最終的に 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 のテキスト説明のみで注入され、エージェントが 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 の2つの追加ユーティリティを提供(純粋な math 実装で外部依存なし)。
2コア機能
01フレームシーケンスのアセンブリおよびSlack向けGIFエンコード(グローバルパレット減色、無限ループ)
02絵文字向けワンクリック最適化:128x128超の自動縮小、色数上限48色、約12フレームへの間引き
03類似重複フレームの排除(繊細なアニメーションを保護する類似度しきい値 0.9995)
04GIF自己検証:寸法/ファイルサイズ/フレーム数/再生時間/fpsの再読み込み検証(emojiとmessageの2つのしきい値)
0517種類以上のイージング関数および補間(linear/quad/cubic/bounce/elastic/back、別名 anticipate/overshoot を含む)
06フレーム描画ヘルパー:空白フレーム/垂直グラデーション背景/円/星/テキスト
07ユーザーアップロード画像の処理ガイドライン(直接利用/インスピレーション利用/フレーム切り抜き)
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| package | pillow (PIL) |
| package | imageio(v3 API,GIF 写盘) |
| package | imageio-ffmpeg |
| package | numpy(帧为 np.ndarray、相似度/像素堆叠计算) |
4推奨統制措置と判定根拠
安全運用のための推奨統制措置
Agent 向け
段階的・都度認可、サンドボックス推奨
管理者向け
承認フロー、ロールバック可能、全履歴監査
判定根拠(ファイルパスと抜粋)
- scripts/: ローカルスクリプトまたはコマンドの実行: ホスト側でのスキルの使われ方は「エージェントが SKILL.md に基づいてその場でPythonコードを生成し実行する」(SKILL.md は全編APIサンプルであり、__m は存在しない)
- 本地工作目录: ファイルの読み書きと成果物の出力: GIFBuilder.save() が引数 output_path に基づいてGIFファイルを書き出す(パスはエージェントが生成したコードに由来し、任意のパスを取り得る)
監査ノート: 純粋なローカルコード生成 + 画像ライブラリツールキット:ネットワーク呼び出し、認証情報の読み取り、隠蔽/難読化スクリプト、外部入力の動的実行、テンプレートインジェクションは一切ありません。ファイル書き出しは GIFBuilder.save を通じてのみ行われます(スキルの本来の機能であり、パスは呼び出し側が制御)。唯一の留意点:ホストがエージェントによるPython実行を許可している必要があります。また、ユーザーがアップロードした画像のパースは Pillow のセキュリティパッチの状態に依存します(これは依存関係レベルのリスクであり、スキルの欠陥ではありません)。
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系エージェントを使ってSlack向けに「そのままアップロードできる絵文字/メッセージGIF」を出力させたいユースケース(チーム内スタンプ、リリース通知アニメーション、クイックプロトタイピング)。コード生成型ホスト(Claude Code/Codex系)に最適。ローカルの Python3 + Pillow/imageio/numpy が必要。人間の開発者向けの PIL アニメーション早見表 + 最適化パイプラインライブラリとしても有用。
不向きな用途: 不向き:①コード実行環境/Python環境がないホスト(ナレッジ単体としての価値は限定的);②フォトリアル/複雑な3Dレンダリング、または実画像/動画APIの呼び出し(例:DALL·E によるフレーム生成、ffmpeg による動画のGIF変換など)を必要とする用途(当スキルはベクター風プリミティブのみを描画し、外部生成サービスは扱いません);③公式認定レベルの厳密な準拠が求められる用途(仕様はヒューリスティックなものであり、現行のSlack制限との照合は各自で行う必要があります)。
Install Agent-Ready
① Verified Mirror 2026-09-06
Option A · Direct DownloadDownload slack-gif-creator.tar.gz
sha256:
Option B · Copy Guide for Agent9d54ca459d0b781f…Agent はこの JSON ガイドから自動的にダウンロードして検証します。
② Upstream GitHub
GitHub Repo ↗
Pinned to commit 41bbe19d1a.