Cursor 自定义大模型 API 保姆级教程:本地与官方模型双模并存、五档思考强度与上下文窗口配置

在开发工具Cursor中接入本地部署的deepseek大模型 最近使用了 Cursor,开发效率大幅提升,但由于内部规定不允许接入云端大模型,必须确保d代码严格留存于本地环境,符合安全合规要求。*所以在本地环境搭建DeepSeek大模型。 阅读详情

玄同 765

AI Engineer


  中国传媒大学 | 数字媒体技术(游戏设计技术方向)

  ▍深耕领域  AI Agent 架构设计 Agent Harness 工程 Context Engineering 多智能体协同 & RAG
  ▍技术底座  Python TypeScript · LangChain MCP & Skills · FastAPI Milvus Docker
  ▍工程能力  专注 Agent 运行时架构、长上下文与 Prompt Cache 优化、LLM 全链路评测与工程化落地

     

「 让 AI 交互更智能,让技术落地更高效 」   |   欢迎技术探讨 / 项目合作,关注解锁大模型与智能交互的无限可能!

Cursor 自定义大模型 API 保姆级教程:本地与官方模型双模并存、五档思考强度与五档上下文窗口配置

很多刚开始用 Cursor 的朋友都会遇到同一个困惑:明明自己手里有现成的大模型 API Key,或者已经在电脑上用 Ollama、vLLM 跑起了本地大模型,可一旦填进 Cursor 的设置页,点下 Verify 不是报连接失败,就是在 Agent 模式下读不了文件、调不动终端工具;或者好不容易配通了本地模型,结果 Cursor 原有的官方模型(Claude / GPT / Auto)、Cursor Tab 代码自动补全和 Cmd + K 行内编辑全都失效了。

更让人头疼的是,像 DeepSeek-R1、Qwen3、Gemini 等支持深度思考(Reasoning)与超长上下文的模型,接进 Cursor 后往往只能按默认参数跑,左下角根本找不到调节 「思考强度(Reasoning Effort)」 与 「上下文窗口(Context Tiers:64K~1M)」 的开关,甚至在流式工具调用被截断重试时还会弹出 Requests ending with a model turn are not supported. 报错。

这篇文章我们就把 Cursor 接入自定义模型 API 的底层逻辑彻底扒开。不讲空话,从最基础的第三方 API 接入讲起,一步步带你打通本地大模型与官方云端模型双模并存(保留 Cursor Tab 与 Cmd + K)、Agent 多轮工具调用、五档思考强度与五档上下文窗口的自由切换,以及 Cursor 三层阶段性结论守卫与 model turn 自动续接。


一、为什么你在 Cursor 里配自定义模型 API 老是报错?

1.1 从一个直觉误区说起:到底是谁在连你的 API?

在动手改配置之前,我们先花两分钟搞清楚一个最核心的原理问题:当你在 Cursor 的输入框里敲下一句提问时,请求到底是从哪台机器发给大模型的?

很多人的第一直觉是:Cursor 装在我的电脑上,我在设置里填了 API Key 和 Base URL,那肯定是我的电脑直接发请求给模型服务商。

但事实恰恰相反。

在默认模式下,Cursor 采用的是「云端中转架构」。你可以把它理解成一家代购驿站:你在本地客户端填好的 API Key 和 Base URL,会先被打包发给 Cursor 的云端服务器;然后由云端服务器代替你去请求那个 Base URL,拿到结果后再流式传回你的电脑。

本地 Agent 运行时:客户端本机直连

1. 下发任务与思考档位

2. 本机直接发起 HTTP 请求

3. 流式返回文本与工具调用

你的电脑
Cursor 渲染层

本机扩展宿主
Local Agent Runtime

本机 / 内网模型服务
localhost:11434 / 8000

默认模式:云端服务器代发请求

1. 上传 Key 和 Base URL

2. 正常访问公网接口

2. 试图访问 127.0.0.1
连向了云端服务器自己!

你的电脑
Cursor 客户端

Cursor 云端服务器

公网模型 API
DeepSeek / 硅基流动等

本机模型服务
localhost:11434

看懂上面这张图,你就瞬间明白为什么会出现那两个经典报错了:

  1. 为什么公网 API 能通,本地 localhost / 127.0.0.1 死活连不上?
    因为你填了 http://127.0.0.1:11434/v1 之后,是远在海外的云端服务器去访问它自己的 127.0.0.1:11434,请求根本不可能回到你的电脑上。
  2. 为什么有时候连上了,却用不了 Agent 模式读写文件?
    因为 Cursor 的 Agent 模式依赖模型返回标准的函数调用(tool_calls),并且会根据 /models 接口返回的能力标签来判断这个模型「会不会用工具、支不支持思考」。如果缺少能力标签,客户端就会把模型的工具权限或思考档位直接关掉。
1.2 三种接入方式全景对比:你适合哪一种?

根据你手头模型服务的部署位置,接入 Cursor 一共有三种方式。先看对比表,按需对号入座:

接入方式适用模型来源是否需要内网穿透Agent 工具调用思考强度调节推荐指数
方式一:设置页 BYOK 模式DeepSeek、硅基流动、OpenRouter 等公网 API不需要支持(受模型目录限制)仅内置白名单模型支持⭐⭐⭐⭐
方式二:反向隧道穿透模式本机 Ollama / vLLM 临时测试需要(ngrok 等)部分支持(延迟极高)不支持⭐⭐
方式三:本地 Agent 运行时直连本机 Ollama / vLLM / 局域网自建网关不需要(本机直连)原生完整支持支持五档自由切换⭐⭐⭐⭐⭐

