MoreRSS

site iconYsicing | 缘生修改

博客名:Solitudes。主要的工作是使用 Go/Rust学习中来实现人们所期望的产品。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Ysicing | 缘生的 RSS 预览

PVE9与k3s那点事:深夜填坑记,搞定AppArmor

2025-08-21 21:25:27

适用于部署了 PVE9 的 k3s 节点。由于本文属于回忆文,可能存在一些出入,总体流程没问题。

背景

我目前已经将大部分 k3s 节点系统升级到最新的 Debian13 了,最近手头又多了一台杜甫,首先装了 Debian13,部署了 k3s 计算节点,然后观察到节点资源还很富裕,可以跑个 PVE 集群节点。

PVE 部署

主要参考 oneclickvirt/pve,直接在 Debian13 上安装 PVE9。中间踩了一个坑,忘记安装前配置 hosts

# 确定能ping,不然后面/etc/pve/local/pve-ssl.key创建失败导致pve没法正常启动
ping $(uname -n)

现象

未部署 PVE 前,k3s 正常工作了很长时间。安装完 PVE 后,部分 POD 开始报错了,本文以 kruise-daemon 为例,一直启动不了直至 CrashLoopBackOff。

查看相关日志后,发现 pod 所在节点审计日志:

[Thu Aug 21 11:52:09 2025] audit: type=1400 audit(1755748328.817:29): apparmor="DENIED" operation="create" class="net" info="failed protocol match" error=-13 profile="cri-containerd.apparmor.d" pid=20287 comm="kruise-daemon" family="unix" sock_type="stream" protocol=0 requested="create" denied="create" addr=none

发现 AppArmor 这位严格的安全管家把你的应用操作给拦下来了。分析一下这个日志,这是一条典型的 AppArmor 安全策略拒绝 (DENIED) 日志。简单来说,系统上的一个名为 kruise-daemon 的程序(运行在容器内)尝试执行一个操作,但被 AppArmor 安全模块阻止了

AI 分析

节选自 AI 分析

日志逐段分析

[Thu Aug 21 11:09:38 2025] audit: type=1400: 这是日志的时间戳和审计事件类型。
apparmor="DENIED": 核心信息。AppArmor 拒绝了一个操作。AppArmor 是 Linux 内核的一个强制访问控制(MAC)安全模块,它可以将程序限制在一组有限的资源中。
operation="create": 被拒绝的操作是“创建”。
class="net": 操作的类别是网络(net)相关的。
info="failed protocol match": 拒绝的详细原因。程序尝试创建的套接字(socket)的协议类型与 AppArmor 策略文件中允许的协议不匹配。
error=-13: 对应系统错误码 EACCES (Permission denied),进一步证实是权限问题。
profile="cri-containerd.apparmor.d": 关键信息。触发这个拒绝事件的安全策略文件是 cri-containerd.apparmor.d。这通常是 containerd 容器运行时的默认 AppArmor 配置文件,用于限制所有由 containerd 管理的容器的行为。
pid=48236 comm="kruise-daemon": 执行这个操作的进程是 kruise-daemon,进程 ID 是 48236。kruise-daemon 是 OpenKruise 的一个组件,通常以 DaemonSet 的形式运行在 Kubernetes 的每个节点上,负责一些节点级的增强功能。
family="unix": 网络套接字的类型是 Unix Domain Socket (UDS),这是一种用于同一台主机上进程间通信的机制,而非跨主机的 TCP/IP 网络。
sock_type="stream": 套接字的类型是流式套接字(stream),类似于 TCP。
protocol=0: 使用的协议号是 0(默认协议)。

问题核心概括

一句话总结: 运行在 containerd 容器中的 kruise-daemon 进程试图创建一个 Unix 域流式套接字(Unix Domain Stream Socket),但是 Kubernetes 节点上为容器配置的默认 AppArmor 安全策略 (cri-containerd.apparmor.d) 不允许这个操作。
这通常意味着 kruise-daemon 需要通过 Unix Socket 与节点上的其他服务(例如 Docker daemon、CNI 插件或其他 agent)进行通信,但默认的安全策略为了保证容器的隔离性,限制了这类“高级”或“特殊”的网络操作。

