← All Skills

snappy-ai-models

v1.0.0
19 files, 109.5 KB ~4,372 words · 18 min read Updated 2026-09-09

snappy-ai-models skill

25 of 34 checks pass
What it can do
chat prompt modeldraft
embed textdraft
image promptdraft
What does not pass yet
Architecture 3 endpoints
🔑 x-api-key auth
GETPOST
api.replicate.com3 endpoints
POST/v1/models/{owner}/{name}/predictions
POST/v1/predictions
GET/v1/predictions/{id}
$ npx snappy-skills install snappy-ai-models
zip ↓
File Tree
├── AGENTS.md ├── SKILL.md ├── anthropic/ │ ├── README.md │ ├── chat.sh │ ├── stream.sh │ └── tool-use.sh ├── api.ts ├── contract.test.ts ├── lib/ │ └── auth.sh ├── models.md ├── openai/ │ ├── README.md │ ├── audio.sh │ ├── chat.sh │ ├── embed.sh │ └── image.sh └── replicate/ ├── README.md ├── flux.sh ├── run.sh └── whisper.sh
Documents
AGENTS.md

snappy-ai-models -- loader#

Use this skill when you need direct provider API access to OpenAI, Anthropic, or Replicate. This is the right choice for first-party features that OpenRouter cannot proxy: gpt-5 Responses API, Anthropic prompt caching/computer use, OpenAI image/audio/embeddings, and Replicate hosted models. For multi-vendor routing or cheap open-source models, use snappy-openrouter. For Gemini, use snappy-gemini.

All scripts live under ~/.claude/skills/snappy-ai-models/. Auth is handled by lib/auth.sh (bash) or snappy-settings/load.ts (TypeScript). Never hardcode API keys.

API module#

typescriptimport { chatCompletion, embed, generateOpenAIImage } from "../snappy-ai-models/api.ts";
Function What it does
chatCompletion(prompt, opts?) OpenAI chat (returns { text, raw })
embed(text, model?) OpenAI embeddings (returns { vector, raw })
generateOpenAIImage(prompt, opts?) OpenAI image generation (returns { url, raw })

Options (chat): model, systemPrompt, temperature, maxTokens. Options (image): model, size.

CLI:

bashnpx tsx ~/.claude/skills/snappy-ai-models/api.ts chat "Explain X" [--model gpt-4o]
npx tsx ~/.claude/skills/snappy-ai-models/api.ts embed "What is Xano?"
npx tsx ~/.claude/skills/snappy-ai-models/api.ts image "Hero image" [--size 1536x1024]

Credentials loaded via snappy-settings/load.ts (TS) or scripts/load-env.sh (shell) from .env.cache. This is the single source of truth -- never hardcode.

Key capabilities#

  • OpenAI text generation (gpt-5 via Responses API, gpt-4o/o1/o3 via Chat Completions)
  • OpenAI image generation (gpt-image-1, dall-e-3)
  • OpenAI audio (Whisper transcription, TTS)
  • OpenAI embeddings (text-embedding-3-large/small)
  • Anthropic chat, streaming, and tool use (claude-opus-4-6, claude-sonnet-4-6, claude-haiku-4-5-20251001)
  • Replicate predictions with transparent polling (Flux images, Whisper+diarization, any hosted model)

Scripts#

OpenAI (openai/)#

bash# Text generation (auto-routes gpt-5 to Responses API, others to Chat Completions)
./openai/chat.sh --model gpt-4o-mini --prompt "Summarize this"
./openai/chat.sh --model gpt-5 --prompt "Plan a launch" --system "You are a CMO" --reasoning high
./openai/chat.sh --model gpt-4o-mini --prompt "Classify" --json
echo "stdin" | ./openai/chat.sh --model gpt-4o-mini

# Image generation
./openai/image.sh --model gpt-image-1 --prompt "Hero image" --size 1536x1024 --out hero.png
./openai/image.sh --model dall-e-3 --prompt "A logo" --size 1024x1024 --quality hd

# Audio (transcribe or TTS)
./openai/audio.sh --mode transcribe --file meeting.mp3
./openai/audio.sh --mode tts --text "Hello" --voice nova --out hello.mp3

