Hopper
LLM inference for voice agents, and a voice and ears for any agent. Hopper serves gemma-4-31b behind an OpenAI-compatible API built for low time to first token, plus text-to-speech and speech-to-text. An agent can start using it on its own: the first run registers a key for it with no human step, and the user can later move that key to their Hopper account. Works in Claude Code, Codex, ChatGPT, Claude and Cursor, and anywhere Agent Skills run.
Skills
| Skill | Say something like | What it does |
|---|---|---|
hopper-integrate | "Make my voice agent respond faster" | Gets a key, benchmarks a 10-turn simulated call on the agent's own prompt and tools, shows the results, and after you say go switches only the LLM in LiveKit Agents, Pipecat, Vapi or OpenAI SDK code. STT, TTS and tools stay as they are. |
hopper-benchmark | "How fast would my agent be on Hopper?" | Measures time to first token and prompt caching on the current prompt. Changes no code. |
hopper-diagnose | "Why does my agent pause before answering?" | Reads the project and ranks what slows the first token, with fixes. Any provider; needs no key or network. |
hopper-speak | "Read this aloud", "make an audio file of…" | Turns text into speech: plays it or saves a WAV, in any of 50 voices. |
hopper-transcribe | "What does this recording say?" | Transcribes audio or video files (WAV, MP3, M4A, voice memos, MP4) with word timestamps. |
In Claude Code they are also commands, such as /hopper:hopper-integrate.
Connector
The plugin connects the Hopper MCP server at https://withhopper.com/mcp, for hosts without a shell such as ChatGPT and Claude:
| Tool | Sign-in | What it does |
|---|---|---|
speak | No | Text to speech, returned as audio and a short-lived link |
transcribe | No | Speech to text from a WAV URL or upload, with word timestamps |
list_voices | No | The ready voices |
list_models | No | Models, context length, prices |
get_integration_guide | No | The tested integration code for LiveKit Agents, Pipecat, Vapi or the OpenAI SDK |
review_voice_agent_config | No | Checks a system prompt, tools and client code for latency problems |
get_account | Yes | Credits, spend and API keys (masked) |
create_api_key | Yes | Creates an API key on your account and returns a one-time link to copy it in the console; the key never appears in the chat |
Without sign-in, speech and transcription have a daily limit per caller; signed in with your Hopper account (OAuth), they use your own credits.
Install
claude plugin marketplace add https://withhopper.com/marketplace.json && claude plugin install hopper@hopper # Claude Code
codex plugin marketplace add hopper-inc/plugins && codex plugin add hopper@hopper # Codex
Pick one way to install: the plugin, or npx skills add hopper-inc/plugins for the skills alone. With both, every skill loads twice.
What it runs, sends and stores
Everything it runs is readable Python in the skills' scripts/ folders: standard library only, plus the openai and h2 packages for the benchmark and ffmpeg to decode compressed audio.
hopper_trial.py(integrate, benchmark) registers an anonymous agent identity athttps://withhopper.com/agent/identity(protocol) and exchanges it athttps://withhopper.com/oauth2/tokenfor a trial key. It writes the key to the project's.envasHOPPER_API_KEYwithout printing it, and saves the claim token to$TMPDIR/hopper-registration.json(mode 600).hopper_ttft.pyreadsHOPPER_API_KEYand sends the agent's system prompt, its tool definitions and ten scripted caller turns tohttps://api.withhopper.com/v1/chat/completions. About $0.01–0.02 of credit per run.hopper_claim.py, only if you choose to keep the key, sends your email address and the saved claim token tohttps://withhopper.com/agent/identity/claimandhttps://withhopper.com/oauth2/token, then writes the account key to.env.hopper_voice.py(speak, transcribe) sends the text to speak tohttps://api.withhopper.com/v1/audio/speech, or the audio to transcribe tohttps://api.withhopper.com/v1/audio/transcriptions. It usesHOPPER_API_KEYor the project's.envif present; otherwise it registers a trial key the same way and keeps it in~/.config/hopper/(mode 600), never in the project. Itsclaimcommand moves that key to your account.- The connector receives the arguments of the tool you call, and nothing else.
hopper-integraterunspip install openai h2in the project's virtualenv, and after your go edits the file that builds the LLM client.
Requests to Hopper are handled under the privacy policy. Nothing else leaves your machine, and the plugin has no telemetry.