Moonshot AI släppte Kimi K3 den 16 juli 2026, med öppna vikter tillgängliga från den 27 juli. Modellen landar med 2,8 biljoner parametrar totalt och ett kontextfönster på 1 048 576 tokens, alltså ungefär en miljon tokens i ett enda anrop. Det är fyra gånger så mycket som föregångaren Kimi K2.7 Code klarade av, enligt Moonshots egen utvecklarguide hos Firecrawl. I den här guiden bygger vi ett komplett, körbart projekt: en AI-agent som pratar med Kimi K3 via det OpenAI-kompatibla API:et och använder Model Context Protocol (MCP) för att anropa egna verktyg. Du får tolv konkreta steg, fem plus kodblock att kopiera, och en färdig mapp med filer du kan starta direkt.

Guiden riktar sig till dig som redan bygger med API:er från OpenAI, Anthropic eller Google och vill förstå vad Kimi K3 faktiskt tillför, snarare än att bara läsa en produktbeskrivning. Vi går igenom kod du kan köra direkt, inte pseudokod, och vi är tydliga med var Moonshots publika dokumentation har luckor, till exempel kring exakta lokala hårdvarukrav. Målet är en agent som fungerar i praktiken, inte bara i teorin.

Vad är Kimi K3 och varför spelar den roll just nu

Kimi K3 är en gles Mixture-of-Experts-modell (MoE). Av de 2,8 biljoner parametrarna aktiveras bara cirka 104 miljarder per token, fördelat över 896 experter där 16 väljs ut för varje enskild token. Det gör modellen billigare att köra än vad den råa parametersiffran antyder, samtidigt som den håller kvar mycket av kapaciteten från en större dense-modell. Moonshot beskriver Kimi K3 som den största öppna modellen som släppts hittills, en position som tidigare hölls av kinesiska konkurrenter som DeepSeek och Qwen.

Namnet “K3” markerar också ett generationsskifte snarare än en mindre uppdatering. Där tidigare Kimi-modeller siktade in sig på kodning och matematiska resonemang specifikt, är K3 byggd som en bredare frontier-modell som ska klara agentiska uppgifter, visuella indata och långa dokument i samma paket. Det gör den till ett rimligt förstaval när du bygger ett system som ska göra flera olika saker i samma flöde, till skillnad från en smalare modell optimerad för en enda uppgiftstyp.

Prissättningen ligger på 3 dollar per miljon input-tokens och 15 dollar per miljon output-tokens via Moonshots API, enligt Yotta Labs specifikationsöversikt. Som jämförelse kostar Anthropics Claude Opus 5, som lanserades 24 juli 2026, 5 dollar per miljon input-tokens och 25 dollar per miljon output-tokens, samma prisnivå som föregångaren Opus 4.8. Kimi K3 landar alltså klart under Opus 5 i pris per token, samtidigt som kontextfönstret är avsevärt större. Modellen finns officiellt på Hugging Face under namnet moonshotai/Kimi-K3, och API:et nås via https://api.moonshot.ai/v1 för internationella konton (kinesiska konton använder https://api.moonshot.cn/v1 istället).

Det som gör Kimi K3 extra intressant för utvecklare i Norden är kombinationen av öppna vikter, ett OpenAI-kompatibelt API och inbyggt stöd för Model Context Protocol i verktygskedjan Kimi Code CLI. Du kan alltså bygga agenter som pratar med externa verktyg, filsystem och API:er på ett standardiserat sätt, utan att låsa in dig i ett proprietärt gränssnitt. I resten av artikeln bygger vi ett sådant flöde från grunden.

Kimi K3 mot Kimi K2.7 Code: vad har ändrats

Kimi K2.7 Code var Moonshots tidigare flaggskepp för kodrelaterade uppgifter, med runt 1,1 biljoner parametrar totalt. Kimi K3 mer än fördubblar den siffran och ökar samtidigt kontextfönstret fyra gånger. Arkitekturen har också bytt namn internt till en så kallad Stable LatentMoE-stack, med fler experter men samma princip om att bara en liten andel aktiveras per token. Tabellen nedan sammanfattar de bekräftade skillnaderna.

EgenskapKimi K2.7 CodeKimi K3
Totala parametrar~1,1 biljoner2,8 biljoner
Aktiva parametrar per tokenLägre (dense-liknande delmängd)~104 miljarder
Antal experterFärre (äldre arkitektur)896 (16 aktiva + delade)
Kontextfönster~262 000 tokens1 048 576 tokens
API-pris (input/output per miljon)Lägre generation, fasas ut3 dollar / 15 dollar
ReleaseTidigare 202616 juli 2026 (vikter 27 juli)