# Embeddings
./openai/embed.sh --text "What is Xano?" --vector
./openai/embed.sh --file sentences.txt --model text-embedding-3-large --dim 1024

Anthropic (anthropic/)#

bash# Chat (system prompt is top-level field, NOT a message role)
./anthropic/chat.sh --model claude-sonnet-4-6 --prompt "Summarize" --system "You are concise"
./anthropic/chat.sh --model claude-opus-4-6 --prompt "..." --max-tokens 4096 --json

# Streaming (prints text deltas live)
./anthropic/stream.sh --model claude-sonnet-4-6 --prompt "Write a haiku"
./anthropic/stream.sh --model claude-opus-4-6 --prompt "Long story" --raw  # full SSE

# Tool use (single-shot; caller handles multi-turn loop)
./anthropic/tool-use.sh --prompt "Weather in SF?" --tools '[{...}]'
./anthropic/tool-use.sh --prompt "Find Robert" --tools-file ./crm-tools.json --json

Replicate (replicate/)#

bash# Generic prediction (handles polling loop automatically)
./replicate/run.sh --model "stability-ai/stable-video-diffusion" --input '{"input_image":"https://..."}'

# Flux image generation
./replicate/flux.sh --prompt "futuristic city" --model schnell --out city.webp
./replicate/flux.sh --prompt "..." --model pro-1.1-ultra --aspect 16:9 --out hero.png

# Whisper transcription (supports local upload via --upload)
./replicate/whisper.sh --audio https://example.com/file.mp3 --model turbo
./replicate/whisper.sh --upload ./local.mp3 --language en

Common gotchas#

  • gpt-5 uses Responses API (/v1/responses), not Chat Completions. chat.sh handles this automatically.
  • o-series models reject temperature -- use --reasoning low|medium|high instead.
  • Anthropic system prompt goes in a top-level system field, NOT inside messages[].
  • Anthropic requires max_tokens -- scripts default to 4096.
  • Replicate is async -- run.sh polls until succeeded/failed. Never read the POST response as final.
  • Replicate local files -- must use --upload flag or stage via file upload API first.

Model quick ref#

Provider Default Flagship Cheap
OpenAI gpt-4o-mini gpt-5 gpt-4o-mini
Anthropic claude-sonnet-4-6 claude-opus-4-6 claude-haiku-4-5-20251001
Replicate/Flux flux-schnell flux-pro-1.1-ultra flux-schnell

When NOT to use this skill#

  • Multi-vendor routing / cheapest model auto-pick -> snappy-openrouter
  • Google Gemini -> snappy-gemini
  • DeepSeek, Qwen, Llama, Mistral -> snappy-openrouter

Self-report convention#

If this loader doesn't cover your case:

bashecho "[$(date -u +%FT%TZ)] snappy-ai-models: <what was missing>" >> ~/.claude/logs/agents-md-feedback.log

Show produced work with snappy-faces: call draw for image channels or lang for MCP Apps.

<!-- SKILL-INDEX-START -->

[snappy-ai-models Index]|root: ~/.claude/skills/snappy-ai-models|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md,models.md}|anthropic:{README.md}|openai:{README.md}|replicate:{README.md}

<!-- SKILL-INDEX-END -->

Used by#

  • snappy-image
  • snappy-openrouter

<!-- SNAPPY-CONTRACT-VERBS-START -->

Contract verbs#

Generated from api.ts HAND_CONTRACT. Do not hand-edit this block.

Verb Contract arguments Effect First call
chat prompt, model draft npx tsx ~/.claude/skills/snappy-ai-models/api.ts chat "<prompt>" <model>
embed text draft npx tsx ~/.claude/skills/snappy-ai-models/api.ts embed "<text>"
image prompt draft npx tsx ~/.claude/skills/snappy-ai-models/api.ts image "<prompt>"

Show the result#

When an answer carries face_hint, show it with one snappy_present(<answer>) call.

See /snappy-faces for face selection. Human-facing images must crop to the

element, render at 2x on Retina, and fill the destination channel instead of

placing a small card in a full-page screenshot.

