diff options
| author | Adam Malczewski <[email protected]> | 2026-06-02 20:05:48 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-02 20:05:48 +0900 |
| commit | 3307fec107fb8d1e7cb063bfdbfadf4b1d4f8c71 (patch) | |
| tree | 10fc7391ef0cfbbcd62d558991c54b4041b3dac9 /packages/core/src/credentials | |
| parent | b3aca3efe9e8cda79db6e2c7fa20482880ed16c3 (diff) | |
| download | dispatch-3307fec107fb8d1e7cb063bfdbfadf4b1d4f8c71.tar.gz dispatch-3307fec107fb8d1e7cb063bfdbfadf4b1d4f8c71.zip | |
fix(wake): resolve probe model dynamically from /v1/models by 'haiku' match
The wake probe was hardcoded to claude-3-5-haiku-20241022, which the
endpoint no longer serves (HTTP 404), exhausting the retry loop. Now the
probe fetches the live model list via fetchAnthropicModels (falling back
to ANTHROPIC_MODELS_FALLBACK if empty) and selects the current Haiku via
a new pure selectHaikuModel() helper (first case-insensitive 'haiku'
substring match; newest-first ordering). No-match surfaces a clear
per-account error instead of crashing.
Diffstat (limited to 'packages/core/src/credentials')
| -rw-r--r-- | packages/core/src/credentials/claude.ts | 17 | ||||
| -rw-r--r-- | packages/core/src/credentials/index.ts | 1 |
2 files changed, 18 insertions, 0 deletions
diff --git a/packages/core/src/credentials/claude.ts b/packages/core/src/credentials/claude.ts index 432e403..7818222 100644 --- a/packages/core/src/credentials/claude.ts +++ b/packages/core/src/credentials/claude.ts @@ -483,6 +483,23 @@ export const ANTHROPIC_MODELS_FALLBACK = [ "claude-3-opus-20240229", ]; +/** + * Pick the model to use for a Claude "wake" probe from a list of model ids. + * + * The probe only needs a small/cheap model to register activity against the + * subscription, so we target Haiku. Model ids change over time (the old + * hardcoded `claude-3-5-haiku-20241022` started returning HTTP 404), so the + * caller fetches the live list from `/v1/models` and we resolve by substring. + * + * Selection: the FIRST id whose name contains "haiku" (case-insensitive). + * Anthropic's `/v1/models` returns models newest-first, so first-match + * naturally prefers the newest Haiku. Returns `null` when nothing matches so + * the caller can surface a clear error instead of probing an invalid model. + */ +export function selectHaikuModel(models: string[]): string | null { + return models.find((id) => id.toLowerCase().includes("haiku")) ?? null; +} + // ─── Credential Validation ──────────────────────────────────── export interface ClaudeProfile { diff --git a/packages/core/src/credentials/index.ts b/packages/core/src/credentials/index.ts index 46fa5b6..5221dc6 100644 --- a/packages/core/src/credentials/index.ts +++ b/packages/core/src/credentials/index.ts @@ -24,6 +24,7 @@ export { refreshAccountCredentials, refreshAccountCredentialsAsync, SYSTEM_IDENTITY, + selectHaikuModel, validateAccountCredentials, } from "./claude.js"; export { |
