Kilo Code Agent 接入
Kilo Code 是开源编码 Agent,可在终端、VS Code、VS Code 兼容编辑器和 JetBrains 中进行规划、修改代码、运行命令与工具调用。CLI 与 IDE 基于同一配置系统,但图形界面不会继承当前终端的一次性环境变量。
开始前,请创建使用 OpenAI-compatible 输出的 Lumoswitch 配置 API。
方式总览
| 方式 | CLI | VS Code / JetBrains |
|---|---|---|
| 仅本次启动 | 支持,通过 KILO_CONFIG_CONTENT 注入进程配置 | 不支持;编辑器进程不继承当前 Shell |
| 永久使用 | 支持,使用 Agent 配置路径与可选维护启动器 | 支持,通过 Providers 设置或全局配置 |
| 清除接入 | 精确删除专属文件 | 按提供方字段从共享配置中移除 |
准备连接信息
| 占位符 | 应填写的内容 |
|---|---|
{{api_base_url}} | 配置 API 的下游地址,包含 /v1 |
{{access_key}} | 当前配置使用的 Lumoswitch Access Key |
{{model}} | 配置 API 显示的下游模型名称 |
{{kilo_config_json}} | 按有效推理能力生成的完整 Kilo 配置 JSON |
下面暂未写死上下文与输出上限。对于不在内置目录中的自定义模型,正式使用前应在 limit.context 和 limit.output 中补充真实值,否则自动压缩和上下文统计可能不准确。
仅本次启动
LUMOSWITCH_KILO_CONFIG='{{kilo_config_json}}'
env \
LUMOSWITCH_KILO_API_KEY="{{access_key}}" \
KILO_CONFIG_CONTENT="$LUMOSWITCH_KILO_CONFIG" \
kilo --model "openai-compatible/{{model}}"KILO_CONFIG_CONTENT 是 Kilo 官方信任的进程级配置来源。退出 Kilo 后立即失效,不写全局或项目 kilo.jsonc。生成的模型目录只会为已核验支持推理的路由声明 reasoning;只有目标模型真实支持工具时才保留 tool_call: true。
CLI 永久使用
下面命令创建 Lumoswitch 专属配置,通过 Kilo 支持的 KILO_CONFIG 指向它,并保存可选维护启动器;不会修改全局 ~/.config/kilo/kilo.jsonc:
set -e
LUMOSWITCH_ROOT="$HOME/.config/lumoswitch/agents/kilo-code"
LUMOSWITCH_ENV="$LUMOSWITCH_ROOT/env.sh"
LUMOSWITCH_LAUNCHER="$HOME/.local/bin/lumoswitch-kilo-code"
mkdir -p "$LUMOSWITCH_ROOT" "$(dirname "$LUMOSWITCH_LAUNCHER")"
umask 077
if [ -f "$LUMOSWITCH_LAUNCHER" ]; then
LUMOSWITCH_BACKUP="$LUMOSWITCH_LAUNCHER.backup.$(date +%Y%m%d-%H%M%S)-$$"
cp "$LUMOSWITCH_LAUNCHER" "$LUMOSWITCH_BACKUP"
chmod 600 "$LUMOSWITCH_BACKUP"
fi
LUMOSWITCH_KILO_CONFIG="$LUMOSWITCH_ROOT/kilo.json"
printf '%s\n' '{{kilo_config_json}}' > "$LUMOSWITCH_KILO_CONFIG"
cat > "$LUMOSWITCH_ENV" <<'LUMOSWITCH_ENV_EOF'
export KILO_CONFIG="$HOME/.config/lumoswitch/agents/kilo-code/kilo.json"
export LUMOSWITCH_KILO_API_KEY="{{access_key}}"
export LUMOSWITCH_KILO_MODEL="{{model}}"
LUMOSWITCH_ENV_EOF
case "$SHELL" in
*/zsh) LUMOSWITCH_PROFILE="$HOME/.zshrc" ;;
*/bash) LUMOSWITCH_PROFILE="$HOME/.bashrc" ;;
*) LUMOSWITCH_PROFILE="$HOME/.profile" ;;
esac
touch "$LUMOSWITCH_PROFILE"
LUMOSWITCH_PROFILE_MARKER='# Lumoswitch Agent: kilo-code'
LUMOSWITCH_SOURCE_LINE='[ -f "$HOME/.config/lumoswitch/agents/kilo-code/env.sh" ] && . "$HOME/.config/lumoswitch/agents/kilo-code/env.sh"'
if ! grep -Fqx "$LUMOSWITCH_SOURCE_LINE" "$LUMOSWITCH_PROFILE"; then
printf '\n%s\n%s\n' "$LUMOSWITCH_PROFILE_MARKER" "$LUMOSWITCH_SOURCE_LINE" >> "$LUMOSWITCH_PROFILE"
fi
printf '%s\n' "$LUMOSWITCH_PROFILE" > "$LUMOSWITCH_ROOT/profile-path"
cat > "$LUMOSWITCH_LAUNCHER" <<'LUMOSWITCH_LAUNCHER_EOF'
#!/usr/bin/env bash
set -e
LUMOSWITCH_ROOT="$HOME/.config/lumoswitch/agents/kilo-code"
LUMOSWITCH_ENV="$LUMOSWITCH_ROOT/env.sh"
LUMOSWITCH_LAUNCHER="$HOME/.local/bin/lumoswitch-kilo-code"
if [ "$1" = "--lumoswitch-clean" ]; then
if [ -f "$LUMOSWITCH_ROOT/profile-path" ]; then
LUMOSWITCH_PROFILE="$(cat "$LUMOSWITCH_ROOT/profile-path")"
if [ -f "$LUMOSWITCH_PROFILE" ]; then
LUMOSWITCH_PROFILE_MARKER='# Lumoswitch Agent: kilo-code'
LUMOSWITCH_SOURCE_LINE='[ -f "$HOME/.config/lumoswitch/agents/kilo-code/env.sh" ] && . "$HOME/.config/lumoswitch/agents/kilo-code/env.sh"'
LUMOSWITCH_PROFILE_TMP="$LUMOSWITCH_PROFILE.lumoswitch.$$"
awk -v marker="$LUMOSWITCH_PROFILE_MARKER" -v source="$LUMOSWITCH_SOURCE_LINE" '$0 != marker && $0 != source' "$LUMOSWITCH_PROFILE" > "$LUMOSWITCH_PROFILE_TMP"
mv "$LUMOSWITCH_PROFILE_TMP" "$LUMOSWITCH_PROFILE"
fi
fi
if [ -d "$LUMOSWITCH_ROOT" ]; then
find "$LUMOSWITCH_ROOT" -depth \( -type f -o -type l \) -delete
find "$LUMOSWITCH_ROOT" -depth -type d -exec rmdir {} \; 2>/dev/null || true
fi
find "$(dirname "$LUMOSWITCH_LAUNCHER")" -maxdepth 1 -type f -name 'lumoswitch-kilo-code.backup.*' -delete
rm -f "$LUMOSWITCH_LAUNCHER"
printf '%s\n' 'Lumoswitch native setup and optional launcher removed. Open a new terminal to refresh the environment.'
exit 0
fi
if [ -f "$LUMOSWITCH_ENV" ]; then . "$LUMOSWITCH_ENV"; fi
exec kilo "$@"
LUMOSWITCH_LAUNCHER_EOF
chmod 600 "$LUMOSWITCH_ENV"
find "$LUMOSWITCH_ROOT" -type f -exec chmod 600 {} \;
chmod 700 "$LUMOSWITCH_LAUNCHER"
. "$LUMOSWITCH_ENV"
printf '%s\n' 'Native Lumoswitch setup saved. Future command: kilo'
printf '%s\n' 'Optional maintenance launcher: ~/.local/bin/lumoswitch-kilo-code'
kilo以后运行:
kilo启动器将专属文件作为 KILO_CONFIG_CONTENT 载入,因此不会被当前项目的普通配置意外覆盖。
Windows PowerShell 原生导入
以下命令在 Windows PowerShell 中原生运行,不需要 WSL。它们与本页的 macOS/Linux 模板使用同一组连接值。
仅本次使用(Windows)
& {
$ErrorActionPreference = 'Stop'
$lumoswitchConfigContent = @'
{{kilo_config_json}}
'@
$lumoswitchEnvironmentNames = @('KILO_CONFIG_CONTENT', 'LUMOSWITCH_KILO_API_KEY')
$lumoswitchPreviousEnvironment = @{}
foreach ($lumoswitchName in $lumoswitchEnvironmentNames) {
$lumoswitchPreviousEnvironment[$lumoswitchName] = [Environment]::GetEnvironmentVariable($lumoswitchName, 'Process')
}
$lumoswitchExitCode = 0
try {
[Environment]::SetEnvironmentVariable('KILO_CONFIG_CONTENT', $lumoswitchConfigContent, 'Process')
[Environment]::SetEnvironmentVariable('LUMOSWITCH_KILO_API_KEY', '{{access_key}}', 'Process')
$lumoswitchArguments = @('--model', 'openai-compatible/{{model}}')
$lumoswitchExecutable = Get-Command 'kilo.cmd' -CommandType Application -ErrorAction SilentlyContinue
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'kilo' -CommandType Application -ErrorAction Stop }
& $lumoswitchExecutable.Path @lumoswitchArguments
if ($null -ne $LASTEXITCODE) { $lumoswitchExitCode = $LASTEXITCODE }
} finally {
foreach ($lumoswitchName in $lumoswitchEnvironmentNames) {
[Environment]::SetEnvironmentVariable($lumoswitchName, $lumoswitchPreviousEnvironment[$lumoswitchName], 'Process')
}
}
if ($lumoswitchExitCode -ne 0) { throw 'kilo exited with code ' + $lumoswitchExitCode }
}永久使用(Windows)
该命令会备份已有的 Lumoswitch 专用文件,并为配置和启动器收紧当前用户的访问权限。
& {
$ErrorActionPreference = 'Stop'
$lumoswitchRoot = Join-Path $env:LOCALAPPDATA 'Lumoswitch\agents\kilo-code'
$lumoswitchLauncher = Join-Path $env:LOCALAPPDATA 'Lumoswitch\bin\lumoswitch-kilo-code.ps1'
$lumoswitchBackupSuffix = (Get-Date -Format 'yyyyMMdd-HHmmss') + '-' + $PID
function Protect-LumoswitchFile([string] $Path) {
$lumoswitchSid = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value
& icacls.exe $Path '/inheritance:r' '/grant:r' ('*' + $lumoswitchSid + ':(F)') '*S-1-5-18:(F)' '*S-1-5-32-544:(F)' | Out-Null
if ($LASTEXITCODE -ne 0) { throw "Could not restrict access to $Path" }
}
function Install-LumoswitchFile([string] $Path, [string] $Content) {
[IO.Directory]::CreateDirectory((Split-Path -Parent $Path)) | Out-Null
if (Test-Path -LiteralPath $Path) {
$lumoswitchItem = Get-Item -LiteralPath $Path -Force
if ($lumoswitchItem.PSIsContainer -or ($lumoswitchItem.Attributes -band [IO.FileAttributes]::ReparsePoint)) {
throw "Lumoswitch refused to replace a directory or link: $Path"
}
$lumoswitchBackup = $Path + '.backup.' + $lumoswitchBackupSuffix
Copy-Item -LiteralPath $Path -Destination $lumoswitchBackup
Protect-LumoswitchFile $lumoswitchBackup
}
$lumoswitchTemporary = $Path + '.' + [Guid]::NewGuid().ToString('N') + '.tmp'
try {
[IO.File]::WriteAllText($lumoswitchTemporary, $Content, [Text.UTF8Encoding]::new($false))
Move-Item -LiteralPath $lumoswitchTemporary -Destination $Path -Force
Protect-LumoswitchFile $Path
} finally {
Remove-Item -LiteralPath $lumoswitchTemporary -Force -ErrorAction SilentlyContinue
}
}
[IO.Directory]::CreateDirectory($lumoswitchRoot) | Out-Null
$lumoswitchKiloConfig = Join-Path $lumoswitchRoot 'kilo.json'
Install-LumoswitchFile $lumoswitchKiloConfig '{{kilo_config_json}}'
$lumoswitchEnvironment = [ordered]@{}
$lumoswitchEnvironment['KILO_CONFIG'] = (Join-Path $lumoswitchRoot 'kilo.json')
$lumoswitchEnvironment['LUMOSWITCH_KILO_API_KEY'] = '{{access_key}}'
$lumoswitchEnvironment['LUMOSWITCH_KILO_MODEL'] = '{{model}}'
foreach ($lumoswitchEntry in $lumoswitchEnvironment.GetEnumerator()) {
[Environment]::SetEnvironmentVariable($lumoswitchEntry.Key, $lumoswitchEntry.Value, 'User')
[Environment]::SetEnvironmentVariable($lumoswitchEntry.Key, $lumoswitchEntry.Value, 'Process')
}
$lumoswitchLauncherContent = @'
param([Parameter(ValueFromRemainingArguments = $true)][string[]] $AgentArgs)
$ErrorActionPreference = 'Stop'
$lumoswitchRoot = Join-Path $env:LOCALAPPDATA 'Lumoswitch\agents\kilo-code'
$lumoswitchLauncher = Join-Path $env:LOCALAPPDATA 'Lumoswitch\bin\lumoswitch-kilo-code.ps1'
function Remove-LumoswitchFile([string] $Path) {
if (-not (Test-Path -LiteralPath $Path)) { return }
$lumoswitchItem = Get-Item -LiteralPath $Path -Force
if ($lumoswitchItem.PSIsContainer -or ($lumoswitchItem.Attributes -band [IO.FileAttributes]::ReparsePoint)) {
throw "Lumoswitch refused to remove a directory or link: $Path"
}
Remove-Item -LiteralPath $Path -Force
}
if ($AgentArgs.Count -gt 0 -and $AgentArgs[0] -eq '--lumoswitch-clean') {
foreach ($lumoswitchName in @('KILO_CONFIG', 'LUMOSWITCH_KILO_API_KEY', 'LUMOSWITCH_KILO_MODEL')) {
[Environment]::SetEnvironmentVariable($lumoswitchName, $null, 'User')
[Environment]::SetEnvironmentVariable($lumoswitchName, $null, 'Process')
}
if (Test-Path -LiteralPath $lumoswitchRoot -PathType Container) {
$lumoswitchRootItem = Get-Item -LiteralPath $lumoswitchRoot -Force
if ($lumoswitchRootItem.Attributes -band [IO.FileAttributes]::ReparsePoint) { throw 'Lumoswitch refused to clean through a linked directory.' }
foreach ($lumoswitchFile in @(Get-ChildItem -LiteralPath $lumoswitchRoot -File -Recurse -Force)) { Remove-LumoswitchFile $lumoswitchFile.FullName }
foreach ($lumoswitchDirectory in @(Get-ChildItem -LiteralPath $lumoswitchRoot -Directory -Recurse -Force | Sort-Object FullName -Descending)) {
if ($null -eq (Get-ChildItem -LiteralPath $lumoswitchDirectory.FullName -Force | Select-Object -First 1)) { Remove-Item -LiteralPath $lumoswitchDirectory.FullName -Force }
}
if ($null -eq (Get-ChildItem -LiteralPath $lumoswitchRoot -Force | Select-Object -First 1)) { Remove-Item -LiteralPath $lumoswitchRoot -Force }
}
$lumoswitchBin = Split-Path -Parent $lumoswitchLauncher
if (Test-Path -LiteralPath $lumoswitchBin -PathType Container) {
foreach ($lumoswitchBackup in @(Get-ChildItem -LiteralPath $lumoswitchBin -Filter 'lumoswitch-kilo-code.ps1.backup.*' -File -Force)) { Remove-LumoswitchFile $lumoswitchBackup.FullName }
}
Remove-LumoswitchFile $lumoswitchLauncher
Write-Host 'Lumoswitch native setup and optional launcher removed. Open a new terminal to refresh the environment.'
exit 0
}
$lumoswitchEnvironment = [ordered]@{}
$lumoswitchEnvironment['KILO_CONFIG'] = (Join-Path $lumoswitchRoot 'kilo.json')
$lumoswitchEnvironment['LUMOSWITCH_KILO_API_KEY'] = '{{access_key}}'
$lumoswitchEnvironment['LUMOSWITCH_KILO_MODEL'] = '{{model}}'
foreach ($lumoswitchEntry in $lumoswitchEnvironment.GetEnumerator()) {
[Environment]::SetEnvironmentVariable($lumoswitchEntry.Key, $lumoswitchEntry.Value, 'Process')
}
$lumoswitchExecutable = Get-Command 'kilo.cmd' -CommandType Application -ErrorAction SilentlyContinue
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'kilo.exe' -CommandType Application -ErrorAction SilentlyContinue }
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'kilo' -CommandType Application -ErrorAction Stop }
$lumoswitchArguments = @()
& $lumoswitchExecutable.Path @lumoswitchArguments @AgentArgs
if ($null -ne $LASTEXITCODE) { exit $LASTEXITCODE }
'@
Install-LumoswitchFile $lumoswitchLauncher $lumoswitchLauncherContent
Write-Host 'Native Lumoswitch setup saved. Future command: kilo'
Write-Host 'Optional maintenance launcher:' $lumoswitchLauncher
$lumoswitchExecutable = Get-Command 'kilo.cmd' -CommandType Application -ErrorAction SilentlyContinue
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'kilo.exe' -CommandType Application -ErrorAction SilentlyContinue }
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'kilo' -CommandType Application -ErrorAction Stop }
$lumoswitchArguments = @()
& $lumoswitchExecutable.Path @lumoswitchArguments
if ($null -ne $LASTEXITCODE -and $LASTEXITCODE -ne 0) { throw 'kilo exited with code ' + $LASTEXITCODE }
}导入会写入 Agent 支持的持久化配置,并直接启动 kilo。保存的 Lumoswitch 维护脚本不是启动 Agent 的必需入口;需要恢复或移除此接入时,运行它并追加 --lumoswitch-clean。
清除 CLI 接入
Windows PowerShell
先退出该 Agent 的所有 Lumoswitch 会话,再运行下面的命令。可选维护启动器会删除受管原生配置、恢复已保留的共享文件、清除 Lumoswitch 用户环境变量,并移除自身。
& {
$lumoswitchLauncher = Join-Path $env:LOCALAPPDATA 'Lumoswitch\bin\lumoswitch-kilo-code.ps1'
if (-not (Test-Path -LiteralPath $lumoswitchLauncher -PathType Leaf)) {
throw 'The optional Lumoswitch maintenance launcher is missing. Run persistent import again before cleanup.'
}
& powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File $lumoswitchLauncher --lumoswitch-clean
}macOS / Linux
"$HOME/.local/bin/lumoswitch-kilo-code" --lumoswitch-clean命令只删除本文创建的专属文件,不删除 Kilo 会话、全局配置、项目配置或其他提供方。
VS Code 与 JetBrains 永久接入
Kilo 官方提供 VS Code 系扩展与 JetBrains 插件;所有本地客户端读取 ~/.config/kilo/kilo.jsonc,因此一份正确的全局配置可复用。
在 Settings → Providers → Custom provider 中填写:
| 字段 | 值 |
|---|---|
| Provider ID | lumoswitch |
| Display name | Lumoswitch |
| Provider API | OpenAI Compatible |
| Base URL | {{api_base_url}} |
| API key | {{access_key}} |
| Models | {{model}} |
图形界面只有永久接入,没有终端式临时命令。IDE 由编辑器进程启动,不会继承上面的 KILO_CONFIG_CONTENT 与 LUMOSWITCH_KILO_API_KEY。
清除 IDE 接入
从 Providers 设置删除 lumoswitch 自定义提供方。如果当前版本需要直接编辑 Global Config,则只删除 provider.lumoswitch,并且仅在顶层 model 指向 lumoswitch/... 时删除或切换它。
不提供终端自动改写命令,因为 kilo.jsonc 是 CLI、VS Code 和 JetBrains 共用的 JSONC,可能含注释、其他提供方和项目规则。整删 ~/.config/kilo 会误删所有客户端设置。自定义 API Key 若由 UI 写在 provider 块中,会随该块一起移除;OAuth 凭证则应使用对应提供方的 Disconnect 或 kilo auth logout,不要用于删除普通 Lumoswitch Key。
Kilo 还有 Cloud、移动端与 Slack 等入口,但本页的本地自定义提供方不会自动同步到托管运行环境;只有 CLI、VS Code 与 JetBrains 的本地配置在此范围内。目前没有独立 Kilo Desktop 应用。
验证与排查
- 运行
kilo models确认模型出现在列表中。 - 模型标识格式为
provider/model;本页 CLI 使用openai-compatible/{{model}}。 - 自定义模型应补充真实
limit.context和limit.output,并按能力设置tool_call。
参考:Kilo Code 简介、Custom Models、Settings、CLI Reference 和JetBrains。
维护者发布字段
- 平台 ID:
kilo-code - 展示名称:
Kilo Code CLI - 下游协议:
openai-compatible commandTemplate:复制「仅本次启动」代码框的完整内容- 永久策略:
native persistentCommandTemplate:复制「CLI 永久使用」代码框的完整内容futureCommand:kilo- 展示顺序:
110 - 最近核验:
2026-08-27