选型建议:如果你只用现成的公网第三方 API,直接看第二节即可,3 分钟搞定;如果你要在 Cursor 里用本机或内网跑的大模型,或者想给自定义模型开启五档「思考强度」与五档「上下文窗口(64K~1M)」调节,请直接重点看第三节和第四节。


二、基础篇:3 分钟接入公网第三方大模型 API

如果你使用的是支持 OpenAI 兼容格式的公网大模型 API(比如 DeepSeek 官方 API、硅基流动、阿里云百炼、OpenRouter 等),只需要在 Cursor 设置界面里按下面四步配置。

2.1 四步完成公网 API 配置
  1. 打开模型设置面板:按下快捷键 Cmd + Shift + J(Windows 为 Ctrl + Shift + J),切换到左侧的 Models 选项卡。
  2. 添加自定义模型名称:在模型列表底部点击 + Add Model,输入服务商文档里对应的准确模型 ID(例如 deepseek-chat、deepseek-reasoner 或 Qwen/Qwen2.5-Coder-32B-Instruct),然后只勾选你刚刚添加的模型。
  3. 填写 API Key 与 Base URL:向下滚动找到 OpenAI API Key 区域:
    • 在输入框中填入你在对应平台申请的 API Key。
    • 展开下方的 Override OpenAI Base URL,填入包含 /v1 后缀的接口基础地址。
  4. 点击 Verify 验证并开启:点击右侧的 Verify 按钮。此时 Cursor 会用你勾选的第一个模型发送一条测试请求,验证通过后开关会自动变成绿色开启状态。
2.2 常见细节避坑:为什么填对了 Key 还是报 404?

新手在这一步最容易踩的坑就是 Base URL 末尾的 /v1 路径。Cursor 在发起对话时,会自动在你的 Base URL 后面拼接 /chat/completions。因此填写时必须遵循以下规则:

你填写的 Base URL 格式Cursor 实际请求的地址结果
https://api.example.com/v1https://api.example.com/v1/chat/completions正确(推荐写法)
https://api.example.comhttps://api.example.com/chat/completions报错 404(漏了 /v1)
https://api.example.com/v1/chat/completionshttps://api.example.com/v1/chat/completions/chat/completions报错 404(路径重复)

三、进阶篇:将本地 / 内网大模型直连接入 Cursor Agent

如果你想接入的是本机运行的 Ollama(默认端口 11434)、vLLM(默认端口 8000)、LM Studio(默认端口 1234),或者是实验室/团队内部局域网里的模型网关,就必须绕开云端中转,启用 Cursor 内置的本地 Agent 运行时(Local Agent Runtime)。

3.1 本地 Agent 运行时是怎么工作的?

在 Cursor 的安装目录里,其实内置了两个专门负责本地执行的扩展模块:cursor-agent-exec(本地工具执行器)和 cursor-local-agent-runtime(本地推理运行时)。一旦激活本地模式,整个对话流程就会变成一套纯粹的本机闭环:

3. 本机 ReAct 循环

是

否

直连本机 /chat/completions

模型是否返回
tool_calls?

本机执行读文件 / 改代码 / 跑终端

流式输出最终回答

2. 交互与参数组装

用户在左下角选择模型

选择思考强度档位
None / Low / Medium / High / Max

组装为 reasoning_effort 参数

1. 启动自检阶段

Cursor 启动

读取本地 Base URL
与 API Key

请求本地 /models 接口

注入上下文与工具能力标签

要打通这条链路,我们只需要解决三个核心问题:开启本地直连开关、处理 :latest 模型名后缀,以及给 /models 接口补齐能力声明。

3.2 第一步:先用一条命令确认本地模型支持工具调用

在配置 Cursor 之前,先打开终端跑一条 curl 命令,确认你的本地模型服务(这里以 http://127.0.0.1:11434/v1 为例)能够正常响应 tools 工具调用请求:

curl -s -X POST http://127.0.0.1:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ollama" \
  -d '{
    "model": "qwen2.5-coder:latest",
    "messages": [{"role": "user", "content": "帮我查一下北京今天的天气"}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "获取城市天气",
        "parameters": {
          "type": "object",
          "properties": {"city": {"type": "string"}},
          "required": ["city"]
        }
      }
    }],
    "stream": false
  }'

只要返回的 JSON 里包含 "tool_calls" 字段,就说明你的本地模型完全具备驱动 Cursor Agent 的能力。

3.3 第二步:解决 :latest 后缀不识别与能力过滤问题

用过 Ollama 的朋友都知道,本地拉取的模型名字通常都带着 :latest 后缀(比如 deepseek-r1:latest、qwen2.5-coder:latest)。但 Cursor 内置的模型匹配函数默认只处理了 / 分隔符,遇到 :latest 就会认为这是个「未知模型」,从而把它藏进折叠列表里。

更关键的是,Cursor 本地运行时在请求 /models 接口时,有一套非常严格的能力准入机制(Fail-Closed):

  • 标准的本地 /models 接口只返回 {"id": "deepseek-r1:latest", "object": "model"},没有任何能力描述。
  • 如果我们在解析 /models 响应时,为本地对话模型统一补上 capabilities 字段,同时剔除 embedding(向量模型)、tts(语音模型)等非对话模型,Cursor 就会自动为这些模型开启 Agent 工具调用、长上下文和多模态图片输入!

核心处理逻辑非常清晰,只需要下面几十行代码:

// 1. 归一化模型名称:剥离命名空间前缀与 :latest 标签,确保本地模型正常匹配置顶
function normalizeModelId(rawId) {
  const slashIdx = rawId.lastIndexOf("/");
  const baseName = slashIdx === -1 ? rawId : rawId.slice(slashIdx + 1);
  return baseName.replace(/:latest$/u, "");
}

// 2. 为本地 /models 返回的模型列表自动注入 Agent 能力标签
function enrichLocalModels(rawResponse) {
  const list = Array.isArray(rawResponse?.data) ? rawResponse.data : [];
  // 自动过滤掉向量嵌入、语音合成等非对话模型
  const nonChatPattern = /embedding|bge-|rerank|tts|whisper/i;

  return list
    .filter(item => item && typeof item.id === "string" && !nonChatPattern.test(item.id))
    .map(item => {
      if (Array.isArray(item.api_types)) return item;
      return {
        ...item,
        api_types: ["chat_completions"],
        long_context_threshold_tokens: 262144, // 默认 256K 上下文窗口阈值
        capabilities: {
          context_length: 1048576,             // 声明最大 1M 上下文窗口上限(支持 64K~1M 五档切换)
          output_modalities: ["text"],
          input_modalities: ["text", "image"],
          supports_tool_use: true,             // 关键:开启 Agent 工具调用权限
          supports_streaming: true,            // 关键:开启流式输出
          supports_reasoning: true,            // 关键:开启思考强度调节支持
          supports_vision: true,
          reasoning_effort: ["none", "low", "medium", "high", "max"]
        }
      };
    });
}
3.4 第三步:实现「本地模型 + 官方原版模型」双模并存(Per-Model Hybrid Routing)

很多教程在教大家开启本地 Agent 运行时的时候,都会直接把客户端的全局开关 localMode 从 false 改成 true,并把数据库里的 availableDefaultModels2 替换成本地模型列表。这样做虽然能让本地模型跑起来,但会带来三个严重的副作用:

  1. 官方原版模型全部消失:一旦全局 localMode = true,模型过滤函数会把不在 localProviderModelIds 里的 40 多个 Cursor 官方云端模型全部隐藏。
  2. Cursor Tab 代码补全与 Cmd + K 被禁用:客户端的代码补全服务(isAllowedCpp)和行内编辑服务(Cmd+K)在检测到全局 localMode === true 时会直接提前返回,导致写代码时失去自动补全。
  3. BYOK 凭证污染官方请求:如果全局开启了 useOpenAIKey = true 并填了 http://127.0.0.1:11434/v1,当你切回官方云端模型时,客户端会把本地的 ollama Key 和 127.0.0.1 地址塞进云端请求头里发给官方服务器,直接触发鉴权报错。

怎么才能既用上本地大模型,又 100% 保留官方原版模型、Cursor Tab 和 Cmd + K 呢?答案是保持全局 localMode = false,改为基于 :latest 后缀的「按模型动态混合路由(Per-Model Hybrid Routing)」:

是 (如 deepseek-r1:latest)

否 (如 claude-4.5-sonnet / Auto)

Cursor 模型选择器
顶部:本地模型 (:latest)
下方:45+ 官方云端模型

所选模型 ID 是否以
:latest 结尾?

本机 Local Agent Runtime
独立注入 127.0.0.1:11434 与 ollama 密钥

启用 5 档思考强度 + 5 档上下文窗口
+ 三层阶段性结论守卫

Cursor 官方云端通道
自动剥离本地 BYOK 凭证防污染

原汁原味官方云端推理
完整保留 Cursor Tab + Cmd+K

在底层实现上,我们只需要在 Workbench 渲染层打通以下三个钩子,即可实现零冲突双模并存:

// 1. 按模型动态路由 (AgentClientService.run):仅 :latest 模型走本机 Runtime,其余走官方云端
async function dispatchAgentTurn(ctx, state, action, modelDetails, listener, res, blobs, mgr, ckpt, mcp, runOpts) {
  const modelId = String(
    runOpts?.requestedModel?.modelId ?? modelDetails?.modelId ?? modelDetails?.modelName ?? ""
  );
  if (modelId.endsWith(":latest")) {
    runOpts?.onNetworkPhaseStart?.();
    return this.runLocalAgentInExtensionHost(ctx, state, action, modelDetails, listener, blobs, ckpt, mcp, res, runOpts);
  }
  return this.client.run(ctx, state, action, modelDetails, listener, res, blobs, mgr, ckpt, mcp, runOpts);
}

// 2. 凭证按模型隔离 (getModelDetailsFromName):防止本地 Key 污染官方云端模型请求
function resolveModelCredentials(modelName, maxMode) {
  const isLocalModel = String(modelName ?? "").endsWith(":latest");
  const apiKey = isLocalModel ? this._cursorAuthenticationService.getApiKeyForModel(modelName) : undefined;
  const baseUrl = isLocalModel
    ? (this._reactiveStorageService.applicationUserPersistentStorage.openAIBaseUrl ?? "http://127.0.0.1:11434/v1")
    : undefined;
  return { modelName, apiKey, openaiApiBaseUrl: baseUrl, maxMode };
}

// 3. 自愈式模型目录合并 (computeAvailableDefaultModels & persistAvailableDefaultModels)
function mergeHybridCatalog(persistedCatalog) {
  const localModels = persistedCatalog.filter(m => String(m?.name ?? "").endsWith(":latest"));
  const officialModels = persistedCatalog.filter(m => !String(m?.name ?? "").endsWith(":latest"));
  return [
    ...(localModels.length > 0 ? localModels : (globalThis.__HYBRID_LOCAL_MODELS__ || [])),
    ...(officialModels.length > 0 ? officialModels : (globalThis.__HYBRID_OFFICIAL_MODELS__ || [])),
  ];
}

