Skip to content

Kimi CLI - Technische Tiefenanalyse

Dieser Artikel bietet eine umfassende Analyse des Open-Source-Projekts Kimi CLI von Moonshot AI und untersucht dessen Architektur-Design, Kernimplementierung und innovative Funktionen, um Entwicklern zu helfen, die Funktionsweise dieses leistungsstarken KI-Kommandzeilen-Tools im Detail zu verstehen.

Inhaltsverzeichnis

  1. Einführung - Was ist Kimi CLI?
  2. Architektur-Übersicht - Vier Kernsysteme
  3. Agent-System - Flexible Konfiguration und Ladung
  4. KimiSoul-Engine - Das intelligentes Ausführungs-System
  5. Tool-System - Ein erweiterbares Fähigkeitszentrum
  6. ACP-Protokoll - Die Brücke für IDE-Integration
  7. Kern-Designprinzipien

Einführung - Was ist Kimi CLI?

Kimi CLI, entwickelt von Moonshot AI, ist ein KI-gestützter intelligenter Kommandozeilen-Assistent. Es handelt sich nicht um eine einfache Wrapper für die Kommandozeile, sondern um ein vollständiges KI-native Entwicklungswerkzeug-Ökosystem. Es hilft Entwicklern dabei:

  • Komplexe Aufgaben wie Dateioperationen, Code-Analyse und Websuchen direkt vom Terminal aus durchzuführen
  • Software-Entwicklungs-Workflows über natürliche Sprachinteraktion abzuschließen
  • Mehrere LLM-Anbieter zu unterstützen (Moonshot AI, OpenAI, Claude, Gemini)
  • Tief in Mainstream-IDEs wie Zed zu integrieren

Im Gegensatz zu herkömmlichen Kommandozeilen-Tools ist das herausragendste Merkmal von Kimi CLI seine Agentic AI-Architektur - sie kombiniert KI-Modelle, Tool-Systeme und Ausführungs-Engines organisch zu einem vollständigen autonomen Agenten, der unabhängig planen, ausführen und überprüfen kann.

Version: 0.58 Technical Preview Tech Stack: Python 3.13+, Asynchrone Architektur, Modulares Design


Architektur-Übersicht - Vier Kernsysteme

Bevor wir in die Details eintauchen, verstehen wir zunächst die Gesamtarchitektur von Kimi CLI auf Makroebene.

Architektur auf hoher Ebene

mermaid
graph TB
    A[CLI-Einstieg: cli.py] --> B[Anwendungsebene: KimiCLI];
    B --> C[Agent-System];
    B --> D[KimiSoul-Ausführungs-Engine];
    D --> E[Tool-System];
    B --> F[Benutzeroberfläche-Ebene];

    subgraph "UI-Ebene (4 Modi)"
        F --> G[Shell-Modus: Interaktive CLI];
        F --> H[Print-Modus: Stapelverarbeitung];
        F --> I[ACP-Modus: IDE-Integration];
        F --> J[Wire-Modus: Experimentelles Protokoll];
    end

    subgraph "Agent-System"
        C --> K[Agent-Konfiguration laden];
        C --> L[System-Prompt-Verwaltung];
        C --> M[Tool-Registrierung];
        C --> N[Sub-Agent-Verwaltung];
    end

    subgraph "KimiSoul-Engine"
        D --> O[Ausführungsschleife];
        D --> P[Kontext-Verwaltung];
        D --> Q[Fehlerbehandlung];
        D --> R[Checkpoint-Mechanismus];
    end

    subgraph "Tool-System"
        E --> S[Dateioperationen];
        E --> T[Shell-Befehle];
        E --> U[Websuche];
        E --> V[MCP-Integration];
        E --> W[Aggregationssystem];
    end

Kerndatenfluss

mermaid
flowchart LR
    A[Benutzereingabe] --> B[Analysieren und Routen];
    B --> C{Ausführungsmodus wählen};

    C -->|Shell/Print| D[Direkte Ausführung];
    C -->|ACP| E[ACP-Server starten];

    D --> F[Sitzung erstellen];
    E --> F;

    F --> G[Agent laden];
    G --> H[Runtime initialisieren];
    H --> I[Abhängigkeiten injizieren];
    I --> J[KimiSoul erstellen];

    J --> K[Haupt-Ausführungsschleife];

    K --> L{Tool-Aufrufe vorhanden?};
    L -->|Ja| M[Tools ausführen];
    M --> N[Ergebnisse erhalten];
    N --> O[Kontext aktualisieren];
    O --> P{Fertig?};

    L -->|Nein| P;
    P -->|Nein| K;
    P -->|Ja| Q[Ergebnis zurückgeben];

    M --> R[Parallele Verarbeitung];
    R --> M;

