Cursor2API:将AI编程助手能力API化,赋能自动化开发工作流
API(应用程序编程接口)是现代软件工程中实现系统解耦与能力复用的核心技术,其核心原理是通过定义清晰的请求-响应协议,将特定功能封装为可远程调用的服务。这种设计模式的技术价值在于打破了工具与环境的壁垒,使得异构系统能够高效协同。在AI辅助编程领域,传统AI编程助手(如Cursor)的能力通常被局限在特定编辑器界面内,限制了其在自动化脚本、CI/CD流水线等更广泛开发场景中的应用。通过将AI编程能力
1. 项目概述:从编辑器插件到通用API接口的蜕变
最近在GitHub上看到一个挺有意思的项目,叫“cursor2api”。光看名字,你可能以为它只是个简单的工具,但深入探究后,我发现这其实是一个极具代表性的“生产力工具API化”的实践。简单来说,它把Cursor编辑器里那些强大的AI辅助编程功能,比如代码补全、解释、重构,甚至文件级的操作,打包成了一组可以通过HTTP请求调用的标准API。这意味着什么?意味着你可以把Cursor的智能编程能力,无缝集成到你自己的IDE、自动化脚本、CI/CD流水线,甚至是任何需要代码智能处理的第三方应用里。这不再是“一个编辑器插件”,而是一个“可编程的AI编程助手服务”。
我自己作为开发者,经常在不同场景下切换工具。有时在服务器上用Vim,有时在本地用VS Code,有时又需要写一些自动化脚本来批量处理代码。每次切换,都希望能有Cursor那样的智能体验,但显然不可能在每个环境都装一个Cursor。cursor2api这个项目,恰好击中了这个痛点。它通过一个轻量级的本地服务,将Cursor的核心能力暴露出来,让你在任何能发送HTTP请求的地方,都能享受到AI辅助编程的便利。这不仅仅是便利性的提升,更是一种开发范式的转变——将AI能力从特定的GUI应用中解耦出来,变成一种可组合、可编排的基础设施。
这个项目适合谁呢?首先,当然是那些已经深度依赖Cursor,但又希望其能力能突破编辑器边界的开发者。其次,是工具链的构建者,比如想为自己的团队搭建一个内部代码审查助手、自动化代码格式化服务,或者想增强现有CI/CD流程智能性的人。最后,对于那些热衷于探索AI与开发流程深度结合的极客来说,这也是一个绝佳的研究和实验平台。通过API,你可以更精细地控制AI的行为,分析其输出,并将其融入到更复杂的自动化工作流中。
2. 核心架构与设计思路拆解
2.1 为什么选择API化这条路?
要理解cursor2api的价值,得先看看我们通常是怎么使用AI编程助手的。传统模式是“人机交互”:你打开编辑器,写一段代码,触发补全或提出问题,等待AI响应,然后手动接受或修改结果。这个过程是紧密耦合在特定编辑器界面里的。API化的核心思路,就是将这个交互过程从“人机”转变为“机机”。让另一个程序(可能是脚本、另一个工具,或者一个服务)来扮演“提问者”和“结果处理者”的角色。
这样做有几个显著优势。 第一是自动化 。想象一下,你可以写一个脚本,每晚定时扫描项目中的复杂函数,自动调用API让AI生成注释和单元测试骨架。 第二是集成 。你可以把代码补全能力集成到团队自研的低代码平台里,或者为内部文档系统添加“解释代码片段”的功能。 第三是标准化 。HTTP API是一种几乎被所有编程语言和平台支持的通用协议,这意味着你用一种方式(Cursor的交互)获得的能力,现在可以用无数种方式来消费和组合。
cursor2api项目的设计者显然深刻理解这一点。它没有尝试去重新发明一个AI模型,而是巧妙地“桥接”了现有的、成熟的Cursor客户端能力。这种思路非常务实,避免了从零训练模型或直接调用昂贵云API的复杂性和成本,直接复用本地已经配置好的、体验经过优化的AI能力。
2.2 项目核心组件与通信流程
虽然项目源码是核心,但我们可以从概念上拆解其核心组件。一个典型的cursor2api架构可能包含以下部分:
- API服务器 :这是项目的核心,一个常驻的本地HTTP服务(可能是用Node.js、Python或Go等编写)。它负责监听来自外部的请求。
- Cursor客户端适配层 :这是最巧妙也最具挑战的部分。服务器本身并不直接包含AI模型,它需要与本地安装的Cursor编辑器实例进行通信。由于Cursor本身可能没有提供官方的程序化接口,这一层很可能需要一些创造性的方法来实现交互,例如:
- 模拟用户输入 :通过自动化测试工具(如Puppeteer、Playwright或操作系统级的自动化接口)来控制Cursor的UI,模拟用户打开文件、选择代码、触发命令等操作。
- 拦截与分析通信 :分析Cursor编辑器与后端AI服务之间的网络通信,尝试理解其协议,然后由API服务器模拟一个“客户端”直接与AI服务通信。这种方法更干净,但对逆向工程能力要求高。
- 利用未公开的API :寻找Cursor编辑器内部可能存在的、未被图形界面完全暴露的脚本接口或插件扩展点。
- 请求/响应翻译器 :将外部通用的API请求(如“补全这段代码”、“解释这个函数”),翻译成Cursor能够理解的具体操作指令或上下文信息。反之,将Cursor的输出(可能是编辑器中的文本变化、弹窗信息或侧边栏内容)解析成结构化的API响应数据(如JSON格式的补全建议列表、解释文本)。
- 配置与状态管理 :管理API服务的配置(如监听的端口、认证方式)、维护与Cursor实例的连接状态、处理并发请求的队列等。
整个通信流程可以简化为:外部应用 -> HTTP请求 -> cursor2api服务器 -> (适配层) -> Cursor编辑器 -> AI处理 -> 结果返回给适配层 -> 结构化 -> HTTP响应 -> 外部应用。这个链条中的每个环节都需要精心设计,以确保稳定性、低延迟和结果的准确性。
注意 :这种通过自动化操作GUI应用来提供API的方式,在带来便利的同时也引入了脆弱性。Cursor编辑器的任何一次界面更新或逻辑变更,都可能破坏适配层的正常工作。因此,这类项目的维护成本相对较高,使用者需要关注其与Cursor版本的兼容性。
3. 核心API功能与使用场景深度解析
3.1 典型API端点猜想与实践
基于Cursor编辑器的核心功能,我们可以推测cursor2api可能提供以下几类API端点,并展开其应用场景:
1. 代码补全与生成
- 端点示例 :
POST /v1/completions - 请求体 :包含当前文件路径、光标位置前的代码片段(prefix)、光标位置后的代码片段(suffix)、编程语言、补全触发方式(行内、函数内、块级)等。
- 响应 :一个按置信度排序的补全建议列表,每个建议包含代码文本、可能的导入语句、简要说明。
- 场景 :
- 为轻量级编辑器赋能 :为你喜欢的轻量级编辑器(如Vim、Emacs、Sublime Text)开发一个插件,将代码补全请求转发到本地的cursor2api服务,瞬间获得媲美Cursor的智能补全体验。
- 在线代码沙盒 :在团队内部的代码学习平台或面试工具中,集成智能补全功能,提升用户体验,而无需采购昂贵的云端AI编码API。
2. 代码解释与文档生成
- 端点示例 :
POST /v1/explain - 请求体 :需要解释的代码片段、可选的上下文(如函数名、所在文件)。
- 响应 :结构化的解释文本,可能包括功能描述、算法步骤、输入输出说明、复杂度分析。
- 场景 :
- 自动化代码审查辅助 :在CI流水线中,对新提交的复杂代码片段自动调用此API生成解释,附在评论中,帮助评审者快速理解代码意图。
- 知识库构建 :定期扫描项目中的核心模块,批量生成解释并存入内部Wiki,形成活化的项目文档。
3. 代码重构与优化建议
- 端点示例 :
POST /v1/refactor - 请求体 :需要重构的代码、重构目标(如提取函数、简化条件、重命名变量、优化性能)。
- 响应 :重构后的代码差异(diff),以及重构理由的说明。
- 场景 :
- 遗留代码现代化 :写一个脚本,遍历历史代码库,针对常见的“坏味道”(如过长函数、重复代码)自动请求重构建议,生成报告供开发者参考执行。
- 结对编程机器人 :在团队协作中,可以有一个“AI伙伴”服务,持续观察代码变更,当发现可优化之处时,通过聊天机器人自动发出重构建议。
4. 对话与问答
- 端点示例 :
POST /v1/chat - 请求体 :对话历史、当前问题、相关的代码文件作为上下文。
- 响应 :AI针对问题的回答,可能包含代码示例。
- 场景 :
- 集成到团队聊天工具 :将API封装成一个Slack或钉钉机器人,开发者可以在群聊中直接@机器人询问代码相关问题,比如“这个错误是什么意思?”或“如何实现某个功能?”,机器人能结合项目上下文给出答案。
- 个性化学习助手 :新加入团队的成员可以通过与这个“项目知识AI”对话,快速了解代码库结构和业务逻辑。
3.2 安全与性能考量
将本地编辑器的能力开放为API,必须慎重考虑安全和性能。
安全方面 :
- 认证与授权 :API服务器必须实现基本的认证机制(如API Key),防止局域网内或其他有网络访问权限的未经授权调用。特别是如果服务绑定在
0.0.0.0上。 - 输入验证与沙箱 :对接收到的文件路径、代码内容进行严格验证,防止路径遍历攻击。对于“执行代码”这类高危操作(如果提供),必须在安全的沙箱环境中进行。
- 上下文隔离 :确保每个API请求的上下文是独立的,不会泄露其他用户或会话的隐私信息。由于底层共用同一个Cursor实例,这需要精巧的会话管理设计。
性能方面 :
- 请求队列与限流 :AI推理是计算密集型操作。API服务需要实现请求队列,避免同时处理过多请求导致Cursor无响应或本地机器卡死。同时应对调用方实施限流。
- 缓存策略 :对于相似的补全或解释请求(例如,同一段代码被多次请求解释),可以引入缓存机制,直接返回缓存结果,大幅降低延迟和Cursor的调用压力。
- 异步处理 :对于耗时的操作(如分析整个文件),API应该设计为异步模式,立即返回一个任务ID,允许客户端随后轮询或通过Webhook获取结果。
4. 实操部署与核心配置详解
4.1 环境准备与项目部署
假设我们已经从GitHub克隆了 7836246/cursor2api 项目,以下是基于常见实践梳理的部署步骤和核心配置解析。
第一步:基础环境检查
- Node.js/Python环境 :根据项目README的说明,安装指定版本的Node.js(如>=18)或Python(如>=3.10)。这是运行API服务器的基础。
- Cursor编辑器 :确保本地已安装并正常配置了Cursor编辑器。你需要已经登录了账号,并且AI功能可以正常使用。这是服务的“能力源”。
- 系统权限 :在macOS或Linux上,可能需要授予终端或脚本辅助功能权限,以便其能控制Cursor应用。在Windows上,可能需要处理用户账户控制(UAC)或防病毒软件的拦截。
第二步:安装与启动
# 假设是一个Node.js项目
git clone https://github.com/7836246/cursor2api.git
cd cursor2api
npm install # 或 yarn install
安装依赖后,通常需要通过配置文件或环境变量进行设置。一个典型的配置文件(如 config.yaml 或 .env )可能包含:
# config.yaml 示例
server:
port: 3000 # API服务监听的端口
host: '127.0.0.1' # 建议默认只监听本地,安全考虑
auth_key: 'your-secret-api-key-here' # 用于API调用的密钥
cursor:
# Cursor应用的可执行文件路径,用于适配层定位
app_path: '/Applications/Cursor.app' # macOS
# app_path: 'C:\\Users\\<Username>\\AppData\\Local\\Programs\\Cursor\\Cursor.exe' # Windows
# 启动参数或工作区路径
workspace: '/path/to/your/project' # 可选,指定Cursor打开的项目目录
ai:
# 可能可以指定使用Cursor中的哪个AI模型(如Claude、GPT)
default_model: 'claude-3.5-sonnet' # 示例
配置完成后,使用启动命令运行服务:
npm start
# 或更生产环境的方式
pm2 start server.js --name cursor2api
服务启动后,应该会看到类似“Server running on http://127.0.0.1:3000”的日志。
4.2 关键配置项解析与调优
-
cursor.app_path:这是适配层与Cursor交互的关键。如果路径不正确,服务将无法启动或控制Cursor。在Windows上,路径可能包含空格和特殊字符,需要正确处理。一个更健壮的做法是,在代码中加入自动查找常见安装路径的逻辑。 -
server.host: 强烈建议在初次使用时保持默认的127.0.0.1。这表示只允许本机访问。如果你需要从同一网络的其他机器调用(比如在服务器上部署,从本地电脑调用),可以改为0.0.0.0,但 务必 同时设置好auth_key和防火墙规则。 -
auth_key:这是最简单的API认证方式。所有客户端请求必须在Header中携带此密钥(如Authorization: Bearer your-secret-api-key-here)。在生产环境中,应考虑更复杂的认证机制,如JWT。 -
cursor.workspace:指定一个默认项目路径。这有助于Cursor在响应请求时拥有正确的项目上下文(如知道依赖库、项目结构),从而提供更准确的补全和建议。对于处理不同项目的请求,更高级的实现可能会设计动态切换工作区的机制。
实操心得 :在Linux无图形界面服务器上部署这类项目会非常棘手,因为Cursor是一个GUI应用。一种可能的方案是使用
xvfb(虚拟帧缓冲器)来模拟一个显示环境,但稳定性和性能难以保证。因此,这类工具更适用于个人开发机或带有桌面的开发服务器。
5. 客户端集成与调用示例
服务跑起来后,我们来看看如何在各种场景下调用它。这里提供几个不同语言的调用示例,并解析其中的关键点。
5.1 使用cURL进行快速测试
最直接的测试方式是使用cURL命令。假设我们的服务运行在 http://127.0.0.1:3000 ,且认证密钥为 my-secret-key 。
测试代码补全:
curl -X POST http://127.0.0.1:3000/v1/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer my-secret-key" \
-d '{
"file_path": "/tmp/test.py",
"prefix": "def calculate_average(numbers):\n sum = 0\n for num in numbers:\n sum +",
"suffix": "",
"language": "python"
}'
这个请求模拟了在Python文件中,函数写到 sum + 时触发补全。期待API返回类似 ["sum += num", "sum = sum + num"] 的建议列表。
测试代码解释:
curl -X POST http://127.0.0.1:3000/v1/explain \
-H "Content-Type: application/json" \
-H "Authorization: Bearer my-secret-key" \
-d '{
"code": "def quicksort(arr):\n if len(arr) <= 1:\n return arr\n pivot = arr[len(arr) // 2]\n left = [x for x in arr if x < pivot]\n middle = [x for x in arr if x == pivot]\n right = [x for x in arr if x > pivot]\n return quicksort(left) + middle + quicksort(right)",
"language": "python"
}'
这个请求要求AI解释一段快速排序的Python代码。响应应该是一段清晰的文字描述算法的分治思想、基准值选择、以及递归过程。
5.2 编写Python客户端脚本
在实际自动化脚本中,我们更倾向于使用编程语言来调用。以下是一个Python客户端的示例,它封装了与cursor2api的交互,并包含错误处理。
import requests
import json
from typing import Optional, List
class Cursor2APIClient:
def __init__(self, base_url: str = "http://127.0.0.1:3000", api_key: str = None):
self.base_url = base_url.rstrip('/')
self.headers = {
"Content-Type": "application/json",
}
if api_key:
self.headers["Authorization"] = f"Bearer {api_key}"
def get_completion(self, file_path: str, prefix: str, suffix: str = "", language: str = "python") -> Optional[List[str]]:
"""获取代码补全建议"""
payload = {
"file_path": file_path,
"prefix": prefix,
"suffix": suffix,
"language": language
}
try:
response = requests.post(
f"{self.base_url}/v1/completions",
headers=self.headers,
json=payload,
timeout=30 # 设置超时,避免长时间等待
)
response.raise_for_status() # 如果状态码不是200,抛出HTTPError
result = response.json()
# 假设返回格式为 {"completions": ["suggestion1", "suggestion2"]}
return result.get("completions", [])
except requests.exceptions.RequestException as e:
print(f"请求API失败: {e}")
if hasattr(e.response, 'text'):
print(f"错误响应: {e.response.text}")
return None
def explain_code(self, code: str, language: str) -> Optional[str]:
"""解释代码片段"""
payload = {
"code": code,
"language": language
}
try:
response = requests.post(f"{self.base_url}/v1/explain", headers=self.headers, json=payload, timeout=30)
response.raise_for_status()
result = response.json()
return result.get("explanation")
except requests.exceptions.RequestException as e:
print(f"解释代码请求失败: {e}")
return None
# 使用示例
if __name__ == "__main__":
client = Cursor2APIClient(api_key="my-secret-key")
# 示例1:补全
suggestions = client.get_completion(
file_path="/project/src/utils.py",
prefix="import os\n\ndef read_file_safely(filepath):\n if not os.path.ex",
language="python"
)
if suggestions:
print("补全建议:")
for i, s in enumerate(suggestions[:3]): # 只显示前三个
print(f"{i+1}. {s}")
# 示例2:解释
complex_code = """
const debounce = (func, wait) => {
let timeout;
return (...args) => {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, args), wait);
};
};
"""
explanation = client.explain_code(code=complex_code, language="javascript")
if explanation:
print("\n代码解释:")
print(explanation)
关键点解析 :
- 错误处理 :网络请求必须包含超时和异常处理。因为底层的Cursor可能无响应,或者API服务本身可能出错。
- 响应解析 :需要清楚API返回的具体JSON结构,才能正确提取数据。上述示例中的
.get(“completions”, [])是一种安全的访问方式。 - 超时设置 :对于AI生成类请求,时间可能较长。
timeout=30秒是一个合理的起始值,可以根据具体操作类型调整。对于重构整个文件的请求,可能需要更长的时间或采用异步接口。
5.3 集成到VS Code插件(概念)
更高级的集成是为其他编辑器开发插件。以VS Code为例,你可以创建一个插件,在用户触发某种操作(如按快捷键)时,将当前编辑器的代码上下文发送到本地的cursor2api服务,并将返回的结果插入到编辑器或显示在悬停提示中。
这涉及到VS Code扩展API的使用,核心思路是:
- 在插件的激活函数中,初始化一个与本地cursor2api服务通信的客户端。
- 注册一个命令(如
cursor2api.complete),在这个命令的处理函数中,获取当前活动编辑器的文档内容、光标位置、语言ID。 - 构造请求数据,调用本地API。
- 收到响应后,使用
vscode模块的API将补全项插入到文档,或以QuickPick列表的形式让用户选择。
这种方式可以让你在不离开VS Code生态的情况下,“借用”Cursor的AI能力,实现“最佳工具组合”。
6. 常见问题、故障排查与性能优化
在实际使用中,你肯定会遇到各种问题。下面整理了一些常见场景及其排查思路。
6.1 连接与基础故障
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| API服务启动失败,端口被占用 | 端口3000已被其他程序使用 | netstat -ano | findstr :3000 (Win) 或 lsof -i :3000 (Mac/Linux) 查找占用进程。修改 config.yaml 中的 server.port 为其他值,如 3001 。 |
客户端请求返回 Connection refused |
API服务未运行;或 server.host 配置为 127.0.0.1 但从外部机器访问 |
1. 检查API服务进程是否存活。 2. 检查服务日志确认监听地址。若需远程访问,需配置 host: ‘0.0.0.0’ 并确保防火墙开放对应端口。 |
请求返回 401 Unauthorized |
认证密钥未配置或错误 | 1. 检查API请求的 Authorization Header格式是否正确(Bearer + 空格 + 密钥)。 2. 检查服务端配置文件中的 auth_key 是否与客户端使用的一致。 |
| 请求长时间无响应或超时 | Cursor编辑器无响应;AI模型推理慢;请求队列堵塞 | 1. 检查Cursor应用是否在前台正常运行,能否手动进行AI对话。 2. 查看API服务日志,看是否卡在某个步骤。 3. 考虑减少单次请求的代码量,或检查是否有其他进程占用了大量CPU/内存。 |
6.2 功能性与结果问题
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 补全/解释的结果质量很差,或文不对题 | 请求中提供的上下文不足;Cursor的AI模型未正确加载或配置 | 1. 提供更丰富的上下文 :对于补全,尽量提供完整的函数签名和之前的代码;对于解释,提供函数名和文件名会更有帮助。 2. 手动打开Cursor,检查AI聊天功能是否正常,模型是否已切换至性能较好的版本(如Claude 3.5 Sonnet)。 3. 在API请求中尝试指定 model 参数(如果支持)。 |
| 无法对指定文件进行操作 | 提供的 file_path 不存在或Cursor无权限访问; workspace 配置不正确 |
1. 确保 file_path 是绝对路径,且该文件真实存在。 2. 检查运行API服务的系统用户是否有该文件的读取权限。 3. 检查 cursor.workspace 配置,确保它包含了目标文件所在的父目录,这样Cursor才能正确加载项目索引。 |
| 并发请求时,返回结果混乱或失败 | 适配层可能无法处理多个同时发生的Cursor UI操作,导致状态冲突 | 1. 这是此类项目的固有瓶颈 。解决方案是 在服务端实现严格的请求队列 ,确保同一时间只有一个请求在与Cursor交互。 2. 客户端应做好重试机制,对于非即时性任务,优先使用异步接口。 |
6.3 性能优化实践
- 启用响应缓存 :对于完全相同的补全或解释请求,结果在短时间内是相同的。可以在API服务器层添加一个内存缓存(如使用
node-cache或redis),键为请求参数的哈希值,设置一个合理的TTL(如5分钟)。这能极大减少对Cursor的调用,提升响应速度。 - 批处理请求 :如果你需要分析一个项目中的多个文件,不要串行地发送几十个API请求。可以设计一个
/v1/batch端点,接受一个请求数组,服务端在内部优化处理顺序,减少Cursor上下文切换的开销。 - 调整Cursor自身设置 :关闭Cursor中不必要的实时检查功能(如某些语法检查),可以释放资源,让AI响应更快。确保Cursor有足够的内存分配。
- 监控与降级 :为API服务添加简单的监控,记录请求量、响应时间和错误率。当检测到Cursor长时间无响应时,可以设计降级策略,例如返回一个空的补全列表或缓存中的旧解释,而不是让客户端一直等待。
7. 扩展思路与高级应用场景
cursor2api项目本身是一个起点,基于这个“AI编程能力即服务”的理念,我们可以拓展出更多有意思的应用。
场景一:构建智能代码审查流水线 在GitLab CI或GitHub Actions中,配置一个环节,针对新提交的代码diff,调用cursor2api的 /v1/review 端点(需扩展)。AI可以检查代码风格、潜在bug、性能问题、安全漏洞,并生成包含具体建议的审查评论。这可以作为人工审查前的第一道自动化过滤器,提高审查效率。
场景二:自动化测试用例生成 为项目中的核心函数或复杂类,编写一个脚本,读取其签名和文档字符串,然后调用cursor2api的 /v1/generate_tests 端点(需扩展),请求生成单元测试用例。虽然生成的测试用例可能需要人工调整,但它能提供一个优秀的起点,覆盖主要的快乐路径和边界情况。
场景三:实时文档同步器 开发一个后台守护进程,监控指定代码目录的文件变更。当 .py 或 .js 文件被保存时,自动提取其中的函数和类,调用API生成或更新对应的Markdown文档。这样,你的代码文档库可以近乎实时地与代码保持同步。
场景四:个性化编程教练 结合你的个人代码仓库历史,训练一个简单的模型(或只是建立索引),来分析你常犯的错误模式。当你编写新代码时,通过cursor2api服务不仅获得补全,还能获得针对你个人习惯的优化建议,比如“你在这里经常忘记处理空值,建议添加判空逻辑”。
实现这些扩展,意味着需要对cursor2api项目本身进行二次开发,增加新的API端点,并在适配层实现更复杂的与Cursor交互的逻辑。这要求开发者对Cursor的操作、项目本身的代码结构有更深的理解。
最后一点个人体会 :这类项目的魅力在于它用一种“务实”的方式打破了工具之间的壁垒。它不追求从头构建一个完美的AI编程引擎,而是巧妙地“连接”与“复用”,快速将前沿能力产品化。在使用和借鉴这类项目时,最重要的不仅是让它跑起来,更是理解其设计上的取舍——比如为了快速实现而接受的与特定GUI应用耦合的脆弱性。这能帮助你在自己的项目中做出更明智的架构选择。如果你正在为团队寻找提升开发效率的“杠杆点”,那么将类似cursor2api的思路应用到你们自己的工作流中,或许就是一个不错的开始。
更多推荐



所有评论(0)