freedzhost.cloud

Why and how I switched from Claude to Kimi: field report of a hybrid setup

Level IntermediateEstimated time 10 minRead first Kimi Code: the long tasks, on a server, from anywhereA word you don't know? Glossary

Here is my situation, with my real invoices: three months, two providers, and a switch. The question was never "is Kimi better than Claude", but: is it reasonable to bet everything on a single provider — and to fund caps that cut work off mid-run?

Month (2026)Claude (Anthropic)Kimi (Moonshot)
September€216.76 — ~€108 subscription + €108.76 of API top-ups€0
October€169.20 — subscription cut to the €24 tier + €145.20 of API top-ups€122.55 — €104 subscription + €18.55 of API
November€0 — subscription cancelled€204 — the Ultra subscription, just one

The real argument is not the price — even if €385.96 over two months at Anthropic versus a single €204 subscription does count. The real argument is the recurring work interruptions: the Claude caps cut my runs mid-work, and every API top-up bought the end of the month, not the end of the run. What I did: cancel the Claude subscription, move Kimi to Ultra, and build a hybrid stack that no longer depends on any single provider. The direction is deliberate: one readable subscription + local — and move the local agentic layer to Kimi as soon as it is technically possible, for the swarm's coherence: same language, same mechanics everywhere. Here is the honest assessment, including what I lost.

1. Why: the reasons, in the order they actually matter

1.1 Hybrid philosophy and sovereignty

This is my real reason number one, so I say it first. Anthropic sells access; Kimi sells an exit door. Kimi K3.1 Pro is the only frontier model on the market to announce the release of its open weights (expected around 4 November 2026), to expose an endpoint compatible with the Anthropic API (§1.3), and to show a readable price. Concretely: an SMB will never be able to host Claude on its own machines — that is structural, not a budget question. With Kimi the door stays open: the day the weights ship, self-hosting becomes possible, and in the meantime local (§2) takes over whenever a task does not need the frontier. For someone whose position is "a sovereign agent swarm, at home", a provider that leaves an exit door matters more than one more benchmark.

1.2 Price — without exaggerating

Model (API, prices observed on 2 Nov 2026)InputOutput
Claude Opus 5.5$4/Mtok$20/Mtok
Claude Sonnet 5.5$2/Mtok$10/Mtok
Kimi K3.1 Pro$2/Mtok$10/Mtok

K3.1 Pro is not cheaper than Sonnet: it is the same price. What is true: announced Opus-level performance at Sonnet's price, with a 1M-token context native in the API. And on the subscription side, my invoices in the opening table speak for themselves. The official prices are published on the Moonshot platform pricing page; my figures above are my observations of the day, not a source.

1.3 Compatibility: the Anthropic endpoint

Kimi exposes an endpoint compatible with the Anthropic API: https://api.kimi.com/coding/ for the Kimi Code subscription (the key is created in the Kimi Code Console), and https://api.moonshot.ai/anthropic for the pay-as-you-go platform, per token. Concrete consequence: my existing tools (Claude Code first) switch without changing the chain. The migration costs an hour, not a month.

1.4 The heart's choice, and the grail I cannot test

Full transparency: my heart's choice was Qwen. DeepSeek, I am not a user of it. Kimi won because it had already proven itself on my machines with K2.7 Coder — and because no other frontier opens the same door. One honest impossibility remains: the real grail would be all-Kimi hybrid agentics — the K3.1 weights at home, the cloud as backup. Not on my rig: the weights need roughly 1.4 TB of aggregate GPU memory; mine has 32 GB. The exit door exists; it is simply too heavy for me today. Every situation is a hell of trade-offs — the only question is choosing the ones you can live with.

2. The hybrid stack: one subscription, everything else metered

Golden rule: one subscription (Kimi). Everything else is pay-per-token or local. If Kimi ever falls short on a task, I will pay for that task per token elsewhere — not a second subscription. That is precisely the "promise → cap → disappointment" pattern I am leaving.

Routing matrix

TaskRouteWhy
Long reasoning, planning, large contextKimi API / subscriptionFrontier, 1M context, controlled cost
Code in Claude CodeKimi (Anthropic-compatible endpoint)Config in §3, tooling unchanged
Everyday tasks, classification, routineLocal Qwen3.8 (9B or 27B)Free, private, zero network latency
Frequent automations, edgeLocal LFM3Efficiency, zero cost
Disposable, non-sensitive volumeOpenRouter (free models)Zero cost, tolerates latency
A task Kimi cannot handleTargeted pay-as-you-go APIPaid per use only, never a second subscription

⚠️ OpenRouter pitfalls: tight rate limits on the free models, models that change without notice, and your data transiting through a third intermediary. Never for client code or anything sensitive.

The hardware that runs the local side

