An open, community-maintained catalog of LLM API parameters.
Every API parameter each AI model accepts, in one place: temperature, top_p, max_tokens and the rest of the request body, with defaults, ranges and gating conditions. Not weight counts — see model parameters vs. API parameters. Inspired by models.dev; we use it at Manifest.
npm install modelparamsParamsOf<Id> is the exact set of parameters a model accepts. Pass one it doesn't, and your code won't compile.
import type { ParamsOf } from "modelparams";
import OpenAI from "openai";
const params: ParamsOf<"openai/gpt-4.1"> = {
max_tokens: 1024,
temperature: 0.7,
// top_k: 40, // won't compile: gpt-4.1 has no top_k
};
await new OpenAI().chat.completions.create({ model: "gpt-4.1", messages, ...params });Defaults, runtime validation, and the helper APIs are in the package README.
pip install modelparamsGenerated TypedDict definitions provide model-specific autocomplete and static checking, while
Pydantic validates untrusted values at runtime:
from modelparams import validate_params
from modelparams.types.openai import Gpt_4_1Params
params: Gpt_4_1Params = {"max_tokens": 1024, "temperature": 0.7}
validated = validate_params("openai/gpt-4.1", params)Defaults, catalog helpers, and validation details are in the Python package README.
Prefer raw JSON?
curl https://modelparams.dev/api/v1/models.json
curl https://modelparams.dev/api/v1/models/openai/gpt-5.5.json
Schema at https://modelparams.dev/api/v1/schema.json, per the Model Parameters convention.
POST the parameters you're about to send. You get back what's wrong — including combinations the provider rejects — and a corrected payload.
curl -s https://modelparams.dev/api/v1/validate \
-H 'Content-Type: application/json' \
-d '{"model":"anthropic/claude-3-opus-20240229","params":{"temperature":0.5,"top_p":0.9}}'Or pass what your SDK is actually configured with — the base URL and the wire model string:
curl -s https://modelparams.dev/api/v1/validate \
-H 'Content-Type: application/json' \
-d '{"baseUrl":"https://api.fireworks.ai/inference/v1","model":"accounts/fireworks/models/kimi-k3","params":{"top_k":40}}'{
"valid": false,
"issues": [
{
"path": "top_p",
"code": "not_applicable",
"message": "top_p does not apply when temperature ≠ 1",
"conflictsWith": ["temperature"]
}
],
"safeParams": { "temperature": 0.5 }
}Give a coding agent the catalog, so it looks parameters up instead of recalling them.
MCP server — hosted at https://modelparams.dev/mcp, nothing to install, always the catalog this site is serving:
claude mcp add --transport http modelparams https://modelparams.dev/mcp
codex mcp add modelparams --url https://modelparams.dev/mcpFour tools: validate_model_params to check a params object before you send it, get_model_params for one model's full surface, list_models and find_models_supporting to search the catalog.
Without MCP — npx skills add mnfst/modelparams.dev installs the companion agent skill, and llms.txt points an agent at a URL.
The same model accepts different parameters on each host that serves it. The catalog has one entry per host, each probed against that host's own endpoint.
moonshot/kimi-k3 |
fireworks/kimi-k3 |
|
|---|---|---|
| Wire id | kimi-k3 |
accounts/fireworks/models/kimi-k3 |
temperature: 1.8 |
✗ 400 | ✓ |
top_k |
✗ | ✓ |
| Thinking control | ✓ | ✗ |
wireId— the exact string to send when it differs from the catalog slug. Every API response and MCP tool returns it.- Provider is mandatory —
kimi-k3alone is refused with both qualified ids to retry with; the catalog never guesses a host. {scope}in awireId— substitute your routing geography before sending. Bedrock serves most newer models only through a cross-region inference profile, whose id is the model id behind a geography prefix:us,eu,apac,jp,au,ca,sa, orglobal. So"{scope}.anthropic.claude-sonnet-4-5-20250929-v1:0"becomeseu.anthropic.…in Frankfurt andglobal.anthropic.…if you want AWS to route it for you. AwireIdwith no placeholder is already complete and works in every region that serves it. The catalog deliberately does not enumerate which model exists in which region — that is per-account, changes constantly, and your ownListInferenceProfilesis the accurate source.
One entry documents one wire format.
| Surface | Status |
|---|---|
| OpenAI Chat Completions — openai, deepseek, xai, mistral, moonshot, alibaba, z-ai, groq, fireworks, … | ✅ |
| Anthropic Messages | ✅ |
Google generateContent |
✅ |
Amazon Bedrock Converse — every bedrock/* entry |
✅ |
Vertex AI generateContent — every vertex/* entry |
✅ |
Subscription plans (-subscription entries) |
✅ |
Amazon Bedrock InvokeModel (native per-vendor bodies) |
❌ |
Vertex AI rawPredict (Anthropic, Meta, Mistral on Vertex) |
❌ |
| MiniMax native endpoint | ❌ |
| OpenAI Responses API | ❌ |
| Google Interactions API | ❌ |
| xAI native SDK | ❌ |
Embeddings, audio, image, and batch APIs are out of scope. Missing a surface? Open an issue or a PR.
vertex/* covers the Gemini models Vertex serves through generateContent, which shares the generationConfig vocabulary with the first-party Gemini API but not its model list or its bounds. Third-party models on Vertex (Claude, Llama, Mistral) go through rawPredict with each vendor's native body, which is a different surface and is not covered.
Bedrock is the sharpest case, because one host serves both surfaces and the SDK you pick decides which. ConverseCommand (@aws-sdk/client-bedrock-runtime) takes inferenceConfig.maxTokens and puts vendor extras in additionalModelRequestFields — that is what bedrock/* documents. AnthropicBedrock (@anthropic-ai/bedrock-sdk) calls InvokeModel with the native Anthropic body (max_tokens, top-level thinking) instead, so these entries do not describe it. Same model, same key, two vocabularies.
Drop a YAML file in models/<provider>/, open a PR, and CI validates it against the schema. Details in CONTRIBUTING.md. Can't open a PR? File an issue with a link to the docs.
npm install
npm run dev # http://localhost:3000
npm run build # → dist/
npm run validate # check every YAML
npm test # site tests, including the /api/v1/validate function
npm test --workspaces # + every published package
npm run codegen:python # regenerate the Python package catalog and typesMIT
