Node.js 环境安装教程

在 Windows、macOS、Linux 安装 Node.js LTS,并验证 node/npm 命令可用。

💡 提示:后续的 Claude Code、Gemini CLI、Codex 都依赖 Node.js 运行环境。先完成本教程,再继续各自工具配置。

Windows

方法一:官方下载(推荐)

前往 Node.js 官网 下载 LTS 版本,双击安装包按提示安装即可。

方法二:使用 Chocolatey

CMD / PowerShell
1choco install nodejs-lts

方法三:使用 Scoop

CMD / PowerShell
1scoop install nodejs-lts

macOS

方法一:使用 Homebrew(推荐)

BASH
1brew install node

方法二:官方下载

前往 Node.js 官网 下载 macOS 安装包。

Linux

Ubuntu / Debian:

BASH
1curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -2sudo apt-get install -y nodejs

CentOS / RHEL:

BASH
1curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash -2sudo yum install -y nodejs

验证安装

安装完成后,在终端执行:

TERMINAL
1node --version2npm --version

如果能输出版本号,说明 Node.js 与 npm 已可用。

下一步

Codex (OpenAI) 配置教程

安装并配置 Codex,通过 ~/.codex 连接 OneKeyAPI 平台。

安装 Codex

⚠️ 注意:手动安装前请先完成

第一步:安装 Codex

BASH
1sudo npm install -g @openai/codex@latest
BASH
1sudo npm install -g @openai/codex@latest
CMD / PowerShell
1npm install -g @openai/codex@latest

以上命令会从 npm 官方仓库下载并安装最新版本的 Codex 工具。

验证安装

TERMINAL
1codex --version

如果显示版本号,恭喜你!Codex 已经成功安装了。

第二步:创建配置文件

Codex 使用配置文件进行连接设置,需要创建 config.tomlauth.json 两个文件。

BASH
1# 删除旧目录并创建新目录2rm -rf ~/.codex && mkdir -p ~/.codex3 4# 创建 config.toml5cat > ~/.codex/config.toml << 'EOF'6model_provider = "codex"7model = "gpt-5.5"8review_model = "gpt-5.5"9model_reasoning_effort = "high"10disable_response_storage = true11network_access = "enabled"12windows_wsl_setup_acknowledged = true13model_context_window = 27000014model_auto_compact_token_limit = 27000015effective_context_window_percent = 9516 17[model_providers.codex]18name = "codex"19base_url = "https://api.onekeyapi.ai/v1"20wire_api = "responses"21requires_openai_auth = true22EOF23 24# 创建 auth.json25cat > ~/.codex/auth.json << 'EOF'26{27  "OPENAI_API_KEY": "YOUR_API_KEY"28}29EOF
BASH
1# 删除旧目录并创建新目录2rm -rf ~/.codex && mkdir -p ~/.codex3 4# 创建 config.toml5cat > ~/.codex/config.toml << 'EOF'6model_provider = "codex"7model = "gpt-5.5"8review_model = "gpt-5.5"9model_reasoning_effort = "high"10disable_response_storage = true11network_access = "enabled"12windows_wsl_setup_acknowledged = true13model_context_window = 27000014model_auto_compact_token_limit = 27000015effective_context_window_percent = 9516 17[model_providers.codex]18name = "codex"19base_url = "https://api.onekeyapi.ai/v1"20wire_api = "responses"21requires_openai_auth = true22EOF23 24# 创建 auth.json25cat > ~/.codex/auth.json << 'EOF'26{27  "OPENAI_API_KEY": "YOUR_API_KEY"28}29EOF
POWERSHELL
1# 删除旧目录并创建新目录2if (Test-Path "$env:USERPROFILE\.codex") { Remove-Item -Recurse -Force "$env:USERPROFILE\.codex" }3mkdir "$env:USERPROFILE\.codex"4 5# 创建 config.toml6@"7model_provider = "codex"8model = "gpt-5.5"9review_model = "gpt-5.5"10model_reasoning_effort = "high"11disable_response_storage = true12network_access = "enabled"13windows_wsl_setup_acknowledged = true14model_context_window = 27000015model_auto_compact_token_limit = 27000016effective_context_window_percent = 9517 18[model_providers.codex]19name = "codex"20base_url = "https://api.onekeyapi.ai/v1"21wire_api = "responses"22requires_openai_auth = true23"@ | Out-File -FilePath "$env:USERPROFILE\.codex\config.toml" -Encoding utf824 25# 创建 auth.json26@"27{28  "OPENAI_API_KEY": "YOUR_API_KEY"29}30"@ | Out-File -FilePath "$env:USERPROFILE\.codex\auth.json" -Encoding utf8
💡 提示:请将命令中的 YOUR_API_KEY 替换为在 控制台 页面中复制的任意 API Key。

