feat(tencent): remove Token Plan provider and auth (#69996)

Co-authored-by: albertxyu <albertxyu@tencent.com>
This commit is contained in:
JuniperSling
2026-04-22 13:46:07 +08:00
committed by GitHub
parent 21e04350ab
commit bcd1dec3dc
7 changed files with 22 additions and 198 deletions

View File

@@ -1,64 +1,40 @@
---
title: "Tencent Cloud (TokenHub + Token Plan)"
summary: "Tencent Cloud TokenHub and Token Plan setup (separate keys)"
title: "Tencent Cloud (TokenHub)"
summary: "Tencent Cloud TokenHub setup"
read_when:
- You want to use Tencent Hy models with OpenClaw
- You need the TokenHub API key or Token Plan (LKEAP) setup
- You need the TokenHub API key setup
---
# Tencent Cloud (TokenHub + Token Plan)
# Tencent Cloud (TokenHub)
The Tencent Cloud provider gives access to Tencent Hy models via two endpoints
with separate API keys:
The Tencent Cloud provider gives access to Tencent Hy models via the TokenHub
endpoint (`tencent-tokenhub`).
- **TokenHub** (`tencent-tokenhub`) — call Hy via Tencent TokenHub Gateway
- **Token Plan** (`tencent-token-plan`) — call Hy via the LKEAP
Token Plan endpoint
Both providers use OpenAI-compatible APIs.
The provider uses an OpenAI-compatible API.
## Quick start
TokenHub:
```bash
openclaw onboard --auth-choice tokenhub-api-key
```
Token Plan:
```bash
openclaw onboard --auth-choice tencent-token-plan-api-key
```
## Non-interactive example
```bash
# TokenHub
openclaw onboard --non-interactive \
--mode local \
--auth-choice tokenhub-api-key \
--tokenhub-api-key "$TOKENHUB_API_KEY" \
--skip-health \
--accept-risk
# Token Plan
openclaw onboard --non-interactive \
--mode local \
--auth-choice tencent-token-plan-api-key \
--tencent-token-plan-api-key "$LKEAP_API_KEY" \
--skip-health \
--accept-risk
```
## Providers and endpoints
| Provider | Endpoint | Use case |
| -------------------- | ------------------------------------- | ----------------------- |
| `tencent-tokenhub` | `tokenhub.tencentmaas.com/v1` | Hy via Tencent TokenHub |
| `tencent-token-plan` | `api.lkeap.cloud.tencent.com/plan/v3` | Hy via LKEAP Token Plan |
Each provider uses its own API key. Setup registers only the selected provider.
| Provider | Endpoint | Use case |
| ------------------ | ----------------------------- | ----------------------- |
| `tencent-tokenhub` | `tokenhub.tencentmaas.com/v1` | Hy via Tencent TokenHub |
## Available models
@@ -66,25 +42,19 @@ Each provider uses its own API key. Setup registers only the selected provider.
- **hy3-preview** — Hy3 preview (256K context, reasoning, default)
### tencent-token-plan
- **hy3-preview** — Hy3 preview (256K context, reasoning, default)
## Notes
- TokenHub model refs use `tencent-tokenhub/<modelId>`. Token Plan model refs
use `tencent-token-plan/<modelId>`.
- TokenHub model refs use `tencent-tokenhub/<modelId>`.
- Override pricing and context metadata in `models.providers` if needed.
## Environment note
If the Gateway runs as a daemon (launchd/systemd), make sure `TOKENHUB_API_KEY`
or `LKEAP_API_KEY` is available to that process (for example, in
`~/.openclaw/.env` or via `env.shellEnv`).
is available to that process (for example, in `~/.openclaw/.env` or via
`env.shellEnv`).
## Related documentation
- [OpenClaw Configuration](/configuration)
- [Model Providers](/concepts/model-providers)
- [Tencent TokenHub](https://cloud.tencent.com/document/product/1823/130050)
- [Tencent Token Plan API](https://cloud.tencent.com/document/product/1823/130060)

View File

@@ -1,11 +1,7 @@
export {
buildTokenHubModelDefinition,
buildTokenPlanModelDefinition,
TOKENHUB_BASE_URL,
TOKENHUB_MODEL_CATALOG,
TOKENHUB_PROVIDER_ID,
TOKEN_PLAN_BASE_URL,
TOKEN_PLAN_MODEL_CATALOG,
TOKEN_PLAN_PROVIDER_ID,
} from "./models.js";
export { buildTokenHubProvider, buildTokenPlanProvider } from "./provider-catalog.js";
export { buildTokenHubProvider } from "./provider-catalog.js";

View File

@@ -1,19 +1,9 @@
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth-api-key";
import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog-shared";
import {
TOKENHUB_MODEL_CATALOG,
TOKENHUB_PROVIDER_ID,
TOKEN_PLAN_MODEL_CATALOG,
TOKEN_PLAN_PROVIDER_ID,
} from "./models.js";
import {
applyTokenHubConfig,
TOKENHUB_DEFAULT_MODEL_REF,
applyTokenPlanConfig,
TOKEN_PLAN_DEFAULT_MODEL_REF,
} from "./onboard.js";
import { buildTokenHubProvider, buildTokenPlanProvider } from "./provider-catalog.js";
import { TOKENHUB_MODEL_CATALOG, TOKENHUB_PROVIDER_ID } from "./models.js";
import { applyTokenHubConfig, TOKENHUB_DEFAULT_MODEL_REF } from "./onboard.js";
import { buildTokenHubProvider } from "./provider-catalog.js";
function buildStaticCatalogEntries(providerId: string, catalog: typeof TOKENHUB_MODEL_CATALOG) {
return catalog.map((entry) => ({
@@ -29,9 +19,8 @@ function buildStaticCatalogEntries(providerId: string, catalog: typeof TOKENHUB_
export default definePluginEntry({
id: "tencent",
name: "Tencent Cloud Provider",
description: "Bundled Tencent Cloud provider plugins (TokenHub + Token Plan)",
description: "Bundled Tencent Cloud provider plugin (TokenHub)",
register(api) {
// ---------- TokenHub provider ----------
api.registerProvider({
id: TOKENHUB_PROVIDER_ID,
label: "Tencent TokenHub",
@@ -55,7 +44,7 @@ export default definePluginEntry({
choiceLabel: "Tencent TokenHub",
groupId: "tencent",
groupLabel: "Tencent Cloud",
groupHint: "TokenHub + Token Plan",
groupHint: "Tencent TokenHub",
},
}),
],
@@ -71,46 +60,5 @@ export default definePluginEntry({
augmentModelCatalog: () =>
buildStaticCatalogEntries(TOKENHUB_PROVIDER_ID, TOKENHUB_MODEL_CATALOG),
});
// ---------- Token Plan provider ----------
api.registerProvider({
id: TOKEN_PLAN_PROVIDER_ID,
label: "Tencent Token Plan",
docsPath: "/providers/tencent",
envVars: ["LKEAP_API_KEY"],
auth: [
createProviderApiKeyAuthMethod({
providerId: TOKEN_PLAN_PROVIDER_ID,
methodId: "api-key",
label: "Tencent Token Plan",
hint: "Hy via Token Plan",
optionKey: "tencentTokenPlanApiKey",
flagName: "--tencent-token-plan-api-key",
envVar: "LKEAP_API_KEY",
promptMessage: "Enter Tencent Token Plan API key",
defaultModel: TOKEN_PLAN_DEFAULT_MODEL_REF,
expectedProviders: [TOKEN_PLAN_PROVIDER_ID],
applyConfig: (cfg) => applyTokenPlanConfig(cfg),
wizard: {
choiceId: "tencent-token-plan-api-key",
choiceLabel: "Tencent Token Plan",
groupId: "tencent",
groupLabel: "Tencent Cloud",
groupHint: "TokenHub + Token Plan",
},
}),
],
catalog: {
order: "simple",
run: (ctx) =>
buildSingleProviderApiKeyCatalog({
ctx,
providerId: TOKEN_PLAN_PROVIDER_ID,
buildProvider: buildTokenPlanProvider,
}),
},
augmentModelCatalog: () =>
buildStaticCatalogEntries(TOKEN_PLAN_PROVIDER_ID, TOKEN_PLAN_MODEL_CATALOG),
});
},
});

View File

@@ -61,33 +61,3 @@ export function buildTokenHubModelDefinition(
api: "openai-completions",
};
}
// ---------- Token Plan provider ----------
export const TOKEN_PLAN_BASE_URL = "https://api.lkeap.cloud.tencent.com/plan/v3";
export const TOKEN_PLAN_PROVIDER_ID = "tencent-token-plan";
export const TOKEN_PLAN_MODEL_CATALOG: ModelDefinitionConfig[] = [
{
id: "hy3-preview",
name: "Hy3 preview (Token Plan)",
reasoning: true,
input: ["text"],
contextWindow: 256_000,
maxTokens: 64_000,
cost: HY3_PREVIEW_COST,
compat: {
supportsUsageInStreaming: true,
supportsReasoningEffort: true,
},
},
];
export function buildTokenPlanModelDefinition(
model: (typeof TOKEN_PLAN_MODEL_CATALOG)[number],
): ModelDefinitionConfig {
return {
...model,
api: "openai-completions",
};
}

View File

@@ -5,13 +5,9 @@ import {
} from "openclaw/plugin-sdk/provider-onboard";
import {
buildTokenHubModelDefinition,
buildTokenPlanModelDefinition,
TOKENHUB_BASE_URL,
TOKENHUB_MODEL_CATALOG,
TOKENHUB_PROVIDER_ID,
TOKEN_PLAN_BASE_URL,
TOKEN_PLAN_MODEL_CATALOG,
TOKEN_PLAN_PROVIDER_ID,
} from "./api.js";
// ---------- TokenHub ----------
@@ -22,8 +18,6 @@ function applyTokenHubProviderConfig(cfg: OpenClawConfig): OpenClawConfig {
const models = { ...cfg.agents?.defaults?.models };
models[TOKENHUB_DEFAULT_MODEL_REF] = {
...models[TOKENHUB_DEFAULT_MODEL_REF],
// Provider-specific alias to keep alias resolution deterministic when
// both Tencent providers are enabled (see buildModelAliasIndex).
alias: models[TOKENHUB_DEFAULT_MODEL_REF]?.alias ?? "Hy3 preview (TokenHub)",
};
@@ -42,32 +36,3 @@ export function applyTokenHubConfig(cfg: OpenClawConfig): OpenClawConfig {
TOKENHUB_DEFAULT_MODEL_REF,
);
}
// ---------- Token Plan ----------
export const TOKEN_PLAN_DEFAULT_MODEL_REF = `${TOKEN_PLAN_PROVIDER_ID}/hy3-preview`;
function applyTokenPlanProviderConfig(cfg: OpenClawConfig): OpenClawConfig {
const models = { ...cfg.agents?.defaults?.models };
models[TOKEN_PLAN_DEFAULT_MODEL_REF] = {
...models[TOKEN_PLAN_DEFAULT_MODEL_REF],
// Provider-specific alias to keep alias resolution deterministic when
// both Tencent providers are enabled (see buildModelAliasIndex).
alias: models[TOKEN_PLAN_DEFAULT_MODEL_REF]?.alias ?? "Hy3 preview (Token Plan)",
};
return applyProviderConfigWithModelCatalog(cfg, {
agentModels: models,
providerId: TOKEN_PLAN_PROVIDER_ID,
api: "openai-completions",
baseUrl: TOKEN_PLAN_BASE_URL,
catalogModels: TOKEN_PLAN_MODEL_CATALOG.map(buildTokenPlanModelDefinition),
});
}
export function applyTokenPlanConfig(cfg: OpenClawConfig): OpenClawConfig {
return applyAgentDefaultModelPrimary(
applyTokenPlanProviderConfig(cfg),
TOKEN_PLAN_DEFAULT_MODEL_REF,
);
}

View File

@@ -1,10 +1,9 @@
{
"id": "tencent",
"enabledByDefault": true,
"providers": ["tencent-tokenhub", "tencent-token-plan"],
"providers": ["tencent-tokenhub"],
"providerAuthEnvVars": {
"tencent-tokenhub": ["TOKENHUB_API_KEY"],
"tencent-token-plan": ["LKEAP_API_KEY"]
"tencent-tokenhub": ["TOKENHUB_API_KEY"]
},
"providerAuthChoices": [
{
@@ -14,24 +13,11 @@
"choiceLabel": "Tencent TokenHub",
"groupId": "tencent",
"groupLabel": "Tencent Cloud",
"groupHint": "TokenHub + Token Plan",
"groupHint": "Tencent TokenHub",
"optionKey": "tokenhubApiKey",
"cliFlag": "--tokenhub-api-key",
"cliOption": "--tokenhub-api-key <key>",
"cliDescription": "Tencent TokenHub API key"
},
{
"provider": "tencent-token-plan",
"method": "api-key",
"choiceId": "tencent-token-plan-api-key",
"choiceLabel": "Tencent Token Plan",
"groupId": "tencent",
"groupLabel": "Tencent Cloud",
"groupHint": "TokenHub + Token Plan",
"optionKey": "tencentTokenPlanApiKey",
"cliFlag": "--tencent-token-plan-api-key",
"cliOption": "--tencent-token-plan-api-key <key>",
"cliDescription": "Tencent Token Plan API key"
}
],
"configSchema": {

View File

@@ -1,11 +1,8 @@
import type { ModelProviderConfig } from "openclaw/plugin-sdk/provider-model-shared";
import {
buildTokenHubModelDefinition,
buildTokenPlanModelDefinition,
TOKENHUB_BASE_URL,
TOKENHUB_MODEL_CATALOG,
TOKEN_PLAN_BASE_URL,
TOKEN_PLAN_MODEL_CATALOG,
} from "./models.js";
export function buildTokenHubProvider(): ModelProviderConfig {
@@ -15,11 +12,3 @@ export function buildTokenHubProvider(): ModelProviderConfig {
models: TOKENHUB_MODEL_CATALOG.map(buildTokenHubModelDefinition),
};
}
export function buildTokenPlanProvider(): ModelProviderConfig {
return {
baseUrl: TOKEN_PLAN_BASE_URL,
api: "openai-completions",
models: TOKEN_PLAN_MODEL_CATALOG.map(buildTokenPlanModelDefinition),
};
}