处理过程

确认 AppArmor 服务状态和已加载的 Profile

需要查看 AppArmor 当前在内核中加载了哪些 Profile

apparmor_status 或者aa-status
# 结果(这个是我调整后的,默认 cri-containerd.apparmor.d也是强制模式)
apparmor module is loaded.
8 profiles are loaded.
7 profiles are in enforce mode.
   /usr/bin/lxc-copy
   /usr/bin/lxc-start
   docker-default
   lxc-container-default
   lxc-container-default-cgns
   lxc-container-default-with-mounting
   lxc-container-default-with-nesting
1 profiles are in complain mode.
   cri-containerd.apparmor.d
0 profiles are in prompt mode.
0 profiles are in kill mode.
0 profiles are in unconfined mode.
1 processes have profiles defined.
0 processes are in enforce mode.
1 processes are in complain mode.
   /kruise-daemon (31408) cri-containerd.apparmor.d
0 processes are in prompt mode.
0 processes are in kill mode.
0 processes are unconfined but have a profile defined.
0 processes are in mixed mode.

默认 /etc/apparmor.d/ 目录下是没有这个的,是 containerd 启动时加载到内核的。针对这种情况下,最好的办法是覆盖它。 我们可以在标准路径 /etc/apparmor.d/ 下创建一个同名的文件。当 AppArmor 服务重载配置时,它会优先使用磁盘上的文件来覆盖内存中已加载的同名 Profile

这里简单记录一下,没那么简单。

在 /etc/apparmor.d/ 目录下创建一个新文件,名字就叫 cri-containerd.apparmor.d

cat > /etc/apparmor.d/cri-containerd.apparmor.d <<EOF
# AppArmor Profile for cri-containerd.apparmor.d
# SYNTAX: AppArmor 4.1 (for Debian 13+)

#include <tunables/global>

# 声明我们使用的是新的 v4 语法,这非常重要!
abi <abi/4.0>,