My rig: Ryzen 7 7800X3D, 64 GB DDR5, RTX 5080 16 GB (PCIe x16) + RTX 4070 Ti SUPER 16 GB as an eGPU (x4 link, so ~32 GB of VRAM in total).

Rule number one of heterogeneous multi-GPU: one model = one GPU. The eGPU's x4 link saturates under tensor-split between the two cards, so each model is assigned whole to one card, with no inter-GPU traffic. I do not enforce this by hand: turnstile, my deterministic GPU allocator, enforces it — a clean queue, and live checks that the model answering is the one that was allocated. In an architecture where a software router picks the backend, that last guarantee is not a detail.

CardServed modelMeasured throughput
RTX 5080 (16 GB)Qwen3.8-heretic 9B Q6_K + MTP speculative decoding — allocated by turnstile169–171 tok/s (2 runs)
RTX 4070 Ti SUPER (16 GB)Qwen3.8-RVN 27B IQ3_XS + MTP — same allocator71.5–71.8 tok/s (2 runs)
CPU (shared in production with 2 other models)LFM3 1.7B Q4_K_M~38 tok/s alone; 88–95 tok/s aggregated on a batch of 8 concurrent classifications

These measurements are taken in real production conditions — the CPU serves two other models during the measurements — not in an empty lab. That is deliberate: a lab figure tells you nothing about what you will get at home.

Mind the KV cache: a long context eats VRAM quickly when running locally. That is a feature of the architecture: anything beyond ~16–32k of context is routed to Kimi (1M native) — not to a more aggressive quant.

Power supply note: 5080 (~360 W) + 4070 Ti SUPER (~285 W) + 7800X3D → plan for a 1000 W PSU (the eGPU has its own power brick).

Minimum viable config for you: a single 16 GB GPU is enough for a 9B at a high quant or a 27B at IQ3; 8 GB → 7–8B. Whatever is missing locally is routed to the API.

The laptop as control plane: "light brain, heavy muscles"

Third element of the architecture: a Ryzen 7 laptop with 64 GB of RAM that pilots everything — and it may be the most useful part, because it reverses the usual "everything on all the time" logic. A rig with a 5080 + 4070 Ti SUPER draws ~100–150 W at idle (about €10–15/month doing nothing, plus noise and wear); a laptop draws 15–35 W. So the laptop stays on permanently and the rig only powers up for compute.

MachineRoleServices
Ryzen 7 laptop, 64 GBControl plane (24/7)n8n (router + queue), routing, dashboards, cost logging
7800X3D rig + 2 GPUsCompute plane (on demand)Per-card inference servers, allocated by turnstile — OpenAI-compatible endpoints, driven by inari

Principle: the laptop receives the requests, applies the routing matrix from §2, and calls the right backend — itself (light tasks), the rig (woken by Wake-on-LAN if needed), or the remote APIs. Concretely: n8n on the laptop → HTTP node → http://rig:8080/v1/chat/completions.

Documented pitfalls:

3. How: the concrete migration

3.1 Switching Claude Code to Kimi

The official procedure is the one in the Kimi Code documentation for third-party agents. Three steps, in order.