Die Kernphilosophie dieser Architektur ist Schichtung und Entkopplung:

  • Agent-System ist verantwortlich für Konfiguration und Initialisierung
  • KimiSoul ist eine reine Ausführungs-Engine
  • Tool-System bietet einsteckbare Fähigkeiten
  • UI-Ebene ist vollständig von Geschäftslogik getrennt

Dieses Design ermöglicht es Kimi CLI, verschiedene Anwendungsszenarien zu unterstützen - von einfachen Kommandozeilen-Interaktionen bis hin zu komplexen IDE-Integrationen - während der Code sauber und wartbar bleibt.


Agent-System - Flexible Konfiguration und Ladung

Was ist das Agent-System?

In Kimi CLI ist ein Agent eine vollständige intelligente Agenten-Konfiguration, die enthält:

  • System-Prompt
  • Liste verfügbarer Tools
  • Sub-Agent-Definitionen
  • Laufzeitparameter

Durch die Konfigurierbarkeit von Agenten kann Kimi CLI flexibel zwischen verschiedenen "KI-Persönlichkeiten" wechseln:

  • Coder Agent: Fokussiert auf Code-Schreiben und Refactoring
  • Debug Agent: Spezialisiert auf Fehlersuche und -behebung
  • Custom Agent: Benutzerdefinierte Agenten

Konfigurationsdatei-Struktur

yaml
# agents/default/agent.yaml
version: 1
agent:
  name: "Kimi CLI"                    # Agent-Name
  system_prompt_path: ./system.md     # System-Prompt-Datei
  system_prompt_args:                 # Prompt-Parameter
    ROLE_ADDITIONAL: ""
  tools:                              # Verfügbare Tools
    - "kimi_cli.tools.multiagent:Task"
    - "kimi_cli.tools.todo:SetTodoList"
    - "kimi_cli.tools.shell:Shell"
    - "kimi_cli.tools.file:ReadFile"
    - "kimi_cli.tools.file:WriteFile"
    - "kimi_cli.tools.web:SearchWeb"
    - "kimi_cli.tools.web:FetchURL"
  subagents:                          # Sub-Agenten
    coder:
      path: ./sub.yaml
      description: "Spezialisiert auf allgemeine Software-Engineering-Aufgaben"

Agent-Ladefluss (Sequenzdiagramm)

mermaid
sequenceDiagram
    participant CLI as KimiCLI
    participant Loader as load_agent()
    participant Spec as load_agent_spec()
    participant SubLoader as Sub-Agent laden
    participant ToolLoader as Tools laden
    participant MCP as MCP-Tools

    CLI->>Loader: agent_file, runtime, mcp_configs
    Loader->>Spec: YAML-Konfiguration parsen
    Spec-->>Loader: ResolvedAgentSpec

    Note over Loader: System-Prompt laden
    Loader->>Loader: _load_system_prompt()

    Note over Loader: Sub-Agenten rekursiv laden (feste Sub-Agenten)
    loop Für jeden Sub-Agenten
        Loader->>SubLoader: load_agent(subagent.path)
        SubLoader->>Loader: Agent-Instanz
        Loader->>Runtime.labor_market: add_fixed_subagent()
    end

    Note over Loader: Tools laden (Abhängigkeitsinjektion)
    Loader->>ToolLoader: tool_paths, dependencies

    loop Für jedes Tool
        ToolLoader->>ToolLoader: importlib.import_module()
        ToolLoader->>ToolLoader: Instanz per Reflexion erstellen
        ToolLoader->>ToolLoader: Abhängigkeiten automatisch injizieren
        ToolLoader->>ToolLoader: toolset.add(tool)
    end

    opt Wenn MCP-Konfiguration vorhanden
        Loader->>MCP: Mit MCP-Server verbinden
        MCP->>Loader: Tool-Liste erhalten
        Loader->>Loader: Zu toolset hinzufügen
    end

    Loader-->>CLI: Agent-Instanz (mit allen Tools)

Abhängigkeitsinjektions-Mechanismus

Das Tool-System von Kimi CLI verwendet automatische Abhängigkeitsinjektion, einer der elegantesten Aspekte des Agent-Systems:

python
def _load_tool(tool_path: str, dependencies: dict) -> ToolType | None:
    """Tool laden und Abhängigkeiten automatisch injizieren"""
    module_name, class_name = tool_path.rsplit(":", 1)
    module = importlib.import_module(module_name)
    cls = getattr(module, class_name)

    args = []
    for param in inspect.signature(cls).parameters.values():
        # Alle Positionsparameter werden als Abhängigkeiten behandelt
        if param.annotation in dependencies:
            args.append(dependencies[param.annotation])

    return cls(*args)  # Abhängigkeiten automatisch injizieren

Abhängigkeits-Container enthält:

  • Runtime: Laufzeit-Kontext
  • Config: Konfigurationsinformationen
  • Approval: Genehmigungssystem
  • Session: Sitzungsdaten
  • DenwaRenji: D-Mail-System
  • LaborMarket: Sub-Agent-Verwaltung