四、隐藏大招:为自定义模型开启五档「思考强度」与五档「上下文窗口(64K~1M)」

在日常写代码时,我们既不希望模型在所有小问题上都耗费几十秒「过度思考」,也不希望它的上下文窗口被死锁在某一个固定值:

  • 思考强度(Reasoning Effort)需要按需切换:改个变量名、写个简单正则,我们希望它秒回(None 或 Low);而在排查复杂并发 Bug、设计模块架构时,才需要把思考强度拉满(High 或 Max)。
  • 上下文窗口(Context Tiers)同样需要分档控制:如果把上下文窗口死锁在 1M,长对话到了后半程每次请求都会携带几十万 Token,不仅首字延迟(TTFT)明显变慢,还会引发长文注意力稀释;反过来如果死锁在 64K,跨模块重构时又会频繁触发历史摘要压缩(Compaction)导致丢记忆。因此,最佳方案是同时开启 五档思考强度(None / Low / Medium / High / Max) 与 五档上下文窗口(64K / 128K / 256K / 512K / 1M)!
4.1 五档思考强度在底层是怎么工作的?

当你在 Cursor 左下角的模型选择器里切换思考强度时,客户端本地运行时会在发送 HTTP 请求前拦截请求体,并根据你选中的档位动态修改 JSON 参数:

None(关闭思考)

Low(轻量思考)

Medium(均衡思考)

High(深度思考·默认)

Max(极限思考)

用户在左下角选择思考强度与上下文档位

当前选中的思考强度档位是?

拦截器移除 reasoning_effort
直接快速输出结果

注入 reasoning_effort = 'low'
适合语法检查与简单改写

注入 reasoning_effort = 'medium'
适合日常函数编写与重构

注入 reasoning_effort = 'high'
适合多文件联动与复杂排障

注入 reasoning_effort = 'max'
适合系统架构设计与疑难攻坚

结合当前选中的 Context 档位
64K / 128K / 256K / 512K / 1M
动态计算历史摘要自动压缩阈值

发往本地 /chat/completions 接口

4.2 五档上下文窗口(64K ~ 1M)与后台自动压缩(Compaction)机制

很多人不知道的是,Cursor 本地 Agent 运行时内部自带了一套 基于 context 参数的自动上下文压缩器(Context Compactor):

  • 默认情况下,Cursor 只会根据模型的 long_context_threshold_tokens(默认阈值)和 context_length(最大上限)生成固定的两档切换。
  • 当我们将本地运行时的 tiers 扩展为 [65536, 131072, 262144, 512000, 1048576] 五档,并把默认档位定在黄金甜点位 256K(262,144 Tokens) 后,你就可以在对话框左下角随时按任务规模切换上下文容量与自动压缩时机:
上下文档位对应 Token 上限自动触发后台压缩阈值响应速度与注意力集中度适用工程场景建议
64K65,536约 55.5K极快(注意力最集中)单文件函数编写、正则生成、极速轻量问答
128K131,072约 118K快常规单模块日常开发、独立组件 Bug 修复
256K(默认)262,144约 236K黄金平衡点(推荐默认)兼顾 15~25 步多文件重构记忆与流式响应速度
512K512,000约 460K较深(适合长链路)跨多模块联动重构、大型 PR 全量 Diff 审查
1M1,048,576约 944K超大容量全仓库架构梳理、超长运行日志与多文档交叉排查

在本地 Agent 运行时(cursor-local-agent-runtime/dist/main.js 与 cursor-agent-exec/dist/main.js)中,解锁这五档上下文窗口只需要修改两处核心逻辑:

// 1. 将原本只有 [defaultTokens, longTokens] 的两档数组,扩展为 64K ~ 1M 五档枚举
function getContextTierConfig() {
  return {
    defaultTokens: 262144, // 默认选中 256K 黄金档位
    longTokens: 1048576,   // 最大支持 1M 超长上下文
    tiers: [65536, 131072, 262144, 512000, 1048576]
  };
}

// 2. 按二进制 1024 换算档位显示名称(64K / 128K / 256K / 512K / 1M)
function formatContextLabel(tokens) {
  if (tokens >= 1048576) return Math.round((tokens / 1048576) * 10) / 10 + "M";
  if (tokens >= 1024) return `${Math.round(tokens / 1024)}K`;
  return String(tokens);
}
4.3 为什么默认看不见这两个菜单?一键解锁 5×5=25 组合变体

即使底层运行时已经支持了 reasoning_effort 与 context 参数,Cursor 前端界面默认也做了三道限制:

  1. 实验开关默认关闭:控制模型选择器顶部平铺展示参数栏的实验开关(effort_first_variant)默认处于 "control" 关闭状态。
  2. 设置页本地模式过滤:在 Settings -> Models 页面渲染函数里,有一行判断 localMode ? {...model, parameterDefinitions: [], variants: []} : model,硬生生把本地模型的参数定义给清空了。
  3. 左下角徽标未挂载 "context" 参数:前端模型选择器在拼接输入框左下角药丸徽标时,默认只读取了 ["effort", "reasoning"],漏掉了 "context",需要把 getParamBadge(i, r, "context") 一并加入徽标数组。

解除这三道限制后,我们只需要用下面这段 Python 脚本,把本地网关地址、API Key 以及带有 五档思考强度 × 五档上下文窗口(共 5×5=25 个组合变体) 的本地模型置顶注入 Cursor 的本地 SQLite 状态数据库(state.vscdb),同时自动合并保留原有的 45+ 个官方云端模型:

import json
import os
import sqlite3
from pathlib import Path

EFFORT_TIERS = [
    ("none", "None", "关闭思考,最快响应"),
    ("low", "Low", "轻量思考,适合简单修改"),
    ("medium", "Medium", "均衡思考,适合日常编码"),
    ("high", "High", "深度思考(默认推荐)"),
    ("max", "Max", "最大思考强度,适合复杂架构与疑难排障"),
]

WINDOW_TIERS = [
    (str(64 * 1024), "64K", "64K 上下文窗口(约 55.5K 启动后台压缩,极速防发散)"),
    (str(128 * 1024), "128K", "128K 上下文窗口(约 118K 启动后台压缩,适合单模块开发)"),
    (str(256 * 1024), "256K", "256K 上下文窗口(默认推荐,约 236K 启动后台压缩)"),
    (str(500 * 1024), "512K", "512K 上下文窗口(约 460K 启动后台压缩,适合跨模块重构)"),
    (str(1024 * 1024), "1M", "1M 超长上下文窗口(约 944K 启动后台压缩,适合全库分析)"),
]


def create_picker_enum_schema(
    field_key: str, title: str, description: str, options: list[tuple[str, str, str]]
) -> dict:
    """构造 Cursor 模型选择器的枚举型参数定义字典。"""
    return {
        "id": field_key,
        "name": title,
        "markdownTooltip": description,
        "isCycleableByHotkey": (field_key == "reasoning"),
        "parameterType": {
            "enumParameter": {
                "values": [
                    {"value": val, "displayName": label, "markdownTooltip": tip, "modelPickerBadges": []}
                    for val, label, tip in options
                ]
            }
        },
    }


def configure_hybrid_local_and_cloud_models(
    gateway_url: str, token_secret: str, local_slug: str, label_title: str
) -> None:
    """配置本地模型与官方云端模型双模并存,并解锁五档思考强度与五档上下文窗口。"""
    sqlite_file = Path(os.path.expanduser("~/Library/Application Support/Cursor/User/globalStorage/state.vscdb"))
    default_window = str(256 * 1024)
    db_conn = sqlite3.connect(str(sqlite_file))
    cursor_obj = db_conn.cursor()

    cursor_obj.execute(
        "INSERT OR REPLACE INTO ItemTable (key, value) VALUES (?, ?)",
        ("cursorAuth/openAIKey", token_secret),
    )
    app_user_key = "src.vs.platform.reactivestorage.browser.reactiveStorageServiceImpl.persistentStorage.applicationUser"
    cursor_obj.execute("SELECT value FROM ItemTable WHERE key = ?", (app_user_key,))
    user_payload = json.loads(cursor_obj.fetchone()[0])

    # 保持全局 useOpenAIKey 为 False,避免污染官方云端模型请求
    user_payload["useOpenAIKey"] = False
    user_payload["openAIBaseUrl"] = gateway_url

    local_descriptor = {
        "name": local_slug,
        "serverModelName": local_slug,
        "defaultOn": True,
        "clientDisplayName": label_title,
        "inputboxShortModelName": label_title,
        "supportsAgent": True,
        "supportsPlanMode": True,
        "supportsSandboxing": True,
        "supportsNonMaxMode": True,
        "supportsMaxMode": True,
        "supportsThinking": True,
        "supportsImages": True,
        "contextTokenLimit": 1024 * 1024,
        "namedModelSectionIndex": 1,
        "parameterDefinitions": [
            create_picker_enum_schema("reasoning", "Reasoning", "调节模型回答前的思考深度", EFFORT_TIERS),
            create_picker_enum_schema("context", "Context", "调节会话最大上下文与自动压缩窗口(默认 256K)", WINDOW_TIERS),
        ],
        "variants": [
            {
                "parameterValues": [{"id": "reasoning", "value": r_val}, {"id": "context", "value": c_val}],
                "displayName": f"{label_title} {r_label} {c_label}",
                "displayNameOutsidePicker": f"{label_title} {r_label} {c_label}",
                "modelPickerBadges": [],
                "isMaxMode": False,
                "isDefaultNonMaxConfig": (r_val == "high" and c_val == default_window),
                "isDefaultMaxConfig": (r_val == "high" and c_val == default_window),
            }
            for r_val, r_label, _ in EFFORT_TIERS
            for c_val, c_label, _ in WINDOW_TIERS
        ],
    }

    # 提取并保留所有非 :latest 的官方云端模型,将本地模型置顶合并
    existing_catalog = user_payload.get("availableDefaultModels2", [])
    cloud_entries = [m for m in existing_catalog if isinstance(m, dict) and not str(m.get("name", "")).endswith(":latest")]
    user_payload["availableDefaultModels2"] = [local_descriptor] + cloud_entries
    user_payload["localProviderModelIds"] = [local_slug]
    user_payload["localProviderAgentModelIds"] = [local_slug]

    ai_cfg = user_payload.setdefault("aiSettings", {})
    ai_cfg["lastDefaultModelSetDate"] = "9999999999999"
    ai_cfg.setdefault("modelConfig", {})["composer"] = {
        "modelName": local_slug,
        "maxMode": False,
        "selectedModels": [{
            "modelId": local_slug,
            "parameters": [
                {"id": "reasoning", "value": "high"},
                {"id": "context", "value": default_window},
            ],
        }],
    }

    cursor_obj.execute(
        "UPDATE ItemTable SET value = ? WHERE key = ?",
        (json.dumps(user_payload, ensure_ascii=False), app_user_key),
    )
    db_conn.commit()
    db_conn.close()
    print(f"已成功配置本地模型 {local_slug} 与 {len(cloud_entries)} 个官方模型双模并存!")