Skillnaden i kontextfönster är det som märks mest i praktiken. Med en miljon tokens kan du skicka in hela kodbaser, långa PDF-rapporter eller flera timmars transkriberad text i ett enda anrop, utan att bygga ett separat retrieval-lager för att klippa ner innehållet. Moonshot uppger själva att en utvärdering på den fulla miljon-token-kontexten, utan någon extra kontexthantering, landade på ett resultat av 90,4 på deras interna långkontext-test. Exakt vilket benchmark som ligger bakom siffran är inte specificerat i det publika materialet, så ta den som en indikation snarare än ett facit.

I praktiken märks skiftet tydligast i vilka uppgifter som blir möjliga utan omskrivning av arkitekturen på din sida. Med K2.7 Codes mindre kontextfönster var du ofta tvungen att bygga ett separat retrieval-steg, det vill säga söka fram de mest relevanta delarna av ett dokument innan du skickade in dem till modellen. Med K3:s miljon-token-fönster kan du för många vanliga uppgifter hoppa över det steget helt och skicka in hela materialet, vilket förenklar arkitekturen även om det inte alltid är den billigaste vägen att gå.

Förkunskaper: verktyg och versioner du behöver

Du behöver inget kraftfullt grafikkort för den här guiden. Vi kör Kimi K3 via API:et, inte lokalt på egen hårdvara (det tar vi separat längre ner). Se till att följande finns installerat innan du börjar.

  • Node.js 20 LTS eller senare (testat mot v20.20)
  • npm 10 eller senare, medföljer Node.js
  • Ett textredigeringsprogram, till exempel VS Code
  • En API-nyckel från Moonshot AI:s utvecklarplattform
  • Grundläggande kunskap i JavaScript och async/await
  • curl för att testa API-anrop direkt från terminalen

Projektet använder tre paket: det officiella openai-biblioteket (version 7.8 vid publicering, fungerar mot alla OpenAI-kompatibla API:er inklusive Moonshots), @modelcontextprotocol/sdk (version 1.30) för att bygga och koppla ihop MCP-servrar, samt zod (version 4.5) för att beskriva verktygsscheman på ett typsäkert sätt. Alla tre är aktivt underhållna och installeras via npm i steg två.

Steg-för-steg: bygg en AI-agent med Kimi K3 och MCP

Nu bygger vi projektet i tolv konkreta steg. Målet är en fungerande kommandoradsagent som kan svara på frågor, räkna ut saker åt dig och kontrollera statusen på en webbadress, allt via verktyg som exponeras genom en egen MCP-server och anropas av Kimi K3.

Steg 1: Skaffa en API-nyckel hos Moonshot AI

Registrera ett konto på Moonshots utvecklarplattform och skapa en API-nyckel under kontoinställningarna. Spara nyckeln direkt, den visas bara en gång. Kontrollera samtidigt vilket API-slut som gäller för ditt konto: internationella konton använder https://api.moonshot.ai/v1, medan konton registrerade i Kina pekar mot https://api.moonshot.cn/v1. Blandar du ihop de två får du autentiseringsfel även om nyckeln i sig är korrekt.

Steg 2: Skapa projektet och installera beroenden

Skapa en ny mapp och initiera ett Node.js-projekt som ES-modul, sedan installerar du de tre paketen från förkunskaperna.

mkdir kimi-k3-agent && cd kimi-k3-agent
npm init -y
npm pkg set type="module"
npm install openai@^7.8.0 @modelcontextprotocol/sdk@^1.30.0 zod@^4.5.0 dotenv@^17.0.0

Steg 3: Konfigurera miljövariabler

Skapa en fil som heter .env i projektroten och lägg till din API-nyckel. Lägg också till .env i din .gitignore så att nyckeln aldrig checkas in i versionshantering av misstag.

MOONSHOT_API_KEY=din-nyckel-har
MOONSHOT_BASE_URL=https://api.moonshot.ai/v1
KIMI_MODEL=kimi-k3

Steg 4: Testa ditt första API-anrop

Innan vi bygger agentlogiken, verifiera att anslutningen fungerar med ett enkelt curl-anrop. Ett lyckat svar bekräftar att nyckeln och bas-URL:en är korrekt konfigurerade.

curl https://api.moonshot.ai/v1/chat/completions \
  -H "Authorization: Bearer $MOONSHOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kimi-k3",
    "messages": [{"role": "user", "content": "Svara med exakt ordet: fungerar"}]
  }'

Ett fungerande svar ser ut ungefär så här (avkortat):