<!-- SNAPPY-CONTRACT-VERBS-END -->

---
name: snappy-ai-models
role: Direct-API interface to OpenAI, Anthropic, and Replicate -- the three providers that need first-party access (not proxied via OpenRouter).
loaded-by: PreToolUse hook (auto-injected when "snappy-ai-models" is mentioned)
---

# snappy-ai-models -- loader

Use this skill when you need **direct provider API access** to OpenAI, Anthropic, or Replicate. This is the right choice for first-party features that OpenRouter cannot proxy: gpt-5 Responses API, Anthropic prompt caching/computer use, OpenAI image/audio/embeddings, and Replicate hosted models. For multi-vendor routing or cheap open-source models, use `snappy-openrouter`. For Gemini, use `snappy-gemini`.

All scripts live under `~/.claude/skills/snappy-ai-models/`. Auth is handled by `lib/auth.sh` (bash) or `snappy-settings/load.ts` (TypeScript). Never hardcode API keys.

## API module

```typescript
import { chatCompletion, embed, generateOpenAIImage } from "../snappy-ai-models/api.ts";
```

| Function | What it does |
|----------|-------------|
| `chatCompletion(prompt, opts?)` | OpenAI chat (returns `{ text, raw }`) |
| `embed(text, model?)` | OpenAI embeddings (returns `{ vector, raw }`) |
| `generateOpenAIImage(prompt, opts?)` | OpenAI image generation (returns `{ url, raw }`) |

Options (chat): `model`, `systemPrompt`, `temperature`, `maxTokens`. Options (image): `model`, `size`.

CLI:
```bash
npx tsx ~/.claude/skills/snappy-ai-models/api.ts chat "Explain X" [--model gpt-4o]
npx tsx ~/.claude/skills/snappy-ai-models/api.ts embed "What is Xano?"
npx tsx ~/.claude/skills/snappy-ai-models/api.ts image "Hero image" [--size 1536x1024]
```

Credentials loaded via `snappy-settings/load.ts` (TS) or `scripts/load-env.sh` (shell) from `.env.cache`. This is the single source of truth -- never hardcode.

## Key capabilities

- OpenAI text generation (gpt-5 via Responses API, gpt-4o/o1/o3 via Chat Completions)
- OpenAI image generation (gpt-image-1, dall-e-3)
- OpenAI audio (Whisper transcription, TTS)
- OpenAI embeddings (text-embedding-3-large/small)
- Anthropic chat, streaming, and tool use (claude-opus-4-6, claude-sonnet-4-6, claude-haiku-4-5-20251001)
- Replicate predictions with transparent polling (Flux images, Whisper+diarization, any hosted model)

## Scripts

### OpenAI (`openai/`)

```bash
# Text generation (auto-routes gpt-5 to Responses API, others to Chat Completions)
./openai/chat.sh --model gpt-4o-mini --prompt "Summarize this"
./openai/chat.sh --model gpt-5 --prompt "Plan a launch" --system "You are a CMO" --reasoning high
./openai/chat.sh --model gpt-4o-mini --prompt "Classify" --json
echo "stdin" | ./openai/chat.sh --model gpt-4o-mini

# Image generation
./openai/image.sh --model gpt-image-1 --prompt "Hero image" --size 1536x1024 --out hero.png
./openai/image.sh --model dall-e-3 --prompt "A logo" --size 1024x1024 --quality hd

# Audio (transcribe or TTS)
./openai/audio.sh --mode transcribe --file meeting.mp3
./openai/audio.sh --mode tts --text "Hello" --voice nova --out hello.mp3

# Embeddings
./openai/embed.sh --text "What is Xano?" --vector
./openai/embed.sh --file sentences.txt --model text-embedding-3-large --dim 1024
```

### Anthropic (`anthropic/`)