profile cri-containerd.apparmor.d flags=(attach_disconnected, complain, mediate_deleted) {
  #include <abstractions/base>
  #include <abstractions/nameservice>

  # 授予容器运行时所需的大部分 POSIX capabilities
  capability,

  # 拒绝直接写内核和内存等危险操作
  deny /dev/mem w,
  deny /dev/kmem w,

  # 允许通用的网络操作 (TCP/IP 等)
  # 在新语法中,这个规则不包含 unix socket
  network,

  # === AppArmor 4.x 关键修改 ===
  # 使用新的、独立的 unix socket 规则族
  # 直接允许创建、连接、监听、发送、接收 stream 类型的 unix socket
  unix (create, connect, listen, accept, send, receive) type=stream,

  # 允许挂载相关的操作
  mount options=(ro, nosuid, nodev, noexec, remount, bind),
  remount,

  # 允许容器运行时需要的一些基本文件访问
  /dev/urandom r,
  /sys/devices/system/cpu/online r,
  /sys/fs/cgroup/ r,
  /sys/fs/cgroup/** r,

  # 拒绝修改 AppArmor 自身,增强安全性
  deny /sys/kernel/security/apparmor/** w,

}
EOF

重新加载 AppArmor 配置,让我们的新文件生效

# -r 表示 replace,会替换掉内存中已有的同名 profile
apparmor_parser -r /etc/apparmor.d/cri-containerd.apparmor.d

再次运行 aa_status,确保 Profile 仍然在加载状态。然后尝试重建一下出问题的那个 kruise-daemon Pod,发现还是会 Deny,换了一个新错

了[Thu Aug 21 12:07:43 2025] audit: type=1400 audit(1755749262.720:42): apparmor="DENIED" operation="open" class="file" profile="cri-containerd.apparmor.d" name="/run/secrets/kubernetes.io/serviceaccount/..2025_08_21_04_07_36.2733297639/token" pid=28709 comm="kruise-daemon" requested_mask="r" denied_mask="r" fsuid=0 ouid=0

同上流程,是不是改一下配置文件就可以,是的, 截取了新增的地方如下

/sys/fs/cgroup/** r,
  # --- 本次新增规则 ---
  # 允许 Pod 读取其 Service Account Token,以便与 K8s API Server 通信
  "/run/secrets/kubernetes.io/serviceaccount/**" r,
  # 拒绝修改 AppArmor 自身,增强安全性
  deny /sys/kernel/security/apparmor/** w,

}

作为暴躁小伙,这样多麻烦,反正自己的环境应该也没啥大问题, 一梭子解决,观察者模式, 只需记录,不会拦截

aa-complain /etc/apparmor.d/cri-containerd.apparmor.d

其实到这里,问题基本解决了,但是没彻底解决。可以根据审计日志来完善,收集全部权限需求,一次性构建完整的 Profile,然后切换回 Enforce

官方这里确实好像有 BUG,事后没搜到了。

参考文档

希望这次的分享能帮到大家!觉得有用的话,别忘了点赞、在看、分享三连哦!

Claude Code之Statusline小工具 大用处

2025-08-12 21:38:59

这是最近新出的功能状态栏配置, 要求版本至少是 1.0.72, 官方文档已经很详细,具体可以参考 claude-code/statusline

状态栏配置用途

为 Claude Code 创建自定义状态栏以显示上下文信息

通过自定义状态栏让 Claude Code 成为您专属的工具,该状态栏显示在 Claude Code 界面底部,类似于终端提示符(PS1)在 Oh-my-zsh 等 shell 中的工作方式。

示例

创建自定义状态栏

官方给了两种方式:

  • 运行 /statusline 让 Claude Code 帮助您设置自定义状态栏。默认情况下,它会尝试复制您终端的提示符,但您可以向 Claude Code 提供关于所需行为的额外说明,例如 /statusline show the model name in orange
  • 直接在 .claude/settings.json 中添加 statusLine 命令(推荐用这种)

另外我的 code-pilot 默认也集成了基础版本的,具体可以参考 settings.example

"statusLine": {
    "type": "command",
    "command": "~/.claude/scripts/statusline.sh",
    "padding": 0
  }

不过,本文主要将如何使用佬友写的 CCometixLine

CCometixLine 配置指南

有兴趣的可以查阅佬友的原文 Claude Code StatusLine | 小工具 大用处

由于我个人的习惯, 二进制放 bin,脚本放 scripts 目录下

20:26 ➜  .claude git:(master) tree -L 1
.
├── assets
├── bin
├── scripts
├── settings.json
└── CLAUDE.md

11 directories, 11 files

项目地址: CCometixLine

macOS 部署

涉及到非中文字体安装, 主要是 CCometixLine 图标依靠 Nerd Font

brew tap laishulu/homebrew
 brew install font-meslo-lg-nerd-font

佬友推荐了:

  • MesloLGS NF(Powerlevel10k 官方推荐)
  • FiraCode Nerd Font(支持编程连字)
  • JetBrainsMono Nerd Font(现代等宽字体)
  • Hack Nerd Font(清晰易读)

安装完成后设置 iTerm2 的字体,主要设置我勾选的那个就可以使图标生效

示例

配置也比较简单, 从 github 下载对应的二进制压缩包,解压放到对应的目录即可,检查一下权限,需要有执行权限

mkdir -p ~/.claude/bin  
wget https://github.com/Haleclipse/CCometixLine/releases/latest/download/ccline-macos-arm64.tar.gz
tar -xzf ccline-macos-arm64.tar.gz
cp ccline ~/.claude/bin/
chmod +x ~/.claude/bin/ccline

然后 settings.json 配置如下:

cat settings.json | jq .statusLine
{
  "type": "command",
  "command": "~/.claude/bin/ccline",
  "padding": 0
}

linux 部署

佬友提供的,可能受限于编译环境,可能提示 glibc 问题。现象就是配置了不生效,可以使用 .claude/bin/ccline -V 测试,如果能提示版本就没问题。

这里我也提供一个在 Debian13(12)都可以运行

https://c.ysicing.net/oss/tiga/linux/amd64/ccline-linux-amd64

其他

除了这些外,还可以使用 ccusage, 可以实时看到今天的总费用、当前活跃的 5 小时区块费用 & 剩余时间、实时消耗速率

{
  "statusLine": {
    "type": "command",
    "command": "bun x ccusage statusline"
  }
}

Claude Code 多智能体工作流系统:从手动敲代码到AI自动化, 开发效率直接起飞!

2025-08-10 21:32:38

大家好,今天来给大家安利一个超级黑科技工具——基于 Claude Code 多智能体工作流系统!这个工作流,它不是简单的代码生成器,而是将你的开发流程从手动命令链升级成自动化专家团队。想象一下,原本需要你一步步监督代码的编写、测试、优化,现在交给一群 AI 智能体分工协作,质量把控还自动过关,简直是福音!如果你是开发者、产品经理,或者对 AI 辅助编程感兴趣,强烈安利。咱们一步步来拆解这个系统的魅力,看看它如何让你的工作流变得更高效、更智能。

项目

https://github.com/ysicing/code-pilot

仓库 README 文件或者 guide 指南文件也是非常详细的,也会随着项目迭代而更新,本文也是根据相关内容撰写而来,有兴趣可以尝试一下

什么是 Claude Code 多智能体工作流系统

简单来说,这个系统是基于 Anthropic 的 Claude Code 构建的开发工具。它将传统的开发过程(如需求分析、代码实现、质量审查、测试、调试)拆分成多个专业 AI 智能体,每个智能体专注于一个领域,避免了万能 AI 带来的泛化问题

核心理念

  • 从主观判断转向客观标准,从手动监督转向自动化质量关卡
  • 大道至简(KISSYAGNISOLID)

内置智能体

系统内置了 14 个专家智能体,比如:

  • 需求生成智能体:帮你拆解用户故事,生成详细规格。
  • 代码实现智能体:根据需求自动生成代码。
  • 审查智能体:客观评分代码质量,确保达到 90% 标准。
  • 测试智能体:智能评估变更影响,进行比例测试,避免过度测试

它不是孤立的,而是无缝集成 Claude Code 命令行(如 /ask/code/test),让整个流程像流水线一样顺畅。

为什么这个系统这么 NB?几大亮点抢先看

一开始想用 agentscommands 子目录功能,使用 znb 区分自定义命令,避免重复,不过好在放弃了。

这个工作流不是吹牛,它的设计直接解决了开发中的痛点,让我来列举几个亮点:

  • 质量控制自动化:不再靠主观“看起来行”,系统用客观 90% 评分作为关卡。通过就继续,不通过就迭代优化,省时省力
  • 专业分工:每个智能体只干一件事,避免上下文污染。比如代码智能体专注生成,审查智能体专注挑刺,测试智能体专注验证 UI 或逻辑变更
  • 轻量级流程(最常用):核心步骤无冗余,聚焦需求驱动。支持全自动化模式(一键从需求到发布)和分阶段手动协调模式,灵活性拉满。
  • 智能测试策略:根据变更类型(如 UI vs. 业务逻辑)比例测试,还能感知 UI 变化,防止过度测试浪费资源(这个是根据实践来的,涉及到前端资源变更时,浪费时间和 Token 要比其他类型要多的多)
  • 需求澄清与拆分: 认识我的人都知道我所在的行业,基于我的实践丰富了这方面内容,试图探索使用 Claude Code 管理我的需求

总之一句话,让开发从监督密集型转向 自动化专家型,特别适合 Web 应用、DevOps 等场景。
举个例子:某系统登录支持 LDAP,原本可能花半天,现在用 /requirements-pilot 命令,几分钟就搞定从用户需求到研发需求、拆迭代、编写代码、测试、预发布检查全流程。

如何快速上手?

最大的门槛是如何稳定使用 Claude Code

安装和使用超简单,别担心,这个系统安装门槛低,提供了详细指南。咱们一步步来。

支持用户级或项目级安装,本人推荐使用用户级安装使用

操作流程

先安装 Claude Code CLI,通过 npm 全局安装:

npm install -g @anthropic-ai/claude-code

然后检查版本:

claude --version
# 本文时版本为1.0.72
1.0.72 (Claude Code)

如果你已有 .claude,先重命名你的

mv ~/.claude ~/.claude-old

克隆到 ~/.claude 目录

git clone https://github.com/ysicing/code-pilot ~/.claude

已有 .claude 的,你可以根据 ~/.claude/.gitignore 内容将 ~/.claude-old 内的目录或者文件同步到 ~/.claude

根据自己的需求,可以将 CLAUDE.md.example 复制一份重命名为 CLAUDE.md, 作为全局 AI 工作流指导文件,大方针;

最后,需要根据自己的实际情况配置了,仅适用于 macOS

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "token",
    "ANTHROPIC_BASE_URL": "url",
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
    "CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR": "true",
    "CLAUDE_LANGUAGE": "zh"
  },
  "includeCoAuthoredBy": false,
  "permissions": {
    "allow": [
    ],
    "deny": [
      "Bash(rm -rf:*)",
      "Bash(rmdir:*)"
    ]
  },
  "hooks": {
    "Notification": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/scripts/show-notification.sh"
          }
        ]
      }
    ],
    "Stop": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/scripts/check-continue.sh"
          },
          {
            "type": "command",
            "command": "~/.claude/scripts/task-completed.sh"
          }
        ]
      }
    ]
  },
  "feedbackSurveyState": {
    "lastShownTime": 1754092908693
  }
}

重点内容在 hooks 里,是等待指示和完成的通知,默认使用的 macOS 自带工具实现。

示例, 更多提示音可以查看 assets 目录下文件,也可以自定义(示例提示音使用 fish.audio 生成)

# 等待提示
afplay assets/49-confirm.mp3 -v 1
# 完成提示音
afplay assets/49-perfect.mp3 -v 1
# 鸽鸽
afplay assets/cxk-v1-perfect.mp3

使用示例

  • 全自动化模式:直接输入 /requirements-pilot "系统登录支持 LDAP" ,系统自动处理需求生成、需求澄清确认、代码实现、审查、测试,也可以添加 --no-test 跳过测试流程
    -分阶段模式:
  1. /story-breakdown "电商结账流程":拆解用户故事。
  2. /ask "结账流程:微服务 vs 单体架构":咨询架构建议。
  3. /requirements-pilot "支付处理故事 1" --test:生成需求并测试。
  4. /review "验证支付安全性":质量审查。
  5. /release-check "支付系统":准备发布。

另外还提供了多种模式,如需求驱动、问题驱动、质量优先,由于流程不太适合公开分享,建议大家可以拿自己的项目实际跑一跑,用过我这套工作流的都说好。

使用体验

效率翻倍,质量更稳

本套流程我已经跑了差不多两周了,效率大大的提升,任何需求一来,/requirements-pilot 基本一梭子就解决了

结语

快来试试,AI 开发新时代已来!Claude Code 多智能体工作流系统绝对是 2025 年开发者的必备神器!它不只是工具,更像是你的 AI 团队伙伴。基于 ysicing/code-pilot 赶紧去试用一下吧,5 分钟就能上手。

致谢

本项目基于 myclaude 进行二次迭代,在此基础上实现了重大增强和创新。我们衷心感谢:

  • @cexll 创建了奠基性的 myclaude 项目,为本项目提供了灵感
  • Claude (Anthropic) 在整个开发过程中提供了卓越的 AI 协助和大力支持
  • Linux.do 社区成员们提供的宝贵建议
  • anyrouter 早期的测试支持

特别感谢与 Claude 的持续合作,使得复杂的多智能体工作流系统和质量门控自动化成为可能。

Debian 12 Bookworm 升级 Debian 13 Trixie

2025-08-08 20:54:09

本文将手把手指导如何升级 Debian 12 Bookworm 到 Debian 13 Trixie

不建议跨大版本升级,Debian 11 Bullseye 升级 Debian 12 Bookworm, 其他版本也是类似,如果机器配置足够低,推荐 Debian 10 养老

准备工作

操作前,重要数据先备份,默认使用 root 操作

  • 不支持 LXC
  • Debian 12
  • root 用户

更新系统

先更新系统,更新到最新版本

apt update
apt upgrade -y
apt autoclean
apt autoremove -y

升级系统

在升级前,先说一下镜像源文件的变化。

之前版本的 Debian 软件源配置文件使用传统的 One-Line-Style,路径为 /etc/apt/sources.list;但是从 Debian 12 的容器版本开始,以及 Debian 13 正式版后,其软件源配置文件变更为 DEB822 格式,路径为 /etc/apt/sources.list.d/debian.sources

推荐使用新的软件源配置文件 DEB822 格式, 然后安全的删除 /etc/apt/sources.list, 当然目前使用老格式也是没问题的。

源示例对比

两者保留其一即可

Debian 13 /etc/apt/sources.list

deb http://mirrors.tencent.com/debian/ trixie main contrib non-free non-free-firmware
deb http://mirrors.tencent.com/debian/ trixie-updates main contrib non-free non-free-firmware
deb http://mirrors.tencent.com/debian/ trixie-backports main contrib non-free non-free-firmware
deb http://mirrors.tencent.com/debian-security trixie-security main contrib non-free non-free-firmware

Debian 13 /etc/apt/sources.list.d/debian.sources

Types: deb
URIs: http://mirrors.tencent.com/debian
Suites: trixie trixie-updates trixie-backports
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Types: deb
URIs: http://mirrors.tencent.com/debian-security
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

升级系统

根据自己的实际情况,操作

sed -i 's/bookworm/trixie/g' /etc/apt/sources.list
sed -i 's/bookworm/trixie/g' /etc/apt/sources.list.d/*.list
sed -i 's/bookworm/trixie/g' /etc/apt/sources.list.d/*.sources

如果有错误提示文件或目录不存在,忽略即可。

apt update
apt upgrade -y
apt full-upgrade -y
# 在升级完成没报错后执行,也可以在reboot后执行
apt autoclean
apt autoremove -y

reboot

更新过程中,用 Debian 都知道的

  • 更新过程种会提示一些软件是否需要自动重启,选 Yes 即可,以及一些软件的配置文件是否需要更新,按照自己的情况选择即可,默认回车即视为使用旧的配置文件
  • 另外有些软件会提示是否变更配置, 默认选择 keep the local version 即可

确定查看系统版本

root@service:~$ cat /etc/debian_version
13.0

确定查看系统版本

# 升级后重启前
root@service:~$ uname -a
Linux service 6.6.13+bpo-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.6.13-1~bpo12+1 (2024-02-15) x86_64 GNU/Linux
# 升级重启后
root@service:~$ uname -a
Linux service 6.12.38+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.38-1 (2025-07-16) x86_64 GNU/Linux

使用 LiteLLM 自建 Claude Code 中转服务

2025-08-05 20:27:54

最近 A 站大规模封号,导致之前的号商的中转大都歇菜了,另外加上国内用户在使用 Claude Code 时常常面临网络限制、账号注册门槛等难题。如何绕过这些障碍,稳定、高效地使用 Claude Code?答案是:自建 Claude Code 中转服务!

今天,我们将介绍如何利用开源工具 LiteLLM 自建 Claude Code 中转服务,不仅能规避官方限制,还能灵活调用多种语言模型(如 OpenAI、Vertex AI、xAI 等),实现成本优化和高效开发。无论你是个人开发者还是团队用户,这篇保姆级教程都能帮你快速上手。

LiteLLM 是什么

LiteLLM 是一个轻量级的开源代理工具,支持将 Claude Code 的 API 请求转换为多种语言模型的格式,兼容 Anthropic、OpenAI、Vertex AI 等主流模型。通过 LiteLLM,你可以:

  • 绕过地域限制:无需海外账号,国内也能流畅使用 Claude Code
  • 灵活切换模型:支持多种模型(如 Claude Sonnet、GPT-4o、Gemini),按需分配任务以优化成本
  • 本地部署:数据隐私更有保障,适合对安全性要求高的项目
  • 开源免费:完全开源,社区活跃,易于扩展和维护

实操

litellm 主要使用 python 编写,部署途径有两种,我这里方便操作使用镜像方式

  • ghcr.io/berriai/litellm:main-latest
  • 国内镜像 ccr.ccs.tencentyun.com/k7scn/litellm:main-latest

使用 compose 部署

  • docker-compose.yaml
services:
  litellm:
    image: ccr.ccs.tencentyun.com/k7scn/litellm:main-latest
    container_name: litellm
    command: --config /app/config.yaml --detailed_debug
    environment:
      - OPENAI_API_KEY=sk-PpJVj1N7Btoken
      - OPENAI_API_URL=https://api.example.ai
      - LITELLM_MASTER_KEY=sk-nb666
    volumes:
      - '/data/litellm/config.yaml:/app/config.yaml'
    ports:
      - '4000:4000'
    restart: always

本文示例使用的是某中转 claude 服务商

  • /data/litellm/config.yaml
litellm_settings:
  master_key: os.environ/LITELLM_MASTER_KEY

model_list:
  # Responses API models
  - model_name: claude-sonnet-4-20250514
    litellm_params:
      model: anthropic/claude-sonnet-4-20250514
      api_key: os.environ/OPENAI_API_KEY
      api_base: os.environ/OPENAI_API_URL
      cache_control_injection_points:
        - location: message
          role: system

启动完成后,在环境里配置

export ANTHROPIC_BASE_URL=http://127.0.0.1:4000
export ANTHROPIC_AUTH_TOKEN=sk-nb666
claude --model claude-sonnet-4-20250514
# 或者在claude里使用/model设置

一分钱一分货,真是贵的可怕。

后续高级玩法

  • 多模型协同:通过 LiteLLM 的路由功能,为不同任务分配不同模型。例如:
  • 代码生成:Claude-3-5-Sonnet
  • 语法检查:GPT-4o-mini
  • 复杂架构分析:Gemini-1.5-Pro

在配置文件中添加更多模型和提供商

总结

通过 LiteLLM 自建 Claude Code 中转服务,你不仅能绕过地域和账号限制,还能灵活调用多种模型,兼顾性能与 成本。这种方式特别适合国内开发者,既省钱又高效!无论你是想快速生成代码、优化开发流程,还是探索 AI 编程的更多可能,这套方案都能让你事半功倍。

其他

本文主要参考两个文档

安利神器:Claude Code Router

2025-08-03 21:43:56

在如今的 AI 开发浪潮中,编码辅助工具层出不穷,但能真正提升效率、灵活适配多种模型的却不多。今天,我要给大家强烈安利一个开源项目——Claude Code Router!这个基于 Claude Code 开发的智能路由器*,不仅能让你更灵活地使用 AI 编码能力,还能无缝切换多种模型,堪称开发者的小助手

主要是体验国内大模型不是

什么是 Claude Code Router

Claude Code Router(后续简称 CCR)是一个开源项目,基于 Anthropic 的 Claude Code 打造,旨在为开发者提供一个灵活的编码基础设施。它就像一个智能路由器,可以将你的编码请求分发到不同的 AI 模型(如 DeepSeek、Ollama 等),并支持高度自定义的配置,让你根据任务需求选择最合适的模型。简单来说,CCR 让你在享受 Claude Code 强大编码能力的同时,还能灵活适配其他模型,省时省力又省钱

一句话总结:CCR 是一个让开发者自由掌控 AI 编码能力的超级工具, 你的省钱小能手

为什么需要 Claude Code Router

灵活的模型切换,打破 API 限制

我们都知道,Anthropic 的 Claude 系列模型在编码任务上表现优异,但它的 API 有时会受到限制,比如封号风险或高昂的 Token 费用。CCR 通过启动一个本地服务,将 Claude Code 的 API 请求转发到任何支持 OpenAI 格式的 API 接口,完美规避了这些问题。你可以用 DeepSeek、Gemini 等其他模型的 API 来驱动 Claude Code,灵活又高效!

高度自定义,适配多样化需求

CCR 支持通过 Providers 数组和 Transformer 机制自定义模型和 API 交互方式。你可以为不同模型设置全局或特定的转换器(Transformer),确保请求和响应的兼容性。比如,AnthropicTransformer 可以实现 Claude 与 OpenAI 格式的双向转换,而 GeminiTransformer 则处理 Gemini 与 OpenAI 格式的转换。这种"混搭"能力让多个模型无缝协作,简直是国内开发者的福音

自动化任务,节省成本

CCR 支持通过 GitHub Actions 实现自动化任务。例如,你可以在非高峰时段运行编码任务,降低 API 调用成本。它的配置简单,配合 GitHub Actions 可以轻松实现触发式自动化,比如当 Issue 评论中包含 @claude 时自动启动编码任务。省时又省钱,效率拉满!

开源免费

CCR 是完全开源的,托管在 GitHub,你可以自由下载、修改和贡献代码

项目地址: musistudio/claude-code-router

核心功能

  • 多模型支持
  • Transformer 机制, 核心功能。它能将不同模型的请求和响应统一到 OpenAI 格式,确保兼容性。
  • 支持本地化
  • Tool Mode,智能任务处理。借鉴了 Claude Code 的 Plan Mode,CCR 为 DeepSeek 等模型实现了 Tool Mode。当启用时,模型会主动选择最合适的工具来完成任务,极大提升编码效, 具体可以参考 Tool Mode

快速上手

  • 本地运行(个人推荐)
  • docker 部署(任意地方)

本地运行

本文示例对接魔搭的 qwen3 最新模型。

环境要求

安装依赖:确保 Node.js 版本 ≥18.0.0,使用 bun 或 npm 安装所需包

安装

  1. 安装 Claude Code
npm install -g @anthropic-ai/claude-code
  1. 安装 CCR
npm install -g @musistudio/claude-code-router

配置

默认配置文件 ~/.claude-code-router/config.json

{
  "LOG": true,
  "CLAUDE_PATH": "",
  "HOST": "127.0.0.1",
  "PORT": 3456,
  "APIKEY": "",
  "API_TIMEOUT_MS": "600000",
  "transformers": [],
  "Providers": [
    {
      "name": "modelscope",
      "api_base_url": "https://api-inference.modelscope.cn/v1/chat/completions",
      "api_key": "不要ms-的token",
      "models": [
        "Qwen/Qwen3-Coder-480B-A35B-Instruct"
      ],
      "transformer": {
        "use": [
          [
            "maxtoken",
            {
              "max_tokens": 65536
            }
          ]
        ]
      }
    }
  ],
  "Router": {
    "default": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "background": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "think": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "longContext": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "longContextThreshold": 60000,
    "webSearch": ""
  }
}

启动

ccr code

容器版部署(非编译版)

容器部署可以从源码编译,也可以像本地一样 npm 安装

  • Dockerfile
FROM node:lts
WORKDIR /app
RUN npm install -g @musistudio/claude-code-router
CMD ["ccr","start"]

基于上面的构建出一个镜像

  • docker-compose.yaml
version: "3.8"

services:
  ccr:
    build: .
    container_name: ccr
    ports:
      - "3456:3456"
    volumes:
      - ./:/root/.claude-code-router
    restart: unless-stopped

配置 config.json 区别, 仅列出调整的

"APIKEY": "xxxxxx", // 必须要有
"HOST": "0.0.0.0", // 以及这里

在本地的配置~/.claude/settings.json,和配置 Claude Code 一样

{
    "env": {
        "ANTHROPIC_BASE_URL": "https://xxxxxxx",
        "ANTHROPIC_AUTH_TOKEN": "123"
    }
}

然后 claude 开始你的编码

总结

潜力已经显而易见, 未来可期哈哈。如果正在为 Claude 的高成本和限制头疼,国内开发者还是值得试一试,当然如果能直接用 Claude Code,还是推荐用 Claude Code