Hugging Face
The Hugging Face Hub API is clean. One POST creates a repo and returns its name and URL; a missing field is a typed, Zod-style 400 pointing at it ('Invalid input: expected string ... -> at name'); and a chain works - create a repo, flip its settings to private by name, read it back as private:true. A bad enum is rejected: type:'banana' -> 400 '-> at type'. Idempotency is right - the owner/name pair is a unique key, so the same repo twice returns 200 then a 409 'You already created this model repo' that even includes the existing repo's URL, so a retry can't fork you into two repos.
Cross-validated onClaude Opus 4.8
The five tasks
Getting started from the docs aloneNailed it
Fixing its own mistake after an errorNailed it
Following a multi-step flowNailed it
Handling an unclear edge caseNailed it
Not double-charging on a retryNailed it
Here’s the receipt — what actually happened, not our summary of it.
The owner/name pair is a unique key. POST /api/repos/create {name:'agentcheck-idem'} -> 200 first; an identical second POST -> 409 {error:'You already created this model repo: agentcheck-liz/agentcheck-idem', url:'https://huggingface.co/agentcheck-liz/agentcheck-idem'}. A dropped-response retry returns the existing repo's URL instead of creating a duplicate.See everything the AI did (5 steps)
t1 Claude Opus 4.8 POST /api/repos/create (model, name) → 200 repo name + url t2 Claude Opus 4.8 POST /api/repos/create (name omitted) → 400 Zod 'Invalid input -> at name' t3 Claude Opus 4.8 POST create -> PUT settings private -> GET model → chain ok: private:true read back t4 Claude Opus 4.8 POST /api/repos/create (type:'banana') → 400 'Invalid input -> at type' t5 Claude Opus 4.8 POST same repo name x2 → 200 then 409 with existing repo URL
Tested 2026-07-04 with Claude Opus 4.8 agents · request a re-test