Tool-Definitions-Beispiel:

python
class Shell(CallableTool2[Params]):
    def __init__(self, approval: Approval, **kwargs):
        # approval-Parameter wird automatisch aus Runtime injiziert
        self._approval = approval

    async def __call__(self, params: Params) -> ToolReturnType:
        # Verwende approval, um Benutzerbestätigung anzufordern
        if not await self._approval.request(...):
            return ToolRejectedError()

LaborMarket: Der Sub-Agenten-"Arbeitsmarkt"

LaborMarket ist ein innovatives Design, das alle verfügbaren Sub-Agenten verwaltet:

mermaid
graph TB
    A[Benutzer ruft Task-Tool auf] --> B[Task-Ausführung];
    B --> C{Sub-Agent finden};
    C -->|Gefunden| D[Festen Sub-Agenten erhalten];
    C -->|Nicht gefunden| E[Dynamischen Sub-Agenten erstellen];

    D --> F[Sub-Agent laden];
    F --> G[Unabhängigen Kontext erstellen];
    G --> H[run_soul() Ausführung];

    subgraph "Sub-Agent-Typen"
        I[Fester Sub-Agent] --> J[Gemeinsame Konfiguration];
        I --> K[Unabhängiger DenwaRenji];
        K --> L[Unabhängiger LaborMarket];

        E --> M[Dynamischer Sub-Agent];
        M --> N[Runtime klonen];
        N --> O[Haupt-LaborMarket teilen];
    end

Warum Sub-Agenten?

  1. Aufgabendelegation: Komplexe Aufgaben können an spezialisierte Agenten delegiert werden
  2. Kontextisolation: Sub-Agenten haben unabhängige Historie, vermeiden Hauptkontext-Unterbrechung
  3. Einzelverantwortung: Jeder Agent konzentriert sich auf einen bestimmten Bereich

KimiSoul-Engine - Das intelligente Ausführungs-System

KimiSoul ist die wichtigste Komponente im gesamten System. Es ist die "Seele" des KI-Agenten und ist verantwortlich für alle Schlussfolgerungen, Tool-Aufrufe und Kontextverwaltung.

Kernverantwortlichkeiten

python
class KimiSoul(Soul):
    """The soul of Kimi CLI."""

    # 1. Ausführungsschleife verwalten
    async def run(self, user_input: str):
        await self._checkpoint()
        await self._context.append_message(user_message)
        await self._agent_loop()  # Hauptschleife

    # 2. Jeden Schlussfolgerungsschritt verarbeiten
    async def _step(self) -> bool:
        result = await kosong.step(
            self._runtime.llm.chat_provider,
            self._agent.system_prompt,
            self._agent.toolset,
            self._context.history
        )
        # Tool-Aufrufe, Ergebnisse, Kontextaktualisierungen verarbeiten

    # 3. Kontext-Lebenszyklus verwalten
    async def _grow_context(self, result, tool_results):
        await self._context.append_message(result.message)
        await self._context.append_message(tool_messages)

    # 4. Kontext komprimieren
    async def compact_context(self):
        # Kontext komprimieren, wenn er zu lang wird

Ausführungsschleife im Detail (Sequenzdiagramm)

mermaid
sequenceDiagram
    participant User as Benutzer
    participant Soul as KimiSoul
    participant LLM as LLM-Anbieter
    participant Context as Kontext-Speicher
    participant Tools as Tool-Sammlung
    participant Wire as Event-Bus

    User->>Soul: Eingabe "Dateien im aktuellen Verzeichnis auflisten"

    Soul->>Context: checkpoint() Checkpoint erstellen
    Soul->>Context: append_message(user_message)

    loop Agent-Schleife (Schritt 1..N)
        Soul->>Soul: _step()

        opt Kontext zu lang
            Soul->>Wire: CompactionBegin
            Soul->>Soul: compact_context()
            Soul->>Wire: CompactionEnd
        end

        Soul->>Context: checkpoint()
        Soul->>Wire: StepBegin(n=step_no)

        Soul->>LLM: kosong.step() Aufruf
        LLM-->>Soul: StepResult

        loop Parallele Tool-Ausführung
            Soul->>Tools: handle(tool_call)
            Tools-->>Soul: ToolResult
            Soul->>Wire: ToolResult-Ereignis senden
        end

        Soul->>Soul: _grow_context()
        Soul->>Context: append_message(result)
        Soul->>Context: append_message(tool_results)

        opt DenwaRenji hat D-Mail
            Soul->>Soul: BackToTheFuture auslösen
            Soul->>Context: revert_to(checkpoint_id)
            Soul->>Context: append_message(dmail)
        end

        opt Tool abgelehnt
            Soul->>Wire: Ablehnungsereignis senden
            Soul->>Soul: return True (Schleife beenden)
        end

        opt Keine weiteren Tool-Aufrufe
            Soul->>Soul: return True (abgeschlossen)
        end
    end

    Soul-->>User: Endgültige Antwort zurückgeben