{
  "id": "chatcmpl-...",
  "model": "kimi-k3",
  "choices": [
    { "message": { "role": "assistant", "content": "fungerar" }, "finish_reason": "stop" }
  ],
  "usage": { "prompt_tokens": 14, "completion_tokens": 3, "total_tokens": 17 }
}

Steg 5: Bygg din första MCP-server

Nu skapar vi själva MCP-servern, filen mcp-server.js. Den exponerar två verktyg: ett som räknar ut enkla matteuttryck och ett som kontrollerar HTTP-statusen på en webbadress. MCP-servern kommunicerar över stdio, alltså standard in och ut, vilket gör den enkel att koppla till vilken klient som helst.

// mcp-server.js
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

const server = new McpServer({ name: "kimi-verktyg", version: "1.0.0" });

server.registerTool(
  "berakna",
  {
    title: "Berakna",
    description: "Raknar ut ett enkelt matteuttryck, t.ex. 12 * (4 + 1)",
    inputSchema: { uttryck: z.string() }
  },
  async ({ uttryck }) => {
    const sakert = /^[0-9+\-*/().\s]+$/.test(uttryck);
    if (!sakert) {
      return { content: [{ type: "text", text: "Ogiltigt uttryck" }], isError: true };
    }
    const resultat = Function(`"use strict"; return (${uttryck})`)();
    return { content: [{ type: "text", text: String(resultat) }] };
  }
);

server.registerTool(
  "kontrollera_url",
  {
    title: "Kontrollera URL",
    description: "Haemtar HTTP-statuskoden for en given webbadress",
    inputSchema: { url: z.string().url() }
  },
  async ({ url }) => {
    const svar = await fetch(url, { method: "HEAD" });
    return { content: [{ type: "text", text: `Status: ${svar.status}` }] };
  }
);

const transport = new StdioServerTransport();
await server.connect(transport);

Steg 6: Koppla en MCP-klient till servern

Agenten behöver en MCP-klient som startar servern som en underprocess och pratar med den. SDK:et sköter processhanteringen åt dig via StdioClientTransport, du behöver bara peka på filen som ska köras.

// mcp-client.js
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";

export async function startaMcpKlient() {
  const transport = new StdioClientTransport({
    command: "node",
    args: ["mcp-server.js"]
  });
  const client = new Client({ name: "kimi-k3-agent", version: "1.0.0" });
  await client.connect(transport);
  return client;
}

Steg 7: Definiera tool-calling-scheman för Kimi K3

Kimi K3:s API följer OpenAI:s format för tool-calling. Det betyder att vi kan hämta verktygslistan från MCP-klienten och konvertera den till det format som chat completions-anropet förväntar sig, utan att skriva scheman två gånger.

function tillOpenAiVerktyg(mcpVerktyg) {
  return mcpVerktyg.map((v) => ({
    type: "function",
    function: {
      name: v.name,
      description: v.description,
      parameters: v.inputSchema
    }
  }));
}

Steg 8: Bygg agent-loopen

Det här är hjärtat i projektet, filen agent.js. Loopen skickar användarens fråga till Kimi K3 tillsammans med verktygslistan. Om modellen svarar med ett tool-anrop kör vi det via MCP-klienten, lägger resultatet tillbaka i konversationen och skickar en ny förfrågan. Loopen fortsätter tills modellen svarar med vanlig text istället för ett verktygsanrop.

// agent.js
import "dotenv/config";
import OpenAI from "openai";
import { startaMcpKlient } from "./mcp-client.js";

function tillOpenAiVerktyg(mcpVerktyg) {
  return mcpVerktyg.map((v) => ({
    type: "function",
    function: { name: v.name, description: v.description, parameters: v.inputSchema }
  }));
}

async function korAgent(fraga) {
  const kimi = new OpenAI({
    apiKey: process.env.MOONSHOT_API_KEY,
    baseURL: process.env.MOONSHOT_BASE_URL
  });
  const mcp = await startaMcpKlient();
  const { tools } = await mcp.listTools();
  const openAiVerktyg = tillOpenAiVerktyg(tools);

  const meddelanden = [
    { role: "system", content: "Du ar en teknisk assistent. Anvand verktygen nar de behovs." },
    { role: "user", content: fraga }
  ];

  for (let varv = 0; varv < 5; varv++) {
    const svar = await kimi.chat.completions.create({
      model: process.env.KIMI_MODEL,
      messages: meddelanden,
      tools: openAiVerktyg,
      reasoning_effort: "high"
    });

    const val = svar.choices[0].message;
    meddelanden.push(val);

    if (!val.tool_calls) {
      await mcp.close();
      return val.content;
    }

    for (const anrop of val.tool_calls) {
      const argument = JSON.parse(anrop.function.arguments);
      const resultat = await mcp.callTool({ name: anrop.function.name, arguments: argument });
      meddelanden.push({
        role: "tool",
        tool_call_id: anrop.id,
        content: resultat.content.map((c) => c.text).join("\n")
      });
    }
  }
  await mcp.close();
  throw new Error("For manga varv utan slutgiltigt svar");
}

