模型接入

自定义模型供应商

只要接口兼容,就能接。千手大师为每个供应商实现了一层流适配器,把第三方 API 格式转换为内部格式, 下游对话逻辑完全不用改。内置 firstParty、Bedrock、Vertex、Foundry、OpenAI、Gemini、Grok 七类 provider, 通过 /login 向导或 /provider 命令切换。

  • OpenAI / Anthropic / Gemini / Grok
  • /login
  • 接口兼容即可用

这是什么

千手大师把所有大模型接入统一为「流适配器」模式:每个兼容层负责把第三方 API 的请求与流式响应 转换成内部格式,上游的查询引擎、工具调用与消息渲染完全无感。因此支持一个供应商的门槛很低—— 接口兼容即可用。

provider 类型 接入方式
firstParty 默认 千手 / Anthropic 直接端点
openai 兼容层 任意 OpenAI Chat Completions 协议端点(Ollama / DeepSeek / vLLM / One API 等)
gemini 兼容层 Google Gemini 原生 REST / SSE
grok 兼容层 xAI Grok API(OpenAI 协议,独立 base URL 与密钥)
bedrock 云平台 AWS Bedrock(仅环境变量控制)
vertex 云平台 Google Vertex AI(仅环境变量控制)
foundry 云平台 Microsoft Foundry(仅环境变量控制)

provider 选择优先级(高到低):

优先级
settings.json 的 modelType 参数
  > QS_USE_BEDROCK / QS_USE_VERTEX / QS_USE_FOUNDRY
  > QS_USE_OPENAI / QS_USE_GEMINI / QS_USE_GROK
  > 默认 firstParty
i
配置写在 settings.json

/login 向导与 /provider 命令最终都会写入用户设置的 modelType 与 env 字段;云平台 provider 例外, 它们只由环境变量控制,不会写入 modelType。

前置条件

  • 已安装千手大师(qsdashi,英文别名 qs-master)。
  • 目标供应商的 API key(以及自建端点时的 base URL)。
  • 如需写入 settings.json 持久生效,确保对用户配置目录有写权限。
  • 环境变量方式生效时,需在启动 qsdashi 的同一 shell 中导出。

启用与切换

有三种方式,可任选:

1用 /login 向导配置

在会话中输入 /login,选择登录方式,填 base URL / API key / 各档模型。

可选登录方式
Anthropic Compatible      # 自建 Anthropic 协议端点 → modelType: anthropic
OpenAI Compatible         # Ollama / DeepSeek / vLLM / One API → modelType: openai
China LLM Providers       # DeepSeek / Zhipu GLM / Qwen / MiMo → modelType: openai
ChatGPT account           # ChatGPT 订阅账号
Gemini API                # Google Gemini → modelType: gemini
Claude account            # Claude 订阅
Anthropic Console         # Console 账户按量计费
3rd-party platform        # Bedrock / Foundry / Vertex

2用 /provider 切换当前 provider

别名 /api。持久化写入 settings.json 的 modelType。

Terminal(会话内)
/provider            # 显示当前 provider
/provider openai     # 切换到 OpenAI 兼容层
/provider unset      # 清除 modelType 与所有 QS_USE_* 变量,回退到环境变量

3直接用环境变量

不做任何设置改动,启动时读取。适合容器 / CI 场景。

Terminal
QS_USE_OPENAI=1 \
OPENAI_BASE_URL=http://localhost:11434/v1 \
OPENAI_API_KEY=ollama \
OPENAI_MODEL=qwen3-coder \
qsdashi

配置

OpenAI 兼容层(QS_USE_OPENAI=1 启用)

环境变量 必填 说明
QS_USE_OPENAI是启用 OpenAI 兼容层
OPENAI_API_KEY是端点 API key(本地无鉴权可填占位值)
OPENAI_BASE_URL建议端点 base URL,如 http://localhost:11434/v1
OPENAI_MODEL否覆盖所有模型映射
OPENAI_DEFAULT_{FAMILY}_MODEL否按 family(HAIKU / SONNET / OPUS)映射
OPENAI_ENABLE_THINKING否1 强制开启思考模式,0 强制关闭
OPENAI_MAX_TOKENS否覆盖最大输出 token(适合小上下文本地模型)
OPENAI_ORG_ID / OPENAI_PROJECT_ID否组织 / 项目 ID
OPENAI_AUTH_MODE=chatgpt否使用 ChatGPT 订阅鉴权而非 API key

模型映射优先级:OPENAI_MODEL > OPENAI_DEFAULT_{FAMILY}_MODEL > QS_DEFAULT_{FAMILY}_MODEL(向后兼容) > 内置默认映射表 > 原样透传。

*
DeepSeek thinking mode

思考模式在以下情况自动开启:设置 OPENAI_ENABLE_THINKING=1, 或模型名包含 deepseek / mimo(大小写不敏感)。 设置 OPENAI_ENABLE_THINKING=0/false/no/off 可强制关闭(优先级最高)。 开启后请求体会同时带 thinking: {type:"enabled"}、enable_thinking: true 与 chat_template_kwargs 三种格式,端点各取所需,忽略其余。

Gemini 兼容层(QS_USE_GEMINI=1 启用)

环境变量 必填 说明
QS_USE_GEMINI是启用 Gemini 兼容层
GEMINI_API_KEY是通过 x-goog-api-key 头发送
GEMINI_BASE_URL否默认 https://generativelanguage.googleapis.com/v1beta
GEMINI_MODEL否直接指定模型,覆盖一切映射
GEMINI_DEFAULT_{FAMILY}_MODEL否按 family 映射(HAIKU / SONNET / OPUS)
QS_DEFAULT_{FAMILY}_MODEL否向后兼容的按 family 映射