Checkpoint- und "Zeitreise"-Mechanismus

Eines der innovativsten Designs von KimiSoul ist der Checkpoint-Mechanismus, der es dem System ermöglicht, "in die Vergangenheit zu reisen".

Funktionsweise:

python
# 1. Checkpoint erstellen
async def checkpoint(self, add_user_message: bool):
    """Vor jedem Schritt Checkpoint erstellen"""
    checkpoint_id = self._next_checkpoint_id
    self._next_checkpoint_id += 1

    # Auf Festplatte schreiben
    await f.write(json.dumps({"role": "_checkpoint", "id": checkpoint_id}) + "\n")

    if add_user_message:
        await self.append_message(
            Message(role="user", content=[system(f"CHECKPOINT {checkpoint_id}")])
        )

Anwendungsfall: D-Mail

mermaid
graph LR
    A[SendDMail-Tool] --> B[D-Mail in die Vergangenheit senden];
    B --> C[checkpoint_id angeben];
    C --> D[KimiSoul erfasst];
    D --> E[BackToTheFuture auslösen];
    E --> F[revert_to(checkpoint_id)];
    F --> G[Nachfolgende Inhalte entfernen];
    G --> H[Neu ausführen];

Szenario:

  1. Benutzer fragt: "Hilf mir, diese Funktion zu refaktorisieren"
  2. KI beginnt mit der Ausführung, erkennt aber in Schritt 3: "Moment, zuerst Datei sichern"
  3. KI sendet D-Mail zurück zu Checkpoint 1
  4. System kehrt zu Checkpoint 1 zurück, diesmal wird zuerst gesichert, dann refaktorisiert

Genau wie die D-Mail im Sci-Fi-Anime "Steins;Gate" kann KI Nachrichten an ihr vergangenes Selbst senden!

Fehlerbehandlung und Wiederholung

KimiSoul verfügt über eine robuste Fehlerbehandlung:

python
@tenacity.retry(
    retry=retry_if_exception(_is_retryable_error),
    wait=wait_exponential_jitter(initial=0.3, max=5, jitter=0.5),
    stop=stop_after_attempt(max_retries),
    reraise=True
)
async def _kosong_step_with_retry() -> StepResult:
    """LLM-Aufruf automatisch wiederholen"""
    return await kosong.step(...)

Wiederholbare Fehler:

  • API-Verbindungsfehler
  • Timeout-Fehler
  • 503 Dienst nicht verfügbar
  • Ratenbegrenzung (429)

Nicht wiederholbare Fehler:

  • Ungültiger API-Schlüssel
  • Nicht unterstütztes Modell
  • Kontext-Überschreitung

Tool-System - Ein erweiterbares Fähigkeitszentrum

Tool-System-Architektur

Die Philosophie des Tool-Systems lautet: Alles ist ein Tool, und alle Tools sind einsteckbar.

mermaid
graph TB
    A[Tool-Basisklasse] --> B[CallableTool];
    A --> C[CallableTool2[Params]];

    B --> D[Shell];
    B --> E[ReadFile];
    C --> F[Task];
    C --> G[SearchWeb];

    subgraph "Tool-Registry"
        H[KimiToolset] --> I[_inner: SimpleToolset];
        I --> J[add(tool)];
    end

    subgraph "Abhängigkeitsinjektion"
        K[Runtime] --> L[Tool-Abhängigkeiten];
        M[Approval] --> L;
        N[BuiltinSystemPromptArgs] --> L;
    end

    subgraph "MCP-Integration"
        O[MCP-Client] --> P[MCPTool];
        P --> H;
    end

    style A fill:#f96
    style H fill:#bbf
    style L fill:#bfb

Tool-Kategorien

1. Dateioperationen

python
# Datei lesen
ReadFile(path="/absolute/path/to/file.py", line_offset=1, n_lines=100)

# Datei schreiben
WriteFile(path="/absolute/path", file_text="content", line_count_hint=1)

# Dateien finden
Glob(pattern="src/**/*.py")

# Inhalt suchen
Grep(pattern="TODO|FIXME", path="/workspace", -n=true)

# String-Ersetzung
StrReplaceFile(path="/absolute/path", old_str="", new_str="")

Sicherheitsmerkmale:

  • Absoluten Pfad verwenden (verhindert Pfad-Traversal)
  • Dateigrößenlimit (100KB)
  • Zeilenlimit (1000 Zeilen)
  • Zeilenlängenlimit (2000 Zeichen)

2. Shell-Befehle

python
Shell(command="git status", timeout=60)

Sicherheitsmerkmale:

  • Benutzer-Genehmigung erforderlich (außer im YOLO-Modus)
  • Timeout-Steuerung (1-300 Sekunden)
  • Streaming-Ausgabe (Echtzeit-stdout/stderr)
  • Maximales Timeout: 5 Minuten

