Blog

Kimi K3 in practice: hands-on experience and a comparison with Claude Code

Markdown

Speed, token usage, caching, and compatibility with multi-agent setups: the author’s personal experience and published independent benchmarks.

Read full article

Highlights

A July 25 review of Kimi K3 suggested putting it to the test: spend a day setting it up and see whether it pays off. I tried it myself. In benchmarks, the model ranks first in frontend work and beats Claude on terminal tasks. On my tasks, it worked twice as slowly, consumed noticeably more tokens, and disrupted work by multiple agents.

The Ailoot documentation describes connecting models and working with the API.

How did the author’s Kimi K3 experiment turn out?

Highlights

On July 25, I published a review of Kimi K3 and ended it by suggesting spending a day calibrating it to find out whether switching pays off. Then I wrote that I was testing the model and was pleasantly shocked. That was true during the first few hours. Then came long sessions with several agents, and the picture changed.

Kimi K3 launched on July 16, 2026. It has 2.8 trillion parameters, a million-token context window, open weights, and first place in a blind frontend comparison. I collected all the details about its architecture, benchmarks, and prices in the full review of Kimi K3 versus Claude Code, so I won’t repeat them here.

At the end of that review, I wrote: the risk is losing a day to setup; the payoff is a bill that drops from the second week onward. I ran the experiment on my own tasks.

The first few hours really are exciting. The model eagerly picks up a task, generates coherent frontend work, and doesn’t hesitate over large files. That’s why my first impression was a pleasant shock. The problems surfaced in long sessions, with multiple agents, through repeated rounds of edits, and in the evening at the terminal.

In the end, I rolled back. Here’s what led to that decision, with figures and links to primary sources so you can check everything for yourself.

Why do benchmarks show Kimi K3 beating Claude?

Highlights

In specific disciplines, Kimi K3 really does beat Claude in benchmarks: terminal tasks, long engineering marathons, and blind frontend comparisons. But across the full set of 35 benchmarks, the tally is different: Claude Fable 5 wins 22, Kimi K3 wins twelve, and there is one tie. Both pictures are accurate; the first one is simply quoted more often.

Here are the benchmarks where Kimi K3 beats Claude Fable 5:

BenchmarkKimi K3Claude Fable 5Margin
Terminal-Bench 2.188.384.6+3.7
SWE-Marathon42.035.0+7.0
BrowseComp91.288.0+3.2
Program Bench77.876.8+1.0

Every row compares against Claude Fable 5.

The figures are real. Across all 35 benchmarks, Claude Fable 5 wins 22, Kimi K3 wins twelve, and there is one tie.

More interesting is where Kimi K3 falls short. Its deficit on coding benchmarks is modest, at 4–5 points. It slips on knowledge and reasoning: on HLE, Claude pulls ahead by almost 10 points. That’s exactly where a long task hits a wall: first you have to understand, and only then can you write.

Moonshot puts it this way in the main section of its release post:

Although it still trails the strongest closed models overall, Claude Fable 5 and GPT 5.6 Sol, Kimi K3 demonstrated a frontier level across our entire benchmark suite.

— Moonshot AI, https://www.kimi.com/blog/kimi-k3

Why does Kimi K3 feel twice as slow in practice?

Highlights

Kimi K3 returns its first token twice as fast as Claude, but the stream then runs twice as slowly. In a short chat, this feels fast; on a work task, the complete response takes noticeably longer. Independent benchmarks put it at 34.7 tokens per second versus 61.3 for Claude Opus 4.8.

MetricKimi K3Claude Opus 4.8
Output speed34.7 tokens/s61.3 tokens/s
Time to first token4.19 s9.50 s
Intelligence index5756
Average price per million$2.31$3.85

The comparison uses Claude Opus 4.8, the Claude version with a complete speed run.

Kimi K3 responds sooner, so it subjectively seems quicker in a short chat. At work, time is spent on something else: how slowly the full response arrives. Here it loses by almost half, and on a long response the gap adds up to minutes.