const fraga = process.argv.slice(2).join(" ") || "Vad ar 34 * 12 + 7?";
korAgent(fraga).then(console.log).catch(console.error);

Steg 9: Justera reasoning effort och thinking mode

Kimi K3 kör med en alltid påslagen resonemangsmodell, en så kallad thinking mode, där du kan styra hur mycket beräkningskraft modellen lägger på att tänka innan den svarar. Alternativen är low, high och max, med max som standard. Lämnar du parametern på max för varje litet anrop äter du onödigt mycket tokens och väntetid, så sätt den lägre för enkla frågor och högre för komplexa flerstegsuppgifter. I koden ovan sätter vi reasoning_effort: "high" som en rimlig standard för ett agent-flöde med verktyg.

Ett bra mönster i produktion är att låta nivån bero på vilken typ av fråga som kommer in, snarare än att hårdkoda samma värde för alla anrop. En enkel klassificering, till exempel om frågan innehåller flera steg eller kräver flera verktyg i följd, kan avgöra om du skickar low, high eller max till just det anropet. Det är ett litet extra steg i koden men kan sänka den genomsnittliga kostnaden per fråga märkbart över tid, särskilt i ett system där de flesta frågor faktiskt är enkla och bara ett fåtal kräver djupare resonemang.

Steg 10: Testa agenten med ett verkligt scenario

Kör agenten från terminalen med en fråga som kräver båda verktygen.

node agent.js "Rakna ut 156 delat med 12, och kolla sedan om https://shattered.io svarar"

Ett typiskt körningsförlopp i terminalen ser ut så här: agenten anropar berakna med uttrycket 156/12, får tillbaka 13, anropar sedan kontrollera_url med adressen och får tillbaka en statuskod, innan den till sist skriver ett sammanfattande textsvar som “156 delat med 12 blir 13. Sidan shattered.io svarar med status 200, det vill saga den ar tillganglig.” Hela flödet, från fråga till färdigt svar, tar normalt två till fyra sekunder beroende på hur många verktygsanrop som krävs.

Steg 11: Lägg till felhantering och timeout

Produktionskod behöver hantera tre typer av fel: nätverksfel mot Moonshots API, ogiltiga verktygsargument, och MCP-servrar som kraschar. Lägg till en enkel omförsöksmekanism runt API-anropet. Var noga med att bara göra om anrop som faktiskt kan göras om säkert, ett verktyg som skickar e-post eller ändrar data någonstans ska inte köras igen automatiskt bara för att nätverket hackade, då riskerar du att utföra samma åtgärd dubbelt.

async function anropaMedOmforsok(kimi, params, forsok = 3) {
  for (let i = 0; i < forsok; i++) {
    try {
      return await kimi.chat.completions.create(params);
    } catch (fel) {
      const sistaForsoket = i === forsok - 1;
      if (sistaForsoket) throw fel;
      const vantetid = 500 * 2 ** i;
      await new Promise((r) => setTimeout(r, vantetid));
    }
  }
}

Steg 12: Driftsätt och håll koll på kostnader

Loggför alltid usage-fältet från varje svar så att du vet hur många tokens som gått åt, särskilt viktigt när kontextfönstret är så stort som en miljon tokens. Ett enda anrop med mycket kontext kan bli dyrt om du inte trimmar bort onödig historik mellan varven i agent-loopen. Sätt en övre gräns för antal verktygsanrop per fråga (fem varv i exemplet ovan) så att en felkonfigurerad modell inte hamnar i en oändlig loop och drar upp fakturan.

Så ser hela projektet ut när det är klart

Efter de tolv stegen ovan har du tre filer och en .env, tillsammans ett komplett, körbart projekt. Så här ser mappstrukturen ut om du följt guiden ordagrant.

kimi-k3-agent/
├── .env
├── .gitignore
├── package.json
├── mcp-server.js
├── mcp-client.js
└── agent.js

Din package.json ska efter installationen i steg två se ut ungefär så här, med de fyra beroendena listade och projektet satt som ES-modul.

{
  "name": "kimi-k3-agent",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "start": "node agent.js"
  },
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.30.0",
    "dotenv": "^17.0.0",
    "openai": "^7.8.0",
    "zod": "^4.5.0"
  }
}