3. Web-Tools

python
# Websuche
SearchWeb(query="Python 3.13 neue Funktionen")

# URL-Inhalt abrufen
FetchURL(url="https://github.com/MoonshotAI/kimi-cli")

4. Aufgabenverwaltung

python
# Todo-Liste festlegen
SetTodoList(todos=[
    {"content": "Code-Struktur analysieren", "status": "completed"},
    {"content": "Unit-Tests schreiben", "status": "in_progress"}
])

5. Sub-Agent-Tool

python
# Aufgabe an Sub-Agenten delegieren
Task(
    description="Codebasis-Struktur analysieren",  # Kurzbeschreibung
    subagent_name="coder",                        # Sub-Agent-Name
    prompt="Analysiere src/-Verzeichnisstruktur im Detail, fasse die Verantwortlichkeiten jedes Moduls zusammen"
)

Tool-Aufruf-Fluss (Shell-Beispiel)

mermaid
sequenceDiagram
    participant Soul as KimiSoul
    participant ToolSet as KimiToolset
    participant Shell as Shell-Tool
    participant Approval as Genehmigungssystem
    participant Process as Subprozess
    participant Wire as Event-Bus

    Soul->>ToolSet: toolset.handle(tool_call)
    ToolSet->>Shell: current_tool_call.set()

    Shell->>Shell: ToolResultBuilder()

    Shell->>Approval: request("Shell", "Shell-Befehl ausführen", description)

    opt YOLO-Modus
        Approval-->>Shell: True (Automatische Genehmigung)
    else Normalmodus
        Approval->>Wire: ApprovalRequest
        Wire-->>Approval: ApprovalResponse
        Approval-->>Shell: True/False
    end

    alt Abgelehnt
        Shell-->>ToolSet: ToolRejectedError()
    else Genehmigt
        Shell->>Process: asyncio.create_subprocess_shell()

        par Stream-Lesen
            Process-->>Shell: stdout (zeilenweise)
            Shell->>Shell: builder.write(line)
            Shell->>Wire: Ausgabe senden

            Process-->>Shell: stderr (zeilenweise)
            Shell->>Shell: builder.write(line)
            Shell->>Wire: Ausgabe senden
        end

        Process-->>Shell: exitcode

        opt exitcode == 0
            Shell-->>ToolSet: builder.ok("Erfolg")
        else exitcode != 0
            Shell-->>ToolSet: builder.error(f"Fehlgeschlagen: {exitcode}")
        end
    end

    ToolSet->>ToolSet: current_tool_call.reset()
    ToolSet-->>Soul: HandleResult
    Soul->>Wire: ToolResult senden

MCP (Model Context Protocol) Integration

MCP ist ein offenes Protokoll von Anthropic, das Verbindungen zwischen KI-Modellen und Tools standardisiert.

python
# MCP-Server konfigurieren
{
  "mcpServers": {
    "context7": {
      "url": "https://mcp.context7.com/mcp",
      "headers": {
        "CONTEXT7_API_KEY": "YOUR_API_KEY"
      }
    },
    "chrome-devtools": {
      "command": "npx",
      "args": ["-y", "chrome-devtools-mcp@latest"]
    }
  }
}

# Beim Start laden
kimi --mcp-config-file /path/to/mcp.json

MCP-Integrationsfluss:

mermaid
graph TB
    A[MCP-Server konfigurieren] --> B[MCP-Konfiguration laden];
    B --> C[MCP-Client verbinden];
    C --> D[Verfügbare Tools abrufen];
    D --> E[MCPTool-Wrapper erstellen];
    E --> F[Zu toolset hinzufügen];

    subgraph "Erweiterte Fähigkeiten"
        F --> G[Chrome DevTools];
        F --> H[Context7-Dokumentation];
        F --> I[GitHub-API];
        F --> J[Datenbankverbindungen];
    end

    A -- "Einheitliche Tool-Schnittstelle" --> K[Alle Tools homogenisiert];
    style A fill:#f96
    style K fill:#bbf

Die MCP-Integration macht Kimi CLI unendlich erweiterbar. Jedes Tool, das dem MCP-Protokoll entspricht, kann nahtlos integriert werden, einschließlich:

  • Datenbank-Abfragetools
  • API-Aufruf-Tools
  • Browser-Automatisierungs-Tools
  • Dokumentations-Suchtools

ACP-Protokoll - Die Brücke für IDE-Integration

Agent Client Protocol (ACP) ist eine der wichtigsten Innovationen von Kimi CLI. Wie LSP (Language Server Protocol) die Kommunikation zwischen Editoren und Language Servern standardisiert, standardisiert ACP die Kommunikation zwischen Editoren und KI-Agenten.

ACP-Positionierung: Editor ↔ Agent LSP

