背景

写博客是个好习惯,但每次都要花大量时间组织内容、排版、调整格式,很容易劝退。如果能用AI工具自动生成博客内容,同时保证质量,那效率就能提升很多。

本文介绍如何使用 Claude Code(Anthropic推出的AI编程CLI工具)配合 火山方舟Coding Plan,搭建一套自动化写Hexo博客的工作流,并重点讲解如何避免API Key泄漏。

什么是Claude Code

Claude Code 是Anthropic官方推出的命令行AI编程助手。它可以直接在终端中运行,理解你的项目代码库,帮你完成编写代码、重构、调试、搜索等任务。

核心能力:

  • 读取和理解整个项目代码库
  • 直接编辑和创建文件
  • 执行Shell命令
  • 与Git集成(创建commit、PR等)
  • 支持自定义API端点,可以使用第三方LLM网关

什么是火山方舟Coding Plan

火山方舟 是字节跳动推出的大模型服务平台,提供多种模型的统一API接入。其中的 Coding Plan 是方舟平台面向代码生成和编程辅助场景的专项服务,提供适合编程和文本生成的模型(如豆包系列模型)。

注意:方舟Coding Plan的具体功能、模型列表和定价可能随时间变化,请以火山方舟官方文档为准。截至本文编写时,方舟官方文档中关于Coding Plan的公开细节有限,建议登录方舟控制台查看最新的模型和定价信息。

方舟API兼容OpenAI SDK格式,基础调用方式如下:

1
2
3
4
5
6
7
8
9
10
11
from openai import OpenAI

client = OpenAI(
api_key="YOUR_ARK_API_KEY",
base_url="https://ark.volcengine.com/v1"
)

response = client.chat.completions.create(
model="ep-xxxxxxxx", # 方舟推理接入点ID
messages=[{"role": "user", "content": "Hello!"}]
)

整体架构

由于Claude Code要求后端API支持 Anthropic Messages格式/v1/messages),而火山方舟提供的是 OpenAI兼容格式/v1/chat/completions),两者无法直接对接。我们需要一个中间代理层来转换协议。

整体架构如下:

1
2
3
4
5
6
7
8
9
10
Claude Code CLI
│ (Anthropic Messages格式)

LiteLLM Proxy
│ (协议转换: Anthropic → OpenAI)

火山方舟 API
│ (OpenAI兼容格式)

豆包/Coding Plan模型

重要局限

协议转换只能解决API格式兼容问题,但 无法解决模型能力差异

  • Claude Code的系统提示和工具调用格式是为Claude模型设计的,转给豆包等非Claude模型时,工具调用(Tool Use)的成功率和准确度会下降
  • 对于简单的文本生成任务(如写博客文章),影响较小;对于需要精确工具调用的场景(如编辑文件、执行命令),体验可能不如原生Claude模型
  • 如果你拥有Anthropic官方API Key或Claude Pro/Max订阅,建议优先使用原生接入(见文末)

搭建步骤

第一步:获取火山方舟API Key

  1. 注册并登录火山方舟控制台
  2. 在「模型推理」中创建推理接入点(Endpoint),选择你需要的模型
  3. 在「API Key管理」中创建API Key
  4. 记录下你的 Endpoint ID(格式如 ep-20250101xxxxx)和 API Key

第二步:部署LiteLLM代理

LiteLLM 是一个开源的LLM代理服务,支持多种API格式之间的转换。

安全提示:LiteLLM PyPI版本1.82.7和1.82.8曾被植入窃取凭证的恶意代码,请勿安装这两个版本。详见 BerriAI/litellm#24518

安装LiteLLM

1
2
3
pip install 'litellm[proxy]' --upgrade
# 确保版本不是1.82.7或1.82.8
pip show litellm | grep Version

创建配置文件

创建 litellm_config.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
model_list:
- model_name: claude-sonnet-4-6
litellm_params:
model: openai/ep-xxxxxxxx # 替换为你的方舟Endpoint ID
api_base: https://ark.volcengine.com/v1
api_key: os.environ/ARK_API_KEY # 从环境变量读取,不要硬编码
- model_name: claude-haiku-4-5
litellm_params:
model: openai/ep-yyyyyyyy # 替换为你的另一个方舟Endpoint ID
api_base: https://ark.volcengine.com/v1
api_key: os.environ/ARK_API_KEY

general_settings:
master_key: os.environ/LITELLM_MASTER_KEY # LiteLLM代理自身的认证密钥