第三步:开始使用

进入项目目录后运行:

TERMINAL
1codex

更多使用说明请参考 OpenAI 官方文档 open_in_new

Claude Code 配置教程

安装 Claude Code

⚠️ 注意:手动安装前请先完成

第一步:安装 Claude Code

CMD / PowerShell
1npm install -g @anthropic-ai/claude-code
BASH
1sudo npm install -g @anthropic-ai/claude-code
BASH
1sudo npm install -g @anthropic-ai/claude-code

macOS / Linux / WSL:

BASH
1curl -fsSL https://claude.ai/install.sh | sudo bash

Windows PowerShell:

POWERSHELL
1irm https://claude.ai/install.ps1 | iex
其他方式会自动在后台更新,保持最新版本。Windows 需要先安装 Git for Windows。

验证安装:

BASH
1claude --version

第二步:配置环境变量

把下面的值写入当前终端或系统环境变量。

ANTHROPIC_BASE_URLhttps://api.onekeyapi.ai
ANTHROPIC_AUTH_TOKEN在个人中心获取
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC1
⚠️ 请保留 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1,用于关闭 Claude Code 的非必要遥测流量。

临时设置(当前会话)

CMD
1set ANTHROPIC_BASE_URL=https://api.onekeyapi.ai2set ANTHROPIC_AUTH_TOKEN=your-key3set CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=14cd your-project5claude

永久设置

POWERSHELL
1[System.Environment]::SetEnvironmentVariable("ANTHROPIC_BASE_URL", "https://api.onekeyapi.ai", [System.EnvironmentVariableTarget]::User)2[System.Environment]::SetEnvironmentVariable("ANTHROPIC_AUTH_TOKEN", "your-key", [System.EnvironmentVariableTarget]::User)3[System.Environment]::SetEnvironmentVariable("CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC", "1", [System.EnvironmentVariableTarget]::User)
💡 提示:请将命令中的 your-key 替换为在 控制台 页面中复制的任意 API Key。

第三步:开始使用

进入项目目录后运行:

BASH
1claude

启动后,Claude Code 会分析当前目录的代码,并提供智能编程辅助。

更多使用说明请参考 Anthropic 官方文档 open_in_new

Gemini CLI 配置教程

安装并配置 Gemini CLI 工具,连接 OneKeyAPI 平台使用 Gemini 模型。

Gemini CLI 是 Google 官方提供的终端 AI 助手工具。本教程将引导你完成安装和配置。

⚠️ 注意:开始前请先完成

第一步:安装 Gemini CLI

CMD / PowerShell
1npm install -g @google/gemini-cli
BASH
1sudo npm install -g @google/gemini-cli

方式一:macOS (npm)

BASH
1sudo npm install -g @google/gemini-cli

方式二:macOS (Homebrew)

BASH
1brew install gemini-cli

验证安装

TERMINAL
1gemini --version

如果显示版本号,说明安装成功了!

第二步:配置环境变量

设置环境变量让 Gemini CLI 连接到 OneKeyAPI 平台。需要设置三个变量:

  • GOOGLE_GEMINI_BASE_URL -- 服务地址
  • GEMINI_API_KEY -- 你的 API Key
  • GEMINI_MODEL -- 使用的模型

临时设置(当前会话)

POWERSHELL
1$env:GOOGLE_GEMINI_BASE_URL = "https://api.onekeyapi.ai"2$env:GEMINI_API_KEY = "YOUR_API_KEY"3$env:GEMINI_MODEL = "gemini-3-pro-preview"
BASH
1export GOOGLE_GEMINI_BASE_URL="https://api.onekeyapi.ai"2export GEMINI_API_KEY="YOUR_API_KEY"3export GEMINI_MODEL="gemini-3-pro-preview"
BASH
1export GOOGLE_GEMINI_BASE_URL="https://api.onekeyapi.ai"2export GEMINI_API_KEY="YOUR_API_KEY"3export GEMINI_MODEL="gemini-3-pro-preview"

永久设置

