Back to the board
Agent-friendly

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