Kimi Code advertises 180–260 tokens per second, and that figure looks convincing next to my 34.7. It refers to the previous generation’s speed build, K2.7 Code HighSpeed. Kimi K3 has no such build at all, and the independent benchmark measures Kimi K3 itself.

A session that breaks on the seventh error and burns tokens on repeated calls is a context-engineering failure; the model choice is secondary here.

Where do the tokens go if reasoning can’t be turned off?

Highlights

Kimi K3’s reasoning cannot be turned off at all. If you call the model directly through the API, the maximum effort level is set by default, and it reasons over every request, including trivial ones.

You can lower the effort level; the documentation lists three: low, high, and maximum. But reasoning cannot be turned off entirely: it explicitly says that reasoning and storage of its history are always enabled for Kimi K3. With direct API calls, the maximum level is set by default, and most wrapper programs don’t change it.

Each turn adds thousands of output tokens at $15 per million. Plus, Moonshot requires you to return the assistant’s entire message, including its reasoning history, and those output tokens become input tokens again on the next turn.

So you pay twice for the same reasoning: first when the model writes it, then when you send it back to the model.

On the overall index, Kimi K3 uses 21% fewer output tokens than its predecessor, K2.6. The model has become more economical compared with its own previous version. Claude still uses less on the same tasks.

The prompt “hi” is billed as 86 tokens. Under the hood, a hidden system prompt of about 85 tokens is present, and you pay for it on every request.

I have a separate review on how to calculate your usage and where to check your remaining balance: how many tokens Claude Pro and Max give you. The calculation logic is the same there; only the prices change.

What happens when the model gets stuck reasoning?

Highlights

Kimi K3 went into a loop several times for me: the reasoning block started repeating the same chunk of text, breaking down into fragments of syllables, while the agents below hung motionless. And it’s not just me. Moonshot’s own list of known issues has reports of these loops, more than once.

It looks like this. The model starts thinking, but instead of developing its thought, the text slips into repetition: the same word, then fragments of syllables, endlessly. The task stalls while the token counter keeps spinning.

Reports in Moonshot’s issue trackers describe Kimi K3 trying to read the same file six times in a row, receiving the “no-op call, file hasn’t changed since the previous read” rejection seven times, and then ending the turn as if nothing had happened. Other reports list four varieties of the same kind of hang—reading, replacing, testing, and analysis.

Moonshot states the cause directly. The model was trained in a mode that preserves reasoning history, and it needs to receive its past reasoning back in full. If the history arrives incomplete, the model tries to reconstruct the answer, produces the same tool call, and starts another loop.

Why does a multi-agent setup fall apart on Kimi K3?

Highlights

When Claude Code connects to the Moonshot API, some of its capabilities break. WebFetch isn’t supported at all, deferred tool loading makes the request fail with a 400 error, and after several such errors the session stops responding even to plain text. The break occurs at the interface between Claude Code and the Moonshot API.

The official Moonshot documentation states this plainly: their API does not yet support WebFetch. In other words, Claude Code, which normally goes online to fetch a page, can’t do that on Kimi K3. The workaround is to paste the content manually or connect a third-party tool.

Claude Code can load tools on demand and puts a service block of type tool_reference in the history. Kimi doesn’t accept this type and returns a 400. It does so silently, without naming either the field or the reason:

{"error":{"type":"invalid_request_error","message":"Invalid request Error"},"type":"error"}

For comparison, here’s what the same failure looks like on Anthropic’s native API, where the server at least names the field and lists the accepted types:

messages.166.content.0.tool_result.content.0: Input tag 'tool_reference' found
using 'type' does not match any of the expected tags: 'document', 'image',
'search_result', 'text'

The difference matters. It’s impossible to diagnose the first message: neither the client nor the person behind it can tell which block was rejected. That’s exactly what the authors of the reports complain about.

The consequence: in one reported session, this error appeared seven times. The session survived the first six; the seventh killed it for good: after that, even entering the plain text “continue” caused it to crash. The report notes separately that the session was nowhere near the context limit, so the “history was too long” explanation doesn’t hold.

