将 Cursor 聊天 API 转换为 OpenAI 兼容格式。
- OpenAI 兼容接口 - 标准
/v1/chat/completions格式 - 流式响应支持 - 实时返回生成内容
- 多模型支持 - GPT-5、Claude 系列、Gemini、DeepSeek
- 自动初始化 - 浏览器环境自动获取访问权限
# 安装依赖
pip install -r requirements.txt
# 安装浏览器
playwright install chromium# 使用启动脚本(推荐)
./start.sh
# 或手动启动
export API_KEY="your-secret-key" # 可选
python3 cursor_proxy.py
# 停止服务
./stop.shdocker build -t cursor-proxy .
docker run -d -p 8888:8888 \
-e OPENAI_API_KEY="your-secret-key" \
--shm-size=2g \
cursor-proxy# 健康检查
curl http://localhost:8888/health
# 非流式(如果设置了 API_KEY 需要加 Authorization 头)
curl -X POST http://localhost:8888/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-secret-key" \
-d '{"model":"claude-sonnet-4-20250514","messages":[{"role":"user","content":"你好"}]}'
# 流式(需要 -N 参数)
curl -N -X POST http://localhost:8888/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-secret-key" \
-d '{"model":"claude-sonnet-4-20250514","stream":true,"messages":[{"role":"user","content":"你好"}]}'from openai import OpenAI
client = OpenAI(
api_key="your-secret-key", # 如果设置了 API_KEY
base_url="http://localhost:8888/v1"
)
# 非流式
response = client.chat.completions.create(
model="claude-sonnet-4-20250514",
messages=[{"role": "user", "content": "你好"}]
)
print(response.choices[0].message.content)
# 流式
stream = client.chat.completions.create(
model="claude-sonnet-4-20250514",
messages=[{"role": "user", "content": "你好"}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)| 端点 | 说明 | 需要认证 |
|---|---|---|
POST /v1/chat/completions |
聊天完成(OpenAI 兼容) | ✅ |
GET /v1/models |
模型列表 | ❌ |
GET /health |
健康检查 | ❌ |
认证方式: Authorization: Bearer <your-api-key>(仅当设置了 API_KEY 环境变量时需要)
gpt-5claude-opus-4-1-20250805claude-opus-4-20250514claude-sonnet-4-20250514(默认)gemini-2.5-prodeepseek-v3.1
使用 Playwright 启动 Chromium 浏览器,访问 Cursor 网站并通过 JavaScript 调用其内部 API,将响应转换为 OpenAI 兼容格式。
- Playwright 启动持久化浏览器会话,自动完成页面初始化
- Python 通过
page.evaluate()执行 JavaScript 代码调用 Cursor API - JavaScript 使用 ReadableStream 实时读取响应
- 通过
expose_function()将数据实时传回 Python - FastAPI 以 SSE 格式流式返回给客户端
| 变量 | 说明 | 默认值 |
|---|---|---|
API_KEY |
API 认证密钥,不设置则无需认证 | 空 |
HEADLESS |
无头模式,Linux/Docker 建议设为 true |
false |
1. 启动时报错:Failed to create a ProcessSingleton
原因:浏览器进程已在运行,占用了会话目录。
解决:
# 使用停止脚本(推荐)
./stop.sh
# 或手动清理
pkill -9 -f cursor_proxy.py
pkill -9 -f Chromium2. API 返回 401 Unauthorized
原因:设置了 API_KEY 但请求未带 Authorization 头。
解决:
# 添加 Authorization 头
curl -H "Authorization: Bearer your-secret-key" ...
# 或不设置 API_KEY(开发环境)
unset API_KEY3. 检查服务状态
# 健康检查
curl http://localhost:8888/health
# 查看进程
ps aux | grep cursor_proxy.py
# 查看日志
tail -f /tmp/cursor_proxy.log4. 浏览器未安装
playwright install chromium5. Docker 相关
# 查看容器日志
docker logs -f <container_id>
# 重启容器
docker restart <container_id>
# 重建镜像
docker build -t cursor-proxy . && docker run -d -p 8888:8888 cursor-proxy- 无头模式:Docker 环境自动使用
HEADLESS=true - 共享内存:Docker 运行需要增加
--shm-size=2g - 系统依赖:Dockerfile 已包含所有必需的浏览器依赖库
- 初始化时间:首次启动需要 10-30 秒进行页面初始化