配置说明:

  • model_name:Claude Code识别的模型名,保持与Claude模型同名即可,LiteLLM会做映射
  • modelopenai/ 前缀 + 你的方舟Endpoint ID,告诉LiteLLM用OpenAI协议调用
  • api_base:方舟的API地址
  • api_key:使用 os.environ/ 前缀从环境变量读取,避免硬编码

启动代理

1
2
3
4
export ARK_API_KEY="你的方舟API Key"
export LITELLM_MASTER_KEY="sk-自定义一个安全密钥"

litellm --config litellm_config.yaml --port 4000

启动后,LiteLLM会在 http://localhost:4000 提供Anthropic Messages格式的API,并将请求转换为OpenAI格式转发给方舟。

第三步:配置Claude Code

方式一:环境变量(推荐用于临时测试)

1
2
3
4
export ANTHROPIC_BASE_URL="http://localhost:4000"
export ANTHROPIC_AUTH_TOKEN="sk-自定义的LiteLLM密钥" # 即上面设置的LITELLM_MASTER_KEY

claude

方式二:配置文件(推荐用于长期使用)

创建或编辑 ~/.claude/settings.json

1
2
3
4
5
6
{
"env": {
"ANTHROPIC_BASE_URL": "http://localhost:4000",
"ANTHROPIC_AUTH_TOKEN": "sk-你的LiteLLM密钥"
}
}

方式三:使用apiKeyHelper(最安全)

对于需要动态获取密钥的场景,可以配置一个脚本:

  1. 创建密钥获取脚本 ~/bin/get-llm-key.sh
1
2
3
4
#!/bin/bash
# 从安全的密钥管理服务获取临时密钥
# 示例:从macOS钥匙串读取
security find-generic-password -s "litellm-master-key" -w
1
chmod +x ~/bin/get-llm-key.sh
  1. 在Claude Code设置中配置:
1
2
3
{
"apiKeyHelper": "~/bin/get-llm-key.sh"
}
  1. 可选,设置密钥刷新间隔:
1
export CLAUDE_CODE_API_KEY_HELPER_TTL_MS=3600000  # 每小时刷新

注意apiKeyHelper 的优先级低于 ANTHROPIC_AUTH_TOKENANTHROPIC_API_KEY。如果同时设置了环境变量和apiKeyHelper,环境变量优先生效。

第四步:自定义模型名称

为了让Claude Code能正确选择模型,可以通过环境变量配置模型映射:

1
2
3
# 在启动Claude Code前设置
export ANTHROPIC_DEFAULT_SONNET_MODEL="claude-sonnet-4-6"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="claude-haiku-4-5"

如果方舟的Endpoint ID与Claude模型名不一致,可以在LiteLLM配置中通过 model_name 做映射(已在第二步的配置中完成),无需额外设置 modelOverrides

使用Claude Code自动写Hexo博客

配置完成后,就可以用Claude Code来辅助写博客了。

创建新文章

在Hexo项目目录下启动Claude Code:

1
2
cd /path/to/hexo_source_file
claude

然后直接用自然语言描述你要写的博客内容:

1
帮我创建一篇关于Unity Addressables资源管理最佳实践的博客,包括资源分组策略、内存优化和加载性能调优三个方面

Claude Code会:

  1. 使用 hexo new post 创建Markdown文件
  2. 自动填充YAML Front Matter(title、date、tags、categories)
  3. 按照你的描述生成完整的博客内容
  4. 保持与你现有博客风格一致的Markdown格式

修改已有文章

1
帮我在spine优化这篇文章中补充按动画拆分Spine文件的具体代码实现

Claude Code会读取现有文章,理解上下文,在合适的位置插入内容。

一键生成并预览

1
创建一篇关于Lua热更新方案对比的博客,然后启动本地预览服务器让我看看效果

Claude Code会创建文章并执行 hexo server 启动预览。

部署

确认文章内容无误后:

1
帮我执行 hexo deploy 部署博客

防止API Key泄漏

这是使用AI工具时最重要的安全问题。以下是多层防护策略:

1. 环境变量,绝不硬编码

1
2
3
4
5
6
# ✅ 正确:通过环境变量传递
export ARK_API_KEY="你的密钥"
export LITELLM_MASTER_KEY="sk-安全密钥"

# ❌ 错误:写在配置文件中提交到Git
api_key: "AK-xxxxxxxx" # 绝对不要这样做

LiteLLM配置中使用 os.environ/ 前缀来引用环境变量:

1
2
api_key: os.environ/ARK_API_KEY  # ✅ 从环境变量读取
# api_key: AK-xxxxxxxx # ❌ 不要硬编码

2. .gitignore排除敏感文件

确保以下文件在 .gitignore 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 环境变量文件
.env
.env.local
.env.production

