高性能异步 AI 代理服务,将 JetBrains AI 的大语言模型转换为 OpenAI API 格式,支持真正的流式响应和高并发处理。
- 新增 Anthropic API 兼容:无缝对接 Anthropic SDK,现已支持
/v1/messages
端点。 - 智能配额管理:自动检测并轮换超出配额的 JetBrains 账户,最大化服务可用性。
- 全面兼容 Function Calling:完全实现 OpenAI 的
tools
和tool_calls
功能,支持完整的函数调用流程。
- 增强 OpenAI 兼容性:优化了对消息
role
的处理逻辑,修复了因角色不规范导致部分客户端调用失败的问题,提升了整体适配性。
- 新增 JWT 自动刷新机制:告别每日手动更换 JWT!现在可以通过配置
licenseId
和authorization
实现 JWT 自动刷新,一劳永逸。 - 向下兼容:旧的
jwt
配置格式仍然有效,可与新格式混合使用,无缝升级。
- ⚡ 高并发异步架构:基于 httpx + FastAPI,支持数千并发连接
- 🔧 OpenAI 完全兼容:零修改集成现有 OpenAI 客户端和工具
- 🔐 动态认证:支持 JWT 自动刷新与轮询,大幅简化认证管理
- 📦 开箱即用:Docker 一键部署,配置简单
git clone https://github.com/oDaiSuno/jetbrainsai2api.git
cd jetbrainsai2api
通过IDE(这里以Pycharm为例)和Reqable(小黄鸟)获取JWT
-
打开小黄鸟并启动
代理设置
,在pycharm中与AI聊下天,在小黄鸟中找到类似于auth/jetbrains-jwt/provide-access/license/v2
的接口,然后将请求头里的authorization
(注意只需复制Bear
后面的内容)和请求体里的licenseId
复制下来 -
当然,你也可以直接在小黄鸟中寻找类似于
v5/llm/chat/stream/v7
的接口,把请求头中grazie-authenticate-jwt
的内容复制下来即为你的JWT
。
创建 jetbrainsai.json
文件。支持以下两种格式,可混合使用:
1. 自动刷新(推荐)
licenseId
和authorization
可在 JetBrains 相关的登录验证请求中捕获。(如上述2.过程)
[
{
"licenseId": "Oxxxx",
"authorization": "eyJhbGcxxx"
}
]
2. 静态 JWT
[
{
"jwt": "your-jwt-here-1"
}
]
3. 混合使用
[
{
"jwt": "your-jwt-here-1",
"licenseId": "Oxxxx",
"authorization": "eyJhbGcxxx"
}
]
创建 client_api_keys.json
:
[
"sk-client-key-1",
"sk-client-key-2"
]
创建 models.json
:
[
"anthropic-claude-3.7-sonnet",
"anthropic-claude-4-sonnet",
"google-chat-gemini-pro-2.5",
"openai-o4-mini",
"openai-o3-mini",
"openai-o3",
"openai-o1",
"openai-gpt-4o",
"anthropic-claude-3.5-sonnet",
"openai-gpt4.1"
]
docker-compose up -d
pip install -r requirements.txt
uvicorn main:app --host 0.0.0.0 --port 8000
# file: proxy_runner.py
python proxy_runner.py
此方式专为需要通过代理访问外网的用户设计,会自动检测Clash代理并配置环境变量。
curl -H "Authorization: Bearer sk-client-key-1" http://localhost:8000/v1/models
POST /v1/chat/completions
Authorization: Bearer <client-api-key>
Content-Type: application/json
请求示例:
{
"model": "anthropic-claude-3.5-sonnet",
"messages": [
{"role": "user", "content": "你好"}
],
"stream": true
}
此接口用于兼容 Anthropic SDK。
POST /v1/messages
x-api-key: <client-api-key>
Content-Type: application/json
x-anthropic-version: 2023-06-01
请求示例:
{
"model": "anthropic-claude-3.5-sonnet",
"messages": [
{"role": "user", "content": "你好"}
],
"max_tokens": 1024,
"stream": true
}
Note
使用 Anthropic SDK 时,请务必在 client
初始化时传入 base_url
。
GET /v1/models
Authorization: Bearer <client-api-key>
import openai
client = openai.OpenAI(
api_key="sk-client-key-1",
base_url="http://localhost:8000/v1"
)
# 流式对话
response = client.chat.completions.create(
model="anthropic-claude-3.5-sonnet",
messages=[{"role": "user", "content": "写一首关于春天的诗"}],
stream=True
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
import anthropic
client = anthropic.Anthropic(
api_key="sk-client-key-1",
base_url="http://localhost:8000/v1",
)
with client.messages.stream(
max_tokens=1024,
messages=[{"role": "user", "content": "写一首关于夏天的诗"}],
model="anthropic-claude-3.5-sonnet",
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
# OpenAI API
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Authorization: Bearer sk-client-key-1" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic-claude-3.5-sonnet",
"messages": [{"role": "user", "content": "你好"}],
"stream": true
}'
# Anthropic API
curl -X POST http://localhost:8000/v1/messages \
-H "x-api-key: sk-client-key-1" \
-H "Content-Type: application/json" \
-H "x-anthropic-version: 2023-06-01" \
-d '{
"model": "anthropic-claude-3.5-sonnet",
"messages": [{"role": "user", "content": "你好"}],
"max_tokens": 1024,
"stream": true
}'
jetbrainsai2api/
├── main.py # 主程序(异步服务器 + API 适配器)
├── proxy_runner.py # 代理模式启动脚本
├── requirements.txt # Python 依赖
├── Dockerfile # Docker 构建文件
├── docker-compose.yml # Docker Compose 配置
├── jetbrainsai.json # JetBrains AI JWT 配置
├── client_api_keys.json # 客户端 API 密钥配置
└── models.json # 可用模型配置