上周三我把 Cursor 里跑得好好的 Qwen3.7 Plus 搬到 Windsurf,结果代码补全没有内容输出——不报错、不超时,就是返回空。排查了较长时间才发现是两个地方的默认行为跟 Cursor 不一样:一个是 Model ID 字段的 alias 解析逻辑,另一个是 Windsurf 发请求时携带的 temperature 默认值在 Qwen3.7 Plus 上会触发空响应。这篇把完整配置流程和这两个问题的根因讲清楚,照着走五分钟能跑通。

这篇适合谁

  • 已经在 Cursor/Cline 里用过 Qwen3.7 Plus,想迁移到 Windsurf 的
  • 配完 Windsurf Custom Model 后补全没反应、但不报错的
  • 搞不清 DashScope 上 qwen-plusqwen3-plus 到底填哪个的
  • 想在 Windsurf 里关掉 Qwen3 思维链节省 token 的

整体流程

  1. DashScope 控制台拿 API Key
  2. Windsurf Settings 里加 Custom Model,填 Base URL / Key / Model ID
  3. 验证连通性(先 curl 跑通再进 Windsurf)
  4. 修 temperature 默认值,解决空响应
  5. 关闭 thinking 模式压缩 token 消耗
graph LR
 A[DashScope 控制台] -->|拿 Key| B[curl 验证连通]
 B --> C[Windsurf Add Custom Model]
 C --> D{补全有响应?}
 D -->|是| E[调 temperature / 关 thinking]
 D -->|否| F[排查 Model ID / URL 格式]
 F --> C

先说结论

坑点 症状 根因 修法
Model ID 写成 qwen3-plus 400 或静默走到错误模型 DashScope 正确 ID 是 qwen-plus 改成 qwen-plus
temperature 空响应 补全返回空字符串,无报错 Windsurf 默认 temperature=0,在部分短 prompt 场景下偶发空响应 手动设为 0.1 或 0.3
Base URL 末尾多斜杠 TypeError: Failed to fetch 多了 / 拼接出双斜杠路径 去掉末尾 /

第一步:拿 DashScope API Key

阿里云控制台 → 模型服务灵积 → API Key 管理 → 创建。格式是 sk- 开头。

拿到后先 curl 验证一下,别直接往 Windsurf 里填——出了问题你分不清是 Key 的事还是 Windsurf 的事:

curl https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \
 -H "Authorization: Bearer sk-your-key" \
 -H "Content-Type: application/json" \
 -d '{"model":"qwen-plus","messages":[{"role":"user","content":"ping"}]}'

返回 200 带内容就说明 Key 和网络都没问题。如果报这个:

Error: 401 Unauthorized
{"code":"InvalidApiKey","message":"Invalid API-key provided."}

检查复制时有没有带多余空格,或者 Key 是不是刚创建还没激活(等 30 秒再试)。

第二步:Windsurf 填 Custom Model

路径:Settings > AI Models > Add Custom Model。四个字段:

字段 填什么 注意
Model Name 随便写,比如 Qwen3.7-Plus 只是显示名
API Base URL https://dashscope.aliyuncs.com/compatible-mode/v1 末尾不要斜杠
API Key sk-xxxxxxxx DashScope 的 Key
Model ID qwen-plus 不是 qwen3-plus

这里就是第一个主要问题所在。

第三步:Model ID 的 alias 陷阱

Cursor 里你可能填的是 qwen-plus-latest 或者随便写个 alias 然后在 model mapping 里指向真实 ID。Windsurf 没有 model mapping 这层——Model ID 字段直接拼进请求体的 "model" 字段原样发给 DashScope。

所以你填 qwen3-plus,DashScope 收到的就是 "model": "qwen3-plus",然后返回:

Error: 400 Bad Request
{"code":"InvalidParameter","message":"The model does not exist or you do not have access"}

更需要注意的是,如果你填了 qwen3-7b(对应 Qwen3 开源 7B 版本,Model ID 请以 DashScope 官方文档 为准),请求不会报错,但你以为自己在用 Qwen3.7 Plus 的能力,实际跑的是 7B 小模型。补全质量会明显下降,但不报错。

正确的 Model ID 对照表(以下 ID 以 DashScope 官方文档为准,使用前请核实):

你想用的模型 正确 Model ID 错误写法(会静默走错)
Qwen3.7 Plus(最新旗舰) qwen-plus qwen3-plus / qwen3.7-plus
Qwen3.7 Plus 固定版本 qwen-plus-latest qwen-plus-2026
Qwen3 235B 开源版 qwen3-235b-a22b qwen3-235b
Qwen3 7B 开源版 请查阅官方文档 qwen-7b

第四步:temperature 默认值导致空响应

这是最隐蔽的问题。配完之后 Cascade 对话能用,但代码补全(autocomplete)返回空字符串。

抓包可以看到 Windsurf 给补全请求默认携带了 "temperature": 0,而 Cursor 的默认值是 0.1。