```bash
# Chat (system prompt is top-level field, NOT a message role)
./anthropic/chat.sh --model claude-sonnet-4-6 --prompt "Summarize" --system "You are concise"
./anthropic/chat.sh --model claude-opus-4-6 --prompt "..." --max-tokens 4096 --json

# Streaming (prints text deltas live)
./anthropic/stream.sh --model claude-sonnet-4-6 --prompt "Write a haiku"
./anthropic/stream.sh --model claude-opus-4-6 --prompt "Long story" --raw  # full SSE

# Tool use (single-shot; caller handles multi-turn loop)
./anthropic/tool-use.sh --prompt "Weather in SF?" --tools '[{...}]'
./anthropic/tool-use.sh --prompt "Find Robert" --tools-file ./crm-tools.json --json
```

### Replicate (`replicate/`)

```bash
# Generic prediction (handles polling loop automatically)
./replicate/run.sh --model "stability-ai/stable-video-diffusion" --input '{"input_image":"https://..."}'

# Flux image generation
./replicate/flux.sh --prompt "futuristic city" --model schnell --out city.webp
./replicate/flux.sh --prompt "..." --model pro-1.1-ultra --aspect 16:9 --out hero.png

# Whisper transcription (supports local upload via --upload)
./replicate/whisper.sh --audio https://example.com/file.mp3 --model turbo
./replicate/whisper.sh --upload ./local.mp3 --language en
```

## Common gotchas

- **gpt-5 uses Responses API** (`/v1/responses`), not Chat Completions. `chat.sh` handles this automatically.
- **o-series models reject temperature** -- use `--reasoning low|medium|high` instead.
- **Anthropic system prompt** goes in a top-level `system` field, NOT inside `messages[]`.
- **Anthropic requires `max_tokens`** -- scripts default to 4096.
- **Replicate is async** -- `run.sh` polls until `succeeded`/`failed`. Never read the POST response as final.
- **Replicate local files** -- must use `--upload` flag or stage via file upload API first.

## Model quick ref

| Provider | Default | Flagship | Cheap |
|----------|---------|----------|-------|
| OpenAI | gpt-4o-mini | gpt-5 | gpt-4o-mini |
| Anthropic | claude-sonnet-4-6 | claude-opus-4-6 | claude-haiku-4-5-20251001 |
| Replicate/Flux | flux-schnell | flux-pro-1.1-ultra | flux-schnell |

## When NOT to use this skill

- Multi-vendor routing / cheapest model auto-pick -> `snappy-openrouter`
- Google Gemini -> `snappy-gemini`
- DeepSeek, Qwen, Llama, Mistral -> `snappy-openrouter`

## Self-report convention

If this loader doesn't cover your case:
```bash
echo "[$(date -u +%FT%TZ)] snappy-ai-models: <what was missing>" >> ~/.claude/logs/agents-md-feedback.log
```


Show produced work with `snappy-faces`: call `draw` for image channels or `lang` for MCP Apps.

<!-- SKILL-INDEX-START -->
[snappy-ai-models Index]|root: ~/.claude/skills/snappy-ai-models|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md,models.md}|anthropic:{README.md}|openai:{README.md}|replicate:{README.md}
<!-- SKILL-INDEX-END -->

## Used by

- `snappy-image`
- `snappy-openrouter`

<!-- SNAPPY-CONTRACT-VERBS-START -->
## Contract verbs

Generated from `api.ts` `HAND_CONTRACT`. Do not hand-edit this block.

| Verb | Contract arguments | Effect | First call |
|---|---|---|---|
| `chat` | `prompt`, `model` | `draft` | `npx tsx ~/.claude/skills/snappy-ai-models/api.ts chat "<prompt>" <model>` |
| `embed` | `text` | `draft` | `npx tsx ~/.claude/skills/snappy-ai-models/api.ts embed "<text>"` |
| `image` | `prompt` | `draft` | `npx tsx ~/.claude/skills/snappy-ai-models/api.ts image "<prompt>"` |

## Show the result

When an answer carries `face_hint`, show it with one `snappy_present(<answer>)` call.
See `/snappy-faces` for face selection. Human-facing images must crop to the
element, render at 2x on Retina, and fill the destination channel instead of
placing a small card in a full-page screenshot.
<!-- SNAPPY-CONTRACT-VERBS-END -->

Keyboard Shortcuts

Search in document⌘K
Focus search/
Previous file tab
Next file tab
Close overlayEsc
Show shortcuts?