Kör hela kedjan med npm start "din fråga här", eller lägg till fler skript i package.json om du vill separera utveckling och produktion, till exempel ett skript som bara startar MCP-servern fristående för felsökning (node mcp-server.js). Eftersom MCP-servern och agenten kommunicerar över stdio kan du testa servern isolerat genom att skicka JSON-RPC-anrop till den manuellt i terminalen, vilket är användbart när du lägger till nya verktyg och vill verifiera scheman innan du kopplar in Kimi K3.

Bygg vidare: fler verktyg och persistent minne

Grundprojektet har två verktyg och inget minne mellan körningar, varje anrop till node agent.js startar en helt ny konversation. I ett verkligt agent-projekt vill du oftast bägge delarna: fler verktyg och möjligheten att komma ihåg tidigare konversationer. Nedan är två konkreta sätt att bygga vidare på projektet.

Att lägga till ett nytt verktyg i MCP-servern är rakt fram, du registrerar bara ett till anrop till server.registerTool med sitt eget namn, schema och funktion. Ett vanligt nästa steg är ett sökverktyg mot din egen dokumentation eller kunskapsbas, så att agenten kan svara på frågor om intern information istället för att bara resonera utifrån det som redan finns i konversationen. Håll varje verktyg smalt och gör en sak, det gör det lättare för Kimi K3 att välja rätt verktyg och lättare för dig att testa och sandboxa varje del för sig.

För persistent minne, lagra konversationshistoriken i en enkel JSON-fil eller en riktig databas mellan körningarna istället för att bygga upp den i minnet varje gång. Nedan är ett minimalt exempel som sparar meddelandehistoriken till disk mellan anrop.

// minne.js
import { readFile, writeFile } from "node:fs/promises";

const SOKVAG = "./konversation.json";

export async function lasHistorik() {
  try {
    const data = await readFile(SOKVAG, "utf8");
    return JSON.parse(data);
  } catch {
    return [];
  }
}

export async function sparaHistorik(meddelanden) {
  await writeFile(SOKVAG, JSON.stringify(meddelanden, null, 2));
}

Importera de två funktionerna i agent.js, läs historiken innan du bygger meddelandelistan och spara den igen efter varje färdigt svar. Tänk på att en sparad historik växer för varje körning, och med Kimi K3:s stora kontextfönster märker du det inte direkt i felmeddelanden, du märker det i fakturan. Trimma bort de äldsta meddelandena efter ett visst antal, eller sammanfatta äldre delar av konversationen med ett separat, billigare anrop innan du skickar den vidare.

Självhosta Kimi K3: vad krävs i praktiken

Kimi K3 släpps med öppna vikter, publicerade den 27 juli 2026 och tillgängliga på Hugging Face under moonshotai/Kimi-K3. Det är dock inte en modell du kör på en gaming-laptop över natten. Med 2,8 biljoner totala parametrar och 104 miljarder aktiva per token krävs infrastruktur i datacenterklass för att köra full precision, snarare än den typ av konsumenthårdvara som räcker för mindre öppna modeller. Moonshots egen dokumentation specificerar inte exakta VRAM-krav eller officiella GGUF-kvantiseringar för lokal körning, så undvik källor som anger precisa siffror här, de är gissningar.

För de flesta team är det praktiska valet att antingen använda Moonshots API direkt (vilket vi gjort i den här guiden) eller hyra serverkapacitet hos en molnleverantör som stödjer MoE-modeller i den här storleksklassen via ramverk som vLLM eller SGLang. Om du redan har erfarenhet av att självhosta stora MoE-modeller kan Hugging Face-sidan vara startpunkten, men räkna med att det kräver ett kluster av GPU:er snarare än en enskild server. Licensen anges av Moonshot som en öppen viktrelease, men inget publikt dokument vi hittat namnger en standardiserad OSI-licens som Apache 2.0 eller MIT, så kontrollera licensvillkoren direkt hos Moonshot innan du bygger något kommersiellt på de egna vikterna.

För organisationer i Sverige och övriga Norden som redan hanterar personuppgifter i sina AI-flöden är API:et normalt det enklare valet ur ett efterlevnadsperspektiv också, eftersom du slipper hantera GPU-drift, patchning och kapacitetsplanering själv. Kör du data som omfattas av GDPR genom ett externt API, kinesiskt eller amerikanskt, är det fortfarande ditt ansvar som personuppgiftsansvarig att ha ett giltigt överföringsavtal och veta var datan faktiskt bearbetas. Det gäller oavsett vilken leverantör du väljer, inte bara Moonshot, och är väl värt att stämma av med ditt dataskyddsombud innan produktionstrafik med känsliga uppgifter skickas till vilket externt API som helst.

