mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-10-26 01:34:51 +08:00
fix(usage): don't auto-enable Volcengine plan quota without AccessKey
Volcengine's plan quota is queried through its OpenAPI with an account-level AccessKey ID + Secret, not the inference API key. Adding a Volcengine Agent/Coding Plan provider (or importing one via deep link) auto-enabled the token_plan query anyway, so every new card showed a red "quota not found" right away and users read it as the provider not working. Preselect Volcengine in the usage settings but leave the query off until the user fills in the AccessKey. Deep links that set usageEnabled are still honored; the import dialog badge and the backend agree. Refs #8494
This commit is contained in:
1 parent
6c36d68af9
commit
8b09732a17
5 files changed
+57
-4
No files matched your search
@@ -476,10 +476,12 @@ fn build_provider_meta(
|
||||
|
||||
// 套餐地址且没带脚本:和在应用里新建一样,按套餐额度查询并默认启用
|
||||
// (链接写了 `usageEnabled` 仍照办)。额度走后端固定端点,不执行任何脚本。
|
||||
// 火山例外:查额度要账号级 AccessKey,链接里没有,默认启用只会显示「额度没查到」,
|
||||
// 所以只预选套餐不启用(前端 `codingPlanEnabledByDefault` 与此一致)。
|
||||
if let (Some(provider_id), true) = (coding_plan_provider, code.is_empty()) {
|
||||
return Ok(Some(ProviderMeta {
|
||||
usage_script: Some(UsageScript {
|
||||
enabled: request.usage_enabled.unwrap_or(true),
|
||||
enabled: request.usage_enabled.unwrap_or(provider_id != "volcengine"),
|
||||
language: "javascript".to_string(),
|
||||
code,
|
||||
timeout: Some(10),
|
||||
|
||||
@@ -2014,6 +2014,20 @@ fn test_deeplink_coding_plan_never_replaces_a_carried_script() {
|
||||
assert_eq!(script.template_type, None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_deeplink_volcengine_plan_is_preselected_but_off() {
|
||||
// 火山查额度要账号级 AccessKey,链接里没有:只预选套餐,不默认启用
|
||||
let request = coding_plan_request("opencode", "https://ark.cn-beijing.volces.com/api/plan/v3");
|
||||
let script = imported_usage_script(AppType::OpenCode, &request).unwrap();
|
||||
assert!(!script.enabled);
|
||||
assert_eq!(script.coding_plan_provider.as_deref(), Some("volcengine"));
|
||||
|
||||
let mut request = coding_plan_request("claude", "https://ark.cn-beijing.volces.com/api/coding");
|
||||
request.usage_enabled = Some(true);
|
||||
let script = imported_usage_script(AppType::Claude, &request).unwrap();
|
||||
assert!(script.enabled, "usageEnabled=true 必须照办");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_deeplink_non_plan_and_zenmux_outside_claude_stay_off() {
|
||||
let request = coding_plan_request("claude", "https://api.example.com/v1");
|
||||
|
||||
@@ -36,6 +36,7 @@ import { getAppLabel, isAdditiveAppId } from "@/config/appConfig";
|
||||
import { normalizeIconDataUri } from "@/utils/customIcon";
|
||||
import {
|
||||
CODING_PLAN_PROVIDERS,
|
||||
codingPlanEnabledByDefault,
|
||||
detectCodingPlanProvider,
|
||||
} from "@/config/codingPlanProviders";
|
||||
|
||||
@@ -392,10 +393,11 @@ export function DeepLinkImportDialog() {
|
||||
: undefined;
|
||||
|
||||
// 导入后用量查询是否启用:链接写了 usageEnabled 就照办;没写时带脚本或是套餐地址即启用
|
||||
// (与后端一致)
|
||||
// (火山要另填 AccessKey,套餐地址也不启用;与后端一致)
|
||||
const usageWillBeEnabled =
|
||||
request?.usageEnabled ??
|
||||
(Boolean(request?.usageScript) || Boolean(codingPlan));
|
||||
(Boolean(request?.usageScript) ||
|
||||
(codingPlan ? codingPlanEnabledByDefault(codingPlan.id) : false));
|
||||
|
||||
// Check if config file is present
|
||||
const hasConfigFile = !!(request?.config || request?.configUrl);
|
||||
|
||||
@@ -197,6 +197,29 @@ describe("injectCodingPlanUsageScript", () => {
|
||||
).toBeUndefined();
|
||||
});
|
||||
|
||||
it("preselects Volcengine without enabling it (needs AccessKey first)", () => {
|
||||
expect(
|
||||
inject("opencode", {
|
||||
settingsConfig: {
|
||||
options: { baseURL: "https://ark.cn-beijing.volces.com/api/plan/v3" },
|
||||
},
|
||||
}).meta?.usage_script,
|
||||
).toMatchObject({
|
||||
enabled: false,
|
||||
templateType: "token_plan",
|
||||
codingPlanProvider: "volcengine",
|
||||
});
|
||||
expect(
|
||||
inject("claude", {
|
||||
settingsConfig: {
|
||||
env: {
|
||||
ANTHROPIC_BASE_URL: "https://ark.cn-beijing.volces.com/api/coding",
|
||||
},
|
||||
},
|
||||
}).meta?.usage_script,
|
||||
).toMatchObject({ enabled: false, codingPlanProvider: "volcengine" });
|
||||
});
|
||||
|
||||
it("never overwrites an existing usage_script", () => {
|
||||
const provider: TestProvider = {
|
||||
settingsConfig: {
|
||||
|
||||
@@ -99,6 +99,18 @@ export function detectCodingPlanProvider(
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 认出套餐地址后,额度查询是否默认启用。火山查额度要账号级 AccessKey ID +
|
||||
* Secret(不是推理 Key),新建或导入时还没有这两项,启用了只会在卡片上显示
|
||||
* 「额度没查到」,被误读成供应商没生效(#8494)。所以火山只预选套餐、不启用,
|
||||
* 等用户在额度设置里填好凭据再打开。与后端深链接导入的默认值一致。
|
||||
*/
|
||||
export function codingPlanEnabledByDefault(
|
||||
id: CodingPlanProviderEntry["id"],
|
||||
): boolean {
|
||||
return id !== "volcengine";
|
||||
}
|
||||
|
||||
/**
|
||||
* 按 app 从 settingsConfig 里取出 base_url,供自动注入检测用。
|
||||
* 提取路径与后端 `Provider::resolve_usage_credentials` 的各 app 分支对齐
|
||||
@@ -180,7 +192,7 @@ export function injectCodingPlanUsageScript<
|
||||
meta: {
|
||||
...(provider.meta ?? {}),
|
||||
usage_script: createUsageScript({
|
||||
enabled: true,
|
||||
enabled: codingPlanEnabledByDefault(codingPlanProvider),
|
||||
templateType: TEMPLATE_TYPES.TOKEN_PLAN,
|
||||
codingPlanProvider,
|
||||
}),
|
||||
|
||||
Reference in new issue
Block a user