skills/multimodal-embedding-generator/SKILL.md
Generate cross-modal embeddings with CLIP, SigLIP, and ImageBind for text-image-audio search. Activate on: multimodal search, text-to-image search, cross-modal embeddings, CLIP embeddings, visual search. NOT for: text-only embeddings (ai-engineer), image classification (computer-vision-pipeline).
npx skillsauth add curiositech/windags-skills multimodal-embedding-generatorInstall 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.
Generate unified embeddings across text, images, and audio using CLIP, SigLIP, and ImageBind for cross-modal retrieval and search.
Activate on: "multimodal search", "text-to-image search", "image-to-text retrieval", "cross-modal embeddings", "CLIP embeddings", "visual search engine", "SigLIP", "ImageBind", "find similar images by description"
NOT for: Text-only embedding and RAG (ai-engineer), image classification or object detection (computer-vision-pipeline), or image generation from text (image-generation-workflow-engine)
| Domain | Technologies | Notes | |--------|-------------|-------| | Text-Image | SigLIP, CLIP (ViT-L/14, ViT-bigG), OpenCLIP | SigLIP preferred for 2026: better zero-shot accuracy | | 6-Modality | ImageBind (Meta) | Text, image, audio, depth, thermal, IMU | | Local Inference | transformers, open_clip, torch | GPU or MPS (Apple Silicon) | | API-Based | Voyage AI multimodal, Cohere embed-v4 | Managed, no GPU needed | | Indexing | Pinecone, Qdrant, Weaviate, pgvector | Same vector DB for all modalities |
Text ──→ [SigLIP Text Encoder] ──┐
├──→ [Normalize] ──→ [Vector DB]
Image ──→ [SigLIP Vision Encoder]─┘ │ │
L2 normalize single index,
to unit sphere modality in metadata
Query (any modality) ──→ [Encode] ──→ [Vector DB Search] ──→ Results (any modality)
# SigLIP cross-modal embedding
from transformers import AutoProcessor, AutoModel
import torch
model = AutoModel.from_pretrained("google/siglip-large-patch16-384")
processor = AutoProcessor.from_pretrained("google/siglip-large-patch16-384")
def embed_image(image):
inputs = processor(images=image, return_tensors="pt")
with torch.no_grad():
emb = model.get_image_features(**inputs)
return torch.nn.functional.normalize(emb, dim=-1).squeeze().numpy()
def embed_text(text: str):
inputs = processor(text=text, return_tensors="pt", padding=True)
with torch.no_grad():
emb = model.get_text_features(**inputs)
return torch.nn.functional.normalize(emb, dim=-1).squeeze().numpy()
# Same vector space: cosine similarity works across modalities
Modalities:
Text ───────┐
Image ──────┤
Audio ──────┤
Depth ──────┼──→ [ImageBind Encoder] ──→ [Shared 1024-dim Space] ──→ [Vector DB]
Thermal ────┤
IMU ────────┘
Use case: "Find the video clip that sounds like this audio sample"
Audio query → ImageBind → nearest neighbors → returns video/image/text matches
Document with images
├── Text chunks ──→ [Text Embedder] ──────────→ [Vector DB: text namespace]
└── Figures/diagrams ──→ [SigLIP Vision] ──→ [Vector DB: image namespace]
Query ──→ [Text Embed] ──→ search text namespace ──┐
└──→ [Vision Embed] ──→ search image namespace──┼──→ [Rerank + Fuse] ──→ Answer
│
reciprocal rank fusion
data-ai
license: Apache-2.0 NOT for unrelated tasks outside this domain.
development
Use when designing caching strategies (cache-aside, write-through, write-behind), implementing distributed locks, building rate limiters, leaderboards, real-time streams (XADD/consumer groups), pub/sub, or tuning eviction policies. Triggers: thundering-herd on cache miss, dogpile on key expiry, Redlock vs SET-NX-PX choice, sliding-window rate limiter, hot-key on a single cluster slot, big-key blowup, MULTI/EXEC across slots, KEYS in production. NOT for Redis Cluster operations/admin (different domain), embedded KV (SQLite, leveldb), in-process LRU caches, or Memcached.
tools
Drawing the `'use client'` boundary correctly in React Server Components apps (Next.js App Router, RSC frameworks) — leaf-pushing, slot composition, serialization rules, and environment poisoning prevention. Grounded in react.dev and Next.js 16 docs.
development
Use when designing rate limiting for an API, choosing between token bucket / sliding window / leaky bucket / fixed window, implementing it in Redis, deciding edge (Cloudflare/Upstash) vs origin enforcement, sizing per-user vs per-IP vs per-endpoint quotas, returning the right 429 response with Retry-After, or fixing the boundary-burst bug in fixed-window limiters. Triggers: 429 too many requests, INCR + EXPIRE, ZADD + ZREMRANGEBYSCORE + ZCARD, X-RateLimit-Remaining header, Cloudflare WAF rate limiting rules, Upstash @upstash/ratelimit, leaky bucket shaping vs policing, distributed rate limiter consistency. NOT for DDoS mitigation specifically (different scale), CAPTCHA / bot management, full WAF design, or per-user quota billing.