Ett alternativ till att bygga MCP-integrationen själv, som vi gjort i den här guiden, är att använda Moonshots egna Kimi Code CLI, som har inbyggt MCP-klientstöd för stdio-, HTTP- och SSE-transporter. Där lägger du till servrar med kommandot kimi mcp add, listar dem med kimi mcp list, och konfigurationen sparas i ~/.kimi/mcp.json. Den vägen är snabbare att komma igång med om du bara vill experimentera, men ger dig mindre kontroll än att skriva agent-loopen själv i kod, vilket vi rekommenderar så snart du ska bygga något som andra ska lita på i produktion.

Vanliga fallgropar när du bygger med Kimi K3

  • Fel bas-URL för kontotyp. Internationella nycklar fungerar inte mot api.moonshot.cn och tvärtom. Kontrollera vilken plattform kontot skapades på.
  • Att lämna reasoning effort på max överallt. Det driver upp både kostnad och svarstid för uppgifter som inte behöver djupt resonemang.
  • Att skicka hela konversationshistoriken varje gång utan trimning. Med ett miljon-token-fönster är det lätt att glömma bort att varje extra meddelande kostar pengar per anrop, inte bara en gång.
  • Att anta att self-hosting är billigare än API:et utan att räkna på GPU-kostnaden. För de flesta team slår Moonshots API-pris på 3 respektive 15 dollar per miljon tokens klart mot att driva egen infrastruktur för en modell i den här storleken.
  • Att inte sätta en gräns på antal varv i agent-loopen. Utan en övre gräns kan en modell som fastnar i ett resonemang om ett verktygsanrop generera en oändlig kostnad.
  • Att blanda ihop MCP-serverns stdout med loggutskrifter. MCP-protokollet använder stdout för själva kommunikationen, så all felsökningsutskrift från servern måste gå till stderr istället, annars kraschar klienten på ogiltig JSON.
  • Att glömma bort att verktygsscheman är en del av API-kostnaden. Varje verktygsbeskrivning i tools-arrayen skickas med som text i varje enda anrop, så ett stort antal detaljerade verktyg med långa beskrivningar drar upp input-tokens även innan modellen valt att använda något av dem.

Det gemensamma för de flesta av dessa fallgropar är att de inte syns förrän projektet skalas upp. Ett enda testanrop i terminalen avslöjar sällan att kontexthistoriken växer okontrollerat eller att ett verktyg saknar en vitlista, det är först när agenten körs mot riktig trafik dag efter dag som kostnaden och riskerna blir synliga. Bygg in loggning och gränser från början istället för att lägga till dem efteråt.

Felsökning: vanliga fel och lösningar

Felmeddelande eller symptomTrolig orsakLösning
401 UnauthorizedFel eller utgången API-nyckelSkapa en ny nyckel i Moonshot-konsolen och uppdatera .env
404 vid anrop till chat/completionsFel bas-URL, t.ex. .cn istället för .aiKontrollera vilken region kontot tillhör
MCP-klienten hänger sig vid startServern skriver icke-JSON till stdoutFlytta all loggning till console.error eller stderr
tool_calls är alltid tomtVerktygsscheman skickas inte med i anropetKontrollera att tools-arrayen faktiskt bifogas i chat.completions.create
Ogiltigt JSON i tool-argumentModellen genererade trasig JSON för komplexa parametrarFörenkla schemat eller lägg till try/catch runt JSON.parse med felmeddelande tillbaka till modellen
Långsamma svar över 10 sekunderreasoning_effort satt till max i onödanSänk till low eller high för enklare frågor
Oväntat hög faktureringIngen gräns på antal varv eller för stor kontexthistorikSätt maxvarv i loopen och trimma meddelandehistoriken
ECONNRESET eller timeout mot API:etNätverksinstabilitet eller för lång kontext i ett enda anropLägg till omförsök med exponentiell backoff enligt steg 11
MCP-servern startar inte allsFel sökväg i StdioClientTransport-kommandotKör node mcp-server.js manuellt först för att isolera felet
Modellen ignorerar verktygen heltSystemprompten nämner inte att verktyg finns tillgängligaLägg till en tydlig rad i systemmeddelandet om att verktyg ska användas när relevant

De flesta av felen ovan går att isolera genom att testa varje lager för sig, först MCP-servern fristående, sedan MCP-klienten mot servern, och till sist hela kedjan med Kimi K3 inkopplad. Att felsöka bakifrån, det vill säga börja vid API-anropet och gå bakåt, tar ofta längre tid än att bygga upp förtroendet för varje lager i tur och ordning.

MCP-säkerhet: sandboxa verktygen innan produktion