Here’s a summary of the block types the Moonshot API accepts and rejects:

What Claude Code doesWorks on Kimi K3
Standard tool callyes
Web searchyes
Page fetching via WebFetchno, the API doesn’t support it
Deferred tool loadingno, 400 error and risk of losing session

The word “compatible” here describes only the request format. Everything else differs: which block types are accepted, what the history must contain, and which tools are available at all.

What doesn’t carry over with Kimi K3?

Highlights

Switching models changes the engine, but the entire wrapper around it—the Claude Code itself, its tools, and its subagents—remains tailored to Claude. The instruction file, skills, and subagents were written for Claude’s behavior. Moonshot explicitly recommends using a wrapper with proven compatibility and not switching models mid-session.

The limitations section of the release post says this verbatim:

K3 was trained in a mode that preserves reasoning history. If an agent wrapper fails to return the entire reasoning history as required, or if a session started with another model is switched to K3, generation quality can become extremely unstable. We recommend using a wrapper with proven compatibility, such as Kimi Code, and avoiding switching to K3 in the middle of a session.

— Moonshot AI, limitations section, https://www.kimi.com/blog/kimi-k3

The model’s developer is saying: use our client; we don’t guarantee how someone else’s behaves.

The second point in that same section explains one more thing I had attributed to the model’s stubbornness:

K3 was trained with an emphasis on long, complex tasks. As a result, when faced with a small inconsistency or ambiguous user intent during work, it may make an unexpected decision on the user’s behalf.

— Moonshot AI, limitations section, https://www.kimi.com/blog/kimi-k3

My CLAUDE.md was written for the opposite habit: ask, show a plan, and wait for confirmation. The instructions are still there, but they’re now being read by a model with a different temperament.

If you want to keep one rule file for several agents, I covered that setup separately: one instruction file for Claude Code, Codex, and Cursor.

How much did Kimi K3 really cost?

Highlights

Per token, Kimi K3 is almost half the price of Claude. In agent workflows, that math breaks down because of the cache: any change to the system prompt or tool list resets it completely, raising input token prices from 30 cents back to $3 per million. Claude Code makes such changes routinely and constantly.

First, the prices, which favor Kimi K3:

ItemKimi K3Claude Opus 5
Input per million$3.00$5.00
Input per million when cached$0.30$0.50
Output per million$15.00$25.00

Kimi prices come from the context caching documentation; the right column shows Claude Opus 5 prices as of July 30, 2026.

Kimi’s cache is automatic, cannot be disabled, and is identified by the hash at the start of the request. Any edit to the system prompt or tool list clears the message cache completely.

Here’s what Claude Code does during a normal workday:

  1. Connects and disconnects external tools as the task progresses.
  2. Loads tools on demand when they’re needed.
  3. Launches subagents with a different set of tools.
  4. Adds the instruction file to the system prompt.
  5. Rebuilds the history when compressing context.

Each item on this list resets the start of the request, and therefore the cache. Input tokens cost $3 per million again instead of 30 cents—ten times more. On top of that comes constant reasoning at $15 per million output tokens, and those same tokens return as input on the next turn. That’s how a model with a low listed price can produce a bill you don’t expect.

According to OpenCode’s aggregate data, across nearly 280,000 live sessions, an average Kimi K3 session costs $1.86 with an average volume of 3.1 million tokens. That figure depends on 93% of input tokens hitting the cache. Change the start of the request, and it no longer applies to you.

Kimi plans cost $19, $39, $99, and $199. The quota comes from a shared pool for the entire membership, resets weekly without carrying over unused amounts, and uses a rolling five-hour window.

The $99 plan’s coding quota is comparable to Anthropic’s $200 plan, which goes against my own position. Kimi is cheaper per token, but you can’t see that anymore in the evening’s bill.

Where is Kimi K3 objectively good?

Highlights

