openpencil/scripts/ab-corpus/clients/ark.ts
2026-05-03 21:00:00 +08:00

60 lines
2.2 KiB
TypeScript

/**
* 方舟 (Volcengine Ark) Coding Plan wrapper. One API key covers
* multiple third-party models hosted on Ark's coding tier —
* currently GLM-5.1 and KIMI-K2.6. Cribbed from builtin-provider-
* presets.ts `ark-coding` preset.
*
* Default baseURL: https://ark.cn-beijing.volces.com/api/coding/v3
* Override via `ARK_BASE_URL` if Volcengine ever ships a regional
* variant (none published as of 2026-04-22).
*
* Key env var: `ARK_CODING_KEY` — Volcengine's UUID-format ARK
* access key. NOT committed to the repo; export in your shell
* before running `bun scripts/ab-corpus/run.ts --live`.
*/
import type { ChatCallResult } from './openai-compat';
import { callOpenAICompat } from './openai-compat';
const ARK_BASE_URL = process.env.ARK_BASE_URL ?? 'https://ark.cn-beijing.volces.com/api/coding/v3';
const ARK_API_KEY_ENV = 'ARK_CODING_KEY';
export interface CallArkArgs {
model: string;
system: string;
user: string;
temperature?: number;
maxTokens?: number;
}
export async function callArk(args: CallArkArgs): Promise<ChatCallResult> {
const apiKey = process.env[ARK_API_KEY_ENV];
if (!apiKey) {
throw new Error(
`${ARK_API_KEY_ENV} not set — export it (Volcengine 方舟 CP UUID key) before running with --live`,
);
}
// Kimi-K2.6 on Ark CP is markedly more brownout-prone than GLM-5.1
// — ab-v5 (2026-05-02) cut its T arm garbage rate to 17% from
// ab-v2's 42%, but it still contributed 9/14 of the T arm garbage
// and ARK's empty-content / 120s-timeout were the only failure
// modes. Bump the kimi branch to retries=3 (extra 4000ms backoff
// attempt) + timeoutMs=180000 (60s headroom) so slow-but-eventually-
// OK responses don't get clipped. GLM-5.1 keeps the existing
// retries=2 + 120s defaults — its garbage rate is already <2%,
// pushing those would just burn budget on healthy calls.
const isKimi = /^kimi/i.test(args.model);
return callOpenAICompat({
baseURL: ARK_BASE_URL,
apiKey,
model: args.model,
system: args.system,
user: args.user,
temperature: args.temperature,
maxTokens: args.maxTokens,
label: 'ark',
retries: isKimi ? 3 : 2,
timeoutMs: isKimi ? 180_000 : undefined,
});
}