MCP löser ett verkligt problem, standardiserad kommunikation mellan modell och verktyg, men protokollet i sig gör ingenting åt vilka rättigheter varje verktyg faktiskt har. Det ansvaret ligger helt på dig som bygger servern. En modell som Kimi K3 kan i teorin övertalas av en illa formulerad eller direkt skadlig prompt att anropa ett verktyg på ett sätt utvecklaren inte tänkt sig, ett mönster som brukar kallas prompt injection när det sker via textinnehåll modellen läser in, till exempel en webbsida eller ett dokument som skickas in som en del av kontexten.

Tre principer minskar risken märkbart. För det första, ge varje MCP-server minsta möjliga behörighet. Ett verktyg som ska läsa filer behöver inte skrivrättigheter, och ett verktyg som ska slå upp en webbadress behöver inte tillgång till interna nätverksadresser. För det andra, validera indata i själva verktygsfunktionen, inte bara i schemat. Zod-schemat i exemplet ovan fångar upp fel typ, men fångar inte automatiskt att ett filnamn försöker navigera utanför en tillåten mapp, det måste du kontrollera separat i koden. För det tredje, logga varje verktygsanrop med argument, så att du i efterhand kan se exakt vad agenten faktiskt gjorde, inte bara vad den svarade användaren. Det är särskilt viktigt första månaden en agent körs mot skarp trafik, innan du har en känsla för vilka mönster som är normala.

Samma resonemang gäller minnesfunktionen från föregående avsnitt. Sparar du konversationshistorik till disk eller en databas, tänk igenom vem som kan läsa den filen och hur länge den ska sparas. En agent som kommer ihåg tidigare frågor kan av misstag exponera information från en användares session till en annan om du inte skiljer historikfilerna åt per användare eller session-id, ett misstag som är lätt att göra i ett snabbt prototyp-projekt men som blir ett allvarligt dataskyddsproblem så fort fler än en person använder agenten.

Avancerade tips för produktion

När du flyttar agenten från lokal utveckling till produktion finns det ett par justeringar som gör stor skillnad. Använd streaming (stream: true i anropet) för konversationer riktade mot en användare, så att texten börjar visas innan hela svaret är klart, det upplevs betydligt snabbare även om den totala svarstiden är densamma. Cacha verktygslistan från MCP-servern istället för att hämta den vid varje enskilt agent-anrop, den ändras sällan och att lista om den varje gång lägger på onödig latens.

Separera dessutom systemets prompt från användarens indata tydligt, och validera argument som kommer tillbaka från modellens tool-anrop innan du kör dem, särskilt om ett verktyg rör filsystem eller nätverksanrop mot interna system. Ett tool som kontrollera_url i vårt exempel bör i produktion begränsas till en vitlista av tillåtna domäner, annars kan en illvillig prompt lura agenten att göra anrop mot interna adresser den inte borde nå. Slutligen, kör flera parallella MCP-servrar för olika ansvarsområden (till exempel en för filsystem, en för externa API:er) istället för en enda monolitisk server, det gör felsökning och behörighetsstyrning enklare när projektet växer.

Övervaka dessutom svarstiderna löpande, inte bara vid lansering. En agent som fungerar bra i test med en handfull verktyg kan bete sig annorlunda när den ansluts till tio olika MCP-servrar samtidigt, särskilt om något av dem svarar långsamt eller helt tappar anslutningen. Sätt en explicit timeout per verktygsanrop (till exempel fem sekunder) i din egen kod runt mcp.callTool, så att en enskild trög server inte får hela agent-loopen att hänga sig. Kombinerat med maxvarv-gränsen från steg tolv ger det ett flöde som misslyckas snabbt och tydligt istället för att fastna i tystnad.

Pris och prestanda: Kimi K3 mot konkurrenterna

Sommaren 2026 har varit tät på nya modellsläpp. Kimi K3 kom 16 juli, Claude Opus 5 följde 24 juli med samma pris som föregångaren Opus 4.8, och Google släppte Gemini 3.7 Flash den 13 augusti. Tabellen nedan ställer de bekräftade siffrorna sida vid sida.

ModellReleaseKontextfönsterPris input/output per miljon tokens
Kimi K316 juli 20261 048 576 tokens3 dollar / 15 dollar
Claude Opus 524 juli 2026Ej ändrad från Opus 4.85 dollar / 25 dollar
Kimi K2.7 CodeTidigare 2026~262 000 tokensLägre generation, fasas ut

