让你的编码 Agent 摆脱账号登录 —— Claude Code、OpenCode、Aider 直接跑在 Ollama / LM Studio / vLLM / 任意 OpenAI 兼容端点上
内置 Anthropic ⇄ OpenAI 双向协议翻译,支持流式与工具调用。 纯 Python 标准库,零第三方依赖,一条命令启动。
English · 简体中文
⭐ 如果觉得有用,点个 Star 是对项目最大的支持!
你可能遇到过这些场景:
- 公司/网络环境无法登录 Claude / OpenAI 账号,但 Claude Code 的终端体验又回不去了
- 手上只有 Ollama / LM Studio 跑的本地模型,想给 coding agent 用,却被各种登录墙和厂商锁定挡住
- 想在同一个提示词下对比几家模型(Qwen / DeepSeek / GLM)的代码能力,不想装三个客户端
- 不想为"把 Claude Code 接到本地模型"再搭一套 LiteLLM / one-api 服务
现有方案要么重度绑定厂商账号(Claude Code、Codex 官方链路),要么部署很重(LiteLLM 带一整套依赖)。KeyDeck 是一个单文件即可分发的本地中转:说 Anthropic 协议的进,说 OpenAI 协议的出,双向翻译、流式透传、工具调用完整保留。
┌─────────────────┐ Anthropic API ┌──────────────┐ OpenAI API ┌──────────────────┐
│ Claude Code │ ────────────────► │ │ ──────────────► │ Ollama │
│ (无需登录) │ ◄──────────────── │ KeyDeck │ ◄────────────── │ LM Studio │
├─────────────────┤ 流式 + 工具调用 │ 本地代理 │ SSE 流式 │ vLLM │
│ OpenCode/Aider │ ────────────────► │ 零依赖 │ ──────────────► │ DeepSeek/OpenAI… │
└─────────────────┘ └──────────────┘ └──────────────────┘
| 特性 | 说明 |
|---|---|
| 🔓 免登录 | 把 Claude Code 指向本地 relay,厂商账号从此无关 |
| 🔁 双向协议翻译 | /v1/messages(Anthropic)与 /v1/chat/completions(OpenAI)互转,含 SSE 流式 |
| 🛠️ 工具调用保真 | tool_use ⇄ tool_calls 完整映射——agentic 编码流程不受损 |
| 🧩 多上游聚合 | Ollama / LM Studio / vLLM / llama.cpp / DeepSeek / Moonshot / OpenRouter / 任意 OpenAI 兼容端点 |
| ⚖️ 一条命令对比多模型 | keydeck ask "a::qwen,a::glm" "这段代码有什么问题?" 并发提问、并排看答案 |
| 🚫 零依赖 | 纯标准库实现(Python 3.10+),pipx install 即用,无 LiteLLM |
| 🔌 Anthropic 上游直通 | 上游也可以是任何 Anthropic 兼容服务(New API / 自建网关) |
pipx install keydeck # 或 pip install keydeck不想安装?直接从源码跑
git clone https://github.com/CHzqb/keydeck && cd keydeck
pip install -e .keydeck init # 生成 keydeck.toml 示例配置本地有 Ollama?什么都不用改,默认就指向 http://127.0.0.1:11434/v1。
或者一行环境变量直接开跑:
KEYDECK_BASE_URL=http://127.0.0.1:11434/v1 KEYDECK_MODEL=qwen3-coder:30b keydeck servekeydeck launch claude它做的事等价于:
ANTHROPIC_BASE_URL=http://127.0.0.1:8787 ANTHROPIC_API_KEY=*** keydeck -m local::qwen3:8b打开 Claude Code,它正在用你的本地模型思考,而它自己毫无察觉。🎩
keydeck ask "ollama::qwen3:8b,deepseek::deepseek-chat" \
"用 Python 写一个 LRU 缓存,要求线程安全,说明设计取舍"并发发出、并排输出,选型 5 分钟搞定。
[proxy]
port = 8787
default_provider = "ollama"
[providers.ollama]
type = "openai" # 上游协议
base_url = "http://127.0.0.1:11434/v1"
model = "qwen3:8b" # 客户端请求 "default" 时实际使用的模型
[providers.lmstudio]
type = "openai"
base_url = "http://127.0.0.1:1234/v1"
[providers.deepseek]
type = "openai"
base_url = "https://api.deepseek.com/v1"
api_key_env = "DEEPSEEK_API_KEY" # 密钥只从环境变量读,永不落盘
[providers.my-gateway]
type = "anthropic" # 上游也是 Anthropic 协议:直通
base_url = "https://new-api.internal:3000"
api_key_env = "GATEWAY_KEY"模型前缀路由:任何客户端把模型名写成 provider::model(如 ollama::qwen3:8b)即可指定上游;不写前缀则用 default_provider。Claude Code 里直接 /model ollama::qwen3:8b 就行。
| 客户端 | 接入方式 | 状态 |
|---|---|---|
| Claude Code | ANTHROPIC_BASE_URL 指向 relay |
✅ 流式/工具调用已测;思考块以纯文本呈现 |
| OpenCode / Aider / 任意 OpenAI SDK | OPENAI_BASE_URL 指向 relay |
✅ 流式/非流式 |
| Codex CLI | 需 Responses API(路线图 v0.2) | 🚧 见 FAQ |
| 其它 Anthropic SDK 应用 | 同 Claude Code | ✅ |
诚实声明:v0.1 已通过完整的 mock 上游端到端测试(流式、工具调用、双向翻译),但尚未在所有真实上游/客户端组合上验证。遇到问题请提 issue,带 upstream 日志更好。
Q: 这和 LiteLLM 有什么区别?
A: LiteLLM 是功能全面的网关(100+ provider、计费、路由策略……也随之而来一整套依赖)。KeyDeck 只做一件事并做到零摩擦:让 coding agent 免登录跑本地模型。单包纯标准库、init 模板专为本地场景设计、launch 一条命令注入环境变量、ask 多模型对比是内置一等公民。
Q: Codex CLI 什么时候支持? A: Codex 走 OpenAI Responses API,需要再做一层翻译,在 v0.2 路线图上。先用 Claude Code / OpenCode / Aider 吧。
Q: 安全吗?
A: 默认只监听 127.0.0.1,密钥只从环境变量读取。它不是公网网关,请不要暴露到不可信网络。
Q: 本地模型效果到底怎么样?
A: 工具调用保真度经过 e2e 测试,但 agentic 编码体验上限取决于模型本身——推荐 qwen3-coder、deepseek-coder 级别起步。用 ask 先测再All in。
- v0.2:Responses API ⇄ Chat Completions 翻译(Codex CLI 免登录)
- v0.2:
keydeck launch codex自动注入 config - v0.3:会话粘性多路路由(同一 thread 固定上游)、成本/token 统计面板
- v0.3:Windows 托盘 / macOS 菜单栏小图标
- 欢迎 Issue & PR —— 见 CONTRIBUTING.md
git clone https://github.com/CHzqb/keydeck && cd keydeck
python -m pytest tests/ -q # 单元测试
python tests/test_e2e.py # 端到端(mock 上游,无网络)翻译层是纯函数(schemas.py / streaming.py),欢迎加 provider 支持、修 edge case。
MIT — 随便用,回头点个 ⭐ 就行。