Catwalk v3 is here 💅
A brand-new, cleaner schema for describing models. Pricing, reasoning and capabilities each get their own home, and type now tells you how to talk to a model rather than who made it. Same catwalk, much better outfits.
The big one!
Provider type now names the API format a provider speaks, not the vendor. There are just three:
completions: OpenAI Chat Completionsresponses: OpenAI Responsesmessages: Anthropic Messages
Models can override their provider's type, too, so a single provider can serve Completions, Responses and Messages models side by side (looking at you, OpenCode and Copilot 👀).
Prettier models
- Pricing now lives in a nested
pricingobject with clearer names:input,output,cache_createandcache_hit. No more guessing which "cached" field means what. - Reasoning is described by
thinking(always,neverortoggleable), plus effort levels that carry display names, likexhighshowing as "X-High". - Capabilities tell you about
visionand, new,audiosupport. max_attachmentssets a per-model attachment limit.session_affinity_headerlets providers that route by session do just that.
Migrating from v2
The module path changed, so update your imports:
go get charm.land/catwalk/v3import "charm.land/catwalk/v3/pkg/catwalk"Then:
| v2 | v3 |
|---|---|
TypeOpenAI, TypeAnthropic, TypeBedrock…
| TypeCompletions, TypeResponses, TypeMessages (use the provider ID to tell vendors apart)
|
CostPer1MIn / CostPer1MOut
| Pricing.Input / Pricing.Output
|
CostPer1MInCached
| Pricing.CacheCreate
|
CostPer1MOutCached
| Pricing.CacheHit
|
CanReason (field)
| CanReason() (method)
|
ReasoningLevels
| ReasoningEffortLevels(), or Reasoning.EffortLevels for display names
|
DefaultReasoningEffort
| Reasoning.DefaultEffortLevel
|
SupportsImages
| Capabilities.Vision
|
| — | model.EffectiveType(provider.Type) to resolve the per-model type
|
The client now fetches from /v3/providers.
Not ready to move yet? No worries. /v2/providers stays live for some time, serving the old schema translated automatically from the v3 data, so existing clients keep working. We'll give plenty of notice before it goes away.
More to come,
Charm XX ⭐
Changelog
Fixed
- 79e2a97: fix: specify the project name in goreleaser (@andrinoff)
- 31c845e: fix: wire types in openai and minimax (@andrinoff)
Other stuff
- 6e154de: catwalk v3 (#611) (@andreynering)
- f241ec3: chore: auto-update generated files (#711) (@github-actions[bot])
Verifying the artifacts
First, download the checksums.txt file and the checksums.txt.sigstore.json file files, for example, with wget:
wget 'https://github.com/charmbracelet/catwalk/releases/download/v3.0.0/checksums.txt'
wget 'https://github.com/charmbracelet/catwalk/releases/download/v3.0.0/checksums.txt.sigstore.json'Then, verify it using cosign:
cosign verify-blob \
--certificate-identity 'https://github.com/charmbracelet/meta/.github/workflows/goreleaser.yml@refs/heads/main' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
--bundle 'checksums.txt.sigstore.json' \
./checksums.txtIf the output is Verified OK, you can safely use it to verify the checksums of other artifacts you downloaded from the release using sha256sum:
sha256sum --ignore-missing -c checksums.txtDone! You artifacts are now verified!
Thoughts? Questions? We love hearing from you. Feel free to reach out on X, Discord, Slack, The Fediverse, Bluesky.