openpencil/scripts/ab-corpus/clients/glm.ts
Fini 51878c3894 feat(scripts): ab-corpus harness with multi-provider model adapters
Harness at scripts/ab-corpus/ wires the pen-ai-skills corpus evaluator to
real model endpoints and pen-mcp handlers:

run.ts            — CLI entry (--dry-run / --live / --models A,B,C / --only ID)
apply.ts          — ApplyFn impl dispatching tool_call → element handler
                    and batch_design DSL → handleBatchDesign, against a
                    fresh tmp .op per run (isolated, auto-cleanup)
build-prompt.ts   — B variant strips elements.md + appends batch_design
                    <op_tool> format instruction; T keeps elements + adds
                    element-tool PRIMARY / batch_design FALLBACK
                    instruction. Uniform <op_tool> wrapper in both arms
                    isolates "tool set width" as the only A/B variable.
stub-model.ts     — fixture-based offline model for --dry-run
real-model.ts     — router by model id (minimax* / gpt-*/o* / glm-5.1 /
                    glm-* / kimi-*)
clients/
  openai-compat.ts — generic chat/completions POST
  minimax.ts       — api.minimax.io/v1, MINIMAX_API_KEY
  codex-cli.ts     — spawns `codex exec` (GPT-5.4 via Codex Pro sub)
  bailian.ts       — coding.dashscope.aliyuncs.com/v1 CP,
                     DASHSCOPE_BAILIAN_CODING_KEY (hosts glm-4.7, kimi-k2.5)
  glm.ts           — open.bigmodel.cn/api/coding/paas/v4 official CP,
                     GLM_OFFICIAL_CODING_KEY
write-report.ts   — Report → report.md + report.json in out dir;
                    4-way routing breakdown table per model

Kept entirely outside packages/ — scripts are a local dev tool, not part
of the published SDK. API keys never hit disk or git.

v1 run results logged separately in openpencil-docs
superpowers/notes/2026-04-20-ab-v1-results.md (5 models × 24 prompts).
2026-04-20 23:53:23 +08:00

42 lines
1.2 KiB
TypeScript

/**
* Zhipu GLM (智谱) Coding Plan wrapper. Uses the official GLM coding
* endpoint at open.bigmodel.cn/api/coding/paas/v4 (CN). Key is the
* `api_key.secret` pair format (`xxx.yyy`) passed verbatim as the
* Bearer token — GLM's own auth handles the split internally.
*
* Key env var: `GLM_OFFICIAL_CODING_KEY`. See
* builtin-provider-presets.ts `glm-coding` preset.
*/
import { callOpenAICompat } from './openai-compat';
const GLM_BASE_URL = process.env.GLM_BASE_URL ?? 'https://open.bigmodel.cn/api/coding/paas/v4';
const GLM_API_KEY_ENV = 'GLM_OFFICIAL_CODING_KEY';
export interface CallGlmArgs {
model: string;
system: string;
user: string;
temperature?: number;
maxTokens?: number;
}
export async function callGlm(args: CallGlmArgs): Promise<string> {
const apiKey = process.env[GLM_API_KEY_ENV];
if (!apiKey) {
throw new Error(
`${GLM_API_KEY_ENV} not set — export it (GLM official CP xxx.yyy key) before running with --live`,
);
}
return callOpenAICompat({
baseURL: GLM_BASE_URL,
apiKey,
model: args.model,
system: args.system,
user: args.user,
temperature: args.temperature,
maxTokens: args.maxTokens,
label: 'glm',
});
}