A toolkit for managing and testing LM Studio models with automatic context limit discovery
Project description
LMStrix: The Unofficial Toolkit for Mastering LM Studio
LMStrix is a professional, installable Python toolkit designed to supercharge your interaction with LM Studio. It provides a powerful command-line interface (CLI) and a clean Python API for managing, testing, and running local language models, with a standout feature: the Adaptive Context Optimizer.
Why LMStrix? The Problem it Solves
Working with local LLMs via LM Studio is powerful, but it comes with challenges:
- The Context Window Mystery: What's the true maximum context a model can handle on your machine? Advertised context lengths are often theoretical. The practical limit depends on your hardware, the model's architecture, and LM Studio's own overhead. Finding this limit manually is a tedious, frustrating process of trial and error.
- Repetitive Workflows: Managing models, crafting prompts, and running inference often involves repetitive boilerplate code or manual steps in the LM Studio UI.
- Lack of Programmatic Control: The UI is great for exploration, but developers building applications on top of local LLMs need a robust, scriptable interface for automation and integration.
LMStrix solves these problems by providing a seamless, developer-friendly toolkit that automates the tedious parts and lets you focus on building.
How It Works: The Adaptive Context Optimizer
The core innovation in LMStrix is its ability to automatically discover the maximum operational context length for any model loaded in LM Studio.
It uses a sophisticated binary search algorithm:
- It starts with a wide range for the possible context size.
- It sends a specially crafted prompt to the model, progressively increasing the amount of "filler" text.
- It analyzes the model's response (or lack thereof) to see if it successfully processed the context.
- By repeatedly narrowing the search range, it quickly pinpoints the precise token count where the model's performance degrades or fails.
This gives you a reliable, empirical measurement of the model's true capabilities on your specific hardware, eliminating guesswork and ensuring your applications run with optimal performance.
Key Features
- Automatic Context Optimization: Discover the true context limit of any model with the
optimizecommand. - Full Model Management: Programmatically
listavailable models andscanfor newly downloaded ones. - Flexible Inference Engine: Run inference with a powerful two-phase prompt templating system that separates prompt structure from its content.
- Rich CLI: A beautiful and intuitive command-line interface built with
richandfire, providing formatted tables, progress indicators, and clear feedback. - Modern Python API: An
async-first API designed for high-performance, concurrent applications. - Robust and Resilient: Features automatic retries with exponential backoff for network requests and a comprehensive exception hierarchy.
- Lightweight and Focused: Built with a minimal set of modern, high-quality dependencies.
Installation
# Using pip
pip install lmstrix
# Using uv (recommended)
uv pip install lmstrix
# For development
git clone https://github.com/twardoch/lmstrix
cd lmstrix
pip install -e .
Quick Start
Command-Line Interface (CLI)
# First, scan for available models in LM Studio
lmstrix scan
# List all models with their test status
lmstrix list
# Test the context limit for a specific model
lmstrix test "model-id-here"
# Test all untested models
lmstrix test --all
# Run inference on a model
lmstrix infer "Your prompt here" --model "model-id" --max-tokens 150
# Run inference with a prompt file
lmstrix infer "@prompts.toml:greeting" --model "model-id"
# Enable verbose output for debugging
lmstrix scan --verbose
lmstrix test "model-id" --verbose
Python API
import asyncio
from lmstrix import LMStrix
async def main():
# Initialize the client
lms = LMStrix()
# Scan for available models
await lms.scan_models()
# List all models
models = await lms.list_models()
for model in models:
print(f"Model: {model.id}")
print(f" Context limit: {model.context_limit:,} tokens")
print(f" Tested limit: {model.tested_max_context or 'Not tested'}")
print(f" Status: {model.context_test_status}")
# Test a specific model's context limits
model_id = models[0].id if models else None
if model_id:
print(f"\nTesting context limits for {model_id}...")
result = await lms.test_model(model_id)
print(f"Optimal context: {result.tested_max_context} tokens")
print(f"Test status: {result.context_test_status}")
# Run inference
if model_id:
response = await lms.infer(
prompt="What is the meaning of life?",
model_id=model_id,
max_tokens=100
)
print(f"\nInference result:\n{response.content}")
if __name__ == "__main__":
asyncio.run(main())
Batch Processing Example
from lmstrix.api.client import LMStudioClient
from lmstrix.core.scanner import ModelScanner
# Process multiple models
client = LMStudioClient()
scanner = ModelScanner(client)
# Scan and test all models
for model in scanner.scan():
if not model.tested_max_context:
print(f"Testing {model.id}...")
# Testing happens automatically via CLI or API
Architecture
LMStrix is designed with a clean, modular architecture:
api/: A dedicated client for communicating with the LM Studio local server API.core/: The heart of the application, containing the core business logic for models, inference, and the context optimization algorithm.loaders/: Handles loading and managing data for models, prompts, and context files.cli/: Implements the command-line interface.utils/: Shared utilities and helper functions.
How Context Testing Works
LMStrix uses an innovative binary search algorithm to find the true operational context limit of each model:
- Initial Range: Starts with the model's declared context size as the upper bound
- Binary Search: Tests the model with progressively refined context sizes
- Validation: Each test sends a simple prompt ("2+2=") padded with filler text to reach the target context size
- Result Verification: Only marks a context size as "working" if the model returns the correct answer ("4")
- Optimization: Finds the maximum context size that reliably works on your hardware
This process typically takes 30-60 seconds per model and saves the results for future use.
Development
# Clone the repository
git clone https://github.com/twardoch/lmstrix
cd lmstrix
# Install in development mode with all dependencies
pip install -e ".[dev]"
# Run the test suite
pytest
# Run with coverage
pytest --cov=src/lmstrix --cov-report=html
# Format code
black .
ruff format .
# Lint code
ruff check .
mypy src/lmstrix
# Build the package
python -m build
License
This project is licensed under the MIT License - see the LICENSE file for details.
Contributing
Contributions are highly welcome! Please feel free to submit pull requests or file issues on our GitHub repository.
Requirements
- Python 3.10 or higher
- LM Studio installed and running locally
- At least one model downloaded in LM Studio
Support
For bugs, feature requests, or general questions, please file an issue on our GitHub repository.
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 lmstrix-1.0.26.tar.gz.
File metadata
- Download URL: lmstrix-1.0.26.tar.gz
- Upload date:
- Size: 45.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
419ce04b9dfbb68f86001c6082be7158249c8a92835e44337ae117f1c9a36f1b
|
|
| MD5 |
e968af8f31735911ae7708e188473623
|
|
| BLAKE2b-256 |
e39786c90fe823bd1cde2c1c3ebf92c9d5ce6980a95701dcf48a37750108b02c
|
File details
Details for the file lmstrix-1.0.26-py3-none-any.whl.
File metadata
- Download URL: lmstrix-1.0.26-py3-none-any.whl
- Upload date:
- Size: 33.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8d7f94bdc0dcbded8d29fbf80fcb9313b98eafdd9795233a7f0276d7d216a8f6
|
|
| MD5 |
ad9696d4948b9764a9df7a97ed7c7164
|
|
| BLAKE2b-256 |
dcdc27e699a18fa9b8f1ebc6335f80dd40c919459286db7a800a9920576c4fa4
|