Use DeepSeek in your coding agents
DeepSeek works in opencode, pi, Crush, Claude Code and eight more coding agents once you add the key with yoink add and the deepseek preset. yoink stores the key once, then writes https://api.deepseek.com/v1 into OpenAI-style configs and https://api.deepseek.com/anthropic into Anthropic-style ones. Only codex is out of reach, since it needs a Responses endpoint (codex and providers).
On this page
At a glance
| Fact | Value |
|---|---|
| Preset id | deepseek |
openai-chat endpoint | https://api.deepseek.com/v1 |
anthropic-messages endpoint | https://api.deepseek.com/anthropic |
| API keys page | https://platform.deepseek.com/api_keys |
| Harnesses it reaches | 12 of 13 |
| Add command | yoink add --external --name <name> --preset deepseek |
| Harness | With this preset |
|---|---|
| Claude Code | uses anthropic-messages |
| pi | uses openai-chat |
| omp | uses openai-chat |
| opencode | uses openai-chat |
| codex | not offered: needs openai-responses |
| Qwen Code | uses openai-chat |
| Kilo Code | uses openai-chat |
| Droid | uses anthropic-messages |
| Crush | uses openai-chat |
| Goose | uses openai-chat |
| Zed | uses openai-chat |
| Continue | uses openai-chat |
| Claude Desktop | uses anthropic-messages |
Generated from the yoink CLI source and docs/providers.md (presets.ts).
Get a key and add it
Create a key at https://platform.deepseek.com/api_keys, then add it. There is no separate key check for this preset. Instead, the interactive flow fetches https://api.deepseek.com/v1/models with your key to build the model picker, so a wrong key shows up as a rejected request at that step, before anything is written.
yoink add
echo "$DEEPSEEK_API_KEY" | yoink add --external --name deepseek --preset deepseek \
--models <model> --connect opencode,pi,crush --default <model> --token-stdinThe scripted form never contacts DeepSeek: a preset is not probed, and the models you pass are taken as given. It does look the ids up on models.dev, preferring entries filed under the provider key deepseek or served from api.deepseek.com, so opencode and Crush get real context and output limits.
What opencode gets
opencode prefers OpenAI Chat Completions, so yoink writes the /v1 endpoint through the @ai-sdk/openai-compatible package and sets the default as deepseek/<model>:
{
"provider": {
"deepseek": {
"npm": "@ai-sdk/openai-compatible",
"name": "DeepSeek",
"options": {
"baseURL": "https://api.deepseek.com/v1",
"apiKey": "<your key>"
},
"models": { "<model>": { "name": "<model>", "tool_call": true } }
}
},
"model": "deepseek/<model>"
}The rest of opencode.json is left alone, and the original file is copied to opencode.json.yoink.bak the first time yoink changes it (backups).
Where the /anthropic URL goes
Three agents take Anthropic Messages from this preset: Claude Code, Droid (which lists it first) and Claude Desktop. Claude Desktop is experimental and gets a file of its own, Claude-3p/configLibrary/yoink-deepseek.json:
{
"inferenceProvider": "gateway",
"inferenceGatewayBaseUrl": "https://api.deepseek.com/anthropic",
"inferenceGatewayApiKey": "<your key>",
"inferenceModels": ["<model>"]
}yoink does not activate it. The notice after connecting tells you to open Claude Desktop, go to Developer, then Configure third-party inference, select yoink-deepseek, and relaunch.
Claude Code is the other Anthropic consumer. Connecting DeepSeek there writes ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic with your model in every tier and makes DeepSeek the active profile; Providers lists the seven keys and the per-project scope.
Keys outside config files
Two agents read the DeepSeek key from your environment instead of a file yoink writes the key into. Goose looks for CUSTOM_DEEPSEEK_API_KEY (unless GOOSE_DISABLE_KEYRING is set, in which case yoink fills secrets.yaml), and Zed looks for DEEPSEEK_API_KEY. Qwen Code keeps it in its own env block as YOINK_DEEPSEEK_API_KEY, which yoink manages.
FAQ
Do I need two DeepSeek keys for the two endpoints?
No. The preset stores one key and sends it to whichever endpoint each agent uses. Rotating it with yoink edit deepseek --token-stdin updates every connected config at once.
How do I find out if my DeepSeek key is wrong?
Use the interactive yoink add. The preset has no key-check URL, but the model picker fetches https://api.deepseek.com/v1/models with your key, so a rejected key fails there before anything is written. The scripted form takes the key as given and does not send it to DeepSeek.
Related
- Providers
Add an API key once with yoink, from a preset (OpenAI, Kimi, OpenRouter, DeepSeek, z.ai, Ollama) or any compatible URL it probes, and pick its models.
- Harnesses
What yoink writes into pi, omp, opencode, codex, Claude Code, Qwen Code, Kilo, Droid, Crush, Continue, Goose, Zed and Claude Desktop: paths and keys.
- Security
Atomic owner-only writes, kept symlinks, one-time backups, seven managed Claude Code keys, a git-tracked config guard, and keys passed on stdin, never argv.
- Use an OpenAI API key in your coding agents
The openai preset has a Responses endpoint, so it is the one preset that reaches Codex. yoink writes it to 11 agents; Claude Code needs Anthropic Messages.
- Use a Kimi Code API key in your coding agents
The kimi-code preset points Claude Code at api.kimi.com/coding and opencode, pi or Crush at api.kimi.com/coding/v1. Distinct from switching Kimi logins.
- Use the Moonshot AI API in your coding agents
Connect a Moonshot AI platform key to Claude Code via api.moonshot.ai/anthropic, and to opencode, pi, Qwen Code or Crush via api.moonshot.ai/v1.