在 OpenCode 中使用 SenseNova Token Plan

OpenCode 是一个面向终端的 AI 编程工具,支持配置多个模型 Provider,并可以在不同模型之间进行切换。

如果手上有 SenseNova Token Plan Token,可以直接将 SenseNova 配置到 OpenCode 中使用。目前SenseNova处于公测期间,完全免费试用,可以上手一试。

本文记录完整配置过程,并给出一份实际验证可用的 opencode.json 配置。

一、整体方案

OpenCode 支持通过 OpenAI-compatible 接口接入第三方模型。

SenseNova Token Plan 提供了兼容 OpenAI API 风格的接口,因此不需要额外搭建一个 OpenAI-compatible 服务,可以直接从 OpenCode 请求 SenseNova。

整体调用链路如下:

┌─────────────────────┐
│       OpenCode      │
│     AI 编程工具      │
└──────────┬──────────┘
           │
           │ OpenAI-compatible API
           ▼
┌─────────────────────┐
│ SenseNova Token Plan│
│ token.sensenova.cn  │
└──────────┬──────────┘
           │
           ├── SenseNova 6.8 Flash Lite
           │
           └── DeepSeek V4 Pro

核心配置实际上只有三个部分:

  1. Provider ID
  2. SenseNova API Base URL
  3. Token Plan API Key

二、准备 SenseNova Token

首先需要准备 SenseNova Token Plan 对应的 API Key。

拿到 Token 后,可以通过环境变量提供给 OpenCode:

export SENSENOVA_API_KEY="你的 SenseNova Token"

如果希望每次打开终端都自动生效,可以加入 shell 配置文件。

例如 macOS 默认使用 zsh:

echo 'export SENSENOVA_API_KEY="你的 SenseNova Token"' >> ~/.zshrc
source ~/.zshrc

检查:

echo $SENSENOVA_API_KEY

能够看到 Token,说明环境变量已经生效。

不建议直接把 API Key 写进 opencode.json,使用环境变量更加安全,也方便更换 Token。


三、SenseNova API 地址

SenseNova Token Plan 使用:

https://token.sensenova.cn/v1

这个地址就是 OpenCode 配置中的:

"baseURL": "https://token.sensenova.cn/v1"

由于接口兼容 OpenAI 风格,所以 OpenCode 可以使用:

@ai-sdk/openai-compatible

作为 SDK Provider。


四、OpenCode 配置

OpenCode 的配置文件一般是:

opencode.json

或者:

opencode.jsonc

在用户主目录下~/.config/opencode/opencode.jsonc。 经过实际验证,可以使用下面的配置:

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "ollama": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Ollama",
      "options": {
        "baseURL": "http://localhost:11434/v1"
      },
      "models": {
        "qwen3-vl:2b": {
          "name": "qwen3-vl:2b"
        }
      }
    },
    "sensenova": {
      "name": "SenseNova Token Plan",
      "env": [
        "SENSENOVA_API_KEY"
      ],
      "npm": "@ai-sdk/openai-compatible",
      "options": {
        "baseURL": "https://token.sensenova.cn/v1"
      },
      "models": {
        "sensenova-6.8-flash-lite": {
          "name": "SenseNova 6.8 Flash Lite"
        },
        "deepseekv4pro": {
          "name": "deepseek-v4-pro"
        }
      }
    }
  }
}

这里同时配置了两个 Provider:

ollama
sensenova

其中 Ollama 用于本地模型:

qwen3-vl:2b

SenseNova 用于远程模型:

sensenova-6.8-flash-lite
deepseek-v4-pro

实际上可以不用models部分,使用/models,搜索供应商会自动列出支持的模型。

五、重点理解 SenseNova Provider 配置

SenseNova 这一段是整个配置的核心:

