Completes the Windows-gating coverage for the built-in skills/ tree. Every
bundled SKILL.md now carries an explicit platforms: declaration so the
loader (agent.skill_utils.skill_matches_platform) can skip-load skills
that don't fit the current OS.
74 skills declared cross-platform (platforms: [linux, macos, windows]):
Creative (16): ascii-art, ascii-video, architecture-diagram, baoyu-comic,
baoyu-infographic, claude-design, creative-ideation, design-md,
excalidraw, humanizer, manim-video, p5js, pixel-art,
popular-web-designs, pretext, sketch, songwriting-and-ai-music,
touchdesigner-mcp
Autonomous agents: claude-code, codex, hermes-agent, opencode
Data/devops: jupyter-live-kernel, kanban-orchestrator, kanban-worker,
webhook-subscriptions, dogfood, codebase-inspection
GitHub: github-auth, github-code-review, github-issues,
github-pr-workflow, github-repo-management
Media: gif-search, heartmula, songsee, spotify, youtube-content
MCP / email / gaming / notes / smart-home: native-mcp, himalaya,
pokemon-player, obsidian, openhue
mlops (non-broken): weights-and-biases, huggingface-hub, llama-cpp,
outlines, segment-anything-model, dspy, trl-fine-tuning
Productivity: airtable, google-workspace, linear, maps, nano-pdf,
notion, ocr-and-documents, powerpoint
Red-teaming / research: godmode, arxiv, blogwatcher, llm-wiki,
polymarket
Software-dev: debugging-hermes-tui-commands, hermes-agent-skill-authoring,
node-inspect-debugger, plan, requesting-code-review, spike,
subagent-driven-development, systematic-debugging,
test-driven-development, writing-plans
Misc: yuanbao
5 skills gated from Windows (platforms: [linux, macos]):
mlops/inference/vllm (serving-llms-vllm)
vLLM is officially Linux-only; Windows requires WSL.
mlops/training/axolotl
Axolotl's flash-attn + deepspeed + bitsandbytes stack is Linux-first.
mlops/training/unsloth
Requires Triton + xformers + flash-attn — Linux only in practice.
mlops/models/audiocraft (audiocraft-audio-generation)
torchaudio ffmpeg backend + encodec dependencies are Linux-first.
mlops/inference/obliteratus
Research abliteration workflow; relies on Linux-focused pytorch
kernels and MLX — no first-class Windows path.
Same strict-over-lenient policy as the optional-skills sweep: when the
underlying tool's Windows support is rough, missing, or WSL-only, gate the
skill. Easier to un-gate after verified Windows support lands than to leak
partial support that manifests as mid-task failures.
Combined with prior commits in this branch, every bundled SKILL.md
(skills/ + optional-skills/) now has a platforms: declaration.
importnumpyasnpfromsegment_anythingimportsam_model_registry,SamPredictor# Load modelsam=sam_model_registry["vit_h"](checkpoint="sam_vit_h_4b8939.pth")sam.to(device="cuda")# Create predictorpredictor=SamPredictor(sam)# Set image (computes embeddings once)image=cv2.imread("image.jpg")image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)predictor.set_image(image)# Predict with point promptsinput_point=np.array([[500,375]])# (x, y) coordinatesinput_label=np.array([1])# 1 = foreground, 0 = backgroundmasks,scores,logits=predictor.predict(point_coords=input_point,point_labels=input_label,multimask_output=True# Returns 3 mask options)# Select best maskbest_mask=masks[np.argmax(scores)]
HuggingFace Transformers
importtorchfromPILimportImagefromtransformersimportSamModel,SamProcessor# Load model and processormodel=SamModel.from_pretrained("facebook/sam-vit-huge")processor=SamProcessor.from_pretrained("facebook/sam-vit-huge")model.to("cuda")# Process image with point promptimage=Image.open("image.jpg")input_points=[[[450,600]]]# Batch of pointsinputs=processor(image,input_points=input_points,return_tensors="pt")inputs={k:v.to("cuda")fork,vininputs.items()}# Generate maskswithtorch.no_grad():outputs=model(**inputs)# Post-process masks to original sizemasks=processor.image_processor.post_process_masks(outputs.pred_masks.cpu(),inputs["original_sizes"].cpu(),inputs["reshaped_input_sizes"].cpu())
# Single foreground pointinput_point=np.array([[500,375]])input_label=np.array([1])masks,scores,logits=predictor.predict(point_coords=input_point,point_labels=input_label,multimask_output=True)# Multiple points (foreground + background)input_points=np.array([[500,375],[600,400],[450,300]])input_labels=np.array([1,1,0])# 2 foreground, 1 backgroundmasks,scores,logits=predictor.predict(point_coords=input_points,point_labels=input_labels,multimask_output=False# Single mask when prompts are clear)
# Box + points for precise controlmasks,scores,logits=predictor.predict(point_coords=np.array([[500,375]]),point_labels=np.array([1]),box=np.array([400,300,700,600]),multimask_output=False)
Iterative refinement
# Initial predictionmasks,scores,logits=predictor.predict(point_coords=np.array([[500,375]]),point_labels=np.array([1]),multimask_output=True)# Refine with additional point using previous maskmasks,scores,logits=predictor.predict(point_coords=np.array([[500,375],[550,400]]),point_labels=np.array([1,0]),# Add background pointmask_input=logits[np.argmax(scores)][None,:,:],# Use best maskmultimask_output=False)
Automatic mask generation
Basic automatic segmentation
fromsegment_anythingimportSamAutomaticMaskGenerator# Create generatormask_generator=SamAutomaticMaskGenerator(sam)# Generate all masksmasks=mask_generator.generate(image)# Each mask contains:# - segmentation: binary mask# - bbox: [x, y, w, h]# - area: pixel count# - predicted_iou: quality score# - stability_score: robustness score# - point_coords: generating point
Customized generation
mask_generator=SamAutomaticMaskGenerator(model=sam,points_per_side=32,# Grid density (more = more masks)pred_iou_thresh=0.88,# Quality thresholdstability_score_thresh=0.95,# Stability thresholdcrop_n_layers=1,# Multi-scale cropscrop_n_points_downscale_factor=2,min_mask_region_area=100,# Remove tiny masks)masks=mask_generator.generate(image)
Filtering masks
# Sort by area (largest first)masks=sorted(masks,key=lambdax:x['area'],reverse=True)# Filter by predicted IoUhigh_quality=[mforminmasksifm['predicted_iou']>0.9]# Filter by stability scorestable_masks=[mforminmasksifm['stability_score']>0.95]
Batched inference
Multiple images
# Process multiple images efficientlyimages=[cv2.imread(f"image_{i}.jpg")foriinrange(10)]all_masks=[]forimageinimages:predictor.set_image(image)masks,_,_=predictor.predict(point_coords=np.array([[500,375]]),point_labels=np.array([1]),multimask_output=True)all_masks.append(masks)
Multiple prompts per image
# Process multiple prompts efficiently (one image encoding)predictor.set_image(image)# Batch of point promptspoints=[np.array([[100,100]]),np.array([[200,200]]),np.array([[300,300]])]all_masks=[]forpointinpoints:masks,scores,_=predictor.predict(point_coords=point,point_labels=np.array([1]),multimask_output=True)all_masks.append(masks[np.argmax(scores)])
importonnxruntime# Load ONNX modelort_session=onnxruntime.InferenceSession("sam_onnx.onnx")# Run inference (image embeddings computed separately)masks=ort_session.run(None,{"image_embeddings":image_embeddings,"point_coords":point_coords,"point_labels":point_labels,"mask_input":np.zeros((1,1,256,256),dtype=np.float32),"has_mask_input":np.array([0],dtype=np.float32),"orig_im_size":np.array([h,w],dtype=np.float32)})
Common workflows
Workflow 1: Annotation tool
importcv2# Load modelpredictor=SamPredictor(sam)predictor.set_image(image)defon_click(event,x,y,flags,param):ifevent==cv2.EVENT_LBUTTONDOWN:# Foreground pointmasks,scores,_=predictor.predict(point_coords=np.array([[x,y]]),point_labels=np.array([1]),multimask_output=True)# Display best maskdisplay_mask(masks[np.argmax(scores)])
Workflow 2: Object extraction
defextract_object(image,point):"""Extract object at point with transparent background."""predictor.set_image(image)masks,scores,_=predictor.predict(point_coords=np.array([point]),point_labels=np.array([1]),multimask_output=True)best_mask=masks[np.argmax(scores)]# Create RGBA outputrgba=np.zeros((image.shape[0],image.shape[1],4),dtype=np.uint8)rgba[:,:,:3]=imagergba[:,:,3]=best_mask*255returnrgba
Workflow 3: Medical image segmentation
# Process medical images (grayscale to RGB)medical_image=cv2.imread("scan.png",cv2.IMREAD_GRAYSCALE)rgb_image=cv2.cvtColor(medical_image,cv2.COLOR_GRAY2RGB)predictor.set_image(rgb_image)# Segment region of interestmasks,scores,_=predictor.predict(box=np.array([x1,y1,x2,y2]),# ROI bounding boxmultimask_output=True)
frompycocotoolsimportmaskasmask_utils# Encode mask to RLErle=mask_utils.encode(np.asfortranarray(mask.astype(np.uint8)))rle["counts"]=rle["counts"].decode("utf-8")# Decode RLE to maskdecoded_mask=mask_utils.decode(rle)
Performance optimization
GPU memory
# Use smaller model for limited VRAMsam=sam_model_registry["vit_b"](checkpoint="sam_vit_b_01ec64.pth")# Process images in batches# Clear CUDA cache between large batchestorch.cuda.empty_cache()
Speed optimization
# Use half precisionsam=sam.half()# Reduce points for automatic generationmask_generator=SamAutomaticMaskGenerator(model=sam,points_per_side=16,# Default is 32)# Use ONNX for deployment# Export with --return-single-mask for faster inference