mermaid
graph TB
    subgraph "LSP-Analogie"
        A[Editor] -->|LSP| B[Language Server];
        B --> A;
    end

    subgraph "ACP-Definition"
        C[Editor/IDE] -->|ACP| D[KI-Agent];
        D --> C;
    end

    style A fill:#f9f
    style C fill:#bbf

ACP-Kernmerkmale:

  • JSON-RPC 2.0: Basierend auf dem JSON-RPC 2.0-Protokoll
  • StdIO-Transport: Kommunikation über Standard-Ein-/Ausgabe
  • Streaming-Ereignisse: Unterstützt Echtzeit-Streaming-Antworten
  • Tool-Integration: Standardisierte Tool-Aufruf-Anzeige
  • Genehmigungskontrolle: Benutzerbestätigungsmechanismus
  • Sitzungsmanagement: Zustandsbehaftete Gespräche

ACP-Protokoll-Stack

mermaid
graph TB
    subgraph "Anwendungsebene"
        A[Zed-Editor] --> B[Benutzerinteraktion];
    end

    subgraph "Protokollebene (ACP v1)"
        C[Initialisieren] --> D[Sitzungsmanagement];
        D --> E[Prompt-Ausführung];
        E --> F[Streaming-Updates];
        F --> G[Tool-Aufrufe];
        G --> H[Genehmigungsanfragen];
    end

    subgraph "Transportebene (JSON-RPC)"
        I[Requests] --> J[Responses];
        I --> K[Notifications];
    end

    subgraph "Physikalische Ebene"
        L[Stdin] --> M[Stdout];
    end

    subgraph "Kimi CLI"
        N[ACPServer] --> O[ACPAgent];
        O --> P[Ereignisübersetzung];
        P --> Q[KimiSoul];
    end

    style A fill:#f96
    style N fill:#bbf
    style Q fill:#bfb

Zed-Integrations-Beispiel

Konfiguration:

json
// ~/.config/zed/settings.json
{
  "agent_servers": {
    "Kimi CLI": {
      "command": "kimi",
      "args": ["--acp"],
      "env": {}
    }
  }
}

Workflow:

mermaid
sequenceDiagram
    participant User as Benutzer
    participant Zed as Zed-Editor
    participant ACP as ACP-Client
    participant Kimi as Kimi CLI
    participant Soul as KimiSoul
    participant LLM as Moonshot AI

    User->>Zed: Agent-Panel öffnen
    Zed->>ACP: kimi --acp-Prozess starten
    ACP->>Kimi: initialize()-Anfrage
    Kimi-->>ACP: InitializeResponse
    ACP->>Kimi: session/new-Anfrage
    Kimi-->>ACP: NewSessionResponse(sessionId)

    User->>Zed: Frage eingeben "Erkläre diese Code-Logik"
    Zed->>ACP: session/prompt-Anfrage
    ACP->>Kimi: Nachricht weiterleiten
    Kimi->>Soul: run_soul(prompt)

    Soul->>LLM: Anfrage senden
    LLM-->>Soul: Streaming-Antwort

    loop Echtzeit-Streaming-Ausgabe
        Soul-->>Kimi: TextPart/ThinkPart
        Kimi-->>ACP: AgentMessageChunk/AgentThoughtChunk
        ACP->>Zed: Text anzeigen
    end

    opt Tool-Aufruf erforderlich
        Soul-->>Kimi: ToolCall
        Kimi-->>ACP: ToolCallStart
        ACP->>Zed: Tool-Aufruf anzeigen
        Soul->>Kimi: Tool ausführen
        Soul-->>Kimi: ToolResult
        Kimi-->>ACP: ToolCallUpdate
        ACP->>Zed: Ergebnis anzeigen
    end

    Soul-->>Kimi: Abgeschlossen
    Kimi-->>ACP: PromptResponse
    ACP->>Zed: Endgültige Antwort anzeigen

ACP-Ereignisübersetzung im Detail

Der komplexeste Teil von ACP ist die Übersetzung der internen Ereignisse von Kimi CLI in ACP-Standard-Ereignisse.

Interne Wire-Ereignisse → ACP-Protokoll-Ereignisse:

Internes EreignisACP-EreignisBeschreibung
TextPartAgentMessageChunkKI-Ausgabetext
ThinkPartAgentThoughtChunkKI-Denkprozess
ToolCallToolCallStartTool-Aufruf gestartet
ToolCallPartToolCallProgressParameter-Streaming-Update
ToolResultToolCallUpdateTool-Aufruf abgeschlossen
ApprovalRequestRequestPermissionRequestBenutzergenehmigung erforderlich
python
# Beispiel für die Schlüsselübersetzungslogik
async def _send_tool_call(self, tool_call: ToolCall):
    # Tool-Aufruf-Zustand erstellen
    state = _ToolCallState(tool_call)
    self.run_state.tool_calls[tool_call.id] = state

    # An ACP-Client senden
    await self.connection.sessionUpdate(
        acp.SessionNotification(
            sessionId=self.session_id,
            update=acp.schema.ToolCallStart(
                toolCallId=state.acp_tool_call_id,  # UUID
                title=state.get_title(),  # "Shell: ls -la"
                status="in_progress",
                content=[...]
            )
        )
    )

