Skip to content
Yoink

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

DeepSeek preset facts
FactValue
Preset iddeepseek
openai-chat endpointhttps://api.deepseek.com/v1
anthropic-messages endpointhttps://api.deepseek.com/anthropic
API keys pagehttps://platform.deepseek.com/api_keys
Harnesses it reaches12 of 13
Add commandyoink add --external --name <name> --preset deepseek
Harnesses the DeepSeek preset reaches
HarnessWith this preset
Claude Codeuses anthropic-messages
piuses openai-chat
ompuses openai-chat
opencodeuses openai-chat
codexnot offered: needs openai-responses
Qwen Codeuses openai-chat
Kilo Codeuses openai-chat
Droiduses anthropic-messages
Crushuses openai-chat
Gooseuses openai-chat
Zeduses openai-chat
Continueuses openai-chat
Claude Desktopuses 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-stdin

The 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.

  • 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.