AWS Kiro 账号池管理系统 - 将 Amazon Q Developer (Kiro) API 转换为 OpenAI 兼容格式的企业级 Go 代理服务。支持多账号池管理、OIDC 自动认证、令牌自动刷新、流式响应、完整的 Web 管理控制台。
关键词: AWS Kiro, Amazon Q Developer, Claude API, OpenAI Proxy, 账号池管理, OIDC 认证, Go 代理服务, 多账号管理, API 转换, 企业级代理
- 多账号池: 支持最多 100 个 AWS Kiro (Amazon Q Developer) 账号统一管理
- OIDC 自动认证: 完整的 AWS OIDC 设备授权流程,无需手动获取令牌
- 智能负载均衡: 自动选择可用账号,均衡分配请求负载
- 令牌自动刷新: 后台自动检测并刷新过期的 AWS 令牌,保持账号池持续可用
- 账号状态监控: 实时监控每个 Kiro 账号的健康状态、使用次数、最后使用时间
- 批量导入导出: 支持批量添加、导入、导出 AWS Kiro 账号配置
- OpenAI 兼容: 完全兼容 OpenAI Chat Completions API 格式
- Claude 支持: 支持 Claude Messages API 格式
- 流式响应: SSE (Server-Sent Events) 流式输出
- 工具调用: 完整支持 Function Calling / Tool Use
- 模型映射: Claude 4.5 Opus、Sonnet 4.5、Sonnet 3.5 自动映射到 Amazon Q
- API Key 认证: 自定义 API Key 保护服务访问
- 密码保护: 管理控制台密码保护
- IP 黑名单: 支持封禁/解封特定 IP 地址
- 频率限制: 可配置的 IP 和 API Key 双重限流
- 现代化界面: Vue.js 3 驱动的响应式 Web 控制台
- 账号池监控: 实时查看所有 AWS Kiro 账号状态、令牌有效期、使用统计
- 在线测试: 内置聊天测试界面,支持流式对话
- 请求日志: 完整的 API 请求日志、统计图表、错误追踪
- 批量操作: 批量添加、删除、刷新 Kiro 账号
- 系统设置: 可视化配置 API Key、限流规则、日志保留策略
从 Releases 下载对应平台的压缩包:
# Linux AMD64
wget https://github.com/kkddytd/claude-api/releases/latest/download/claude-server-linux-amd64.tar.gz
tar -xzf claude-server-linux-amd64.tar.gz
./claude-server
# macOS (Apple Silicon)
wget https://github.com/kkddytd/claude-api/releases/latest/download/claude-server-darwin-arm64.tar.gz
tar -xzf claude-server-darwin-arm64.tar.gz
./claude-server
# Windows
# 下载 claude-server-windows-amd64.zip 并解压
# 双击运行 claude-server.exe# 克隆仓库
git clone https://github.com/kkddytd/claude-api.git
cd claude-api
# 安装 Go 依赖
go mod download
# 编译
go build -o claude-server main.go
# 运行
./claude-server首次使用:
- 访问控制台:
http://localhost:62311 - 默认密码:
admin(首次登录后请立即修改) - 添加 AWS Kiro 账号:点击"账号管理" → "添加账号" → 完成 OIDC 授权
- 配置 API Key:点击"系统设置" → 设置自定义 API Key
- 开始使用:使用 OpenAI SDK 连接到
http://localhost:62311/v1
项目提供了强大的 build.sh 脚本,支持多平台编译:
# 构建当前平台(server + desktop)
./build.sh
# 仅构建后端服务
./build.sh server
# 仅构建桌面应用(macOS + Windows)
./build.sh desktop
# 构建所有平台
./build.sh all
# 清理构建产物
./build.sh clean
# 指定版本构建
./build.sh server -v v1.2.0
# 指定平台构建
./build.sh server -p linux/amd64
# 构建选项
./build.sh --no-cache # 禁用构建缓存
./build.sh --verbose # 显示详细日志
./build.sh -h # 显示帮助信息服务端:
- Linux: amd64, arm64
- macOS: amd64, arm64
- Windows: amd64, arm64
桌面应用:
- macOS: Universal (需要 Wails v2)
- Windows: amd64 (需要 Wails v2)
dist/
├── server/
│ ├── claude-server-linux-amd64.tar.gz
│ ├── claude-server-linux-arm64.tar.gz
│ ├── claude-server-darwin-amd64.tar.gz
│ ├── claude-server-darwin-arm64.tar.gz
│ ├── claude-server-windows-amd64.zip
│ └── claude-server-windows-arm64.zip
└── desktop/
├── Claude-API-Server-macOS.zip
└── Claude-API-Server-Windows.zip
# 当前平台
go build -o claude-server main.go
# 带版本号
go build -ldflags="-X main.Version=v1.0.0" -o claude-server main.go
# 跨平台编译
GOOS=linux GOARCH=amd64 go build -o claude-server-linux-amd64 main.go
GOOS=darwin GOARCH=arm64 go build -o claude-server-darwin-arm64 main.go
GOOS=windows GOARCH=amd64 go build -o claude-server-windows-amd64.exe main.go创建服务文件 /etc/systemd/system/claude-api.service:
[Unit]
Description=Claude API Server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/claude-api
ExecStart=/opt/claude-api/claude-server
Restart=on-failure
RestartSec=5s
# 环境变量(可选)
Environment="PORT=62311"
[Install]
WantedBy=multi-user.target启动服务:
# 部署文件
sudo mkdir -p /opt/claude-api
sudo cp claude-server /opt/claude-api/
sudo chown -R www-data:www-data /opt/claude-api
# 启动服务
sudo systemctl daemon-reload
sudo systemctl enable claude-api
sudo systemctl start claude-api
# 查看状态
sudo systemctl status claude-api
# 查看日志
sudo journalctl -u claude-api -fserver {
listen 80;
server_name api.example.com;
# 重定向到 HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name api.example.com;
# SSL 证书
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# SSL 配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:62311;
proxy_http_version 1.1;
# WebSocket 支持
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
# 代理头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 流式响应支持
proxy_buffering off;
proxy_cache_bypass $http_upgrade;
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
}
}重载 Nginx:
sudo nginx -t
sudo systemctl reload nginx# 安装 PM2
npm install -g pm2
# 创建 ecosystem.config.js
cat > ecosystem.config.js << 'EOF'
module.exports = {
apps: [{
name: 'claude-api',
script: './claude-server',
cwd: '/opt/claude-api',
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '500M',
env: {
PORT: 62311
}
}]
}
EOF
# 启动
pm2 start ecosystem.config.js
# 查看状态
pm2 status
# 查看日志
pm2 logs claude-api
# 开机自启
pm2 startup
pm2 save支持的环境变量:
# 服务端口
export PORT=62311
# 数据目录(桌面应用)
export DATA_DIR=/path/to/data
# 禁用浏览器自动打开
export NO_BROWSER=true# 备份数据库
cp data.sqlite3 data.sqlite3.backup.$(date +%Y%m%d_%H%M%S)
# 定时备份(crontab)
0 2 * * * cd /opt/claude-api && cp data.sqlite3 backups/data.sqlite3.$(date +\%Y\%m\%d)
# 保留最近 7 天的备份
0 3 * * * find /opt/claude-api/backups -name "data.sqlite3.*" -mtime +7 -deletefrom openai import OpenAI
client = OpenAI(
api_key="your-api-key",
base_url="http://localhost:62311/v1"
)
# 普通对话
response = client.chat.completions.create(
model="claude-sonnet-4.5",
messages=[
{"role": "user", "content": "你好"}
]
)
print(response.choices[0].message.content)
# 流式对话
stream = client.chat.completions.create(
model="claude-sonnet-4.5",
messages=[
{"role": "user", "content": "写一首诗"}
],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")import OpenAI from 'openai';
const client = new OpenAI({
apiKey: 'your-api-key',
baseURL: 'http://localhost:62311/v1'
});
// 普通对话
const response = await client.chat.completions.create({
model: 'claude-sonnet-4.5',
messages: [
{ role: 'user', content: '你好' }
]
});
console.log(response.choices[0].message.content);
// 流式对话
const stream = await client.chat.completions.create({
model: 'claude-sonnet-4.5',
messages: [
{ role: 'user', content: '写一首诗' }
],
stream: true
});
for await (const chunk of stream) {
if (chunk.choices[0]?.delta?.content) {
process.stdout.write(chunk.choices[0].delta.content);
}
}# 普通请求
curl -X POST http://localhost:62311/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"model": "claude-sonnet-4.5",
"messages": [
{"role": "user", "content": "你好"}
]
}'
# 流式请求
curl -X POST http://localhost:62311/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"model": "claude-sonnet-4.5",
"messages": [
{"role": "user", "content": "你好"}
],
"stream": true
}'database:
type: sqlite # 或 mysql
sqlite:
path: data.sqlite3
mysql:
host: localhost
port: 3306
user: root
password: ""
database: claude-api
charset: utf8mb4
server:
host: 0.0.0.0
port: 62311
debug: false
test: false| 设置项 | 说明 | 默认值 |
|---|---|---|
apiKey |
OpenAI API Key | 空 |
adminPassword |
管理员密码 | admin |
debugLog |
调试日志 | false |
enableRequestLog |
请求日志 | true |
logRetentionDays |
日志保留天数 | 30 |
enableIPRateLimit |
IP 频率限制 | false |
ipRateLimitWindow |
限制时间窗口(分钟) | 1 |
ipRateLimitMax |
窗口内最大请求数 | 100 |
POST /v1/chat/completions
Content-Type: application/json
Authorization: Bearer YOUR_API_KEY
{
"model": "claude-sonnet-4.5",
"messages": [
{"role": "user", "content": "你好"}
],
"stream": true
}支持的模型:
claude-4.5-opus-high- Claude 4.5 Opus (高性能)claude-4.5-opus-low- Claude 4.5 Opus (低成本)claude-sonnet-4.5- Claude Sonnet 4.5claude-sonnet-3.5- Claude Sonnet 3.5
# 账号管理
GET /v2/accounts # 列出账号
POST /v2/accounts # 创建账号
POST /v2/accounts/feed # 批量添加
POST /v2/accounts/import # 导入账号
GET /v2/accounts/export # 导出账号
DELETE /v2/accounts/:id # 删除账号
# 设置管理
GET /v2/settings # 获取设置
PUT /v2/settings # 更新设置
# 日志管理
GET /v2/logs # 获取日志
GET /v2/logs/stats # 统计数据
POST /v2/logs/cleanup # 清理日志
# IP 管理
GET /v2/ips/blocked # 被封禁的 IP
POST /v2/ips/block # 封禁 IP
POST /v2/ips/unblock # 解封 IPclaude-api/
├── main.go # 程序入口,HTTP 服务器启动
├── build.sh # 多平台构建脚本
├── config.yaml # 配置文件(可选)
├── internal/ # 内部包
│ ├── api/ # API 服务器
│ │ ├── server.go # 服务器核心、中间件、缓存
│ │ ├── routes.go # 路由配置
│ │ ├── handlers.go # 请求处理器(主要逻辑)
│ │ └── cache.go # 账号池、设置缓存
│ ├── amazonq/ # Amazon Q 客户端
│ │ ├── client.go # HTTP 客户端
│ │ ├── parser.go # 响应解析
│ │ └── errors.go # 错误处理
│ ├── auth/ # 认证模块
│ │ ├── oidc.go # OIDC 设备授权流程
│ │ ├── kiro.go # Kiro 社交登录
│ │ └── apikey.go # API Key 验证
│ ├── claude/ # 格式转换
│ │ └── converter.go # OpenAI ↔ Amazon Q 格式转换
│ ├── stream/ # 流处理
│ │ ├── parser.go # SSE 流解析
│ │ ├── openai_sse.go # OpenAI 格式流
│ │ ├── claude_sse.go # Claude 格式流
│ │ └── unified_sse.go # 统一流处理
│ ├── database/ # 数据库
│ │ ├── database.go # 数据库初始化
│ │ ├── accounts.go # 账号管理
│ │ ├── users.go # 用户管理
│ │ ├── settings.go # 系统设置
│ │ ├── logs.go # 请求日志
│ │ ├── proxy.go # 代理管理
│ │ └── blocked_ips.go # IP 黑名单
│ ├── models/ # 数据模型
│ │ ├── account.go # 账号模型
│ │ ├── user.go # 用户模型
│ │ ├── settings.go # 设置模型
│ │ ├── openai.go # OpenAI 格式
│ │ ├── claude.go # Claude 格式
│ │ └── amazonq.go # Amazon Q 格式
│ ├── config/ # 配置管理
│ ├── logger/ # 日志系统
│ ├── tokenizer/ # Token 计数
│ ├── compressor/ # 上下文压缩器
│ ├── proxy/ # 代理池管理
│ ├── ratelimit/ # 双重限流器(IP + API Key)
│ └── utils/ # 工具函数
├── frontend/ # Web 前端
│ ├── index.html # 主页面
│ ├── login.html # 登录页面
│ ├── js/ # JavaScript 模块
│ │ ├── app.js # 主应用入口
│ │ ├── accounts.js # 账号管理
│ │ ├── users.js # 用户管理
│ │ ├── settings.js # 系统设置
│ │ ├── chat.js # 聊天界面
│ │ ├── logs.js # 请求日志
│ │ ├── ips.js # IP 管理
│ │ └── api.js # API 封装
│ ├── css/ # 样式文件
│ └── vendor/ # 第三方库(Vue.js、Marked 等)
├── scripts/ # 辅助脚本
│ ├── start.sh # 启动脚本
│ ├── stop.sh # 停止脚本
│ └── setup.sh # 环境配置
└── dist/ # 编译产物(自动生成)
└── server/ # 各平台服务端程序
- 后端: Go 1.24+, Gin
- 数据库: SQLite (glebarez/sqlite - 纯 Go,无需 CGO) / MySQL
- 前端: Vue.js 3
- Token 计数: anthropic-tokenizer-go
claude-api/
├── main.go # 程序入口
├── build.sh # 构建脚本
├── config.yaml # 配置文件
├── internal/ # 内部包
│ ├── api/ # API 服务器
│ │ ├── server.go # 服务器核心
│ │ ├── routes.go # 路由配置
│ │ └── handlers.go # 请求处理器
│ ├── amazonq/ # Amazon Q 客户端
│ ├── auth/ # 认证模块
│ ├── claude/ # 格式转换
│ ├── stream/ # 流处理
│ ├── database/ # 数据库
│ ├── models/ # 数据模型
│ ├── config/ # 配置管理
│ ├── logger/ # 日志系统
│ ├── tokenizer/ # Token 计数
│ └── sync/ # 同步客户端
├── frontend/ # Web 前端
│ ├── index.html
│ ├── js/
│ └── css/
│ ├── server.py
│ └── requirements.txt
└── dist/ # 编译产物
客户端 → Gin Router → 认证中间件 → 账号选择器 → 格式转换器 → Amazon Q API
↓
客户端 ← OpenAI 格式 ← 流解析器 ← SSE 流 ← Amazon Q 响应
1. 令牌刷新失败
错误: failed to refresh token
解决: 检查 refreshToken 是否有效,尝试重新授权
2. 连接超时
错误: context deadline exceeded
解决: 检查网络连接,考虑配置 HTTP_PROXY
3. 数据库锁定
错误: database is locked
解决: 确保没有其他进程使用数据库,或重启服务器
curl http://localhost:62311/healthz
# 预期响应: {"status":"ok"}- 控制台日志: 直接输出到终端
- 请求日志: 存储在数据库
request_logs表 - 调试日志: 启用调试模式后在控制台输出
- 修改默认密码: 首次启动后立即修改管理员密码
- 使用 HTTPS: 生产环境使用 Nginx 反向代理并配置 SSL
- 限制访问: 使用防火墙限制管理控制台访问
- 定期备份: 定期备份
data.sqlite3数据库 - 监控日志: 定期查看请求日志,发现异常及时处理
MIT License