Kimi K3 is strong where the task is one large, clearly defined job: frontend work, large-scale code refactoring, working with long files, and analyzing a large repository. It deserved first place in the blind frontend comparison, and it makes sense to give it tasks like these. Below are five things in its favor.

  1. Frontend. First place in a blind comparison by live developers. It builds layouts neatly and with decent taste.
  2. Volume. A million-token context window, and long files don’t faze it. Analyzing a large repository and mapping it out is its kind of task.
  3. First response. Time to first token is half that of Claude. It’s noticeable and pleasant in a short conversation.
  4. Price per token. About 60% of Claude Opus 5’s price. If the start of the request doesn’t change, this yields real savings on large, repetitive workloads.
  5. Open weights. The model isn’t locked to one provider.

There’s a caveat about the last point. It’s unrealistic to run a model like this at home: even in compressed form, its weights measure in terabytes. Here, openness means independence from a single provider.

How to test all this yourself in one evening

Highlights

You need to test Kimi K3 on your usual task: the difference doesn’t show up in a short chat. Measure two things: how much time it took and how much the evening cost. Below are seven steps in order, so you don’t confuse a problem with the model itself for a problem with the wrapper around it.

  1. Set up access using the instructions. I described the three environment variables and model substitutions by tier in the Kimi K3 versus Claude Code review. Check the setup with the /status command: Kimi won’t appear in the model selection menu because it has a built-in list of aliases, and you don’t need to touch it.
  2. Remove the old key. If you previously had ANTHROPIC_API_KEY set, remove it. Together with ANTHROPIC_AUTH_TOKEN, it causes a conflict and you’ll get an authorization error for no good reason.
  3. Turn off deferred tool loading right away. Do it before the first run, not after the first session dies.
  4. Don’t switch models mid-task. If you started on Kimi K3, finish on Kimi K3. The reverse is also true. This is a direct Moonshot requirement; I quoted it above.
  5. Use a real task of your own. One you worked on yesterday, with all its mess and unfinished threads. A snake game won’t show the difference: it only appears over the long run.
  6. Write down two figures. How many minutes it took and how much money you spent that evening. Compare it with a usual evening on Claude.
  7. Track idle time separately. When the agent hangs, reads the same file in a loop, or responds with an error—that’s part of the cost too.

If the evening’s bill comes out higher than expected, it’s almost always the cache: count how many times the start of the request was reset that evening. The price per token has little to do with it.

What I ended up keeping

Highlights

Kimi K3 didn’t fully replace Claude Code, and I didn’t force it to. Claude Code remained the main engine for long tasks and multi-agent setups. Kimi K3 stays alongside it as a second engine for tasks that involve a lot of repetitive layout work and can be handed off as a whole. The dividing line is how many transitions a task involves.

A practical setup: send Kimi K3 to inspect the repository and give a second opinion, while leaving the main work to your familiar agent. This setup holds up because it doesn’t require moving the wrapper or breaking what already works.

You can put it this way: one complete task goes to Kimi K3; a long chain involving tools and subagents goes to Claude Code. The more switches between tools a task requires, the more it costs on Kimi K3 and the greater the chance of a broken session.

I have a separate review on how to assign roles to two agents without mixing them up: three ways to work with two agents.

Benchmarks answer the question “who is stronger in lab conditions?” Your evening’s bill and your list of completed work answer the question “who is stronger for you?” When those two answers differ, trust the second: you calculated it yourself, not the marketing department.

After looking at all this, I decided for myself: whatever people say about new models, a leader is still a leader. Claude Code remains my main engine.

You can continue working with AI on Ailoot.

More details

Questions about Kimi K3 in practice: hands-on experience and a comparison with Claude Code

Does a faster first token mean Kimi completes coding tasks faster?

No. The first-token delay and the speed of the remaining stream are different measurements. Time the complete task, including tool steps, retries and checks, rather than judging the opening response.

How should I test whether Kimi works for my workflow?

Use one representative task with the same starting files and success checks as your current setup. Record total time, token usage and the result, then test the multi-agent workflow separately before relying on it for long sessions.

All articles