@opencode-ai/models
Official typed client for the Models.dev API.
npm install @opencode-ai/models
Usage
import { Models } from "@opencode-ai/models"
const client = Models.make()
const providers = await client.providers()
providers["anthropic"]?.models["claude-opus-4-6"]?.cost?.input
const models = await client.models()
models["anthropic/claude-opus-4-6"]?.knowledge
const catalog = await client.catalog()
Options:
const client = Models.make({
baseUrl: "https://models.dev",
fetch: myFetch,
headers: { "x-extra": "1" },
})
await client.providers({ signal: AbortSignal.timeout(5000) })
Errors are a single ModelsDevError with reason: "Transport" | "UnexpectedStatus" | "MalformedResponse" and the underlying cause.
Snapshot
A full copy of the database ships inside the package as a separate, tree-shakable entrypoint:
import snapshot, { providers, models, generatedAt } from "@opencode-ai/models/snapshot"
providers["anthropic"]?.models["claude-opus-4-6"]?.limit.context
Use it for no-network runtimes, tests, cold-start-sensitive paths, or as an explicit fallback:
const providers = await client.providers().catch(async () => (await import("@opencode-ai/models/snapshot")).providers)
The published snapshot is at most ~24h behind the live API (data releases are automated).
Effect
An Effect-native client lives at @opencode-ai/models/effect (requires the optional peer dependency effect):
import { Models } from "@opencode-ai/models/effect"
import { FetchHttpClient } from "effect/unstable/http"
import { Effect } from "effect"
const program = Effect.gen(function* () {
const client = yield* Models.make()
return yield* client.providers()
})
await program.pipe(Effect.provide(FetchHttpClient.layer), Effect.runPromise)
Transport comes from the environment's HttpClient service, so proxies, retries, tracing, and test transports compose the usual Effect way. For DI, Models.Service and Models.layer(options?) are provided:
const program = Effect.gen(function* () {
const client = yield* Models.Service
return yield* client.models()
})
program.pipe(Effect.provide(Models.layer().pipe(Layer.provide(FetchHttpClient.layer))))