POWERSHELL
1[System.Environment]::SetEnvironmentVariable("GOOGLE_GEMINI_BASE_URL", "https://api.onekeyapi.ai", [System.EnvironmentVariableTarget]::User)2[System.Environment]::SetEnvironmentVariable("GEMINI_API_KEY", "YOUR_API_KEY", [System.EnvironmentVariableTarget]::User)3[System.Environment]::SetEnvironmentVariable("GEMINI_MODEL", "gemini-3-pro-preview", [System.EnvironmentVariableTarget]::User)
ZSH
1echo 'export GOOGLE_GEMINI_BASE_URL="https://api.onekeyapi.ai"' >> ~/.zshrc2echo 'export GEMINI_API_KEY="YOUR_API_KEY"' >> ~/.zshrc3echo 'export GEMINI_MODEL="gemini-3-pro-preview"' >> ~/.zshrc4source ~/.zshrc
BASH
1echo 'export GOOGLE_GEMINI_BASE_URL="https://api.onekeyapi.ai"' >> ~/.bashrc2echo 'export GEMINI_API_KEY="YOUR_API_KEY"' >> ~/.bashrc3echo 'export GEMINI_MODEL="gemini-3-pro-preview"' >> ~/.bashrc4source ~/.bashrc
💡 提示:请将命令中的 YOUR_API_KEY 替换为在 控制台 页面中复制的任意 API Key。如需更换模型,只需修改 GEMINI_MODEL 即可。

第三步:开始使用

配置完成后,在项目目录中运行:

TERMINAL
1gemini

Gemini CLI 会分析当前目录的代码,并提供智能建议。

测试命令

非交互式查询:

TERMINAL
1gemini -p "你好"

更多使用说明请参考 Google AI 官方文档 open_in_new

TRAE SOLO 配置教程

在 TRAE SOLO 中添加自定义模型,分别接入 Codex 和 Claude 通道。

第一步:进入自定义模型配置

01

打开设置

02

模型

03

添加模型

04

自定义配置

第二步:按模型类型填写配置

Codex 模型配置

OpenAI / Codex 地址使用 https://api.onekeyapi.ai/v1

TRAE SOLO Codex 模型配置截图

Claude 模型配置

Claude / Anthropic 地址使用 https://api.onekeyapi.ai

TRAE SOLO Claude 模型配置截图
💡 API Key 请在 密钥管理 获取;Codex 模型示例可填 gpt-5.5,Claude 模型示例可填 claude-opus-4-7

OpenClaw 配置教程

通过 OneKeyAPI 接入 OpenClaw。按下方步骤完成安装与配置,可选择 Anthropic(Claude)或 OpenAI(Codex)通道。

Anthropic(Claude)

https://api.onekeyapi.ai

Claude / Anthropic 接口不要带 /v1,示例模型:claude-opus-4-6。

OpenAI(Codex)

https://api.onekeyapi.ai/v1

OpenAI / Codex 接口必须带 /v1,示例模型:gpt-5.5。

安装与配置 OpenClaw

第一步:安装 OpenClaw

BASH
1npm install -g @openclaw/cli

第二步:选择接入通道

BASH
1export ANTHROPIC_API_KEY="YOUR_API_KEY"2openclaw onboard --auth-choice custom-api-key \3  --custom-base-url https://api.onekeyapi.ai \4  --custom-api-key-env ANTHROPIC_API_KEY \5  --custom-compatibility anthropic \6  --custom-model claude-opus-4-6

Anthropic(Claude)通道使用根地址,不要加 /v1

💡 请先在 密钥管理 获取对应分组的 API Key,并替换命令中的 YOUR_API_KEY

第三步:开始使用

TERMINAL
1openclaw

Hermes 配置教程

通过 OneKeyAPI 接入 Hermes。按下方步骤完成安装与配置,选择通道并写入配置文件。

安装与配置 Hermes

Claude / Anthropic 接口不要带 /v1;OpenAI / Codex 接口必须带 /v1。

第一步:安装 Hermes

BASH
1pipx install hermes-agent

第二步:选择接入通道

YAML
1mkdir -p ~/.hermes2cat > ~/.hermes/config.yaml << 'EOF'3model:4  default: claude-opus-4-75  provider: onekeyapi-claude6providers:7  onekeyapi-claude:8    api_mode: anthropic_messages9    base_url: https://api.onekeyapi.ai10    api_key: YOUR_API_KEY11    default_model: claude-opus-4-712    models:13      - claude-opus-4-714EOF
💡 请先在 密钥管理 获取对应分组的 API Key,并替换命令中的 YOUR_API_KEY

第三步:开始使用

TERMINAL
1hermes

API脚本 接入教程

下面示例覆盖文本、视觉和图片接口。复制后把 YOUR_API_KEY 替换为你的密钥即可运行。

OpenAI Responses 文本+视觉

新一代 OpenAI 接口,适合文本对话、图片理解和流式输出。

