# Provider 设置指南
这是一份覆盖 SF 所有受支持 LLM providers 的分步配置指南。如果你已经运行过 onboarding 向导(`sf config`)并选择了 provider,很可能已经配置完成,可以在会话中用 `/model` 检查。
## 目录
- [快速参考](#quick-reference)
- [内置 Providers](#built-in-providers)
- [Anthropic(Claude)](#anthropic-claude)
- [OpenAI](#openai)
- [Google Gemini](#google-gemini)
- [OpenRouter](#openrouter)
- [Groq](#groq)
- [xAI(Grok)](#xai-grok)
- [Mistral](#mistral)
- [GitHub Copilot](#github-copilot)
- [Amazon Bedrock](#amazon-bedrock)
- [Vertex AI 上的 Anthropic](#anthropic-on-vertex-ai)
- [Azure OpenAI](#azure-openai)
- [本地 Providers](#local-providers)
- [Ollama](#ollama)
- [LM Studio](#lm-studio)
- [vLLM](#vllm)
- [SGLang](#sglang)
- [自定义 OpenAI-Compatible Endpoints](#custom-openai-compatible-endpoints)
- [常见坑点](#common-pitfalls)
- [验证你的配置](#verifying-your-setup)
## 快速参考
| Provider | 认证方式 | 环境变量 | 配置文件 |
|----------|----------|----------|----------|
| Anthropic | API key | `ANTHROPIC_API_KEY` | — |
| OpenAI | API key | `OPENAI_API_KEY` | — |
| Google Gemini | API key | `GEMINI_API_KEY` | — |
| OpenRouter | API key | `OPENROUTER_API_KEY` | 可选 `models.json` |
| Groq | API key | `GROQ_API_KEY` | — |
| xAI | API key | `XAI_API_KEY` | — |
| Mistral | API key | `MISTRAL_API_KEY` | — |
| GitHub Copilot | OAuth | `GH_TOKEN` | — |
| Amazon Bedrock | IAM credentials | `AWS_PROFILE` 或 `AWS_ACCESS_KEY_ID` | — |
| Vertex AI | ADC | `GOOGLE_APPLICATION_CREDENTIALS` | — |
| Azure OpenAI | API key | `AZURE_OPENAI_API_KEY` | — |
| Ollama | 无(本地) | — | 需要 `models.json` |
| LM Studio | 无(本地) | — | 需要 `models.json` |
| vLLM / SGLang | 无(本地) | — | 需要 `models.json` |
---
## 内置 Providers
内置 providers 的 models 已经预注册在 SF 里。你只需要提供认证信息。
### Anthropic(Claude)
**推荐。** Anthropic models 集成最深,支持内置 Web 搜索、extended thinking 和 prompt caching。
**选项 A:API key(推荐)**
```bash
export ANTHROPIC_API_KEY="sk-ant-..."
```
或者运行 `sf config`,在提示时粘贴 key。
**获取 key:** [console.anthropic.com/settings/keys](https://console.anthropic.com/settings/keys)
**选项 B:Claude Code CLI**
如果你有 Claude Pro 或 Max 订阅,可以通过 Anthropic 官方的 Claude Code CLI 完成认证。安装后执行 `claude` 登录,随后 SF 会自动检测并经由该通道路由:
```bash
# 安装 Claude Code CLI(见 https://docs.anthropic.com/en/docs/claude-code)
claude
# 按提示登录,然后启动 SF
sf
```
SF 会检测你本地的 Claude Code 安装,并把它作为已认证的 Anthropic surface 使用。这是 Anthropic 订阅用户符合 TOS 的方式,SF 不会直接处理你的订阅凭据。
> **注意:** SF 不支持 Anthropic 的浏览器 OAuth 登录。请改用 API key 或 Claude Code CLI。
**Runtime 边界:** SF 可以把 Claude Code、Codex 或 Gemini CLI core 作为 model/runtime adapter 使用。这些 adapter 不是项目 MCP 依赖,SF 也不会把自己的 workflow 暴露成 MCP server。请直接运行 `sf` 或 `/sf autonomous`;MCP 配置只用于 SF 需要调用的外部工具。
### OpenAI
```bash
export OPENAI_API_KEY="sk-..."
```
或者运行 `sf config`,选择 “Paste an API key” 然后选择 “OpenAI”。
**获取 key:** [platform.openai.com/api-keys](https://platform.openai.com/api-keys)
### Google Gemini
```bash
export GEMINI_API_KEY="..."
```
**获取 key:** [aistudio.google.com/app/apikey](https://aistudio.google.com/app/apikey)
### OpenRouter
OpenRouter 通过单个 API key 聚合了多个 providers 的 200+ models。
**第 1 步:获取 API key**
访问 [openrouter.ai/keys](https://openrouter.ai/keys) 创建一个 key。
**第 2 步:设置 key**
```bash
export OPENROUTER_API_KEY="sk-or-..."
```
或者运行 `sf config`,选择 “Paste an API key” 然后选择 “OpenRouter”。
**第 3 步:切换到 OpenRouter model**
在 SF 会话中输入 `/model` 并选择一个 OpenRouter model。OpenRouter models 都以 `openrouter/` 为前缀(例如 `openrouter/anthropic/claude-sonnet-4`)。
**可选:通过 `models.json` 添加自定义 OpenRouter models**
如果你想使用不在内置列表中的 model,可把它写进 `~/.sf/agent/models.json`:
```json
{
"providers": {
"openrouter": {
"baseUrl": "https://openrouter.ai/api/v1",
"apiKey": "OPENROUTER_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "meta-llama/llama-3.3-70b",
"name": "Llama 3.3 70B (OpenRouter)",
"reasoning": false,
"input": ["text"],
"contextWindow": 131072,
"maxTokens": 32768,
"cost": { "input": 0.3, "output": 0.3, "cacheRead": 0, "cacheWrite": 0 }
}
]
}
}
}
```
注意:这里的 `apiKey` 字段写的是**环境变量名**,不是字面 key。SF 会自动解析它。你也可以改用字面值或 shell 命令(见 [值解析](./custom-models.md#value-resolution))。
**可选:路由到指定上游 provider**
你可以通过 `modelOverrides` 控制 OpenRouter 实际选用哪个上游 provider:
```json
{
"providers": {
"openrouter": {
"modelOverrides": {
"anthropic/claude-sonnet-4": {
"compat": {
"openRouterRouting": {
"only": ["amazon-bedrock"]
}
}
}
}
}
}
}
```
### Groq
```bash
export GROQ_API_KEY="gsk_..."
```
**获取 key:** [console.groq.com/keys](https://console.groq.com/keys)
### xAI(Grok)
```bash
export XAI_API_KEY="xai-..."
```
**获取 key:** [console.x.ai](https://console.x.ai)
### Mistral
```bash
export MISTRAL_API_KEY="..."
```
**获取 key:** [console.mistral.ai/api-keys](https://console.mistral.ai/api-keys)
### GitHub Copilot
使用 OAuth,通过浏览器登录:
```bash
sf config
# 选择 "Sign in with your browser" → "GitHub Copilot"
```
要求你拥有有效的 GitHub Copilot 订阅。
### Amazon Bedrock
Bedrock 使用 AWS IAM 凭据,而不是 API key。下面任意一种都可以:
```bash
# 选项 1:命名 profile
export AWS_PROFILE="my-profile"
# 选项 2:IAM keys
export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="..."
export AWS_REGION="us-east-1"
# 选项 3:Bedrock API key(bearer token)
export AWS_BEARER_TOKEN_BEDROCK="..."
```
ECS task roles 和 IRSA(Kubernetes)也会被自动检测。
### Vertex AI 上的 Anthropic
使用 Google Cloud Application Default Credentials:
```bash
gcloud auth application-default login
export ANTHROPIC_VERTEX_PROJECT_ID="my-project-id"
```
或者设置 `GOOGLE_CLOUD_PROJECT`,并确保 ADC 凭据存在于 `~/.config/gcloud/application_default_credentials.json`。
### Azure OpenAI
```bash
export AZURE_OPENAI_API_KEY="..."
```
---
## 本地 Providers
本地 providers 运行在你的机器上。因为 SF 需要知道 endpoint URL 和可用 models,所以它们都要求配置 `models.json`。
**配置文件位置:** `~/.sf/agent/models.json`
每次打开 `/model` 时,这个文件都会自动重新加载,无需重启。
### Ollama
**第 1 步:安装并启动 Ollama**
```bash
# macOS
brew install ollama
ollama serve
# 或前往 https://ollama.com 下载
```
**第 2 步:拉取一个 model**
```bash
ollama pull llama3.1:8b
ollama pull qwen2.5-coder:7b
```
**第 3 步:创建 `~/.sf/agent/models.json`**
```json
{
"providers": {
"ollama": {
"baseUrl": "http://localhost:11434/v1",
"api": "openai-completions",
"apiKey": "ollama",
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": false
},
"models": [
{ "id": "llama3.1:8b" },
{ "id": "qwen2.5-coder:7b" }
]
}
}
}
```
`apiKey` 是 schema 的必填字段,但 Ollama 会忽略它,因此任意值都可以。
**第 4 步:选择 model**
在 SF 里输入 `/model`,然后选择你的 Ollama model。
**Ollama 提示:**
- Ollama 不支持 `developer` role,也不支持 `reasoning_effort`,因此请始终设置 `compat.supportsDeveloperRole: false` 和 `compat.supportsReasoningEffort: false`
- 如果得到空响应,先检查 `ollama serve` 是否正在运行,以及 model 是否已经 pull 下来
- 如果未显式指定,`contextWindow` 和 `maxTokens` 默认分别为 128K / 16K。若模型能力不同,请手动覆盖
### LM Studio
**第 1 步:安装 LM Studio**
访问 [lmstudio.ai](https://lmstudio.ai) 下载。
**第 2 步:启动本地 server**
在 LM Studio 中进入 “Local Server” 标签页,加载一个 model,然后点击 “Start Server”。默认端口为 1234。
**第 3 步:创建 `~/.sf/agent/models.json`**
```json
{
"providers": {
"lm-studio": {
"baseUrl": "http://localhost:1234/v1",
"api": "openai-completions",
"apiKey": "lm-studio",
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": false
},
"models": [
{
"id": "your-model-name",
"name": "My Local Model",
"contextWindow": 32768,
"maxTokens": 4096
}
]
}
}
}
```
把 `your-model-name` 替换成 LM Studio server 标签页中显示的 model 标识符。
**LM Studio 提示:**
- `models.json` 里的 model `id` 必须与 LM Studio server API 返回的值完全一致
- LM Studio 默认端口是 1234;如果你改了端口,也要同步修改 `baseUrl`
- 如果模型支持更大的上下文,记得上调 `contextWindow` 和 `maxTokens`
### vLLM
```json
{
"providers": {
"vllm": {
"baseUrl": "http://localhost:8000/v1",
"api": "openai-completions",
"apiKey": "vllm",
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": false,
"supportsUsageInStreaming": false
},
"models": [
{
"id": "meta-llama/Llama-3.1-8B-Instruct",
"contextWindow": 128000,
"maxTokens": 16384
}
]
}
}
}
```
model `id` 必须与 `vllm serve` 启动时传入的 `--model` 参数完全一致。
### SGLang
```json
{
"providers": {
"sglang": {
"baseUrl": "http://localhost:30000/v1",
"api": "openai-completions",
"apiKey": "sglang",
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": false
},
"models": [
{
"id": "meta-llama/Llama-3.1-8B-Instruct"
}
]
}
}
}
```
---
## 自定义 OpenAI-Compatible Endpoints
任何实现了 OpenAI Chat Completions API 的 server 都可以和 SF 配合使用。这包括代理(LiteLLM、Portkey、Helicone)、自托管推理服务,以及新出现的 providers。
**最快路径:使用 onboarding 向导**
```bash
sf config
# 选择 "Paste an API key" → "Custom (OpenAI-compatible)"
# 输入:base URL、API key、model ID
```
这会自动帮你写好 `~/.sf/agent/models.json`。
**手动配置:**
```json
{
"providers": {
"my-provider": {
"baseUrl": "https://my-endpoint.example.com/v1",
"apiKey": "MY_PROVIDER_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "model-id-here",
"name": "Friendly Model Name",
"reasoning": false,
"input": ["text"],
"contextWindow": 128000,
"maxTokens": 16384,
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
}
]
}
}
}
```
**添加自定义 headers(常见于代理)**
```json
{
"providers": {
"litellm-proxy": {
"baseUrl": "https://litellm.example.com/v1",
"apiKey": "MY_API_KEY",
"api": "openai-completions",
"headers": {
"x-custom-header": "value"
},
"models": [...]
}
}
}
```
**支持 thinking mode 的 Qwen models**
对于 Qwen-compatible servers,可用 `thinkingFormat` 打开 thinking mode:
```json
{
"compat": {
"thinkingFormat": "qwen",
"supportsDeveloperRole": false
}
}
```
如果该 server 要求 `chat_template_kwargs.enable_thinking`,请改用 `"qwen-chat-template"`。
关于 `compat` 字段、`modelOverrides`、值解析和高级配置的完整说明,见 [自定义模型](./custom-models.md)。
---
## 常见坑点
### 使用有效 key 仍提示 “Authentication failed”
**原因:** key 虽然设在 shell 中,但 SF 看不到。
**解决:** 确认你是在同一个终端里 `export` 了该环境变量并运行 `sf`。或者直接用 `sf config` 把 key 保存进 `~/.sf/agent/auth.json`,这样就能跨会话持久化。
### OpenRouter models 没出现在 `/model`
**原因:** 没有设置 `OPENROUTER_API_KEY`,因此 SF 会隐藏 OpenRouter models。
**解决:** 设置 key 并重启 SF:
```bash
export OPENROUTER_API_KEY="sk-or-..."
sf
```
### Ollama 返回空响应
**原因:** Ollama server 没有运行,或者对应 model 尚未 pull。
**解决:**
```bash
# 确认 server 正在运行
curl http://localhost:11434/v1/models
# 如果 model 缺失则先 pull
ollama pull llama3.1:8b
```
### LM Studio model ID 不匹配
**原因:** `models.json` 中的 `id` 和 LM Studio 实际通过 API 暴露的值不一致。
**解决:** 去 LM Studio 的 server 标签页查看精确的 model 标识符。它通常会包含文件名或量化后缀(例如 `lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF`)。
### 本地 models 报 `developer` role 错误
**原因:** 大多数本地推理 server 不支持 OpenAI 的 `developer` message role。
**解决:** 在 provider 配置里添加 `compat.supportsDeveloperRole: false`。这样 SF 会改用 `system` message:
```json
{
"compat": {
"supportsDeveloperRole": false,
"supportsReasoningEffort": false
}
}
```
### 本地 models 报 `stream_options` 错误
**原因:** 部分 server 不支持 `stream_options: { include_usage: true }`。
**解决:** 添加 `compat.supportsUsageInStreaming: false`:
```json
{
"compat": {
"supportsUsageInStreaming": false
}
}
```
### 报 “apiKey is required” 校验错误
**原因:** `models.json` schema 规定:只要定义了 `models`,就必须存在 `apiKey`。
**解决:** 对于不需要认证的本地 server,填一个占位值即可:
```json
"apiKey": "not-needed"
```
### 自定义 models 的成本显示为 `$0.00`
这是**预期行为**。SF 对自定义 models 的默认成本就是 0。如果你想获得准确的成本跟踪,需要自己填写 `cost` 字段:
```json
"cost": { "input": 0.15, "output": 0.60, "cacheRead": 0.015, "cacheWrite": 0.19 }
```
这些值的单位都是每百万 tokens。
---
## 验证你的配置
完成 provider 配置后:
1. **启动 SF:**
```bash
sf
```
2. **检查可用 models:**
```
/model
```
列表里应该能看到该 provider 的 models。
3. **切换到对应 model:**
在 `/model` 选择器中选中它。
4. **发送一条测试消息:**
输入任意内容,确认 model 可以正常响应。
如果 model 没有出现,请检查:
- 当前 shell 中是否设置了对应环境变量
- `models.json` 是否是合法 JSON(可执行 `cat ~/.sf/agent/models.json | python3 -m json.tool`)
- 本地 providers 的 server 是否已经运行
如果还需要更多帮助,请查看 [故障排查](./troubleshooting.md),或者在会话中运行 `/sf doctor`。