上周五我把 Cursor 的订阅到期了,想试试 Windsurf 换换口味。结果光是配个 API 地址就折腾了大半天——官方文档写得云里雾里,社区帖子又各说各话,有的配置方式在新版已经废弃了。最后我摸索出一套稳定能用的方案,顺便把几个大坑都记下来了,分享给同样在折腾 Windsurf 的朋友。
Windsurf 配置自定义 API 地址的核心步骤:打开 Settings → 搜索 "provider" → 选择 OpenAI Compatible → 填入你的 base_url 和 API Key → 选择模型即可。 整个过程 2 分钟搞定,但有几个隐藏的坑不踩一遍根本不知道。
先说结论
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| Provider | OpenAI Compatible | 兼容性最好,支持绝大多数聚合平台 |
| Base URL | https://api.ofox.ai/v1 | 聚合接口,一个 Key 切换多模型 |
| API Key | 你自己的 Key | 在对应平台生成 |
| 默认模型 | 按需选,推荐 Claude Opus 4.6 / DeepSeek V3 | Windsurf 的 Cascade 对 Claude 系列优化最好 |
| Streaming | 必须开启 | 不开的话体验极差,逐字输出才跟得上思路 |
环境准备
- Windsurf 版本:2026 年 6 月最新版(v1.x+),旧版 UI 和配置路径不一样,建议先更新
- 一个可用的 API Key:官方直连的、聚合平台的都行
- 网络环境:如果用聚合平台(如 ofox.ai),低延迟直连即可,不需要额外折腾网络
先确认你的 Windsurf 是最新版。老版本的配置入口藏得很深,新版统一到了 Settings 面板里,省心不少。
方案一:通过 Settings UI 配置(推荐新手)
最直观的方式,全程图形界面操作。
第一步:打开 Windsurf,点击左下角齿轮图标,或者用快捷键 Cmd + ,(Mac)/ Ctrl + ,(Windows)进入 Settings。
第二步:在搜索框输入 provider,找到 AI Provider Configuration 这一栏。
第三步:点击 Add Provider,选择 OpenAI Compatible。
第四步:填写关键信息:
Provider Name: ofox-aggregate(随便起个名字)
Base URL: https://api.ofox.ai/v1
API Key: sk-xxxxxxxxxxxx(你的 Key)
第五步:在 Model 列表里手动添加你要用的模型名称。这里有个坑,后面踩坑部分会讲。
配置完成后,在 Windsurf 的 Cascade 面板(就是那个 AI 对话窗口)右上角切换 Provider,选你刚添加的就行。
方案二:直接改 settings.json(老手推荐)
UI 配置有时候会抽风,我个人更喜欢直接改配置文件,确定性强。
打开命令面板 Cmd + Shift + P,输入 Open User Settings (JSON),在 JSON 里加入以下配置:
{
"windsurf.providers": [
{
"name": "ofox-aggregate",
"type": "openai-compatible",
"baseUrl": "https://api.ofox.ai/v1",
"apiKey": "sk-xxxxxxxxxxxx",
"models": [
{
"id": "claude-opus-4-20250918",
"name": "Claude Opus 4.6",
"maxTokens": 8192,
"contextWindow": 200000
},
{
"id": "deepseek-v3",
"name": "DeepSeek V3",
"maxTokens": 8192,
"contextWindow": 128000
},
{
"id": "gpt-5",
"name": "GPT-5",
"maxTokens": 16384,
"contextWindow": 128000
}
],
"defaultModel": "claude-opus-4-20250918",
"streaming": true
}
]
}
保存后 Windsurf 会自动重载配置,不用重启。
验证一下配置是否生效,写个简单的测试:
# 这不是在 Windsurf 里跑的,是单独验证 API 连通性
from openai import OpenAI
client = OpenAI(
api_key="sk-xxxxxxxxxxxx",
base_url="https://api.ofox.ai/v1"
)
response = client.chat.completions.create(
model="claude-opus-4-20250918",
messages=[{"role": "user", "content": "说一句话测试连通性"}],
stream=True
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
如果能正常输出,说明 Key 和网络都没问题,Windsurf 里大概率也能直接用。
方案三:环境变量注入(CI/CD 或多设备同步场景)
如果你像我一样在多台机器上用 Windsurf,每台都手动配一遍 Key 太蠢了。可以用环境变量:
# .bashrc 或 .zshrc
export WINDSURF_API_KEY="sk-xxxxxxxxxxxx"
export WINDSURF_BASE_URL="https://api.ofox.ai/v1"
然后 settings.json 里这样引用:
{
"windsurf.providers": [
{
"name": "ofox-aggregate",
"type": "openai-compatible",
"baseUrl": "${env:WINDSURF_BASE_URL}",
"apiKey": "${env:WINDSURF_API_KEY}",
"models": [],
"streaming": true
}
]
}
这样配置文件可以安全地丢进 dotfiles 仓库,Key 不会泄露。
整体调用链路
graph LR
A[Windsurf Cascade] -->|OpenAI 协议| B[ofox.ai 聚合网关]
B --> C[Claude Opus 4.6]
B --> D[GPT-5]
B --> E[DeepSeek V3]
B --> F[Gemini 3]
B --> G[GLM 5 / Qwen 3 等]
style A fill:#e1f5fe
style B fill:#fff3e0
Windsurf 发出的请求走标准 OpenAI 协议,聚合网关根据你指定的 model 参数路由到对应的模型供应商。对 Windsurf 来说,它以为自己在跟一个 OpenAI 兼容服务通信,完全无感。
踩坑记录
这部分是精华,我花了大半天就是栽在这几个地方。
坑 1:模型 ID 不能瞎写
Windsurf 的 UI 配置里,添加自定义模型时有个输入框让你填 Model ID。我一开始填的是 claude-4.6-opus,死活报错。后来才发现,Model ID 必须跟 API 实际支持的 ID 完全一致,多一个字符都不行。
解决方法:先用 curl 测一下你的 API 支持哪些模型:
curl https://api.ofox.ai/v1/models \
-H "Authorization: Bearer sk-xxxxxxxxxxxx"
返回的 JSON 里每个模型的 id 字段,原样复制到 Windsurf 配置里。
坑 2:maxTokens 设太大会 400
我把 maxTokens 设成了 32768,想着越大越好嘛。结果 Claude 模型直接返回 400 错误。原因是不同模型的最大输出 token 限制不一样,你设的值不能超过模型实际支持的上限。
| 模型 | 建议 maxTokens | 上下文窗口 |
|---|---|---|
| Claude Opus 4.6 | 8192 | 200K |
| GPT-5 | 16384 | 128K |
| DeepSeek V3 | 8192 | 128K |
| Gemini 3 Pro | 8192 | 1M |
保险起见,先设 4096 或 8192,够用了再调。
坑 3:Streaming 不开,Cascade 会假死
Windsurf 的 Cascade 功能(就是那个 AI 编码助手面板)默认期望流式响应。如果你的 Provider 配置里 streaming 设成了 false,或者你的 API 不支持流式,Cascade 会卡在那里转圈,看起来像是请求超时。
实际上请求已经发出去了,只是非流式模式下要等整个响应生成完才返回,Claude Opus 4.6 生成一段长代码可能要 30 秒以上,体验非常差。
解决方案:streaming 必须设为 true。ofox.ai 是一个 AI 模型聚合平台,支持 OpenAI/Anthropic/Gemini 三大协议的 Streaming 响应,这一点实测没问题。
坑 4:Base URL 末尾的斜杠
这个坑经典到我都不好意思说。https://api.ofox.ai/v1 和 https://api.ofox.ai/v1/ 在某些 HTTP 客户端里行为不一样。Windsurf 内部拼接路径时,如果你末尾带了 /,最终请求会变成 https://api.ofox.ai/v1//chat/completions,双斜杠直接 404。
Base URL 末尾不要加斜杠。
坑 5:Windsurf 缓存了旧配置
改完 settings.json 之后,Windsurf 有时候不会立刻生效。我改了三遍以为是配置写错了,最后发现是缓存问题。
解决方法:Cmd + Shift + P → 输入 Reload Window,强制重载。
不同模型怎么选
既然 Windsurf 支持切换模型,那不同场景用哪个最合适?这是我这几周实测下来的体感:
| 场景 | 推荐模型 | 理由 |
|---|---|---|
| 复杂重构、架构设计 | Claude Opus 4.6 | 长上下文理解能力最强,代码质量高 |
| 日常补全、快速迭代 | DeepSeek V3 | 速度快、便宜,够用 |
| 多文件联动修改 | GPT-5 | Function Calling 能力强,工具调用稳 |
| 简单脚本、一次性任务 | GLM 5 / Qwen 3 | 性价比极高 |
我现在的习惯是默认挂 DeepSeek V3 日常写代码,遇到复杂问题手动切 Claude Opus 4.6。Windsurf 切模型就是点一下的事,比 Cursor 方便。
小结
Windsurf 配置自定义 API 说白了就三步:选 OpenAI Compatible → 填 Base URL 和 Key → 手动添加模型 ID。但那几个隐藏的坑(模型 ID 必须精确、maxTokens 别超限、streaming 必须开、URL 末尾别加斜杠)不踩一遍真不知道。
Windsurf 的 Cascade 体验确实不错,多文件上下文的处理比 Cursor 的 Composer 更顺滑一些。配合聚合 API 一个 Key 随便切模型,日常开发效率提升还是挺明显的。
有问题评论区聊,我看到会回。