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
- Einführung - Was ist Kimi CLI?
- Architektur-Übersicht - Vier Kernsysteme
- Agent-System - Flexible Konfiguration und Ladung
- KimiSoul-Engine - Das intelligentes Ausführungs-System
- Tool-System - Ein erweiterbares Fähigkeitszentrum
- ACP-Protokoll - Die Brücke für IDE-Integration
- 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
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];
endKerndatenfluss
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
# 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)
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:
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 injizierenAbhängigkeits-Container enthält:
Runtime: Laufzeit-KontextConfig: KonfigurationsinformationenApproval: GenehmigungssystemSession: SitzungsdatenDenwaRenji: D-Mail-SystemLaborMarket: Sub-Agent-Verwaltung
Tool-Definitions-Beispiel:
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:
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];
endWarum Sub-Agenten?
- Aufgabendelegation: Komplexe Aufgaben können an spezialisierte Agenten delegiert werden
- Kontextisolation: Sub-Agenten haben unabhängige Historie, vermeiden Hauptkontext-Unterbrechung
- 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
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 wirdAusführungsschleife im Detail (Sequenzdiagramm)
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ückgebenCheckpoint- 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:
# 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
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:
- Benutzer fragt: "Hilf mir, diese Funktion zu refaktorisieren"
- KI beginnt mit der Ausführung, erkennt aber in Schritt 3: "Moment, zuerst Datei sichern"
- KI sendet D-Mail zurück zu Checkpoint 1
- 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:
@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.
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:#bfbTool-Kategorien
1. Dateioperationen
# 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
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
# Websuche
SearchWeb(query="Python 3.13 neue Funktionen")
# URL-Inhalt abrufen
FetchURL(url="https://github.com/MoonshotAI/kimi-cli")4. Aufgabenverwaltung
# Todo-Liste festlegen
SetTodoList(todos=[
{"content": "Code-Struktur analysieren", "status": "completed"},
{"content": "Unit-Tests schreiben", "status": "in_progress"}
])5. Sub-Agent-Tool
# 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)
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 sendenMCP (Model Context Protocol) Integration
MCP ist ein offenes Protokoll von Anthropic, das Verbindungen zwischen KI-Modellen und Tools standardisiert.
# 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.jsonMCP-Integrationsfluss:
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:#bbfDie 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
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:#bbfACP-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
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:#bfbZed-Integrations-Beispiel
Konfiguration:
// ~/.config/zed/settings.json
{
"agent_servers": {
"Kimi CLI": {
"command": "kimi",
"args": ["--acp"],
"env": {}
}
}
}Workflow:
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 anzeigenACP-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 Ereignis | ACP-Ereignis | Beschreibung |
|---|---|---|
TextPart | AgentMessageChunk | KI-Ausgabetext |
ThinkPart | AgentThoughtChunk | KI-Denkprozess |
ToolCall | ToolCallStart | Tool-Aufruf gestartet |
ToolCallPart | ToolCallProgress | Parameter-Streaming-Update |
ToolResult | ToolCallUpdate | Tool-Aufruf abgeschlossen |
ApprovalRequest | RequestPermissionRequest | Benutzergenehmigung erforderlich |
# 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
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
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()
endDieser 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
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:#bfbVorteile 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
# 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)
# 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
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:
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:
Terminal-Entwicklungs-Workflow
bashkimi > Hilf mir, diese Fehlerprotokolle zu analysieren und die Ursache zu finden > Tests ausführen und fehlgeschlagene Fälle beheben > Performance dieses Codes optimierenIDE-Intelligenter Assistent
json// Nach Zed-Konfiguration { "agent_servers": { "Kimi CLI": { "command": "kimi", "args": ["--acp"] } } }Stapel-Automatisierung
bashkimi --print -c "Alle Python-Dateien überprüfen und PEP8-Verstöße beheben"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:
- Einfache Q&A: Direkte ChatGPT-Web-Oberfläche ist bequemer
- Nicht-interaktiv: Traditionelle Tools sind schneller für einfache grep/ls-Befehle
- Ultra-hohe Performance: Python-Async hat Overhead
Sicherheits-Design
Pfad-Beschränkungen
- Dateioperationen müssen absolute Pfade verwenden
- Verhindert Pfad-Traversal-Angriffe
Genehmigungsmechanismus
- Shell-Befehle erfordern Genehmigung
- Dateimodifikationen erfordern Genehmigung
- Unterstützt YOLO-Modus (für Skript-Szenarien)
Timeout-Steuerung
- Shell-Befehle max. 5-Minuten-Timeout
- Verhindert langes Hängen
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:
- KI-Anwendungen sollten geschichtet sein: Konfiguration, Ausführung, Tool- und UI-Ebene sollten klar getrennt sein
- Abhängigkeitsinjektion ist der Schlüssel zur Flexibilität: Automatisch verdrahtete Tools sind einfach zu erweitern
- Checkpoint ist Zeitreise-Magie: Bietet Sicherheitsnetze und unterstützt komplexe Aufgaben
- 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