POST /v1/responses
1import json
2import urllib.request
3 
4API_URL = "https://api.onekeyapi.ai/v1/responses"
5API_KEY = "YOUR_API_KEY"
6 
7body = {
8 "model": "gpt-5.4-mini",
9 "stream": True,
10 "input": "用中文简单介绍一下 OneKeyAPI。",
11}
12 
13def iter_sse(response):
14 buffer = ""
15 while chunk := response.read(4096):
16 buffer += chunk.decode("utf-8", errors="replace")
17 frames = buffer.split("\n\n")
18 buffer = frames.pop()
19 for frame in frames:
20 data = "\n".join(line[5:].strip() for line in frame.splitlines() if line.startswith("data:")).strip()
21 if data and data != "[DONE]":
22 yield data
23 
24request = urllib.request.Request(
25 API_URL,
26 data=json.dumps(body).encode("utf-8"),
27 method="POST",
28 headers={"Authorization": "Bearer " + API_KEY, "Content-Type": "application/json", "Accept": "text/event-stream"},
29)
30 
31with urllib.request.urlopen(request, timeout=900) as response:
32 for data in iter_sse(response):
33 event = json.loads(data)
34 if event.get("type") == "response.output_text.delta":
35 print(event.get("delta", ""), end="", flush=True)
36 if event.get("type") in ("response.completed", "response.done"):
37 break
38print()

OpenAI Chat Completions 文本+视觉

兼容传统 OpenAI Chat 格式,适合已有客户端平滑迁移。

POST /v1/chat/completions
1import json
2import urllib.request
3 
4API_URL = "https://api.onekeyapi.ai/v1/chat/completions"
5API_KEY = "YOUR_API_KEY"
6 
7body = {
8 "model": "gpt-5.4-mini",
9 "stream": True,
10 "messages": [{"role": "user", "content": "用中文简单介绍一下 OneKeyAPI。"}],
11}
12 
13def iter_sse(response):
14 buffer = ""
15 while chunk := response.read(4096):
16 buffer += chunk.decode("utf-8", errors="replace")
17 frames = buffer.split("\n\n")
18 buffer = frames.pop()
19 for frame in frames:
20 data = "\n".join(line[5:].strip() for line in frame.splitlines() if line.startswith("data:")).strip()
21 if data and data != "[DONE]":
22 yield data
23 
24request = urllib.request.Request(
25 API_URL,
26 data=json.dumps(body).encode("utf-8"),
27 method="POST",
28 headers={"Authorization": "Bearer " + API_KEY, "Content-Type": "application/json", "Accept": "text/event-stream"},
29)
30 
31with urllib.request.urlopen(request, timeout=900) as response:
32 for data in iter_sse(response):
33 chunk = json.loads(data)
34 for choice in chunk.get("choices") or []:
35 print((choice.get("delta") or {}).get("content", ""), end="", flush=True)
36print()

Anthropic Messages 文本+视觉

Claude / Anthropic Messages 格式;图片模式会先转 base64 再提交。

POST /v1/messages
1import json
2import urllib.request
3 
4API_URL = "https://api.onekeyapi.ai/v1/messages"
5API_KEY = "YOUR_API_KEY"
6 
7body = {
8 "model": "claude-sonnet-4-6",
9 "max_tokens": 64000,
10 "stream": True,
11 "messages": [{"role": "user", "content": "用中文简单介绍一下 OneKeyAPI。"}],
12}
13 
14def iter_sse(response):
15 buffer = ""
16 while chunk := response.read(4096):
17 buffer += chunk.decode("utf-8", errors="replace")
18 frames = buffer.split("\n\n")
19 buffer = frames.pop()
20 for frame in frames:
21 data = "\n".join(line[5:].strip() for line in frame.splitlines() if line.startswith("data:")).strip()
22 if data and data != "[DONE]":
23 yield data
24 
25request = urllib.request.Request(
26 API_URL,
27 data=json.dumps(body).encode("utf-8"),
28 method="POST",
29 headers={"Authorization": "Bearer " + API_KEY, "Content-Type": "application/json", "Accept": "text/event-stream"},
30)
31 
32with urllib.request.urlopen(request, timeout=900) as response:
33 for data in iter_sse(response):
34 event = json.loads(data)
35 if event.get("type") == "content_block_delta":
36 print((event.get("delta") or {}).get("text", ""), end="", flush=True)
37 if event.get("type") == "message_stop":
38 break
39print()

gpt-image-2 图片生成

支持文生图,也可以通过 Responses 图片工具接入参考图生成。