"sensenova": {
  "name": "SenseNova Token Plan",
  "env": [
    "SENSENOVA_API_KEY"
  ],
  "npm": "@ai-sdk/openai-compatible",
  "options": {
    "baseURL": "https://token.sensenova.cn/v1"
  },
  "models": {
    "sensenova-6.8-flash-lite": {
      "name": "SenseNova 6.8 Flash Lite"
    },
    "deepseekv4pro": {
      "name": "deepseek-v4-pro"
    }
  }
}

可以拆成几个部分理解。

1. provider ID

"sensenova": {}

这里的 sensenova 是 Provider ID。

后续 OpenCode 中模型的完整标识可以理解为:

sensenova/模型ID

例如:

sensenova/sensenova-6.8-flash-lite

以及:

sensenova/deepseekv4pro

2. name

"name": "SenseNova Token Plan"

这是 OpenCode UI 中显示的 Provider 名称。

它可以自定义,例如:

"name": "SenseNova"

或者:

"name": "SenseNova Token Plan"

不会影响 API 请求。


3. env

"env": [
  "SENSENOVA_API_KEY"
]

告诉 OpenCode 使用哪个环境变量作为 API Key。

因此:

export SENSENOVA_API_KEY="xxxxxxxx"

对应:

"env": [
  "SENSENOVA_API_KEY"
]

这样就形成:

OpenCode
   │
   └── SENSENOVA_API_KEY
             │
             ▼
       SenseNova API

4. npm

"npm": "@ai-sdk/openai-compatible"

这是非常关键的一项。

它告诉 OpenCode:

使用 OpenAI-compatible Provider 访问这个模型服务。

因此 SenseNova 不需要在 OpenCode 中存在一个专门的:

SenseNova Provider

只要它提供兼容 OpenAI API 的接口,就可以通过:

@ai-sdk/openai-compatible

接入。

同样的方式也可以用于其他兼容 OpenAI API 的模型服务。


六、配置 SenseNova 6.8 Flash Lite

配置:

"models": {
  "sensenova-6.8-flash-lite": {
    "name": "SenseNova 6.8 Flash Lite"
  }
}

其中:

sensenova-6.8-flash-lite

是实际请求的 Model ID。

而:

SenseNova 6.8 Flash Lite

只是 OpenCode 中显示的名称。

两者不一定需要完全相同。

例如也可以写:

"sensenova-6.8-flash-lite": {
  "name": "SenseNova Flash"
}

这样在 OpenCode 中显示的就是:

SenseNova Flash

七、配置 DeepSeek V4 Pro

同样可以在 SenseNova Provider 下增加:

"deepseekv4pro": {
  "name": "deepseek-v4-pro"
}

这里需要注意:

deepseekv4pro

是 OpenCode 配置中的模型 ID。

而:

deepseek-v4-pro

是显示名称。

如果 SenseNova Token Plan 的接口将该模型映射为这个 Model ID,那么 OpenCode 就会通过同一个 Provider 请求 DeepSeek V4 Pro。

因此最终可以形成:

SenseNova Token Plan
        │
        ├── SenseNova 6.8 Flash Lite
        │
        └── DeepSeek V4 Pro

这样不需要为 DeepSeek V4 Pro 再创建一个独立 Provider。


八、在 OpenCode 中选择模型

配置完成后启动 OpenCode:

opencode

然后查看模型:

/models

或者使用 OpenCode 提供的模型选择功能。

应该可以看到类似:

SenseNova Token Plan
 ├── SenseNova 6.8 Flash Lite
 └── deepseek-v4-pro

Ollama
 └── qwen3-vl:2b

选择:

sensenova/sensenova-6.8-flash-lite

或者:

sensenova/deepseekv4pro

即可使用对应模型进行代码分析和编程。


九、为什么不需要 OpenAI Compatible 中转服务?

这是整个方案比较重要的一点。

很多模型平台虽然不是 OpenAI 官方服务,但提供了类似:

/v1/chat/completions

这样的接口。

只要接口协议兼容 OpenAI API,就可以:

OpenCode
   │
   │ @ai-sdk/openai-compatible
   ▼
SenseNova
   │
   ▼
模型

而不是:

OpenCode
   │
   ▼
