Lookup capabilities (context window, modalities, features) of various LLM models offline.
Project description
llmcapa
Lookup capabilities (context window, modalities, supported features) of various LLM models — fully offline by default.
Features
- Comprehensive Bundled Data: Offline capability data for OpenAI, Anthropic, Google (Gemini), Microsoft (Phi), Amazon (Nova/Titan), Meta (Llama), Mistral, Qwen, DeepSeek, NVIDIA, and Japanese domestic models (NTT tsuzumi, PFN PLaMo, ELYZA, etc. adopted by the Digital Agency's "GENNAI" platform).
- Zero Runtime Dependencies: Built entirely on the Python standard library.
- Alias Resolution: Automatically resolves aliases and provider-specific names (e.g.,
gpt-4o-2024-08-06->gpt-4o,gemini-1.5-pro-preview-0409->gemini-1.5-pro). - Advanced Feature Queries: Check support for
vision,multimodal,chat_completion,responses_api,reasoning_effort,thinking_budget, and specific input/output modalities (e.g.,image_input,image_output,audio_input). - High Performance: Evaluated feature checks are cached internally using memoization to avoid redundant calculations.
- Cost Estimation: Estimate API costs based on input and output token counts.
- Drop-in Replacement Checker: Check if a model can be safely replaced by another model based on context window and required features.
- Tokenizer Mapping: Access tokenizer names (e.g.,
o200k_base) directly from model capabilities. - Dynamic OpenRouter Integration: Fetch and register all 300+ models from OpenRouter API dynamically, with local file caching to ensure offline availability with the latest updates.
- Extendable: Load your own local JSON model definitions.
- CLI Included: Query and list model capabilities directly from your terminal.
Install
pip install llmcapa
Or from source:
pip install .
Usage
Basic Lookup
import llmcapa
# Get model capabilities (case-insensitive, alias-resolved)
cap = llmcapa.get("gpt-4o")
print(cap.context_window) # 128000
print(cap.max_output_tokens) # 16384
print(cap.tokenizer_name) # "o200k_base"
# Check feature support (using strings or Feature enum)
from llmcapa import Feature
print(cap.supports("vision")) # True
print(cap.supports(Feature.LLMC_FEAT_VISION)) # True
print(cap.supports("responses_api")) # True
print(cap.supports("reasoning_effort")) # False
# List all supported features
print(cap.features())
# ['chat_completion', 'function_calling', 'image', 'image_input', 'image_output', 'json_mode', 'multimodal', 'responses_api', 'streaming', 'text', 'text_input', 'text_output', 'vision']
Token & Cost Estimation
Roughly estimate the number of tokens for a given text (supporting 30+ major languages) and calculate API costs:
[!NOTE] Token estimation is a lightweight, offline approximation. For exact token counts, please use the official APIs or dedicated tokenizers from each provider.
gpt = llmcapa.get("gpt-4o")
# Estimate tokens for multilingual text
# If `tiktoken` is installed, it dynamically uses it for exact OpenAI token counts.
# Otherwise, it falls back to a highly-optimized, standard-library-only estimation.
text = "Hello world! こんにちは世界。"
tokens = gpt.estimate_tokens(text)
print(tokens) # 10 (estimated tokens)
# Estimate API costs based on token counts (returns cost and currency)
res = gpt.estimate_cost(input_tokens=1500, output_tokens=500)
print(res) # {'cost': 0.00875, 'currency': 'USD'}
Drop-in Replacement Checker
Check if a model can be safely replaced by another model. The replacement model must have a context window at least as large as the target model and support all required features.
gpt4o = llmcapa.get("gpt-4o")
gpt4o_mini = llmcapa.get("gpt-4o-mini")
gemini = llmcapa.get("gemini-3.5-flash")
# gpt-4o-mini has the same context window but lacks image_output (which gpt-4o supports)
print(gpt4o.can_be_replaced_by(gpt4o_mini)) # False
# gemini-3.5-flash has a larger context window but also lacks image_output
print(gpt4o.can_be_replaced_by(gemini)) # False
# If we only require vision and function_calling, gemini-3.5-flash can replace gpt-4o
print(gpt4o.can_be_replaced_by(gemini, required_features=["vision", "function_calling"])) # True
Modality & Multimodal Checks
You can check specific input/output modalities or general multimodal support:
gemini = llmcapa.get("gemini-3.5-flash")
print(gemini.supports("multimodal")) # True (supports multiple modalities)
print(gemini.supports("audio_input")) # True
print(gemini.supports("image_output")) # False
Reasoning & Thinking Checks
Differentiate between OpenAI-style reasoning_effort and Anthropic-style thinking_budget:
o1 = llmcapa.get("o1")
print(o1.supports("reasoning_effort")) # True
print(o1.supports("thinking_budget")) # False
claude = llmcapa.get("claude-3-7-sonnet")
print(claude.supports("reasoning_effort")) # False
print(claude.supports("thinking_budget")) # True
Listing & Searching Models
# List all models for a specific provider
for c in llmcapa.list_models(provider="anthropic"):
print(c.model_id, c.context_window)
# Search models by capability criteria
big_reasoning_models = llmcapa.find(
supports_reasoning=True,
min_context_window=200000
)
Dynamic OpenRouter Integration
Fetch and register all 300+ models dynamically from OpenRouter API to get real-time capabilities and pricing. You can fetch models dynamically using fetch_openrouter(). The response is cached locally in ~/.llmcapa/openrouter_cache.json and automatically loaded on subsequent imports to ensure offline availability with the latest updates.
# Fetch and register OpenRouter models dynamically
count = llmcapa.fetch_openrouter()
print(f"Registered {count} models from OpenRouter!")
# Lookup using OpenRouter model ID
cap = llmcapa.get("meta-llama/llama-3.3-70b-instruct")
print(cap.context_window) # 131072
print(cap.pricing) # {'input_per_1m': 0.1, 'output_per_1m': 0.32, 'currency': 'USD'}
Custom Local Data
Load your own model definitions from a local JSON file:
llmcapa.load_extra("my_models.json")
my_models.json format:
{
"models": [
{
"provider": "local",
"model_id": "my-custom-model",
"context_window": 32768,
"max_output_tokens": 4096,
"supports_function_calling": true,
"aliases": ["my-model-latest"]
}
]
}
Development
For details on how to extend the library, add new providers, or implement new feature flags, please refer to the DEVELOP.md guide.
CLI
# Show capabilities of a specific model
llmcapa show gpt-4o
llmcapa show gpt-4o --json
# List all known models
llmcapa list
llmcapa list --provider google
llmcapa list --json --no-deprecated
# List all known providers
llmcapa providers
# Explicitly fetch and update the OpenRouter models cache (forces cache refresh)
llmcapa update
Notes
- Static Snapshot: Bundled capability data is a static snapshot. While we strive to keep it updated with the latest models (including GPT-5.5, Claude Fable, Gemini 3.5, DeepSeek V4, etc.), providers change limits and pricing frequently. Use
fetch_openrouter()or verify with official documentation when absolute accuracy is critical.
License
Apache License 2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file llmcapa-0.1.0.tar.gz.
File metadata
- Download URL: llmcapa-0.1.0.tar.gz
- Upload date:
- Size: 47.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ae8f45d5a69a529380365480eb3ce1b7870c792381703e079c1835ccb1414ad0
|
|
| MD5 |
683aff6113a68ac9b9b63cd248ba4aa0
|
|
| BLAKE2b-256 |
3a31e55e3d651fd4447b445fdb48d0c7681386597dae92ab7a3975b6f2db3236
|
File details
Details for the file llmcapa-0.1.0-py3-none-any.whl.
File metadata
- Download URL: llmcapa-0.1.0-py3-none-any.whl
- Upload date:
- Size: 44.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
93e3656029035412c482dd0518e130e79816252e3ff0c4fd10e91a95f7cdabf7
|
|
| MD5 |
574027fac40613bca4690b1a9bf4b182
|
|
| BLAKE2b-256 |
00a703b96aaade2ce8a1de51fb7b0b9db5467659816308ddb8c3e3882093bcb9
|