logo
0
0
WeChat Login

codeai

一个轻量级的 Go CLI 工具,通过按需加载配置文件(Profile)向 AI 命令行程序(如 claudecodex 等)注入环境变量,实现多账号、多模型、多密钥的快速切换。


功能特性

  • 多 Profile 管理:为同一程序创建多个配置文件,按需切换
  • 环境变量注入:Profile 中定义的变量会覆盖当前 Shell 环境,不污染全局配置
  • 自动 Profile 匹配:通过 ~/.codeai/setting.json 按当前环境变量自动选择 Profile,无需手动指定
  • 额外参数支持:Profile 可附带默认启动参数
  • 内置代理:可选启动本地 HTTP 代理,按白名单/黑名单规则决定流量走向,支持 IP、CIDR、域名、通配符域名
  • 可配置日志级别:默认静默运行,配置 "log_level": "debug" 后输出详细调试信息,便于排查问题
  • 零依赖:纯 Go 标准库实现,无需安装任何第三方包

安装

克隆仓库

git clone https://cnb.cool/hepeichun/codeai.git

构建

cd codeai go build -o codeai .

交叉编译多平台[OR]

goreleaser release --clean --skip=publish --snapshot

可选:移至 PATH

sudo mv codeai /usr/local/bin/

使用方法

创建 Profile

codeai init <程序名> <profile名>

示例:

codeai init claude default # 创建 ~/.codeai/claude/default.json

编辑 Profile

打开生成的 JSON 文件,填入你的配置:

{ "env": { "ANTHROPIC_API_KEY": "sk-ant-xxxxxxxx" }, "args": ["--verbose"], "log_level": "", "proxy": { "enabled": false, "upstream": "http://user:pass@proxy.host:port", "mode": "whitelist", "rules": ["api.anthropic.com", "*.anthropic.com"] } }
字段类型说明
envmap[string]string注入的环境变量,覆盖当前 Shell 中的同名变量
args[]string启动程序时自动附加的参数
log_levelstring日志级别,留空或省略时静默运行,设为 "debug" 时输出调试日志至 stderr
proxyobject内置代理配置,省略或 enabled: false 时不启用

proxy 字段说明