# 密钥脚本
bin/get-llm-key.sh

# LiteLLM配置(如果包含密钥)
litellm_config.yaml

# Claude Code项目设置(可能包含API配置)
.claude/settings.json

3. 使用 .env 文件管理本地密钥

创建 .env 文件(确保已被gitignore):

1
2
3
4
5
# .env - 绝对不要提交到Git
ARK_API_KEY=AK-xxxxxxxx
LITELLM_MASTER_KEY=sk-xxxxxxxx
ANTHROPIC_BASE_URL=http://localhost:4000
ANTHROPIC_AUTH_TOKEN=sk-xxxxxxxx

推荐使用 direnv 自动加载,避免手动export:

1
2
3
4
5
6
7
8
9
# 安装direnv
brew install direnv

# 在Shell配置中启用direnv(~/.zshrc添加)
eval "$(direnv hook zsh)"

# 在项目根目录创建 .envrc
echo 'source_env .env' > .envrc
direnv allow

进入项目目录时,direnv会自动加载 .env 中的环境变量。

4. 使用系统密钥管理

macOS用户可以使用钥匙串存储密钥:

1
2
3
4
5
# 存储密钥
security add-generic-password -s "ark-api-key" -a "hexo-blog" -w "AK-xxxxxxxx"

# 读取密钥(用于apiKeyHelper脚本)
security find-generic-password -s "ark-api-key" -w

Linux用户可以使用 passsecret-tool 或云厂商的密钥管理服务。

5. 在CLAUDE.md中声明安全规则

在项目的 CLAUDE.md 中添加安全指令,确保Claude Code不会将密钥写入博客内容:

1
2
3
4
# 安全规则
- 绝不在生成的博客文章中包含任何API Key、Token、密钥等敏感信息
- 如果引用代码示例,将密钥替换为占位符(如 YOUR_API_KEY)
- 不要将 .env 文件的内容输出到对话中

6. Git Hooks自动检查

创建 pre-commit hook 防止意外提交密钥:

1
2
3
4
5
6
7
8
9
#!/bin/bash
# .git/hooks/pre-commit

# 检查暂存文件中是否包含疑似API Key的内容
if git diff --cached -G '(AK-[a-zA-Z0-9]{16,}|sk-ant-[a-zA-Z0-9]{20,}|api_key\s*[:=]\s*["'\''][^"'\'']{10,})'; then
echo "检测到可能的API Key,请确认后再提交"
echo "如果是误报,使用 git commit --no-verify 跳过检查"
exit 1
fi
1
chmod +x .git/hooks/pre-commit

7. 方舟平台侧的防护

  • 为不同用途创建不同的API Key,限制其权限范围
  • 设置API调用的额度上限,防止密钥泄漏后产生高额费用
  • 定期轮换API Key
  • 使用方舟 GetApiKey 接口获取临时API Key,而非长期有效的密钥

完整工作流示例

下面是一个从零开始的完整流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1. 启动LiteLLM代理(新终端窗口)
export ARK_API_KEY="你的方舟API Key"
export LITELLM_MASTER_KEY="sk-your-secure-key"
litellm --config litellm_config.yaml --port 4000

# 2. 配置Claude Code环境
export ANTHROPIC_BASE_URL="http://localhost:4000"
export ANTHROPIC_AUTH_TOKEN="sk-your-secure-key"

# 3. 进入Hexo项目目录
cd /path/to/hexo_source_file

# 4. 启动Claude Code
claude

# 5. 在Claude Code中输入你的需求
# > 帮我写一篇关于xx的博客,包括xxx和xxx几个部分

# 6. 检查生成的文章
# > hexo server 启动预览

# 7. 满意后部署
# > hexo deploy

如果你有Anthropic官方API

如果你有Anthropic官方的API Key(无需使用方舟),配置更简单,不需要LiteLLM代理:

1
2
export ANTHROPIC_API_KEY="sk-ant-xxxxxxxx"
claude

也可以使用Claude Pro/Max订阅直接登录:

1
claude login

使用官方API或订阅可以享受Claude模型的原生工具调用能力,体验明显优于通过代理转接的方案。

总结

步骤 说明
获取方舟API Key 在火山方舟控制台创建
部署LiteLLM代理 转换Anthropic Messages与OpenAI格式
配置Claude Code 设置 ANTHROPIC_BASE_URL 和认证信息
写博客 用自然语言描述需求,Claude Code自动生成
防泄漏 环境变量 + gitignore + pre-commit hook + CLAUDE.md规则

核心原则:密钥永远只通过环境变量或系统密钥管理传递,绝不出现在代码、配置文件或Git仓库中