POST /v1/images/generations
1import base64
2import json
3import urllib.request
4from pathlib import Path
5 
6API_URL = "https://api.onekeyapi.ai/v1/images/generations"
7API_KEY = "YOUR_API_KEY"
8 
9def iter_sse(response):
10 buffer = ""
11 while chunk := response.read(4096):
12 buffer += chunk.decode("utf-8", errors="replace")
13 frames = buffer.split("\n\n")
14 buffer = frames.pop()
15 for frame in frames:
16 data = "\n".join(line[5:].strip() for line in frame.splitlines() if line.startswith("data:")).strip()
17 if data and data != "[DONE]":
18 yield data
19 
20body = {"model": "gpt-image-2", "prompt": "生成一只太空猫", "n": 1, "size": "1024x1024", "stream": True, "response_format": "b64_json"}
21request = urllib.request.Request(
22 API_URL,
23 data=json.dumps(body).encode("utf-8"),
24 method="POST",
25 headers={"Authorization": "Bearer " + API_KEY, "Content-Type": "application/json", "Accept": "text/event-stream"},
26)
27 
28with urllib.request.urlopen(request, timeout=900) as response:
29 for data in iter_sse(response):
30 event = json.loads(data)
31 if event.get("type") == "image_generation.partial_image":
32 print(".", end="", flush=True)
33 if event.get("type") == "image_generation.completed":
34 image = event.get("b64_json") or (event.get("data") or [{}])[0].get("b64_json")
35 Path("generated-image.png").write_bytes(base64.b64decode(image))
36 print("\n图片已保存:generated-image.png")
37 break

gpt-image-2 图片编辑

上传图片并按提示修改,通过流式事件保存编辑结果。

POST /v1/images/edits
1import base64
2import json
3import mimetypes
4import urllib.request
5import uuid
6from pathlib import Path
7 
8API_URL = "https://api.onekeyapi.ai/v1/images/edits"
9API_KEY = "YOUR_API_KEY"
10IMAGE_HEADERS = {"User-Agent": "Mozilla/5.0", "Accept": "image/*,*/*;q=0.8"}
11 
12def iter_sse(response):
13 buffer = ""
14 while chunk := response.read(4096):
15 buffer += chunk.decode("utf-8", errors="replace")
16 frames = buffer.split("\n\n")
17 buffer = frames.pop()
18 for frame in frames:
19 data = "\n".join(line[5:].strip() for line in frame.splitlines() if line.startswith("data:")).strip()
20 if data and data != "[DONE]":
21 yield data
22 
23def multipart(fields, file_data, file_type):
24 boundary = "----onekeyapi-" + uuid.uuid4().hex
25 body = bytearray()
26 for name, value in fields.items():
27 body.extend(f"--{boundary}\r\nContent-Disposition: form-data; name=\"{name}\"\r\n\r\n{value}\r\n".encode())
28 body.extend(f"--{boundary}\r\nContent-Disposition: form-data; name=\"image\"; filename=\"source.png\"\r\nContent-Type: {file_type}\r\n\r\n".encode())
29 body.extend(file_data)
30 body.extend(f"\r\n--{boundary}--\r\n".encode())
31 return bytes(body), "multipart/form-data; boundary=" + boundary
32 
33image_request = urllib.request.Request("https://api.onekeyapi.ai/logo.png", headers=IMAGE_HEADERS)
34with urllib.request.urlopen(image_request, timeout=60) as image_response:
35 image_type = image_response.headers.get("content-type", "").split(";")[0] or mimetypes.guess_type("source.png")[0] or "image/png"
36 image_data = image_response.read()
37 
38body, content_type = multipart(
39 {"prompt": "把图片整体颜色更改为蓝色。", "model": "gpt-image-2", "n": "1", "quality": "auto", "size": "1024x1024", "stream": "true", "response_format": "b64_json"},
40 image_data,
41 image_type,
42)
43request = urllib.request.Request(API_URL, data=body, method="POST", headers={"Authorization": "Bearer " + API_KEY, "Content-Type": content_type, "Accept": "text/event-stream"})
44 
45with urllib.request.urlopen(request, timeout=900) as response:
46 for data in iter_sse(response):
47 event = json.loads(data)
48 image = event.get("b64_json") or ((event.get("data") or [{}])[0]).get("b64_json") or (event.get("item") or {}).get("result")
49 if event.get("type") == "image_generation.partial_image":
50 print(".", end="", flush=True)
51 if image:
52 Path("edited-image.png").write_bytes(base64.b64decode(image))
53 print("\n图片已保存:edited-image.png")
54 break