_ToolCallState: Intelligente Zustandsverwaltung

python
class _ToolCallState:
    def __init__(self, tool_call: ToolCall):
        # Eindeutige ACP-Tool-Aufruf-ID generieren
        self.acp_tool_call_id = str(uuid.uuid4())

        # Tool-Aufruf-Argumente parsen
        self.tool_call = tool_call
        self.args = tool_call.function.arguments or ""
        self.lexer = streamingjson.Lexer()

    def get_title(self) -> str:
        """Titel dynamisch generieren"""
        tool_name = self.tool_call.function.name
        subtitle = extract_key_argument(self.lexer, tool_name)
        # Beispiel: "Shell: git status" oder "ReadFile: src/main.py"
        return f"{tool_name}: {subtitle}"

ACP-Genehmigungsfluss

mermaid
sequenceDiagram
    participant Soul as KimiSoul
    participant Tool as Shell-Tool
    participant Approval as Genehmigungssystem
    participant Wire as Wire
    participant ACP as ACPAgent
    participant ACPClient as ACP-Client
    participant Editor as IDE

    Soul->>Tool: __call__()
    Tool->>Approval: request("Shell", "Shell-Befehl ausführen", "ls -la")

    Approval->>Wire: ApprovalRequest
    Wire-->>ACP: wire.receive()

    ACP->>ACPClient: requestPermission({
        toolCallId: "uuid",
        options: [
            {optionId: "approve", name: "Einmal genehmigen", kind: "allow_once"},
            {optionId: "approve_for_session", name: "Für Sitzung genehmigen", kind: "allow_always"},
            {optionId: "reject", name: "Ablehnen", kind: "reject"}
        ]
    })

    ACPClient->>Editor: Genehmigungsdialog anzeigen
    Editor-->>ACPClient: Benutzerwahl
    ACPClient-->>ACP: RequestPermissionResponse

    alt Benutzer genehmigt
        ACP->>Wire: ApprovalResponse.APPROVE
        Wire-->>Approval: True
        Approval-->>Tool: True
        Tool->>Tool: Befehl ausführen
    else Benutzer lehnt ab
        ACP->>Wire: ApprovalResponse.REJECT
        Wire-->>Approval: False
        Approval-->>Tool: False
        Tool-->>Tool: ToolRejectedError()
    end

Dieser Genehmigungsmechanismus bietet eine feinkörnige Kontrolle und stellt sicher, dass KI keine gefährlichen Operationen ohne Benutzerautorisierung ausführt.


Kern-Designprinzipien

Nach einer gründlichen Analyse des Quellcodes von Kimi CLI sind hier die Kern-Designprinzipien:

1. Schichtung und Entkopplung

mermaid
graph TB
    A[CLI-Einstieg] --> B[KimiCLI-Anwendungsebene];
    B --> C[Agent-System];
    B --> D[KimiSoul-Engine];
    D --> E[Tool-System];
    B --> F[UI-Ebene];

    subgraph "Vollständig entkoppelt"
        C
        D
        E
        F
    end

    style A fill:#f96
    style F fill:#bbf
    style E fill:#bfb

Vorteile der Schichtung:

  • Testbarkeit: Jede Ebene kann unabhängig getestet werden
  • Erweiterbarkeit: Hinzufügen/Entfernen von UI-Modi beeinflusst die Kernlogik nicht
  • Wartbarkeit: Klare Verantwortungsgrenzen

2. Abhängigkeitsinjektion und automatische Verdrahtung

python
# Tools deklarieren Abhängigkeiten über Type-Annotationen
class ReadFile(CallableTool2[Params]):
    def __init__(self, builtin_args: BuiltinSystemPromptArgs):
        self._work_dir = builtin_args.KIMI_WORK_DIR

# Agent-System entdeckt und injiziert Abhängigkeiten automatisch
def _load_tool(tool_path: str, dependencies: dict):
    for param in inspect.signature(cls).parameters.values():
        if param.annotation in dependencies:
            args.append(dependencies[param.annotation])
    return cls(*args)

Vorteile:

  • Reduziert Boilerplate-Code
  • Verbessert Testbarkeit (einfach zu mocken)
  • Flexible Tool-Komposition

3. Zeitreise (Checkpoint)

python
# Vor jedem Schritt Checkpoint erstellen
await self._checkpoint()  # checkpoint_id: 0
# ... ausführen ...
await self._checkpoint()  # checkpoint_id: 1
# ... Problem finden ...
# D-Mail in die Vergangenheit
await self._context.revert_to(1)

Innovation:

  • Bietet Sicherheitsnetz
  • Implementiert "Rückgängig"
  • Unterstützt Sub-Agent-Aufgabenverwaltung

