DeepSeek Harness on a Claude Subscription in 120 Lines Developer Manoj Lds built dsh-llm-claude-code, a roughly 120-line plugin that lets DeepSeek's open-source DeepSeek Harness (dsh) run on a Claude subscription through the local Claude Code login, reusing Pi's pi-claude-code provider and dsh's own pi-ai adapter. The plugin exploits dsh's stateless model seam, where adapters implement a single stream(options: GenerateOptions) method and answer one step at a time from the host's transcript, the same contract Pi gives its providers. The author warns the approach is not sanctioned: Anthropic may bill the usage as extra usage, restrict it, or act on the account. DeepSeek Harness on a Claude Subscription in 120 Lines DeepSeek Harness has no way to use a Claude subscription, so I wrote a plugin for it. Its model seam is stateless like Pi's, which meant I could borrow pi-claude-code for the hard part and dsh's own pi-ai adapter for the rest. 1. 1. Managing Context Windows with pi /tree: Branches, Summaries, and Subagent-like Workflows https://stacktoheap.com/blog/2026/02/26/pi-tree-context-window-management 2. 2. Pi Durable: A Look at the Future of Agent Harnesses https://stacktoheap.com/blog/2026/10/05/pi-durable 3. 3. Code Mode That Survives a Crash: Durable Scripts in Pi Durable https://stacktoheap.com/blog/2026/10/26/durable-code-mode-in-pi 4. 4. Two Harnesses Walk into a Claude Subscription https://stacktoheap.com/blog/2026/10/30/claude-subscriptions-two-harnesses 5. 5. DeepSeek Harness on a Claude Subscription in 120 Lines Note: This plugin copies what bigger harnesses like OpenCode and Pi it literally uses Pi’s pi-claude-code provider already do to support Claude Code subscriptions, but that doesn’t make it sanctioned. Anthropic may not like third-party harnesses running on a subscription, and it may bill that usage from extra usage, restrict it, or act on the account. Try it with that in mind, and read the billing section whats-still-rough before you rely on it. In my last post https://stacktoheap.com/blog/2026/10/30/claude-subscriptions-two-harnesses , I looked at how OpenCode and Pi let you bring a Claude subscription into another coding agent through your local Claude Code login. OpenCode keeps a Claude Code session alive and waits inside a tool handler while it runs each tool. Pi asks Claude Code for one model response per step and replays its own transcript into a fresh worker each time. A few days later I started playing with DeepSeek Harness https://github.com/deepseek-ai/deepseek-harness dsh , DeepSeek’s open-source agent harness. It is still a developer preview, but it is very pluggable, and I wanted to drive it with the subscription I already pay for. dsh has no provider for that, so I wrote one: dsh-llm-claude-code https://github.com/manojlds/dsh-claude-code . I expected to spend most of the time reimplementing one of the two approaches from my last post. Instead, the plugin ended up being about 120 lines, because almost everything it needed already existed in two other projects. This post covers how dsh talks to models, which of the two approaches fits it and why , the shortcut that made the plugin small, the packaging work that wasn’t small, what I tested, and what is still rough. How dsh talks to models dsh is built from plugins. A profile, such as web or headless , is a stack of plugin bundles plus your own patch file, and every capability—tools, the system prompt, compaction, model providers is a plugin on a documented extension point. Here, a model provider is the piece that takes a request from the agent loop and turns it into a call to a model API. Model providers plug into dsh’s LLM service as adapters . An adapter registers one or more provider routes names like deepseek-official or openrouter and implements one required method: abstract stream options: GenerateOptions : AsyncIterable