在实际使用中观察到:Windsurf 以 temperature=0 调用 Qwen3.7 Plus 时,对于较短的 prompt(比如补全场景下只有几行上下文),偶发返回空 choices。这一现象表现为"时灵时不灵"。需要说明的是,这一行为的具体归因——究竟是模型侧特性还是客户端侧行为——目前没有官方文档佐证,建议遇到此问题时优先调整 temperature 值进行验证。

解法:在 Windsurf 的 Custom Model 高级设置里把 temperature 手动设为 0.1

注意:temperature 是 API 请求的采样参数,无法通过 System Prompt 文本指令来控制。如果 Windsurf 版本没有暴露 temperature 设置项,需要通过其他方式(如升级客户端版本或通过 API 直接调用)来设置该参数。

第五步:关闭 thinking 模式节省 token

Qwen3.7 Plus 默认开启思维链,Windsurf 的 Cascade 对话里你会看到模型先输出一大段 <think>...</think> 然后才给答案。这些 thinking token 同样计费——以写一个快速排序为例,thinking 部分可能消耗数百 tokens,而实际答案 token 量相对较少。

关闭 thinking 的官方方式有两种:

方式一:在用户消息末尾加 /no_think(注意是下划线)

根据 Qwen3 官方文档,在用户消息末尾添加 /no_think 可关闭当次请求的 thinking 模式。

方式二:通过 enable_thinking 参数

如果你是通过 API 调用,可以在请求中传入该参数:

resp = client.chat.completions.create(
    model="qwen-plus",
    messages=[{"role": "user", "content": "快速排序"}],
    extra_body={"enable_thinking": False}
)

注意:extra_bodyenable_thinking 参数的实际生效情况取决于所使用的 SDK 版本,建议参考 DashScope 官方文档 确认当前版本的支持情况。

关闭 thinking 后,对于代码补全这类场景,token 消耗会有明显下降。

不同场景怎么选

纯代码补全(autocomplete):用 qwen-plus,temperature 设 0.1,关 thinking。

Cascade 对话(重构/解释代码):同样 qwen-plus,temperature 可以放到 0.3,thinking 看情况——复杂逻辑推理就开着,简单问答关掉。

控制成本:可以考虑补全用较小的开源模型,对话用 qwen-plus。Windsurf 支持给不同场景配不同模型,在 Settings > AI Models 里分别加两个 Custom Model 就行。各模型的具体定价请以 DashScope 官方价格页 为准。

团队统一管理:如果团队多人都在用 Windsurf + Qwen,建议走 API 聚合网关统一分发 Key,可以按用户维度追踪 token 消耗和费用,避免月底逐一对账。

常见问题 FAQ

Q: Base URL 到底要不要加 /v1

要加。正确格式是 https://dashscope.aliyuncs.com/compatible-mode/v1,末尾不带斜杠。如果你只填到 /compatible-mode,Windsurf 拼接后会请求 /compatible-mode/chat/completions,DashScope 返回 404。

Q: 配完后模型列表里看不到我加的模型?

重启 Windsurf。有时候改完 Settings 不会立即刷新模型列表,关掉整个窗口重新打开就有了。

Q: 补全时灵时不灵,有时候有内容有时候空?

大概率是 temperature=0 的问题,参考第四步。也可能是触发了 DashScope 的内容审核,此时 API 返回 HTTP 400,错误码为 DataInspectionFailed

Error: 400 Bad Request
{"code":"DataInspectionFailed","message":"Input data may contain inappropriate content"}

遇到这个错误说明请求内容触发了内容过滤,换个 prompt 试试。

Q: 怎么确认我实际调用的是哪个模型?

最可靠的方式是在 DashScope 控制台查看调用日志,确认请求中实际使用的 Model ID。也可以通过抓包查看 Windsurf 发出的请求体。直接询问模型"你是什么模型"并不可靠——模型的自报身份与实际调用的 Model ID 是两回事,不应作为确认依据。

Q: Windsurf 免费版能用 Custom Model 吗?

能。Custom Model 的费用走你自己的 DashScope 账户,跟 Windsurf 订阅无关。免费版唯一限制是 Cascade 对话次数,但代码补全不限。

Q: 报 429 限流怎么办?

Error: 429 Too Many Requests
{"code":"Throttling.RateQuota","message":"Requests rate limit exceeded"}

DashScope 各模型的限流规则按模型和账户等级不同而有所差异,具体 QPM 上限请查阅 DashScope 官方文档。如果团队多人共用一个 Key 容易触发限流,可以考虑每人单独申请 Key,或通过聚合网关做负载均衡。

小结

整个配置其实就三个字段的事,但 Model ID 的命名规则和 temperature 默认值这两个差异,确实让从 Cursor 迁移过来的人容易踩坑。Windsurf 的 Custom Model 设计比 Cursor 更"直通"——没有 model mapping 层,填什么就发什么。好处是简单透明,坏处是你得自己去查 DashScope 的真实 Model ID,不能想当然。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