Skillnaden i pris per token gör Kimi K3 till ett rimligt förstahandsval för uppgifter som kräver mycket kontext men inte nödvändigtvis toppresultat på varje enskilt agentbenchmark, till exempel att sammanfatta stora kodbaser, analysera långa loggfiler, eller bygga interna verktyg där kostnad per anrop faktiskt spelar roll i budgeten. För uppgifter där exakthet i varje enskilt steg väger tyngre än pris kan en dyrare modell som Opus 5 fortfarande vara motiverad, det är en avvägning varje team behöver göra utifrån sin egen användning, inte ett universellt facit.

Ett praktiskt tips för team som redan har en agent byggd mot ett annat OpenAI-kompatibelt API: byt bara ut baseURL och modellnamn, och kör samma prompt mot flera modeller parallellt under en testperiod innan du bestämmer dig. Kostnaden per anrop skiljer sig som synes rejält mellan leverantörerna, men den enda siffran som egentligen spelar roll är kostnaden per löst uppgift i din egen arbetsbelastning, inte listpriset på pappret. En modell som är dyrare per token kan fortfarande bli billigare i praktiken om den löser en uppgift i ett enda anrop istället för att behöva tre försök.

Vanliga frågor

Är Kimi K3 helt gratis att använda?
Nej. API:et kostar 3 dollar per miljon input-tokens och 15 dollar per miljon output-tokens. Vikterna är öppna och kan i teorin köras på egen infrastruktur, men det kräver hårdvara i datacenterklass, inte en vanlig hemdator.

Kan jag köra Kimi K3 på min egen laptop?
Osannolikt. Med 2,8 biljoner totala parametrar och 104 miljarder aktiva per token krävs betydligt mer minne och beräkningskraft än en bärbar dator med ett vanligt grafikkort kan erbjuda. Moonshot har inte publicerat officiella kvantiserade varianter avsedda för konsumenthårdvara.

Vad är skillnaden mellan MCP och vanlig tool-calling i OpenAI:s API?
Tool-calling i OpenAI:s API beskriver hur modellen begär att ett verktyg ska köras. MCP är ett separat, öppet protokoll som standardiserar hur själva verktygen exponeras och kommunicerar, oavsett vilken modell som anropar dem. I den här guiden använder vi MCP för att beskriva och köra verktygen, och konverterar sedan schemat till OpenAI:s tool-calling-format när vi pratar med Kimi K3.

Behöver jag Kimi Code CLI för att använda MCP med Kimi K3?
Nej. Kimi Code CLI har inbyggt MCP-stöd och är ett snabbare sätt att komma igång, men du kan precis som i den här guiden bygga din egen MCP-klient och koppla den mot Kimi K3:s OpenAI-kompatibla API direkt i kod.

Hur stort är egentligen kontextfönstret i praktiken?
1 048 576 tokens, vilket motsvarar grovt räknat en bok på flera hundra sidor eller en medelstor kodbas i ett enda anrop. Kom ihåg att du betalar för varje token du skickar in, så ett fullt kontextfönster i varje anrop blir dyrt i längden om det inte är nödvändigt.

Är Kimi K3 bättre än Kimi K2.7 Code för kodgenerering?
Modellen är större, har fler experter och ett betydligt större kontextfönster, vilket gynnar uppgifter som kräver att stora mängder kod hålls i minnet samtidigt. Moonshot har inte publicerat detaljerade jämförande benchmarksiffror mellan de två modellerna specifikt för kodgenerering i det material som finns tillgängligt offentligt, så testa själv mot din egen kodbas innan du byter i produktion.

Vilken licens gäller för Kimi K3:s vikter?
Moonshot beskriver släppet som en öppen viktrelease, men det publika materialet namnger inte en standardiserad OSI-licens som Apache 2.0 eller MIT. Läs licensvillkoren direkt på Hugging Face-sidan innan du bygger kommersiella produkter på de nedladdade vikterna.

Fungerar koden i den här guiden med andra OpenAI-kompatibla modeller?
Ja, i stort sett. Byt bara ut baseURL och modellnamnet i .env-filen. Själva MCP-lagret är helt oberoende av vilken språkmodell som används, det är en av poängerna med protokollet.

Hur skyddar jag mig mot att agenten missbrukar ett verktyg?
Ge varje MCP-verktyg minsta möjliga behörighet, validera argument i verktygsfunktionen och inte bara i schemat, och logga varje anrop med vilka argument som faktiskt användes. För verktyg som gör nätverksanrop, som kontrollera_url i exemplet, bör du i produktion begränsa vilka domäner som får anropas.

Kan jag använda samma MCP-server med flera olika agenter samtidigt?
Ja. MCP-servern i den här guiden startas som en egen process per klient via StdioClientTransport, men SDK:et stödjer även HTTP- och SSE-transport, vilket gör det möjligt att köra en enda delad server som flera agenter eller flera användare pratar med samtidigt.