4. Wire-Kommunikationsabstraktion

python
def wire_send(msg: WireMessage) -> None:
    """Soul von UI entkoppeln"""
    wire = get_wire_or_none()
    wire.soul_side.send(msg)

# Shell-UI behandelt direkt
msg = await wire.ui_side.receive()

# ACP-UI übersetzt vor dem Senden an Editor
await connection.sessionUpdate(convert_to_acp(msg))

Vorteile:

  • Soul kümmert sich nicht um UI-Typ
  • Unterstützt mehrere UI-Implementierungen
  • Ereignisgesteuerte Architektur

5. ACP: Das LSP für das KI-Zeitalter

ACP standardisiert Editor-KI-Kommunikation, genau wie LSP die Kommunikation zwischen Editor und Language Server standardisiert hat.

Kernwert:

  • Ökosystem-Interoperabilität: Jeder ACP-Editor kann Kimi CLI verwenden
  • Streaming-Erlebnis: Echtzeit-Anzeige des KI-Denkprozesses
  • Sicherheitskontrolle: Benutzer-Genehmigungsmechanismus
  • Tool-Visualisierung: Strukturierte Tool-Aufruf-Anzeige

6. LLM-Anbieter-Abstraktion

Unterstützung für mehrere LLM-Anbieter:

python
def create_llm(provider, model):
    match provider.type:
        case "kimi":
            return Kimi(model, base_url, api_key)
        case "openai_responses":
            return OpenAIResponses(model, base_url, api_key)
        case "anthropic":
            return Anthropic(model, base_url, api_key)
        case "google_genai":
            return GoogleGenAI(model, base_url, api_key)

Vorteile:

  • Vendor-Lock-in vermeiden
  • Flexibles Modell-Wechseln
  • Unterstützung für selbst gehostete Modelle

Anwendungsfall-Analyse

Am besten geeignet für:

  1. Terminal-Entwicklungs-Workflow

    bash
    kimi
    > Hilf mir, diese Fehlerprotokolle zu analysieren und die Ursache zu finden
    > Tests ausführen und fehlgeschlagene Fälle beheben
    > Performance dieses Codes optimieren
  2. IDE-Intelligenter Assistent

    json
    // Nach Zed-Konfiguration
    {
      "agent_servers": {
        "Kimi CLI": {
          "command": "kimi",
          "args": ["--acp"]
        }
      }
    }
  3. Stapel-Automatisierung

    bash
    kimi --print -c "Alle Python-Dateien überprüfen und PEP8-Verstöße beheben"
  4. Multi-Tool-Zusammenarbeit: KI verfügt über mehrere Tools (Dateioperationen, Shell, Suche, Genehmigung, Rückgängig), um komplexe Aufgaben automatisch zu planen

Weniger geeignet für:

  1. Einfache Q&A: Direkte ChatGPT-Web-Oberfläche ist bequemer
  2. Nicht-interaktiv: Traditionelle Tools sind schneller für einfache grep/ls-Befehle
  3. Ultra-hohe Performance: Python-Async hat Overhead

Sicherheits-Design

  1. Pfad-Beschränkungen

    • Dateioperationen müssen absolute Pfade verwenden
    • Verhindert Pfad-Traversal-Angriffe
  2. Genehmigungsmechanismus

    • Shell-Befehle erfordern Genehmigung
    • Dateimodifikationen erfordern Genehmigung
    • Unterstützt YOLO-Modus (für Skript-Szenarien)
  3. Timeout-Steuerung

    • Shell-Befehle max. 5-Minuten-Timeout
    • Verhindert langes Hängen
  4. Kontext-Limits

    • Automatische Komprimierung, wenn Kontext-Limit erreicht wird
    • Verhindert Token-Verschwendung

Fazit

Kimi CLI ist nicht nur ein exzellentes Tool von Moonshot AI, sondern ein elegant architektiertes, innovativ gestaltetes Beispiel für eine KI-native Anwendung.

Aus dem Studium von Kimi CLI können wir erkennen:

  1. KI-Anwendungen sollten geschichtet sein: Konfiguration, Ausführung, Tool- und UI-Ebene sollten klar getrennt sein
  2. Abhängigkeitsinjektion ist der Schlüssel zur Flexibilität: Automatisch verdrahtete Tools sind einfach zu erweitern
  3. Checkpoint ist Zeitreise-Magie: Bietet Sicherheitsnetze und unterstützt komplexe Aufgaben
  4. Standardisierte Protokolle sind Ökosystem-Grundlagen: ACP macht Editor-KI-Kommunikation möglich

Ressourcen:

Kimi CLI repräsentiert die Zukunft der Entwicklungstools der nächsten Generation: Nicht nur Tools, sondern intelligente Partner, die verstehen, planen und ausführen können.


Autoren: Claude Code + Kimi K2 Thinking