自己搭建 OpenAI Proxy
   │
   ▼
SenseNova

因此少了一层代理服务。

对于个人开发环境来说,直接调用通常更加简单。


十、与 Ollama 配合使用

实际上 OpenCode 可以同时配置本地模型和云端模型。

例如本文配置:

                 OpenCode
                    │
          ┌─────────┴─────────┐
          │                   │
          ▼                   ▼
       Ollama              SenseNova
          │                   │
          ▼              ┌────┴────┐
      qwen3-vl:2b        │         │
                         ▼         ▼
                    SenseNova   DeepSeek
                       6.8       V4 Pro

本地模型:

"ollama": {
  "npm": "@ai-sdk/openai-compatible",
  "name": "Ollama",
  "options": {
    "baseURL": "http://localhost:11434/v1"
  }
}

SenseNova:

"sensenova": {
  "npm": "@ai-sdk/openai-compatible",
  "options": {
    "baseURL": "https://token.sensenova.cn/v1"
  }
}

两者本质上使用的是同一种接入方式:

@ai-sdk/openai-compatible

区别只是:

Ollama
→ localhost:11434

SenseNova
→ token.sensenova.cn

十一、常见问题

1. 是否需要自己部署 OpenAI-compatible 服务?

不需要。

SenseNova Token Plan 已经提供兼容接口,可以直接从 OpenCode 调用。


2. 是否需要把 API Key 写进配置文件?

不建议。

推荐:

export SENSENOVA_API_KEY="你的 Token"

配置文件只保留:

"env": [
  "SENSENOVA_API_KEY"
]

这样即使把 opencode.json 提交到 Git,也不会直接泄露 Token。


3. 为什么使用 @ai-sdk/openai-compatible?

因为 SenseNova 提供的是 OpenAI-compatible API。

OpenCode 不需要为每一个模型平台实现一套独立 Provider,而是可以通过 OpenAI-compatible Adapter 接入。

因此同样的思路也适用于其他提供兼容接口的模型服务。


4. 一个 Provider 可以配置多个模型吗?

可以。

本文就是一个例子:

"sensenova": {
  ...
  "models": {
    "sensenova-6.8-flash-lite": {},
    "deepseekv4pro": {}
  }
}

所以 Provider 与 Model 的关系可以理解为:

Provider
   │
   ├── Model A
   ├── Model B
   └── Model C

而不是:

一个模型 = 一个 Provider

十二、最终配置

如果已经同时使用 Ollama 和 SenseNova,可以直接使用下面这份配置:

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "ollama": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Ollama",
      "options": {
        "baseURL": "http://localhost:11434/v1"
      },
      "models": {
        "qwen3-vl:2b": {
          "name": "qwen3-vl:2b"
        }
      }
    },
    "sensenova": {
      "name": "SenseNova Token Plan",
      "env": [
        "SENSENOVA_API_KEY"
      ],
      "npm": "@ai-sdk/openai-compatible",
      "options": {
        "baseURL": "https://token.sensenova.cn/v1"
      },
      "models": {
        "sensenova-6.8-flash-lite": {
          "name": "SenseNova 6.8 Flash Lite"
        },
        "deepseekv4pro": {
          "name": "deepseek-v4-pro"
        }
      }
    }
  }
}

环境变量:

export SENSENOVA_API_KEY="你的 SenseNova Token"

最终 OpenCode 中可以同时使用:

┌──────────────────────────────────────┐
│               OpenCode               │
├──────────────────────────────────────┤
│ Ollama                               │
│   └── qwen3-vl:2b                    │
│                                      │
│ SenseNova Token Plan                 │
│   ├── SenseNova 6.8 Flash Lite       │
│   └── DeepSeek V4 Pro                │
└──────────────────────────────────────┘

这套方式的核心价值是:利用 OpenCode 的 OpenAI-compatible Provider 能力,把 SenseNova Token Plan 直接作为模型后端接入,同时保留 Ollama 等本地模型,最终在 OpenCode 内统一切换。