Step 1 — the key. In the Kimi Code Console (the subscription, not the per-token platform): "Create API Key", name it, copy it — it is no longer readable once the dialog closes. The pay-as-you-go platform key (platform.moonshot.ai, endpoint https://api.moonshot.ai/anthropic) remains a per-token fallback option, outside the subscription.

Step 2 — the official script, before the first launch. After installing Claude Code, do not start it right away: this script enables third-party model support in ~/.claude.json (penguinModeOrgEnabled + hasCompletedOnboarding) and removes the old model variables from any env block in ~/.claude/settings.json — a stale configuration there would override the new one:

node --eval "
const fs = require('fs');
const os = require('os');
const path = require('path');

// enable third party model support and fast mode
const claudeJsonFilePath = path.join(os.homedir(), '.claude.json');
if (fs.existsSync(claudeJsonFilePath)) {
    const content = JSON.parse(fs.readFileSync(claudeJsonFilePath, 'utf-8'));
    fs.writeFileSync(claudeJsonFilePath, JSON.stringify({ ...content, penguinModeOrgEnabled: true, hasCompletedOnboarding: true }, null, 2), 'utf-8');
} else {
    fs.writeFileSync(claudeJsonFilePath, JSON.stringify({ penguinModeOrgEnabled: true, hasCompletedOnboarding: true }), 'utf-8');
}

// delete old model id
const claudeSettingsJsonFilePath = path.join(os.homedir(), '.claude', 'settings.json');
if (fs.existsSync(claudeSettingsJsonFilePath)) {
    const content = JSON.parse(fs.readFileSync(claudeSettingsJsonFilePath, 'utf-8'));
    if (typeof content === 'object' && typeof content.env === 'object') {
        for (const element of [
            'ANTHROPIC_MODEL',
            'ANTHROPIC_SMALL_FAST_MODEL',
            'CLAUDE_CODE_SUBAGENT_MODEL',
            'ANTHROPIC_DEFAULT_FABLE_MODEL',
            'ANTHROPIC_DEFAULT_FABLE_MODEL_NAME',
            'ANTHROPIC_DEFAULT_OPUS_MODEL',
            'ANTHROPIC_DEFAULT_OPUS_MODEL_NAME',
            'ANTHROPIC_DEFAULT_SONNET_MODEL',
            'ANTHROPIC_DEFAULT_SONNET_MODEL_NAME',
            'ANTHROPIC_DEFAULT_HAIKU_MODEL',
            'ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME',
        ]) {
            delete content.env[element];
        }
        fs.writeFileSync(claudeSettingsJsonFilePath, JSON.stringify(content, null, 2), 'utf-8');
    }
}
"

Step 3 — the official configuration: exported environment variables, not an env block in settings.json. Depending on your plan, the available models and context window change:

PlanAvailable modelsContext window
Andantekimi-for-coding262,144
Moderatok3 or kimi-for-coding262,144
Allegretto and abovek3, kimi-for-coding, kimi-for-coding-highspeed1,048,576 for K3, 262,144 for the K2.7 Code series

The "K3 with 1M context" configuration (Allegretto and above):

export ANTHROPIC_BASE_URL=https://api.kimi.com/coding/
export ANTHROPIC_API_KEY=YourApiKey

export ANTHROPIC_MODEL="k3[1m]"
export ANTHROPIC_DEFAULT_FABLE_MODEL=$ANTHROPIC_MODEL
export ANTHROPIC_DEFAULT_OPUS_MODEL=$ANTHROPIC_MODEL
export ANTHROPIC_DEFAULT_SONNET_MODEL=$ANTHROPIC_MODEL
export ANTHROPIC_DEFAULT_HAIKU_MODEL=$ANTHROPIC_MODEL
export CLAUDE_CODE_SUBAGENT_MODEL=$ANTHROPIC_MODEL
export CLAUDE_CODE_EFFORT_LEVEL=high
export CLAUDE_CODE_AUTO_COMPACT_WINDOW=1048576
export CLAUDE_CODE_MAX_CONTEXT_TOKENS=1048576

claude

The "k3[1m]" form exists only there: as a Claude Code environment variable value, quoted, to unlock the 1M-token window. Everywhere else — API requests, the "Model ID" field of other tools — the identifier is k3. If your plan only gives K3 at 256k, use ANTHROPIC_MODEL=k3 and set CLAUDE_CODE_AUTO_COMPACT_WINDOW and CLAUDE_CODE_MAX_CONTEXT_TOKENS to 262144.

3.2 The pitfalls (what cost me time, so it does not cost you yours)

  1. A single authentication variable: the official documentation only uses ANTHROPIC_API_KEY. Do not mix it with older variables (ANTHROPIC_AUTH_TOKEN, leftovers of an env block) — that is what the step 2 script is for.
  2. Turning "thinking" off reroutes K3 to K2.6: keep reasoning enabled to stay on K3 / K2.7. Effort is set in-session with /effort, without an environment variable. Level mapping: low → low, medium and high → high, xhigh and max → max (unset: high).
  3. Every unconfigured tier variable = a silent failure of the matching scenario (subagents, summary, etc.). Everything must be mapped.
  4. Test before launching: a curl against the endpoint validates the key in 10 seconds; then /status in Claude Code must show Base URL https://api.kimi.com/coding/. The /model menu and /status may keep showing Claude model names: that is normal, the calls do go to the Kimi Code API.
  5. If a 400 persists: add ENABLE_TOOL_SEARCH=false.
  6. EU vs China keys: platform.kimi.ai (international) and platform.kimi.com (China) are two silos — a key from one returns 401 on the other.

3.3 The swarm: n8n as conductor

Above Claude Code, the swarm runs on n8n, on the laptop: each workflow reads the routing matrix from §2, delegates to the right backend — Kimi, a local model on the rig, or LFM3 — and logs cost and latency per task. That log is what keeps the matrix honest: a route that costs too much or fails too often shows up, and it changes. The workflow details belong to the "your agent stack" series; here, the only thing to remember is that the router is a deterministic tool, not an agent deciding on a hunch.

4. What I measure — and what I refuse to publish

I will not publish an A/B Claude vs Kimi table with quality scores: I did not run that benchmark, and an invented table would be worth less than any blogger's benchmark. What I actually measure:

5. What I lost (as important as the rest)

6. Who it is for (and who it is not for)

Sources

Prices observed on 2 November 2026 — prices move fast on both sides. Transparency: no relationship with Moonshot AI; this article is not sponsored; real figures from my invoices. Article under CC BY-SA 4.0, like the rest of freedzhost.cloud.

Found this useful? Tell us what to measure next.

Comments

No account, no tracker: a comment is read by a human before it appears.