模型映射优先级:GEMINI_MODEL > GEMINI_DEFAULT_{FAMILY}_MODEL > QS_DEFAULT_{FAMILY}_MODEL > 原样。若模型名能识别出 family(含 sonnet / opus / haiku)但以上都未配置,会直接抛出错误。

Grok 兼容层(QS_USE_GROK=1 启用)

环境变量 必填 说明
QS_USE_GROK是启用 Grok 兼容层
GROK_API_KEY / XAI_API_KEY是两者任一
GROK_BASE_URL否默认 https://api.x.ai/v1
GROK_MODEL否覆盖所有模型映射
GROK_DEFAULT_{FAMILY}_MODEL否按 family 映射
GROK_MODEL_MAP否JSON 字符串,按 family 覆盖映射

云平台 provider(仅环境变量控制)

环境变量 对应 provider
QS_USE_BEDROCKAWS Bedrock
QS_USE_VERTEXGoogle Vertex AI
QS_USE_FOUNDRYMicrosoft Foundry

provider 注册表(providers.json)

src/services/providerRegistry/ 提供了文件化的 provider 配置机制: 从 ~/.claude/providers.json 读取一个 ProviderConfig 数组并校验, 与内置默认项按 id 合并(用户项覆盖同名默认项)。内置默认项为 cerebras、groq、qwen、deepseek。 switchProvider(id) 会计算激活某个 OpenAI 兼容 provider 所需的环境变量 (QS_USE_OPENAI=1、OPENAI_BASE_URL、OPENAI_MODEL), 但它不修改 process.env,需要用户自行写入 shell 配置。

常用命令与参数

命令 参数 行为
/login 无 打开登录向导,选择登录方式并填写 base URL / API key / 各档模型
/provider 无 显示当前 API provider
/provider anthropic / openai / gemini / grok 写入 settings.json 的 modelType,并清理冲突的 QS_USE_* 变量
/provider bedrock / vertex / foundry 只设置对应 QS_USE_* 环境变量,不改 settings.json
/provider unset 清空 modelType 与所有 QS_USE_* 变量,回退到环境变量

别名:/api 等价于 /provider。有效值集合为 anthropic, openai, gemini, grok, bedrock, vertex, foundry, unset。

i
切换时的环境变量校验

切到 openai 时会检查 OPENAI_API_KEY 与 OPENAI_BASE_URL; 切到 grok 检查 GROK_API_KEY 或 XAI_API_KEY; 切到 gemini 检查 GEMINI_API_KEY。 缺失时仍会切换,并在返回信息中给出 warning,提示通过 /login 或环境变量补齐。

实战示例

接入本地 Ollama(OpenAI 兼容):

Terminal
QS_USE_OPENAI=1 \
OPENAI_BASE_URL=http://localhost:11434/v1 \
OPENAI_API_KEY=ollama \
OPENAI_MODEL=qwen3-coder \
qsdashi

接入 DeepSeek,并显式开启思考模式:

Terminal
QS_USE_OPENAI=1 \
OPENAI_BASE_URL=https://api.deepseek.com/v1 \
OPENAI_API_KEY=sk-your-deepseek-key \
OPENAI_MODEL=deepseek-reasoner \
OPENAI_ENABLE_THINKING=1 \
qsdashi

用 settings.json 持久配置 Gemini:

settings.json
{
  "modelType": "gemini",
  "env": {
    "GEMINI_API_KEY": "your-key",
    "GEMINI_DEFAULT_SONNET_MODEL": "gemini-2.5-flash",
    "GEMINI_DEFAULT_OPUS_MODEL": "gemini-2.5-pro"
  }
}

在会话中查看与切换 provider:

qsdashi 会话
/provider
# Current API provider: firstParty
/provider openai
# API provider set to openai.

常见问题排错

!
切换到 openai 提示缺少环境变量

provider 已切换成功,但当前环境缺少 OPENAI_API_KEY 或 OPENAI_BASE_URL。可通过 /login 选择 OpenAI Compatible 写入配置, 或在 shell 中导出后重启。

!
Gemini 报「requires GEMINI_MODEL」

当请求的模型名能识别出 family(sonnet / opus / haiku),但 GEMINI_MODEL 与该 family 对应的 GEMINI_DEFAULT_*_MODEL / QS_DEFAULT_*_MODEL 都未配置时会抛错。 直接用 GEMINI_MODEL 指定,或补齐 family 映射即可。

!
Grok 缺少 API key

需要设置 GROK_API_KEY 或 XAI_API_KEY。 未设置时 /provider grok 会切换但给出 warning。

!
凭证混淆警告:QS_API_KEY + OpenAI 模式

当同时存在 QS_API_KEY 与 OpenAI 兼容模式时,注册表会给出警告: QS_API_KEY 用于 Anthropic 工作区端点,而 OpenAI 兼容模式会把 /v1/messages 路由到第三方。二者是不同平面,请确认是否为有意配置。

!
改了环境变量却不生效

OpenAI 客户端实例会被缓存,环境变量变更后需要重启会话才会重建。 switchProvider 也明确不修改当前进程的 process.env, 其返回的 export 语句需写入 shell profile 后重启。

*
思考模式只对 deepseek / mimo 自动生效

自动检测仅匹配模型名含 deepseek 或 mimo 的情形; Grok 被刻意排除(其推理模型自动推理,不需要 thinking 请求参数)。 其他模型需要 OPENAI_ENABLE_THINKING=1 显式开启。