Close gaps: GLM-judge (anthropic registry) + run cancel + deep-link
#2 GLM judge (closes #114): registry NamedProvider gains a `format` field; build_provider_registry builds an AnthropicProvider for format="anthropic". GLM's coding/OpenAI endpoint is ToS-throttled for raw SDK, but its Anthropic endpoint (api.z.ai/api/anthropic) accepts raw API calls (verified x-api-key -> glm-4.7), so CLAWMATES_JUDGE_MODEL=glm:glm-4.7 routes the door governor / topology judge through GLM with no runtime-routing. (Kimi-as-judge still needs a Platform key — coding key is agent-only.) #3 run-control: POST /api/topology-runs/{id}/cancel (workspace-scoped, queued/running only); the worker honors it at the step boundary (checks current_status in the checkpoint callback) and won't clobber a cancel with `failed`. Frontend Run tab gains a Cancel button and clickable recent runs that deep-link into a live/replayed stream (SSE replays from checkpoint). cm-* tests (incl. new cancel test) + clippy + frontend lint/typecheck green. Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
f845dfb15f
commit
6e87433c66
@@ -69,17 +69,27 @@ pub struct LlmConfig {
|
||||
pub providers: Vec<NamedProvider>,
|
||||
}
|
||||
|
||||
/// An extra OpenAI-compatible provider in the registry (e.g. GLM or Kimi).
|
||||
/// An extra provider in the registry (e.g. GLM or Kimi). Used as judge or
|
||||
/// topology-exec model via `"<name>:<model>"`.
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct NamedProvider {
|
||||
/// Selector prefix, e.g. `glm` or `kimi` (used as `"glm:glm-4.6"`).
|
||||
pub name: String,
|
||||
/// OpenAI-compatible base URL incl. version, e.g.
|
||||
/// `https://open.bigmodel.cn/api/paas/v4` (GLM) or
|
||||
/// `https://api.moonshot.ai/v1` (Kimi).
|
||||
/// Base URL incl. version, e.g. `https://open.bigmodel.cn/api/paas/v4`
|
||||
/// (OpenAI-compat) or `https://api.z.ai/api/anthropic` (Anthropic-format).
|
||||
pub base_url: String,
|
||||
/// Env var holding this provider's API key, e.g. `GLM_API_KEY`.
|
||||
pub api_key_env: String,
|
||||
/// Wire format: `openai_compat` (default) or `anthropic`. GLM's coding
|
||||
/// OpenAI endpoint is ToS-throttled for raw SDK access, but its Anthropic
|
||||
/// endpoint (`api.z.ai/api/anthropic`) accepts raw API calls — so a GLM
|
||||
/// judge uses `format = "anthropic"`.
|
||||
#[serde(default = "default_provider_format")]
|
||||
pub format: String,
|
||||
}
|
||||
|
||||
fn default_provider_format() -> String {
|
||||
"openai_compat".to_string()
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
|
||||
Reference in New Issue
Block a user