Check Kiln's model list for deprecated or sunset models across all providers. Use when the user wants to find deprecated models, check model availability, audit the model list for stale entries, or mentions model deprecation/sunset/end-of-life.
72
90%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Audit libs/core/kiln_ai/adapters/ml_model_list.py to find models that have been deprecated, removed, or are approaching end-of-life across all providers. All checks are free — they use model-listing endpoints, not inference.
curl, uv run, and python3 commands that hit the network MUST use required_permissions: ["all"]. The sandbox blocks network access..env before running check scripts: export $(grep -v '^#' .env | xargs)gcloud CLI authentication. Before running, ask the user to run gcloud auth login if they haven't recently. If gcloud auth print-access-token fails, prompt the user to authenticate.deprecated=True on individual provider entries. It never removes models or providers from the list.deprecated=False (the default). Don't re-check entries already marked deprecated.Run the extraction script from the repo root:
python3 .agents/skills/kiln-check-deprecation/scripts/extract_models.py > /tmp/kiln_extracted.jsonThis fetches the published model list from https://remote-config.getkiln.ai/kiln_config_v2.json and extracts:
It skips entries already marked deprecated=True.
Output: JSON to stdout (pipe to file), human summary to stderr.
The JSON contains:
deprecated_count: number of already-deprecated entriesproviders: dict of provider_name → sorted unique list of model_idsentries: list of {enum, provider, model_id} for each non-deprecated entryexport $(grep -v '^#' .env | xargs)
python3 .agents/skills/kiln-check-deprecation/scripts/check_provider.py all > /tmp/kiln_check_results.jsonexport $(grep -v '^#' .env | xargs)
python3 .agents/skills/kiln-check-deprecation/scripts/check_provider.py openrouter > /tmp/kiln_check_openrouter.jsonThe script handles all provider API quirks automatically:
{data: [...]})models/ — stripped automaticallyx-api-key header, not Authorization: Bearerexpiration_date fields/v1/models only lists serverless models; the script instead checks each model individually via the model detail API (GET /v1/{model_id}), which covers all tiers (serverless, on-demand, fine-tune). A model is only flagged as missing if it returns HTTP 404 from the detail API.:exacto is a virtual routing suffix (quality-first provider sorting) that never appears in model listings. The script strips it before checking. :free and :thinking are real model entries that appear in the listing when available — if they're missing, it's a genuine removal.task=Text Generation, include_deprecated=true) when CLOUDFLARE_API_KEY and CLOUDFLARE_ACCOUNT_ID are both set, and otherwise Cloudflare's public catalog JSON (https://ai-cloudflare-com.pages.dev/api/models), so it is never skipped for a missing key. Every model with a planned_deprecation_date is reported under expiring. Once that date has passed, the model also counts as missing even if the listing still shows it. Never use LiteLLM's catalog or models.dev to decide a Cloudflare model still exists: LiteLLM's is stale and models.dev no longer deletes retired models.x-goog-user-project header. Requires gcloud CLI auth. Kiln entries may use meta/ prefix for LiteLLM routing — stripped automatically. Versioned aliases (e.g. gemini-2.0-flash-001 → gemini-2.0-flash) are handled by stripping 3-digit version suffixes.Output: JSON to stdout with per-provider results, human summary to stderr.
Each provider result contains:
missing: model_ids not found in the provider's listingexpiring: model_ids with upcoming expiration dates (OpenRouter and Cloudflare)entries_to_deprecate: full enum/provider/model_id entries for each missing modelskipped / error: if credentials missing or API call failed| Provider | Env Var | Auth |
|---|---|---|
| OpenRouter | (none — public API) | None |
| OpenAI | OPENAI_API_KEY | Bearer |
| Anthropic | ANTHROPIC_API_KEY | x-api-key |
| Gemini API | GEMINI_API_KEY | Query param |
| Fireworks AI | FIREWORKS_API_KEY | Bearer |
| Together AI | TOGETHER_API_KEY | Bearer |
| SiliconFlow CN | SILICONFLOW_CN_API_KEY | Bearer |
| Cerebras | CEREBRAS_API_KEY | Bearer |
| Groq | GROQ_API_KEY | Bearer |
| Vertex AI | VERTEX_PROJECT_ID + gcloud CLI auth | OAuth (gcloud) |
| Cloudflare | CLOUDFLARE_API_KEY + CLOUDFLARE_ACCOUNT_ID (optional — falls back to the public catalog) | Bearer |
Requires aws CLI configured. If not installed, skip.
aws bedrock list-foundation-models --output json | \
jq '[.modelSummaries[] | {modelId, status: .modelLifecycle.status, endOfLife: .modelLifecycle.endOfLifeTime}]'Flag any model where status == "LEGACY" or endOfLifeTime is approaching.
Cross-reference against LiteLLM's public model database for deprecation_date fields. This mostly covers Azure/OpenAI date-stamped models but is a useful secondary signal.
curl -s https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json | \
jq 'to_entries[] | select(.value.deprecation_date != null) | {model: .key, deprecation_date: .value.deprecation_date}'These don't have meaningful deprecation to check:
ollama — local models, user-managedkiln_fine_tune — internalkiln_custom_registry — internalopenai_compatible — user-configureddocker_model_runner — localazure_openai — typically mirrors OpenAI, covered by OpenAI checkhuggingface — serverless inference, model availability variestypesafe — adapter-backed, not LiteLLM; its /v1/models needs a key, so Jev entries can only be checked with oneRead the JSON output from check_provider.py and present findings in a clear table to the user:
Deprecation Audit Results
=========================
❌ REMOVED (model not found in provider's model list):
- ModelName.gemini_1_5_pro → gemini_api (model_id: gemini-1.5-pro)
- ModelName.gemini_1_5_pro → openrouter (model_id: google/gemini-pro-1.5)
⚠️ EXPIRING SOON (within 90 days):
- ModelName.claude_3_7_sonnet → openrouter (model_id: anthropic/claude-3.7-sonnet, expires: 2026-05-05)
⚠️ LEGACY (Bedrock lifecycle status):
- ModelName.mistral_large → amazon_bedrock (model_id: mistral.mistral-large-2407-v1:0, status: LEGACY)
✅ ALL CLEAR:
- openai: 20/20 models found
- anthropic: 8/11 models found (3 deprecated above)
⏭️ SKIPPED (no credentials):
- groq
- amazon_bedrockGroup by provider within each category. Use the entries_to_deprecate field from the JSON to get the ModelName enum for each entry.
For each confirmed-removed model, set deprecated=True on the affected KilnModelProvider entry.
To find the line to edit, grep for the model_id in ml_model_list.py:
grep -n 'model_id="<model_id>"' libs/core/kiln_ai/adapters/ml_model_list.pyThen add deprecated=True, after the model_id= line in the matching KilnModelProvider block.
Rules:
KilnModel are deprecated, note this to the user — they may want to consider removing the model entirelyplanned_deprecation_date deprecated now, before that date, and flag it as urgent in the reportLEGACY status, mark deprecated (the model still works but is on its way out)Ask the user to confirm before making changes. Present the list of changes and wait for approval.
After marking providers deprecated, run a quick sanity check:
grep -c "deprecated=True" libs/core/kiln_ai/adapters/ml_model_list.pyEnsure the count matches what you expect (previous count + newly marked).
gcloud auth print-access-token works, or skip Vertex)deprecated=True set on confirmed entriesKiln-AI/Kiln
c66200f
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.