Files
cursor-api/README.md
2025-08-14 18:21:36 +08:00

1938 lines
54 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# cursor-api
## 说明
* 当前版本已稳定,若发现响应出现缺字漏字,与本程序无关。
* 若发现首字慢,与本程序无关。
* 若发现响应出现乱码,也与本程序无关。
* 属于官方的问题,请不要像作者反馈。
* 本程序拥有堪比客户端原本的速度,甚至可能更快。
* 本程序的性能是非常厉害的。
* 根据本项目开源协议Fork的项目不能以作者的名义进行任何形式的宣传、推广或声明。
* 更新的时间跨度达5月有余了求赞助项目不收费不定制。
* 推荐自部署,[官方网站](https://cc.wisdgod.com) 仅用于作者测试,不保证稳定性。
## 获取key
1. 访问 [www.cursor.com](https://www.cursor.com) 并完成注册登录
2. 在浏览器中打开开发者工具F12
3. 在 Application-Cookies 中查找名为 `WorkosCursorSessionToken` 的条目,并复制其第三个字段。请注意,%3A%3A 是 :: 的 URL 编码形式cookie 的值使用冒号 (:) 进行分隔。
## 配置说明
### 环境变量
* `PORT`: 服务器端口号默认3000
* `AUTH_TOKEN`: 认证令牌必须用于API认证
* `ROUTE_PREFIX`: 路由前缀(可选)
更多请查看 `/env-example`
### Token文件格式已弃用
`.tokens` 文件每行为token和checksum的对应关系
```
# 这里的#表示这行在下次读取要删除
token1,checksum1
token2,checksum2
```
该文件可以被自动管理,但用户仅可在确认自己拥有修改能力时修改,一般仅有以下情况需要手动修改:
* 需要删除某个 token
* 需要使用已有 checksum 来对应某一个 token
### 模型列表
写死了,后续也不会会支持自定义模型列表,因为本身就支持动态更新,详见[更新模型列表说明](#更新模型列表说明)
```
claude-4-sonnet
claude-4-sonnet-thinking
claude-4-opus-thinking
claude-4-opus
default
claude-3.5-sonnet
o3
gemini-2.5-pro-preview-05-06
gemini-2.5-flash-preview-04-17
gpt-4.1
claude-3.7-sonnet
claude-3.7-sonnet-thinking
cursor-small
claude-3.5-haiku
gemini-2.5-pro-exp-03-25
gpt-4o
o4-mini
deepseek-r1
deepseek-v3.1
grok-3-beta
grok-3-mini
```
支持图像(default始终支持)
```
claude-4-sonnet
claude-4-sonnet-thinking
claude-4-opus-thinking
claude-4-opus
claude-3.5-sonnet
o3
gemini-2.5-pro-preview-05-06
gemini-2.5-flash-preview-04-17
gpt-4.1
claude-3.7-sonnet
claude-3.7-sonnet-thinking
claude-3.5-haiku
gemini-2.5-pro-exp-03-25
gpt-4o
o4-mini
```
支持思考:
```
claude-4-sonnet-thinking
claude-4-opus-thinking
o3
gemini-2.5-pro-preview-05-06
gemini-2.5-flash-preview-04-17
claude-3.7-sonnet-thinking
gemini-2.5-pro-exp-03-25
o4-mini
deepseek-r1
```
支持Max与非Max
```
claude-4-sonnet
claude-4-sonnet-thinking
claude-3.5-sonnet
gemini-2.5-pro-preview-05-06
gpt-4.1
claude-3.7-sonnet
claude-3.7-sonnet-thinking
gemini-2.5-pro-exp-03-25
o4-mini
grok-3-beta
```
Max Only
```
claude-4-opus-thinking
claude-4-opus
o3
```
非Max Only
```
default
gemini-2.5-flash-preview-04-17
cursor-small
claude-3.5-haiku
gpt-4o
deepseek-r1
deepseek-v3.1
grok-3-mini
```
## 接口说明
### 基础对话
* 接口地址: `/v1/chat/completions`
* 请求方法: POST
* 认证方式: Bearer Token
1. 使用环境变量 `AUTH_TOKEN` 进行认证
2. ~~使用 `.token` 文件中的令牌列表进行轮询认证~~ 在v0.1.3的rc版本更新中移除`.token`文件
3. ~~自v0.1.3-rc.3起支持直接使用 token,checksum 进行认证,但未提供配置关闭~~ v0.3.0起不再支持
4. 使用 `/build-key` 构建的动态密钥认证
5. 使用 `/config` 设置的共享Token进行认证 (关联:环境变量`SHARED_TOKEN`)
6. 日志中的缓存 token key 的两种表示方式认证 (`/build-key` 同时也会给出这两种格式作为动态密钥的别名该数字key本质为一个192位的整数)
#### 请求格式
```json
{
"model": string,
"messages": [
{
"role": "system" | "user" | "assistant", // 也可以是 "developer" | "human" | "ai"
"content": string | [
{
"type": "text" | "image_url",
"text": string,
"image_url": {
"url": string
}
}
]
}
],
"stream": boolean,
"stream_options": {
"include_usage": boolean
}
}
```
#### 响应格式
如果 `stream``false`:
```json
{
"id": string,
"object": "chat.completion",
"created": number,
"model": string,
"choices": [
{
"index": number,
"message": {
"role": "assistant",
"content": string
},
"finish_reason": "stop" | "length"
}
],
"usage": {
"prompt_tokens": 0,
"completion_tokens": 0,
"total_tokens": 0
}
}
```
如果 `stream``true`:
```
data: {"id":string,"object":"chat.completion.chunk","created":number,"model":string,"choices":[{"index":number,"delta":{"role":"assistant","content":string},"finish_reason":null}]}
data: {"id":string,"object":"chat.completion.chunk","created":number,"model":string,"choices":[{"index":number,"delta":{"content":string},"finish_reason":null}]}
data: {"id":string,"object":"chat.completion.chunk","created":number,"model":string,"choices":[{"index":number,"delta":{},"finish_reason":"stop"}]}
data: [DONE]
```
### 获取模型列表
* 接口地址: `/v1/models`
* 请求方法: GET
* 认证方式: Bearer Token
#### 查询参数
可选的 JSON 请求体用于作为请求模型列表的参数:
```json
{
"is_nightly": boolean, // 是否包含 nightly 版本模型,默认 false
"include_long_context_models": boolean, // 是否包含长上下文模型,默认 false
"exclude_max_named_models": boolean, // 是否排除 max 命名的模型,默认 false
"additional_model_names": [string] // 额外包含的模型名称列表,默认空数组
}
```
**注意**: 认证可选,查询参数可选且认证时生效,未提供时使用默认值。
#### 响应格式
```json
{
"object": "list",
"data": [
{
"id": string,
"display_name": string,
"created": number,
"created_at": string,
"object": "model",
"type": "model",
"owned_by": string,
"supports_thinking": boolean,
"supports_images": boolean,
"supports_max_mode": boolean,
"supports_non_max_mode": boolean
}
]
}
```
#### 更新模型列表说明
每次携带Token时都会拉取最新的模型列表与上次更新需距离至少30分钟。`additional_model_names` 可以用添加额外模型。
### Token管理接口
#### 简易Token信息管理页面
* 接口地址: `/tokens`
* 请求方法: GET
* 响应格式: HTML页面
* 功能: 调用下面的各种相关API的示例页面
#### 获取Token信息
* 接口地址: `/tokens/get`
* 请求方法: POST
* 认证方式: Bearer Token
* 响应格式:
```json
{
"status": "success",
"tokens": [
[
number,
string,
{
"bundle": {
"primary_token": string,
"secondary_token": string, // 可选
"checksum": {
"first": string,
"second": string,
},
"client_key": string, // 可选,非空时显示
"config_version": string, // 可选
"session_id": string, // 可选
"proxy": string, // 可选
"timezone": string, // 可选
"gcpp_host": object, // 可选
"user": { // 可选
"email": string,
"name": string,
"updated_at": string,
"picture": string, // 可选
"is_on_new_pricing": boolean
}
},
"status": "enabled" | "disabled",
"stripe": { // 可选
"membership_type": "free" | "free_trial" | "pro" | "pro_plus" | "ultra" | "enterprise",
"payment_id": string, // 可选
"days_remaining_on_trial": number,
"subscription_status": "trialing" | "active" | "incomplete" | "incomplete_expired" | "past_due" | "canceled" | "unpaid" | "paused", // 可选
"verified_student": boolean, // 可选
"is_on_student_plan": boolean // 可选
}
}
]
],
"tokens_count": number
}
```
#### 设置Token信息
* 接口地址: `/tokens/set`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
[
[
string,
{
"bundle": {
"primary_token": string,
"secondary_token": string, // 可选
"checksum": {
"first": string,
"second": string,
},
"client_key": string, // 可选
"config_version": string, // 可选
"session_id": string, // 可选
"proxy": string, // 可选
"timezone": string, // 可选
"gcpp_host": object, // 可选
"user": { // 可选
"email": string,
"name": string,
"updated_at": string,
"picture": string, // 可选
"is_on_new_pricing": boolean
}
},
"status": "enabled" | "disabled",
"stripe": { // 可选
"membership_type": "free" | "free_trial" | "pro" | "pro_plus" | "ultra" | "enterprise",
"payment_id": string, // 可选
"days_remaining_on_trial": number,
"subscription_status": "trialing" | "active" | "incomplete" | "incomplete_expired" | "past_due" | "canceled" | "unpaid" | "paused", // 可选
"verified_student": boolean // 可选
}
}
]
]
```
* 响应格式:
```json
{
"status": "success",
"tokens_count": number,
"message": "Token files have been updated and reloaded"
}
```
#### 添加Token
* 接口地址: `/tokens/add`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
{
"tokens": [
{
"alias": string, // 可选,无则自动生成
"token": string,
"checksum": string, // 可选,无则自动生成
"client_key": string, // 可选,无则自动生成
"session_id": string, // 可选
"config_version": string, // 可选
"proxy": string, // 可选
"timezone": string, // 可选
"gcpp_host": string // 可选
}
],
"status": "enabled" | "disabled"
}
```
* 响应格式:
```json
{
"status": "success",
"tokens_count": number,
"message": string // "New tokens have been added and reloaded" 或 "No new tokens were added"
}
```
#### 删除Token
* 接口地址: `/tokens/del`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
{
"aliases": [string], // 要删除的token列表
"include_failed_tokens": boolean // 默认为false
}
```
* 响应格式:
```json
{
"status": "success",
"failed_tokens": [string] // 可选根据include_failed_tokens返回表示未找到的token列表
}
```
* expectation说明:
- simple: 只返回基本状态
- updated_tokens: 返回更新后的token列表
- failed_tokens: 返回未找到的token列表
- detailed: 返回完整信息包括updated_tokens和failed_tokens
#### 设置Tokens标签已弃用
* 接口地址: `/tokens/tags/set`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
{
"tokens": [string],
"tags": {
string: null | string // 键可以为 timezone: 时区标识符 或 proxy: 代理名称
}
}
```
* 响应格式:
```json
{
"status": "success",
"message": string // "标签更新成功"
}
```
#### 更新令牌Profile
* 接口地址: `/tokens/profile/update`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
[
string // aliases
]
```
* 响应格式:
```json
{
"status": "success",
"message": "已更新{}个令牌配置, {}个令牌更新失败"
}
```
#### 更新令牌CV
* 接口地址: `/tokens/config-version/update`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
[
string // aliases
]
```
* 响应格式:
```json
{
"status": "success",
"message": "已更新{}个令牌配置版本, {}个令牌更新失败"
}
```
#### 刷新令牌
* 接口地址: `/tokens/refresh`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
[
string // aliases
]
```
* 响应格式:
```json
{
"status": "success",
"message": "已刷新{}个令牌, {}个令牌刷新失败"
}
```
#### 设置令牌状态
* 接口地址: `/tokens/status/set`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
{
"aliases": [string],
"status": "enabled" | "disabled"
}
```
* 响应格式:
```json
{
"status": "success",
"message": "已设置{}个令牌状态, {}个令牌设置失败"
}
```
#### 设置令牌别名
* 接口地址: `/tokens/alias/set`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
{
"{old_alias}": "{new_alias}"
}
```
* 响应格式:
```json
{
"status": "success",
"message": "已设置{}个令牌别名, {}个令牌设置失败"
}
```
#### 设置Tokens代理
* 接口地址: `/tokens/proxy/set`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
{
"aliases": [string],
"proxy": string // 可选代理地址null表示清除代理
}
```
* 响应格式:
```json
{
"status": "success",
"message": "已设置{}个令牌代理, {}个令牌设置失败"
}
```
#### 设置Tokens时区
* 接口地址: `/tokens/timezone/set`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
{
"aliases": [string],
"timezone": string // 可选,时区标识符(如"Asia/Shanghai"null表示清除时区
}
```
* 响应格式:
```json
{
"status": "success",
"message": "已设置{}个令牌时区, {}个令牌设置失败"
}
```
#### 构建API Key
* 接口地址: `/build-key`
* 请求方法: POST
* 认证方式: Bearer Token (当SHARE_AUTH_TOKEN启用时需要)
* 请求格式:
```json
{
"token": string, // 格式: JWT
"checksum": {
"first": string, // 格式: 长度为64的Hex编码字符串
"second": string, // 格式: 长度为64的Hex编码字符串
},
"client_key": string, // 格式: 长度为64的Hex编码字符串
"config_version": string, // 格式: UUID
"session_id": string, // 格式: UUID
"secret": string, // 可选,没什么用
"proxy_name": string, // 可选,指定代理
"timezone": string, // 可选,指定时区
"gcpp_host": string, // 可选,代码补全区域
"disable_vision": boolean, // 可选,禁用图片处理能力
"enable_slow_pool": boolean, // 可选,启用慢速池
"include_web_references": boolean,
"usage_check_models": { // 可选,使用量检查模型配置
"type": "default" | "disabled" | "all" | "custom",
"model_ids": string // 当type为custom时生效以逗号分隔的模型ID列表
}
}
```
* 响应格式:
```json
{
"keys": [string] // 成功时返回生成的key
}
```
或出错时:
```json
{
"error": string // 错误信息
}
```
说明:
1. 此接口用于生成携带动态配置的API Key是对直接传token与checksum模式的升级版本在0.3起直接传token与checksum的方式已经不再适用
2. 生成的key格式为: `sk-{encoded_config}`其中sk-为默认前缀(可配置)
3. usage_check_models配置说明:
- default: 使用默认模型列表(同下 `usage_check_models` 字段的默认值)
- disabled: 禁用使用量检查
- all: 检查所有可用模型
- custom: 使用自定义模型列表(需在model_ids中指定)
4. 在当前版本keys数组长度总为3后2个基于缓存仅第1个使用过才行
1. 完整key旧版本也存在
2. 数字key的base64编码版本
3. 数字key的明文版本
5. 数字key是一个128位无符号整数与一个64位无符号整数组成的比通常使用的uuid更难破解。
#### 获取Config Version
* 接口地址: `/config-version`
* 请求方法: POST
* 认证方式: Bearer Token (当SHARE_AUTH_TOKEN启用时需要)
* 请求格式:
```json
{
"token": string, // 格式: JWT
"checksum": {
"first": string, // 格式: 长度为64的Hex编码字符串
"second": string, // 格式: 长度为64的Hex编码字符串
},
"client_key": string, // 格式: 长度为64的Hex编码字符串
"session_id": string, // 格式: UUID
"proxy_name": string, // 可选,指定代理
"timezone": string, // 可选,指定时区
"gcpp_host": string // 可选,代码补全区域
}
```
* 响应格式:
```json
{
"config_version": string // 成功时返回生成的UUID
}
```
或出错时:
```json
{
"error": string // 错误信息
}
```
### 代理管理接口
#### 简易代理信息管理页面
* 接口地址: `/proxies`
* 请求方法: GET
* 响应格式: HTML页面
* 功能: 调用下面的各种相关API的示例页面
#### 获取代理配置信息
* 接口地址: `/proxies/get`
* 请求方法: POST
* 响应格式:
```json
{
"status": "success",
"proxies": {
"proxies": {
"proxy_name": "non" | "sys" | "http://proxy-url",
},
"general": string // 当前使用的通用代理名称
},
"proxies_count": number,
"general_proxy": string,
"message": string // 可选
}
```
#### 设置代理配置
* 接口地址: `/proxies/set`
* 请求方法: POST
* 请求格式:
```json
{
"proxies": {
"{proxy_name}": "non" | "sys" | "http://proxy-url"
},
"general": string // 要设置的通用代理名称
}
```
* 响应格式:
```json
{
"status": "success",
"proxies_count": number,
"message": "代理配置已更新"
}
```
#### 添加代理
* 接口地址: `/proxies/add`
* 请求方法: POST
* 请求格式:
```json
{
"proxies": {
"{proxy_name}": "non" | "sys" | "http://proxy-url"
}
}
```
* 响应格式:
```json
{
"status": "success",
"proxies_count": number,
"message": string // "已添加 X 个新代理" 或 "没有添加新代理"
}
```
#### 删除代理
* 接口地址: `/proxies/del`
* 请求方法: POST
* 请求格式:
```json
{
"names": [string], // 要删除的代理名称列表
"expectation": "simple" | "updated_proxies" | "failed_names" | "detailed" // 默认为simple
}
```
* 响应格式:
```json
{
"status": "success",
"updated_proxies": { // 可选根据expectation返回
"proxies": {
"proxy_name": "non" | "sys" | "http://proxy-url"
},
"general": string
},
"failed_names": [string] // 可选根据expectation返回表示未找到的代理名称列表
}
```
#### 设置通用代理
* 接口地址: `/proxies/set-general`
* 请求方法: POST
* 请求格式:
```json
{
"name": string // 要设置为通用代理的代理名称
}
```
* 响应格式:
```json
{
"status": "success",
"message": "通用代理已设置"
}
```
#### 代理类型说明
* `non`: 表示不使用代理
* `sys`: 表示使用系统代理
* 其他: 表示具体的代理URL地址`http://proxy-url`
#### 注意事项
1. 代理名称必须是唯一的,添加重复名称的代理会被忽略
2. 设置通用代理时,指定的代理名称必须存在于当前的代理配置中
3. 删除代理时的 expectation 参数说明:
- simple: 只返回基本状态
- updated_proxies: 返回更新后的代理配置
- failed_names: 返回未找到的代理名称列表
- detailed: 返回完整信息包括updated_proxies和failed_names
### 错误格式
所有接口在发生错误时会返回统一的错误格式:
```json
{
"status": "error",
"code": number, // 可选
"error": string, // 可选,错误详细信息
"message": string // 错误提示信息
}
```
### 配置管理接口
#### 配置页面
* 接口地址: `/config`
* 请求方法: GET
* 响应格式: HTML页面
* 功能: 提供配置管理界面,可以修改页面内容和系统配置
#### 更新配置
* 接口地址: `/config`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
{
"action": "get" | "update" | "reset",
"path": string,
"content": {
"type": "default" | "not_found" | "redirect" | "plain_text" | "html" | "css" | "js",
"value": string // type=redirect时为URL, type=plain_text/html/css/js时为对应内容
},
"vision_ability": "none" | "base64" | "all", // "disabled" | "base64-only" | "base64-http"
"enable_slow_pool": boolean,
"enable_long_context": boolean,
"usage_check_models": {
"type": "none" | "default" | "all" | "list",
"content": string
},
"enable_dynamic_key": boolean,
"share_token": string,
"calibrate_token": string,
"include_web_references": boolean
}
```
* 响应格式:
```json
{
"status": "success",
"message": string,
"data": {
"content": {
"type": "default" | "not_found" | "redirect" | "plain_text" | "html" | "css" | "js",
"value": string
},
"vision_ability": "none" | "base64" | "all",
"enable_slow_pool": boolean,
"enable_long_context": boolean,
"usage_check_models": {
"type": "none" | "default" | "all" | "list",
"content": string
},
"enable_dynamic_key": boolean,
"share_token": string,
"calibrate_token": string,
"include_web_references": boolean
}
}
```
注意:`usage_check_models` 字段的默认值为非"cursor-small"、"deepseek-v3.1"、"grok-3-mini"的所有模型。
这些模型将默认进行使用量检查。您可以通过配置接口修改此设置。
### 日志管理接口
#### 获取日志接口
* 接口地址: `/logs`
* 请求方法: GET
* 响应格式: 根据配置返回不同的内容类型(默认、文本或HTML)
#### 获取日志数据
* 接口地址: `/logs/get`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
{
"query": {
// 分页与排序控制
"limit": number, // 可选,返回记录数量限制
"offset": number, // 可选,起始位置偏移量
"reverse": boolean, // 可选反向排序默认false从旧到新true时从新到旧
// 时间范围过滤
"from_date": string, // 可选开始日期时间RFC3339格式
"to_date": string, // 可选结束日期时间RFC3339格式
// 用户标识过滤
"user_id": string, // 可选按用户ID精确匹配
"email": string, // 可选,按用户邮箱过滤(支持部分匹配)
"membership_type": string, // 可选,按会员类型过滤 ("free"/"free_trial"/"pro"/"enterprise")
// 核心业务过滤
"status": string, // 可选,按状态过滤 ("pending"/"success"/"failure")
"model": string, // 可选,按模型名称过滤(支持部分匹配)
"include_models": [string], // 可选,包含特定模型
"exclude_models": [string], // 可选,排除特定模型
// 请求特征过滤
"stream": boolean, // 可选,是否为流式请求
"has_chain": boolean, // 可选,是否包含对话链
"has_usage": boolean, // 可选是否有usage信息
// 错误相关过滤
"has_error": boolean, // 可选,是否包含错误
"error": string, // 可选,按错误过滤(支持部分匹配)
// 性能指标过滤
"min_total_time": number, // 可选,最小总耗时(秒)
"max_total_time": number, // 可选,最大总耗时(秒)
"min_tokens": number, // 可选最小token数input + output
"max_tokens": number // 可选最大token数
}
}
```
* 响应格式:
```json
{
"total": number,
"logs": [
{
"id": number,
"timestamp": string,
"model": string,
"token_info": {
"key": string,
"stripe": { // 可选
"membership_type": "free" | "free_trial" | "pro" | "pro_plus" | "ultra" | "enterprise",
"payment_id": string, // 可选
"days_remaining_on_trial": number,
"subscription_status": "trialing" | "active" | "incomplete" | "incomplete_expired" | "past_due" | "canceled" | "unpaid" | "paused", // 可选
"verified_student": boolean // 可选
}
},
"chain": {
"prompt": [ // array or string
{
"role": string,
"content": string
}
],
"delays": [
string,
[
number, // chars count
number // time
]
],
"usage": { // optional
"input": number,
"output": number,
}
},
"timing": {
"total": number
},
"stream": boolean,
"status": string,
"error": string
}
],
"timestamp": string,
"status": "success"
}
```
* 说明:
- 所有查询参数都是可选的
- 管理员可以查看所有日志普通用户只能查看与其token相关的日志
- 如果提供了无效的状态或会员类型,将返回空结果
- 日期时间格式需遵循 RFC3339 标准,如:"2024-03-20T15:30:00+08:00"
- 邮箱和模型名称支持部分匹配
#### 获取日志令牌
* 接口地址: `/logs/tokens/get`
* 请求方法: POST
* 认证方式: Bearer Token
* 请求格式:
```json
[
string
]
```
* 响应格式:
```json
{
"status": "success",
"tokens": {
"{key}": {
"primary_token": string,
"secondary_token": string, // 可选
"checksum": {
"first": string,
"second": string,
},
"client_key": string, // 可选,非空时显示
"config_version": string, // 可选
"session_id": string, // 可选
"proxy": string, // 可选
"timezone": string, // 可选
"gcpp_host": object, // 可选
"user": { // 可选
"email": string,
"name": string,
"updated_at": string,
"picture": string, // 可选
"is_on_new_pricing": boolean
}
}
},
"total": number,
"timestamp": string
}
```
### 静态资源接口
#### 获取共享样式
* 接口地址: `/static/shared-styles.css`
* 请求方法: GET
* 响应格式: CSS文件
* 功能: 获取共享样式表
#### 获取共享脚本
* 接口地址: `/static/shared.js`
* 请求方法: GET
* 响应格式: JavaScript文件
* 功能: 获取共享JavaScript代码
#### 获取其他资源
* 接口地址: `/static/{path}`
* 请求方法: GET
* 请求参数:
- `path`: 静态文件的相对路径
* 响应格式:
- **成功响应 (200 OK)**:
- Headers:
- `Content-Type`: 根据文件扩展名自动设置见下方MIME类型映射表
- `Content-Length`: 文件大小
- Body: 文件的二进制内容
- **文件不存在或大小超过4GiB (404 Not Found)**:
- Headers:
- `Content-Type`: `text/plain; charset=utf-8`
- Body: 错误信息
* 支持的MIME类型映射:
- 文本类型: html, htm, txt, css, js, mjs, csv, xml, md, markdown
- 图像类型: jpg, jpeg, png, gif, webp, svg, bmp, ico, tiff, tif, avif
- 音频类型: mp3, mp4a, wav, ogg, oga, weba, aac, flac, m4a
- 视频类型: mp4, mpeg, mpg, webm, ogv, avi, mov, qt, flv
- 文档类型: pdf, doc, docx, xls, xlsx, ppt, pptx
- 压缩文件: zip, rar, 7z, gz, gzip, tar
- 字体类型: ttf, otf, woff, woff2
- 其他类型: 默认为 `application/octet-stream`
* 功能: 获取从环境变量DATA_DIR指定的目录下的子目录static下的文件。
#### 环境变量示例
* 接口地址: `/env-example`
* 请求方法: GET
* 响应格式: 文本文件
* 功能: 获取环境变量配置示例
### 健康检查接口
* **接口地址**: `/health``/`(重定向)
* **请求方法**: GET
* **认证方式**: 无需
* **响应格式**: 根据配置返回不同的内容类型(默认JSON、文本或HTML)
#### 响应结构
```json
{
"status": "success",
"service": {
"name": "cursor-api",
"version": "1.0.0",
"is_debug": false,
"build": {
"version": 1,
"timestamp": "2024-01-15T10:30:00Z",
"is_debug": false,
"is_prerelease": false
}
},
"runtime": {
"started_at": "2024-01-15T10:00:00+08:00",
"uptime_seconds": 1800,
"requests": {
"total": 1250,
"active": 3,
"errors": 12
}
},
"system": {
"memory": {
"used_bytes": 134217728,
"used_percentage": 12.5,
"available_bytes": 1073741824
},
"cpu": {
"usage_percentage": 15.2,
"load_average": [0.8, 1.2, 1.5]
}
},
"capabilities": {
"models": ["gpt-4", "claude-3"],
"endpoints": ["/chat", "/completions", "/embeddings"],
"features": ["streaming", "function_calling", "vision"]
}
}
```
#### 字段说明
| 字段 | 类型 | 说明 |
|------|------|------|
| `status` | string | 服务状态: "success", "warning", "error" |
| `service.name` | string | 服务名称 |
| `service.version` | string | 服务版本 |
| `service.is_debug` | boolean | 是否为调试模式 |
| `service.build.version` | number | 构建版本号(仅preview功能启用时) |
| `service.build.timestamp` | string | 构建时间戳 |
| `service.build.is_prerelease` | boolean | 是否为预发布版本 |
| `runtime.started_at` | string | 服务启动时间 |
| `runtime.uptime_seconds` | number | 运行时长(秒) |
| `runtime.requests.total` | number | 总请求数 |
| `runtime.requests.active` | number | 当前活跃请求数 |
| `runtime.requests.errors` | number | 错误请求数 |
| `system.memory.used_bytes` | number | 已使用内存(字节) |
| `system.memory.used_percentage` | number | 内存使用率(%) |
| `system.memory.available_bytes` | number | 可用内存(字节,可选) |
| `system.cpu.usage_percentage` | number | CPU使用率(%) |
| `system.cpu.load_average` | array | 系统负载[1分钟,5分钟,15分钟] |
| `capabilities.models` | array | 支持的模型列表 |
| `capabilities.endpoints` | array | 可用的API端点 |
| `capabilities.features` | array | 支持的功能特性 |
### 其他接口
#### 随机生成一个uuid
* 接口地址: `/gen-uuid`
* 请求方法: GET
* 响应格式:
```plaintext
string
```
#### 随机生成一个hash
* 接口地址: `/gen-hash`
* 请求方法: GET
* 响应格式:
```plaintext
string
```
#### 随机生成一个checksum
* 接口地址: `/gen-checksum`
* 请求方法: GET
* 响应格式:
```plaintext
string
```
#### 随机生成一个token已弃用
* 接口地址: `/gen-token`
* 请求方法: GET
* 响应格式:
```plaintext
string
```
#### 获取当前的timestampheader
* 接口地址: `/get-timestamp-header`
* 请求方法: GET
* 响应格式:
```plaintext
string
```
#### 获取用户信息(已弃用)
* 接口地址: `/userinfo`
* 请求方法: POST
* 认证方式: 请求体中包含token
* 请求格式:
```json
{
"token": string
}
```
* 响应格式:
```json
{
"usage": {
"premium": {
"num_requests": number,
"total_requests": number,
"num_tokens": number,
"max_requests": number,
"max_tokens": number
},
"standard": {
"num_requests": number,
"total_requests": number,
"num_tokens": number,
"max_requests": number,
"max_tokens": number
},
"start_of_month": string
},
"user": {
"email": string,
"name": string,
"id": string,
"updated_at": string
},
"stripe": {
"membership_type": "free" | "free_trial" | "pro" | "enterprise",
"payment_id": string,
"days_remaining_on_trial": number
}
}
```
如果发生错误,响应格式为:
```json
{
"error": string
}
```
#### 获取更新令牌(已弃用)
* 接口地址: `/token-upgrade`
* 请求方法: POST
* 认证方式: 请求体中包含token
* 请求格式:
```json
{
"token": string
}
```
* 响应格式:
```json
{
"status": "success" | "failure" | "error",
"message": string,
"result": string // optional
}
```
#### 基础校准(已弃用)
* 接口地址: `/basic-calibration`
* 请求方法: POST
* 认证方式: 请求体中包含token
* 请求格式:
```json
{
"token": string
}
```
* 响应格式:
```json
{
"status": "success" | "error",
"message": string,
"user_id": string,
"create_at": string
}
```
注意: `user_id``create_at` 字段在校验失败时可能不存在。
## Copilot++ 接口文档
1. 相关接口都需要 `x-client-key`, 格式请见 `/gen-hash`32字节
2. Cookie `FilesyncCookie` 是16字节工作区不变即不变。
3. 关于形如 `AWSALBAPP-0` 的 Cookie 具有7天有效期可能变化详情请查阅 Amazon 相关文档。
4. `FilesyncCookie``AWSALBAPP` 总是被 `/file/upload``/file/sync`
5. 以下所有接口都使用 POST 方法,且都需要认证。
### 获取代码补全服务的配置信息
* 接口地址: `/cpp/config`
#### 请求格式
```json
{
"is_nightly": boolean, // 可选是否使用nightly版本
"model": string, // 模型名称
"supports_cpt": boolean // 可选是否支持CPT
}
```
### 响应格式
```json
{
"above_radius": number, // 可选,上方扫描半径
"below_radius": number, // 可选,下方扫描半径
"merge_behavior": { // 可选,合并行为
"type": string,
"limit": number, // 可选,限制
"radius": number // 可选,半径
},
"is_on": boolean, // 可选,是否开启
"is_ghost_text": boolean, // 可选,是否使用幽灵文本
"should_let_user_enable_cpp_even_if_not_pro": boolean, // 可选,非专业用户是否可以启用
"heuristics": [ // 启用的启发式规则列表
"lots_of_added_text",
"duplicating_line_after_suggestion",
"duplicating_multiple_lines_after_suggestion",
"reverting_user_change",
"output_extends_beyond_range_and_is_repeated",
"suggesting_recently_rejected_edit"
],
"exclude_recently_viewed_files_patterns": [string], // 最近查看文件排除模式
"enable_rvf_tracking": boolean, // 是否启用RVF跟踪
"global_debounce_duration_millis": number, // 全局去抖动时间(毫秒)
"client_debounce_duration_millis": number, // 客户端去抖动时间(毫秒)
"cpp_url": string, // CPP服务URL
"use_whitespace_diff_history": boolean, // 是否使用空白差异历史
"import_prediction_config": { // 导入预测配置
"is_disabled_by_backend": boolean, // 是否被后端禁用
"should_turn_on_automatically": boolean, // 是否自动开启
"python_enabled": boolean // Python是否启用
},
"enable_filesync_debounce_skipping": boolean, // 是否启用文件同步去抖动跳过
"check_filesync_hash_percent": number, // 文件同步哈希检查百分比
"geo_cpp_backend_url": string, // 地理位置CPP后端URL
"recently_rejected_edit_thresholds": { // 可选,最近拒绝编辑阈值
"hard_reject_threshold": number, // 硬拒绝阈值
"soft_reject_threshold": number // 软拒绝阈值
},
"is_fused_cursor_prediction_model": boolean, // 是否使用融合光标预测模型
"include_unchanged_lines": boolean, // 是否包含未更改行
"should_fetch_rvf_text": boolean, // 是否获取RVF文本
"max_number_of_cleared_suggestions_since_last_accept": number, // 可选,上次接受后清除建议的最大数量
"suggestion_hint_config": { // 可选,建议提示配置
"important_lsp_extensions": [string], // 重要的LSP扩展
"enabled_for_path_extensions": [string] // 启用的路径扩展
}
}
```
### 获取可用的代码补全模型列表
* 接口地址: `/cpp/models`
#### 请求格式
### 响应格式
```json
{
"models": [string], // 可用模型列表
"default_model": string // 可选,默认模型
}
```
### 上传文件
* 接口地址: `/file/upload`
#### 请求格式
```json
{
"uuid": string, // 文件标识符
"relative_workspace_path": string, // 文件相对于工作区的路径
"contents": string, // 文件内容
"model_version": number, // 模型版本
"sha256_hash": string // 可选文件的SHA256哈希值
}
```
### 响应格式
```json
{
"error": string // 错误类型unspecified, non_existant, hash_mismatch
}
```
### 同步文件变更
* 接口地址: `/file/sync`
#### 请求格式
```json
{
"uuid": string, // 文件标识符
"relative_workspace_path": string, // 文件相对于工作区的路径
"model_version": number, // 模型版本
"filesync_updates": [ // 文件同步更新数组
{
"model_version": number, // 模型版本
"relative_workspace_path": string, // 文件相对于工作区的路径
"updates": [ // 单个更新请求数组
{
"start_position": number, // 更新开始位置
"end_position": number, // 更新结束位置
"change_length": number, // 变更长度
"replaced_string": string, // 替换的字符串
"range": { // 简单范围
"start_line_number": number, // 开始行号
"start_column": number, // 开始列
"end_line_number_inclusive": number, // 结束行号(包含)
"end_column": number // 结束列
}
}
],
"expected_file_length": number // 预期文件长度
}
],
"sha256_hash": string // 文件的SHA256哈希值
}
```
### 响应格式
```json
{
"error": string // 错误类型unspecified, non_existant, hash_mismatch
}
```
### 流式代码补全
* 接口地址: `/cpp/stream`
#### 请求格式
```json
{
"current_file": { // 当前文件信息
"relative_workspace_path": string, // 文件相对于工作区的路径
"contents": string, // 文件内容
"rely_on_filesync": boolean, // 是否依赖文件同步
"sha256_hash": string, // 可选SHA256哈希值
"top_chunks": [ // 顶级代码块
{
"content": string, // 内容
"range": { // 最简单范围
"start_line": number, // 开始行
"end_line_inclusive": number // 结束行(包含)
},
"score": number, // 分数
"relative_path": string // 相对路径
}
],
"contents_start_at_line": number, // 内容开始行
"cursor_position": { // 光标位置
"line": number, // 行号
"column": number // 列号
},
"dataframes": [ // 数据框信息
{
"name": string, // 名称
"shape": string, // 形状
"data_dimensionality": number, // 数据维度
"columns": [ // 列
{
"key": string, // 键
"type": string // 类型
}
],
"row_count": number, // 行数
"index_column": string // 索引列
}
],
"total_number_of_lines": number, // 总行数
"language_id": string, // 语言ID
"selection": { // 选择范围
"start_position": { // 开始位置
"line": number, // 行号
"column": number // 列号
},
"end_position": { // 结束位置
"line": number, // 行号
"column": number // 列号
}
},
"alternative_version_id": number, // 可选替代版本ID
"diagnostics": [ // 诊断信息
{
"message": string, // 消息
"range": { // 范围
"start_position": { // 开始位置
"line": number, // 行号
"column": number // 列号
},
"end_position": { // 结束位置
"line": number, // 行号
"column": number // 列号
}
},
"severity": "error" | "warning" | "information" | "hint", // 严重程度
"related_information": [ // 相关信息
{
"message": string, // 消息
"range": { // 范围
"start_position": { // 开始位置
"line": number, // 行号
"column": number // 列号
},
"end_position": { // 结束位置
"line": number, // 行号
"column": number // 列号
}
}
}
]
}
],
"file_version": number, // 可选,文件版本
"cell_start_lines": [number], // 单元格开始行
"workspace_root_path": string // 工作区根路径
},
"diff_history": [string], // 差异历史
"model_name": string, // 可选,模型名称
"linter_errors": { // 可选Linter错误
"relative_workspace_path": string, // 文件相对于工作区的路径
"errors": [ // 错误数组
{
"message": string, // 错误消息
"range": { // 范围
"start_position": { // 开始位置
"line": number, // 行号
"column": number // 列号
},
"end_position": { // 结束位置
"line": number, // 行号
"column": number // 列号
}
},
"source": string, // 可选,来源
"related_information": [ // 相关信息数组
{
"message": string, // 相关信息消息
"range": { // 相关信息范围
"start_position": { // 开始位置
"line": number, // 行号
"column": number // 列号
},
"end_position": { // 结束位置
"line": number, // 行号
"column": number // 列号
}
}
}
],
"severity": "error" | "warning" | "information" | "hint" // 可选,严重程度
}
],
"file_contents": string // 文件内容
},
"context_items": [ // 上下文项
{
"contents": string, // 内容
"symbol": string, // 可选,符号
"relative_workspace_path": string, // 相对工作区路径
"score": number // 分数
}
],
"diff_history_keys": [string], // 差异历史键
"give_debug_output": boolean, // 可选,提供调试输出
"file_diff_histories": [ // 文件差异历史
{
"file_name": string, // 文件名
"diff_history": [string], // 差异历史
"diff_history_timestamps": [number] // 差异历史时间戳
}
],
"merged_diff_histories": [ // 合并差异历史
{
"file_name": string, // 文件名
"diff_history": [string], // 差异历史
"diff_history_timestamps": [number] // 差异历史时间戳
}
],
"block_diff_patches": [ // 块差异补丁
{
"start_model_window": { // 开始模型窗口
"lines": [string], // 行
"start_line_number": number, // 开始行号
"end_line_number": number // 结束行号
},
"changes": [ // 变更
{
"text": string, // 文本
"range": { // 范围
"start_line_number": number, // 开始行号
"start_column": number, // 开始列
"end_line_number": number, // 结束行号
"end_column": number // 结束列
}
}
],
"relative_path": string, // 相对路径
"model_uuid": string, // 模型UUID
"start_from_change_index": number // 开始变更索引
}
],
"is_nightly": boolean, // 可选是否为nightly版本
"is_debug": boolean, // 可选,是否为调试模式
"immediately_ack": boolean, // 可选,立即确认
"enable_more_context": boolean, // 可选,启用更多上下文
"parameter_hints": [ // 参数提示
{
"label": string, // 标签
"documentation": string // 可选,文档
}
],
"lsp_contexts": [ // LSP上下文
{
"uri": string, // URI
"symbol_name": string, // 符号名称
"positions": [ // 位置
{
"line": number, // 行
"character": number // 字符
}
],
"context_items": [ // 上下文项
{
"uri": string, // 可选URI
"type": string, // 类型
"content": string, // 内容
"range": { // 可选,范围
"start_line": number, // 开始行
"start_character": number, // 开始字符
"end_line": number, // 结束行
"end_character": number // 结束字符
}
}
],
"score": number // 分数
}
],
"cpp_intent_info": { // 可选,代码补全意图信息
"source": string // 来源
},
"workspace_id": string, // 可选工作区ID
"additional_files": [ // 附加文件
{
"relative_workspace_path": string, // 相对工作区路径
"is_open": boolean, // 是否打开
"visible_range_content": [string], // 可见范围内容
"last_viewed_at": number, // 可选,最后查看时间
"start_line_number_one_indexed": [number], // 从1开始索引的起始行号
"visible_ranges": [ // 可见范围
{
"start_line_number": number, // 开始行号
"end_line_number_inclusive": number // 结束行号(包含)
}
]
}
],
"control_token": "quiet" | "loud" | "op", // 可选,控制标记
"client_time": number, // 可选,客户端时间
"filesync_updates": [ // 文件同步更新
{
"model_version": number, // 模型版本
"relative_workspace_path": string, // 相对工作区路径
"updates": [ // 更新数组
{
"start_position": number, // 开始位置(字符偏移量)
"end_position": number, // 结束位置(字符偏移量)
"change_length": number, // 变更长度
"replaced_string": string, // 替换的字符串
"range": { // 范围
"start_line_number": number, // 开始行号
"start_column": number, // 开始列
"end_line_number_inclusive": number, // 结束行号(包含)
"end_column": number // 结束列
}
}
],
"expected_file_length": number // 预期文件长度
}
],
"time_since_request_start": number, // 请求开始后的时间
"time_at_request_send": number, // 请求发送时的时间
"client_timezone_offset": number, // 可选,客户端时区偏移
"lsp_suggested_items": { // 可选LSP建议项
"suggestions": [ // 建议
{
"label": string // 标签
}
]
},
"supports_cpt": boolean // 可选是否支持CPT
}
```
### 响应格式 (SSE流格式)
事件类型及对应数据格式:
1. **model_info**
```json
{
"type": "model_info",
"is_fused_cursor_prediction_model": boolean,
"is_multidiff_model": boolean
}
```
2. **range_replace**
```json
{
"type": "range_replace",
"start_line_number": number,
"end_line_number_inclusive": number,
"text": string
}
```
3. **cursor_prediction**
```json
{
"type": "cursor_prediction",
"relative_path": string,
"line_number_one_indexed": number,
"expected_content": string,
"should_retrigger_cpp": boolean
}
```
4. **text**
```json
{
"type": "text",
"text": string
}
```
5. **done_edit**
```json
{
"type": "done_edit"
}
```
6. **done_stream**
```json
{
"type": "done_stream"
}
```
7. **debug**
```json
{
"type": "debug",
"model_input": string,
"model_output": string,
"total_time": string, // 可选
"stream_time": string,
"ttft_time": string,
"server_timing": string // 可选
}
```
8. **error**
```json
{
"type": "error",
"message": string
}
```
9. **stream_end**
```json
{
"type": "stream_end"
}
```
#### 来源可选值
- line_change
- typing
- option_hold
- linter_errors
- parameter_hints
- cursor_prediction
- manual_trigger
- editor_change
- lsp_suggestions
## 鸣谢
感谢以下项目和贡献者:
- [cursor-api](https://github.com/wisdgod/cursor-api) - 本项目本身
- [zhx47/cursor-api](https://github.com/zhx47/cursor-api) - 提供了本项目起步阶段的主要参考
- [luolazyandlazy/cursorToApi](https://github.com/luolazyandlazy/cursorToApi)