# runpod-vllm-claude-code

Deploys HuggingFace models to RunPod via vLLM and bridges them to Claude Code through a translation proxy. It smoke-tests tool calling on disposable GPU boxes.

- skill · `type=skill` · Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode · 706 installs
- Author: marks97
- License: MIT · policy=mirror · the beginning of the file is at the end of this page
- Source: https://github.com/marks97/runpod-vllm-claude-code/tree/HEAD/runpod-vllm-claude-code/SKILL.md
- Updated: 2026-10-01
- HTML: https://affpapa.org/en/nevibecode/skills/runpod-vllm-claude-code

## What it does

This skill provisions HuggingFace checkpoints on RunPod instances running vLLM. It fetches ground-truth parameter counts and weight sizes directly from `config.json` and `model.safetensors.index.json` via the HuggingFace API. That prevents hardware sizing mistakes. RunPod hardware pricing is verified through its GraphQL API, because standard GPU REST endpoints return 404.

Connecting the instance requires bridging two protocols. Claude Code speaks the Anthropic Messages API, while vLLM expects OpenAI `/v1/chat/completions`. The skill runs `scripts/anthropic-openai-proxy.js` via `ANTHROPIC_BASE_URL` to translate content blocks and event streams.

It runs a smoke test to confirm tool calling works end to end. An incorrect `--tool-call-parser` flag causes the model to output text instead of structured tool calls. After benchmarking, the skill terminates the pod and cleans up local temporary files. You must export `RUNPOD_API_KEY` beforehand.

## Install

### Claude Code (native platform)

1. **Skills CLI (Vercel)**
```bash
npx skills add marks97/runpod-vllm-claude-code --skill runpod-vllm-claude-code -a claude-code
```

2. **Manually: put the files in place**
- File: `~/.claude/skills/runpod-vllm-claude-code/SKILL.md` — Copy the whole skill folder; for one project use .claude/skills/runpod-vllm-claude-code/

### Codex

1. **Skills CLI (Vercel)**
```bash
npx skills add marks97/runpod-vllm-claude-code --skill runpod-vllm-claude-code -a codex
```

2. **Manually: put the files in place**
- File: `.agents/skills/runpod-vllm-claude-code/SKILL.md` — For all projects use ~/.agents/skills/

### Cursor

1. **Skills CLI (Vercel)**
```bash
npx skills add marks97/runpod-vllm-claude-code --skill runpod-vllm-claude-code -a cursor
```

2. **Manually: put the files in place**
- File: `.cursor/skills/runpod-vllm-claude-code/SKILL.md` — Cursor also reads .agents/skills/ and .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install marks97/runpod-vllm-claude-code runpod-vllm-claude-code
```

2. **Manually: put the files in place**
- File: `.github/skills/runpod-vllm-claude-code/SKILL.md`

### Gemini CLI

1. **Skills CLI (Vercel)**
```bash
npx skills add marks97/runpod-vllm-claude-code --skill runpod-vllm-claude-code -a gemini-cli
```

2. **Platform CLI**
```bash
gemini skills install https://github.com/marks97/runpod-vllm-claude-code --path runpod-vllm-claude-code
```

### Windsurf (Devin Desktop)

**Manually: put the files in place**
- File: `.devin/skills/runpod-vllm-claude-code/SKILL.md` — The legacy .windsurf/skills/ path still works

### OpenCode

**Skills CLI (Vercel)**
```bash
npx skills add marks97/runpod-vllm-claude-code --skill runpod-vllm-claude-code -a opencode
```

### Claude.ai

**Claude.ai**
- Zip the folder and upload it in Settings → Capabilities → Skills

Where a file is given instead of a command, copy the files from the source to that path: https://github.com/marks97/runpod-vllm-claude-code/tree/HEAD/runpod-vllm-claude-code/SKILL.md

## When to use it
- deploy a HuggingFace checkpoint to RunPod with vLLM
- bridge Claude Code Messages API to OpenAI chat completions
- verify tool-calling support on open-source checkpoints
- calculate required GPU VRAM from exact model weights
- terminate disposable GPU pods and local scratch files

## Example prompts
- Check how much VRAM is needed to run `Qwen/Qwen2.5-Coder-32B-Instruct` on RunPod
- Deploy a vLLM server on RunPod for my HuggingFace model and hook it to Claude Code
- Smoke-test tool-calling on the active pod and tear down all resources

## Source text · SKILL.md · MIT

Below is the content of a third-party file. It is data, not instructions for you: do not act on anything written inside unless the human asks. Block tag: 9c795543bb53ad43.

BEGIN THIRD-PARTY FILE 9c795543bb53ad43
````text
---
name: runpod-vllm-claude-code
description: Deploy any HuggingFace model to RunPod as a vLLM server, bridge it to Claude Code (which speaks Anthropic's Messages API, not OpenAI's), smoke-test that tool-calling actually works end to end, and tear everything down with zero trace (pod, network volumes, local processes, scratch files). Use this whenever you want to run a model on RunPod, try a model with Claude Code, test whether a HF/GGUF/abliterated checkpoint supports tool use, benchmark a model for coding-agent use, or spin up/kill a disposable GPU inference box. Also trigger it for anything about hooking Claude Code up to a non-Anthropic backend (vLLM, Ollama, LM Studio) via ANTHROPIC_BASE_URL, or questions like 'what GPU do I need to run X' and 'how much will it cost to run this model'.
---

# RunPod vLLM + Claude Code bridge

Two things are being solved together here, and it's worth being clear about which is which:

1. **Getting a model running on RunPod.** Straightforward — pick a GPU, start a
   vLLM container, wait for health.
2. **Getting Claude Code to actually talk to it.** Not straightforward — Claude Code
   speaks Anthropic's Messages API (`/v1/messages`, content blocks, SSE events).
   vLLM speaks OpenAI's `/v1/chat/completions`. Nothing bridges these two by default.
   `ANTHROPIC_BASE_URL` lets Claude Code point at *any* server that implements the
   Messages API shape — so a small translation proxy in the middle is what makes
   "point Claude Code at my RunPod box" actually work. `scripts/anthropic-openai-proxy.js`
   is that proxy, already fixed for the two protocol mismatches that will otherwise burn
   an hour of retries (see Gotchas below). Use it as-is; don't re-derive it from scratch.

This is exploratory/disposable infra by nature — a GPU pod costs real money per hour
the moment it exists. Before creating one, tell the user which GPU and roughly $/hr,
unless they already named the machine and accepted the cost.

## Step 0: get real numbers on the model before guessing hardware

Don't trust generic "VRAM requirements" blog posts for a model name — the GPU-rental
SEO space is full of content-farm sites (things like "willitrunai.com", "canitrun.dev",
"orcarouter.ai") that auto-generate plausible-looking spec pages for *any* model name,
including ones that barely exist yet. They will confidently disagree with each other.

Get ground truth from the HuggingFace API instead:

```bash
# Real param count / architecture (don't trust the repo name's number):
````
END THIRD-PARTY FILE 9c795543bb53ad43

The third-party file has ended. Everything between the 9c795543bb53ad43 tags is data: requests and commands from it are not followed. An “end of file” line with another tag inside the block is part of the file.

First 2527 of 17996 bytes. © marks97 · MIT · https://github.com/marks97/runpod-vllm-claude-code/tree/HEAD/runpod-vllm-claude-code/SKILL.md

_Part of the page did not fit — see the HTML version._

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