if __name__ == "__main__":
    configure_hybrid_local_and_cloud_models(
        gateway_url="http://127.0.0.1:11434/v1",
        token_secret="ollama",
        local_slug="deepseek-r1:latest",
        label_title="DeepSeek R1 (Local)",
    )

重启 Cursor 后,点击对话框左下角的模型选择按钮,你会发现菜单顶部同时出现了两排清爽的平铺选项栏:

  • 第一排 Reasoning:None / Low / Medium / High / Max(默认选中 High);
  • 第二排 Context:64K / 128K / 256K / 512K / 1M(默认选中 256K),且输入框左下角会实时显示形如 High 256K 的当前档位徽标!

五、实战避坑指南:9 个高频报错与一键解决速查表

最后,我把大家在配置过程中最容易碰到的 9 个报错整理成了一张速查表。遇到问题不用慌,直接对照表里的现象找解法:

序号遇到的报错或现象背后的真正原因一句话解决办法
1点 Verify 报错 Connection failed 或 127.0.0.1 refused还在走默认的「云端中转模式」,云端服务器连不上你电脑的 127.0.0.1切换到本地 Agent 运行时模式,或者给本地端口配一个临时反向隧道
2填完 Base URL 后报 404 Not FoundBase URL 漏写了末尾的 /v1,或者多写了 /chat/completions确保 Base URL 严格以 /v1 结尾(例如 http://127.0.0.1:11434/v1)
3本地 /models 有十几个模型,但列表里一个都不显示触发了本地运行时的严格能力校验,缺少 supports_tool_use: true 的模型被全部静默剔除在 /models 响应解析处统一注入 capabilities.supports_tool_use = true
4第一轮调工具正常,第二轮回传结果报 missing thought_signature常见于带思考签名的推理模型:中间代理层篡改了首轮返回的 tool_call.id,导致签名丢失走 /chat/completions 原生直连,不要用改写 call_id 的第三方中转脚本
5模型能对话,但左下角看不到 Reasoning 思考强度与 Context 上下文窗口选项前端实验开关 effort_first 未激活,且设置页在本地模式下清空了 parameterDefinitions开启 selected-model-parameters-flat 菜单模式,保留 parameterDefinitions 并生成 5×5=25 组合 variants
6菜单里能切 64K ~ 1M 上下文档位,但输入框左下角只显示 High 不显示 256K前端模型选择器的外显徽标数组默认只读取了 ["effort", "reasoning"],未挂载 "context"在前端 Workbench 徽标渲染数组中加入 getBadge(i, r, "context") 并更新 product.json 校验和
7macOS 修改客户端脚本重签名后,启动卡住 20 秒或弹钥匙串窗口重签名改变了应用签名身份,触发了 macOS SecurityAgent 拦截钥匙串访问在 ~/.cursor/argv.json 中加上 "use-inmemory-secretstorage": true 即可免弹窗秒开
8对话中途报错 Failed to call LLM service: invoking wrapper: Requests ending with a model turn are not supported.模型流式输出阶段性结论后,工具调用块因触发上游 PROHIBITED_CONTENT 过滤或网络中断被丢弃,Cursor 自动重试时请求末尾停留在 role: "assistant"在本地 Runtime 请求序列化出口加入末尾 assistant 回合检测,自动追加 role: "user" 续接提醒或补齐 tool 响应
9配好本地模型后,原有的官方模型消失、切换官方模型报 Key 错误,且 Cursor Tab / Cmd+K 失效全局强行开启了 localMode = true、全量覆盖了 availableDefaultModels2,且 useOpenAIKey = true 污染了云端请求保持全局 localMode = false 与 useOpenAIKey = false,在 AgentClientService.run 与 getModelDetailsFromName 中按 :latest 后缀动态分流并合并保留官方模型目录

结语

把自定义大模型 API 和本地推理服务真正跑通之后,Cursor 就不再只是一个绑定固定云端订阅的编辑器,而是一个可以随时挂载任何开源模型、自建网关和深度推理能力的本地 AI 工作台。

日常写业务代码时切到 Low 或 Medium 享受极速流式响应,遇到硬骨头时切到 High 或 Max 让模型深度思考后再动手改代码——希望这篇从原理到实操的完整指南,能帮你把自己的大模型 API 在 Cursor 里真正用出生产力!

一文读懂 Cursor 如何配置第三方聚合平台(干货教程) 阅读详情

相关推荐

如何利用内网穿透实现Cursor对私有化部署大模型的跨网络访问实践

本文主要介绍如何在Windows环境下,使用Cursor接入Ollama启动本地部署的千问qwq-32b大模型实现辅助编程,并结合cpolar内网穿透工具配置公网地址的自定义OPENAI API,实现随时随地远程使用。为了提升开发效率,借助大型语言模型进行辅助编程的需求日益增长。Cursor作为一款强大的代码助手,因其便捷的操作体验受到许多开发者的青睐。

2301_79855962的博客 2202

Cursor 接入第三方 API:Base URL、模型与验证

本文详细介绍了如何在AI编程工具Cursor中接入第三方API服务。文章从准备工作开始,逐步讲解获取API Key、复制模型名、填写Base URL等关键步骤,并提供了配置示意图。针对常见问题如401/403错误、404接口不存在、模型不可用等给出了具体排查方法。作者建议用户先进行最小验证测试,采用小步使用策略,并保持Git检查点以确保安全。最后强调Cursor接入第三方API的核心在于正确配置Base URL、API Key和模型名三要素,推荐新手从简单任务开始逐步验证功能稳定性。

AI147AI的博客 2902

cursor AI代码编辑器IDE对接deepseek模型api;字节ai编辑器trae

参考: https://www.cursor.com/ https://platform.deepseek.com/https://www.cursor.com/下载安装后,注册账号登录即可 再高级里选择设置 再模型这注册模型: 模型名称一定要填正确,url地址填好,最后填上秘钥验证

weixin_42357472的博客 1万+

cursor接入第三方API Key

cursor如何接入第三方API Key

weixin_42351754的博客 1017

告别复制粘贴:如何在 Cursor / 各种 IDE 中丝滑接入本地 AI 模型?

回到标题的那句话——“告别复制粘贴”。一年前,在 IDE 中接入本地模型还是一件需要折腾半天、效果勉强的“极客玩具”。但在 2026 年的今天,Ollama 的一键部署、llama.cpp 的极致性能、Continue 的无缝集成、Qwen3-Coder-Next 的 Agent 级能力,让本地 AI 编程从“能用”进化到了“好用”。三个趋势判断:本地模型与云端模型的差距正在快速缩小。

ZXSXJ的博客 404

Cursor入门 12 - 本地模型无缝挂载

本文详细介绍了如何连接本地 Ollama 服务架构,打破公网数据安全瓶颈,在 Cursor 中挂载并调用阿里开源的编程模型。我们提供了一个用于连通性检测与响应延迟评估的 Python 脚本,展示了纯离线环境下的顺畅编程体验,并针对局域网跨域 CORS 拦截问题给出了完善的环境配置修复指引。在下一篇文章中,我们将涉足大中型企业多人开发的核心痛点——Cursor 全库 Review:自动进行全量代码审查与性能瓶颈检测。

yueyeguzhuo的专栏 201

突破 Cursor 模型限制:低成本接入 GLM-5 与第三方大模型实践指南

如何在保留 Cursor 极致编码体验的前提下,突破官方的高速额度瓶颈,并引入更懂中文开发语境的国产顶尖大模型呢?

倔强的石头的博客 3万+

机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾

f作者: 寒小阳 &&龙心尘 时间:2015年10月。 出处: 声明:版权所有,转载请注明出处,谢谢。手把手机器学习之逻辑回归应用——Kaggle泰坦尼克之灾1.引言先说一句,年末双十一什么的一来,真是非(mang)常(cheng)欢(gou)乐(le)!然后push自己抽出时间来写这篇blog的原因也非常简单: 写完前两篇逻辑回归的介绍和各个角度理解之后,小伙伴们纷纷表示『好像很高级的样纸,

寒小阳 43万+

开发工具Cursor中接入本地deepseek和云端大模型

开发工具Cursor对接本地ollama,实现全部开源模型的使用,保证代码安全性,提高工作效率

yanghongfei110的博客 1万+

手把手拆解UCIe协议层:从Raw Mode到Flit Mode,数据包到底经历了什么?

本文深入解析UCIe协议层的数据包处理机制,从Raw Mode到Flit Mode的三大变体(Standard 256B、68B-Enhanced、Latency-Optimized),详细揭示数据包在不同模式下的封装与转换过程。通过工程师视角,展示协议层如何实现多模式动态切换、错误恢复及与D2D Adapter的协同设计,为芯片级互连技术提供实践指导。

weixin_28728495的博客 238

【国民技术N32项目移植】基于 Windows 的 ARM GCC 开发环境

【国民技术N32项目移植】基于 Windows 的 ARM GCC 开发环境

weixin_42150032的博客 1355

3步搞定!在Cursor中接入DeepSeek大模型!

大家好!我是羊仔,专注AI工具、编程、智能体。羊仔最近发现,把坐席换成面向窗户,灵感似乎也特别容易涌现——不过,这可能只是心理作用而已。对了,羊仔身边的朋友最近对AI工具表示了各种好奇,还问了不少经验,现在真是个人人都想更高效工作的小时代。今天为大家分享一个超实用的玩法:如何在Cursor编辑器中接入国产大模型DeepSeek。

羊仔的博客 1万+

5.2 自抗扰控制 (ADRC)

自抗扰控制(Active Disturbance Rejection Control, ADRC)是由韩京清研究员于1998年提出的一种不依赖被控对象精确数学模型的新型控制技术[reference:0]。其核心思想是将系统的模型不确定性、内部参数摄动以及外部负载变化等所有影响统一定义为“总扰动”,通过一个名为扩张状态观测器(ESO)的环节对其进行实时估计并主动补偿,从而实现动态解耦和强鲁棒性。

技术工作者 1173

Cursor 配置第三方 API 教程:统一接入 Claude / GPT / Gemini / DeepSeek

本文以 hoapi 为例,介绍 Cursor、Claude Code、Dify、OpenWebUI 等工具接入 OpenAI 兼容第三方 API 的配置思路、常见报错和排查方法。

PLA_pengfei的博客 1245

Cadence PSpice 仿真11:电感型低通滤波器最坏情况分析仿真实战图文教程

在进行蒙特卡罗分析时会将元器件的容差考虑进去,然后通过运行多次的随机仿真,得到电路输出的一个范围。但是多数情况下设计师关注的只是电路的最坏情况是否满足设计要求。PSpice的最坏情况分析是取在容差的边界点元件参数进行仿真以计算出电路输出的最坏情况。所以如果如果电路中有10个元件的话,需要先取10个元件的标准值仿真1次,然后再分别在10个元件的容差边界处各仿真1次,然后再对仿真结果进行统计和计算,再最坏情况下再仿真1次。

fydar的博客 1944

摩尔线程嵌入式面试题及参考答案(2万字长文)

说一下你对 drm 框架的理解。 DRM(Direct Rendering Manager)是 Linux 系统中用于管理图形显示设备的一个重要框架。 从架构层面来讲,它处于内核空间,主要目的是为用户空间的图形应用程序提供一个统一的接口来访问图形硬件。DRM 包括内核态的驱动模块和用户态的库。内核态的驱动负责和硬件进行交互,比如对显存的管理、硬件寄存器的配置等。用户态的库则方便应用程序利用内核态提供的功能进行图形渲染等操作。 在图形显示的具体流程中,DRM 可以控制显示设备的分辨率、刷

大模型大数据攻城狮的专栏 1227

Cursor 用第三方 API:设置里改两个地方就行,不用写一行代码

本文详细介绍了如何在 Cursor 编辑器中配置自定义 API Key 和服务地址。操作简单:通过设置中的 Models 页面开启 OpenAI API Key 模式,填写正确的 API Key 和带 /v1 的 Base URL 即可。文章还提供了常见问题排查方法,并对比了 Cursor 与 VSCode 在 AI 功能集成上的差异,强调 Cursor 内置对话和上下文感知的优势。配置成功后,开发者可直接通过 Ctrl+L

2601_96771545的博客 485

RK3588平台开发系列讲解(以太网篇)MDIO底层驱动

沉淀、分享、成长,让自己和他人都能有所收获!😄。

内核笔记 6881

Cursor 接入商汤 SenseNova API 教程:自定义模型配置方法

Cursor 支持通过 OpenAI API Key 方式配置自定义模型,可以接入 SenseNova(商汤日日新)的 OpenAI 兼容接口。这篇文章主要分享 Cursor 接入 SenseNova 的完整配置步骤,包括套餐限制说明、Models 页面参数填写、模型添加方法,以及配置过程中两个高频报错的解决方法。大家好 这里是「代码简单说」,这篇文章主要分享一下 Cursor 接入 SenseNova 大模型 API 的配置方法。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 706

Image Sensor卷帘曝光(Rolling Shutter)基本原理以及对曝光行的通俗理解

由于CMOS sensor的曝光方式是一行一行的方式进行的,任何一个pixel的曝光时间是一样的,也就是同一行上的每个pixel的曝光开始点和曝光的时间都是一模一样的,所以同一行的所有点所接受到的能量是一样的,而在不同行之间虽然曝光时间都是一样的,但是曝光的开始点是不同的,所以不同行之间所接受到的能量是不一定相同的。至此完成了这一行的曝光。还是以桶装水为比喻: 排成一行的桶(桶的数量和每个桶的大小确定),每一曝光行为单位的时间内每一个桶加水都是一样,需要多少个曝光行才能使的所有水桶加起来的水达到1L。

大熊 3921

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

cursor使用RooCode配置第三方api避坑

点 Cancel → 找 “Use without account” → 进设置配 API。安装第三方api(以智谱为例)注:如果选项中没有api的提供商,可以选择OpenAI Compatible、模型名称可以大写开始启用时一直显示报错,执行不起来,可能是模型名称有点不匹配,可尝试变更模型名称。

fu01o8的博客 391

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Cursor 配置自定义 API 教程:Override Base URL 接入第三方模型(2026 最新,附验证方法)

本文详解Cursor聊天模型切换至自定义OpenAI兼容API(如巨蓝鲸AI)的配置方法与关键边界。重点说明:通过Settings中Override OpenAI Base URL接入外部服务,需正确填写带/v1的URL及专属API Key,使用服务端提供的模型ID(勿加new-前缀)。强调验证成功≠实际调用,核心判断标准为服务端日志记录。明确功能边界——仅聊天请求受控,Tab补全等仍走官方计费。附报错排查表与配置入口指引,助用户灵活使用按量计费模型,实现成本优化与功能分离。

bftx007的博客 218

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

保姆级教程:Cursor自定义大模型教程——接入kimi的moonshot API教程

详细介绍如何在 Cursor编译器 中配置并使用 kimi的大模型moonshot API或者其他兼容了 OpenAI SDK的Api。

m0_73950008的博客 1万+

本地大模型接入Cursor终极教程:Llama 3/DeepSeek-Coder离线部署,安全可控又极速,仅限内部技术组验证版

本教程手把手教你完成本地大模型接入Cursor,支持Llama 3与DeepSeek-Coder离线部署,适用于内部开发、代码安全审查等场景;无需联网、响应极速、全程可控。是当前最实用的Cursor教程,值得收藏。

ProceGlow的博客 496

Cursor接入API: deepseekV3(免费)

2.创建一个API Key:名字随便写一个就好,第二个不用填,点击创建,复制弹出窗口中的API,这个API号码只会在创建的时候出现一次,所以一定要记下来。1. 登录OpenRouter官网,在Models中搜索:deepseekV3。5. 点击Save和Verify,就可以了。4.添加API到Cursor。

m0_63564748的博客 4429
上一篇: 从神经元到神经网络:深度学习的本质
下一篇: AI Agent 连续调工具闷头当哑巴?开源阶段性结论守卫插件实战(已获官方收录)
玄同765
玄同765 新星创作者: 人工智能技术领域 新星创作者: 人工智能技术领域
博客等级 码龄6年 1万+粉丝 262原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值