字段类型说明
enabledbool是否启用内置代理
upstreamstring上游代理地址,格式 http://[user:pass@]host:port
modestring"whitelist""blacklist",见下文
rules[]string匹配规则列表,支持精确 IP、CIDR、域名、通配符域名(*.example.com

mode 语义:

moderules 内的主机rules 外的主机
whitelist走上游代理直连
blacklist直连(绕过代理)走上游代理

工作原理: 启用后,codeai 在本地随机端口(20000–30000)启动一个轻量 HTTP 代理,将子进程的 HTTP_PROXY / HTTPS_PROXY 指向它,同时清空 NO_PROXY。代理根据规则决定每个连接是转发至上游还是直连。子进程退出后代理随即关闭。

启动程序

# 使用 default profile 启动 codeai claude # 指定 profile(跳过自动匹配) codeai claude work

等效于:

ANTHROPIC_API_KEY=sk-ant-xxxxxxxx claude --verbose

自动 Profile 匹配

无需每次手动输入 profile 名称。在 ~/.codeai/setting.json 中配置规则,codeai 启动时会依次评估规则,命中第一条匹配的规则即使用对应的 profile;若无匹配则回退到 default

~/.codeai/setting.json 示例:

{ "env_profiles": [ { "program": "claude", "profile": "work", "when": { "ANTHROPIC_BASE_URL": "https://work.example.com" } }, { "program": "claude", "profile": "corp", "when": { "$and": [ { "ANTHROPIC_BASE_URL": "https://corp.example.com" }, { "ANTHROPIC_AUTH_TOKEN": "sk-corp-token" } ] } }, { "program": "claude", "profile": "personal", "when": { "$or": [ { "ANTHROPIC_BASE_URL": "https://personal.example.com" }, { "ANTHROPIC_AUTH_TOKEN": "sk-personal-token" } ] } } ] }

规则字段说明:

字段说明
program规则作用的程序名,与 codeai <program> 中的程序名对应,不匹配则跳过
profile命中时使用的 profile 名称
when匹配条件(见下文)

when 条件语法:

写法含义
{ "KEY": "VALUE" }环境变量 KEY 的值等于 VALUE
多个顶层 key隐式 AND,所有条件均需满足
{ "$or": [...] }任意一个子条件满足即可
{ "$and": [...] }所有子条件均需满足

$or / $and 可任意嵌套。

查看已有 Profile

codeai list claude # 输出: # default # work # personal

配置文件位置

所有配置文件存放在 ~/.codeai/ 目录下,按程序名分组:

~/.codeai/ ├── setting.json # 全局设置:env_profiles 自动匹配规则 ├── claude/ │ ├── default.json │ └── work.json └── codex/ └── default.json
  • 目录权限:0700
  • 文件权限:0600

错误码

场景退出码
未传入参数1
Profile 文件不存在1
JSON 格式错误1
程序不在 PATH 中127
子进程退出子进程的退出码
init 目标文件已存在1

所有错误信息输出至 stderr,以 codeai: 为前缀。


典型使用场景

场景一:个人账号与工作账号分离

codeai init claude personal codeai init claude work # 分别填入不同的 API Key codeai claude personal # 使用个人账号 codeai claude work # 使用工作账号

场景二:切换不同模型

{ "env": { "ANTHROPIC_API_KEY": "sk-ant-xxxxxxxx", "ANTHROPIC_MODEL": "claude-opus-4-6" }, "args": [] }

场景三:通过代理访问(黑名单模式)

内网域名直连,其他流量走上游代理:

{ "env": { "ANTHROPIC_API_KEY": "sk-ant-xxxxxxxx" }, "args": [], "proxy": { "enabled": true, "upstream": "http://user:pass@corp-proxy.example.com:8080", "mode": "blacklist", "rules": [ "localhost", "127.0.0.1", "192.168.0.0/16", "*.internal.example.com" ] } }

场景四:白名单模式——仅代理 Anthropic API

只让 Anthropic 相关域名走代理,其余全部直连:

{ "env": { "ANTHROPIC_API_KEY": "sk-ant-xxxxxxxx" }, "args": [], "proxy": { "enabled": true, "upstream": "http://127.0.0.1:7890", "mode": "whitelist", "rules": [ "api.anthropic.com", "*.anthropic.com" ] } }

场景五:按环境变量自动切换 Profile

在不同终端会话或 CI 环境中设置不同的环境变量,codeai 自动使用对应的 Profile,无需手动指定:

// ~/.codeai/setting.json { "env_profiles": [ { "program": "claude", "profile": "work", "when": { "ANTHROPIC_BASE_URL": "https://work.example.com" } }, { "program": "claude", "profile": "personal", "when": { "ANTHROPIC_BASE_URL": "https://personal.example.com" } } ] }
export ANTHROPIC_BASE_URL=https://work.example.com codeai claude # 自动使用 work profile export ANTHROPIC_BASE_URL=https://personal.example.com codeai claude # 自动使用 personal profile codeai claude default # 显式指定时跳过自动匹配

场景七:管理多个 AI 工具

codeai init codex default codeai init gemini default codeai codex codeai gemini

场景八:开启调试日志排查问题

当程序运行无输出或行为异常时,在 Profile 中设置 "log_level": "debug" 即可在 stderr 看到完整的执行过程:

{ "env": { "ANTHROPIC_API_KEY": "sk-ant-xxxxxxxx" }, "args": [], "log_level": "debug" }

示例输出(运行 codeai curl default -s https://ipinfo.io):

codeai[debug] loaded profile: program=curl, profile=default codeai[debug] profile args: [] codeai[debug] resolved path: /usr/bin/curl codeai[debug] final args: [-s https://ipinfo.io] codeai[debug] injected env keys: [ANTHROPIC_API_KEY] codeai[debug] proxy disabled codeai[debug] exec: /usr/bin/curl [-s https://ipinfo.io] codeai[debug] exit code: 0

调试完毕后将 log_level 删除或置为 "" 即可恢复静默模式。


项目结构

codeai/ ├── main.go # 入口 ├── cmd/ │ ├── root.go # 命令分发 │ ├── run.go # codeai <程序> [profile] │ ├── list.go # codeai list <程序> │ ├── init.go # codeai init <程序> <profile> │ └── open.go # codeai open <程序> ├── config/ │ ├── config.go # 配置路径解析、JSON 解析、Profile / ProxyConfig 结构体 │ └── setting.go # 全局设置解析、env_profiles 规则匹配引擎 ├── logger/ │ └── logger.go # 全局调试日志(由 log_level 控制) ├── proxy/ │ ├── proxy.go # 本地 HTTP 代理服务器(CONNECT + 普通 HTTP) │ └── rules.go # 规则匹配引擎(IP / CIDR / 域名 / 通配符) └── executor/ └── executor.go # 环境变量合并、代理生命周期、进程启动、stdio 透传

License

MIT

About

No description, topics, or website provided.
Language
Go100%