CLI to detect GPT token waste from Langfuse logs
Project description
๐ง What is Crashens Detector?
Crashens Detector is a developer tool to analyze GPT API logs and uncover hidden token waste, retry loops, and overkill model usage. It helps you optimize your OpenAI, Anthropic, or Langfuse API usage by generating a cost breakdown and suggesting cost-saving actions.
๐ Use it when you want to:
- Understand how your GPT API budget is being spent
- Reduce unnecessary model calls or retries
- Audit logs for fallback logic inefficiencies
- Analyze Langfuse/OpenAI JSONL logs locally, with full privacy
๐งพ Supports: OpenAI, Anthropic, Langfuse JSONL logs
๐ป Platform: 100% CLI, 100% local
๐ก Why use Crashens Detector?
"You can't optimize what you can't see." Crashens Detector gives you visibility into how you're actually using LLMs โ and how much it's costing you.
๐จโ๐ป Use Cases
- Track and reduce monthly OpenAI bills
- Debug retry loops and fallback logic in LangChain or custom agents
- Detect inefficient prompt-to-model usage (e.g., using GPT-4 for 3-token completions)
- Generate token audit logs for compliance or team analysis
- CLI tool to audit GPT usage and optimize OpenAI API costs
- Analyze GPT token usage and efficiency in LLM logs
- Reduce LLM spending with actionable insights
TL;DR
pip install crashlens-detector
crashlens scan path/to/your-logs.jsonl
# Generates report.md with per-trace waste, cost, and suggestions
โ ๏ธ Python Requirement
Crashens Detector requires Python 3.12 or higher. Download Python 3.12+ here.
โ ๏ธ Windows PATH Warning
If you see a warning like:
WARNING: The script crashlens-detector.exe is installed in 'C:\Users\<user>\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\Scripts' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
This means the crashlens command may not work from any folder until you add the above Scripts directory to your system PATH.
How to fix:
- Copy the path shown in the warning (ending with
\Scripts). - Open the Windows Start menu, search for "Environment Variables", and open "Edit the system environment variables".
- Click "Environment Variables...".
- Under "User variables" or "System variables", select
Pathand click "Edit". - Click "New" and paste the Scripts path.
- Click OK to save. Restart your terminal/command prompt.
Now you can run crashlens-detector from any folder.
Crashens Detector analyzes your logs for patterns like fallback failures, retry loops, and overkill model usage, and generates a detailed Markdown report (report.md) with cost breakdowns and actionable insights.
๐ Example Crashens Detector Report
Below is a sample of what the actual report.md looks like after running Crashens Detector:
๐จ Crashens Detector Token Waste Report ๐จ ๐ Analysis Date: 2025-07-31 15:24:48
| Metric | Value |
|---|---|
| Total AI Spend | $1.18 |
| Total Potential Savings | $0.82 |
| Wasted Tokens | 19,831 |
| Issues Found | 73 |
| Traces Analyzed | 156 |
โ Overkill Model | 59 traces | $0.68 wasted | Fix: optimize usage ๐ฏ Wasted tokens: 16,496 ๐ Traces (57): trace_overkill_01, trace_norm_02, trace_overkill_02, trace_overkill_03, trace_norm_06, +52 more
๐ข Fallback Failure | 7 traces | $0.08 wasted | Fix: remove redundant fallbacks ๐ฏ Wasted tokens: 1,330 ๐ Traces (7): trace_fallback_success_01, trace_fallback_success_02, trace_fallback_success_03, trace_fallback_success_04, trace_fallback_success_05, +2 more
โก Fallback Storm | 5 traces | $0.07 wasted | Fix: optimize model selection ๐ฏ Wasted tokens: 1,877 ๐ Traces (5): trace_fallback_failure_01, trace_fallback_failure_02, trace_fallback_failure_03, trace_fallback_failure_04, trace_fallback_failure_05
๐ Retry Loop | 2 traces | $0.0001 wasted | Fix: exponential backoff ๐ฏ Wasted tokens: 128 ๐ Traces (2): trace_retry_loop_07, trace_retry_loop_10
Top Expensive Traces
| Rank | Trace ID | Model | Cost |
|---|---|---|---|
| 1 | trace_norm_76 | gpt-4 | $0.09 |
| 2 | trace_norm_65 | gpt-4 | $0.07 |
| 3 | trace_norm_38 | gpt-4 | $0.06 |
Cost by Model
| Model | Cost | Percentage |
|---|---|---|
| gpt-4 | $1.16 | 98% |
| gpt-3.5-turbo | $0.02 | 2% |
๐ Features
- Detects token waste patterns: fallback failures, retry loops, overkill/short completions
- Supports OpenAI, Anthropic, and Langfuse-style logs (JSONL)
- Robust error handling for malformed or incomplete logs
- Configurable model pricing and thresholds via
pricing.yaml - Generates a professional Markdown report (
report.md) after every scan - 100% local: No data leaves your machine
1. Clone the Repository
Replace <repo-link> with the actual GitHub URL:
git clone <repo-link>
cd crashlens
2. Install Python & Poetry
Crashens Detector requires Python 3.8+ and Poetry for dependency management.
MacOS
- Install Python (if not already):
brew install python@3.12
- Install Poetry (stable version):
curl -sSL https://install.python-poetry.org | python3 - --version 1.8.2 # Or with Homebrew: brew install poetry
- Add Poetry to your PATH if needed:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zprofile source ~/.zprofile
- Verify installation:
poetry --version # Should show: Poetry (version 1.8.2)
Windows
โ ๏ธ Use PowerShell, not CMD, for these commands.
- Install Python from python.org
- Install Poetry (stable version):
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python - --version 1.8.2
- Add Poetry to your PATH if
poetry --versionreturns "not found":$userPoetryBin = "$HOME\AppData\Roaming\Python\Scripts" if (Test-Path $userPoetryBin -and -not ($env:Path -like "*$userPoetryBin*")) { $env:Path += ";$userPoetryBin" [Environment]::SetEnvironmentVariable("Path", $env:Path, "User") Write-Output "โ Poetry path added. Restart your terminal." } else { Write-Output "โ ๏ธ Poetry path not found or already added. You may need to locate poetry.exe manually." }
โ ๏ธ Restart your terminal/PowerShell after adding to PATH. - Verify installation:
poetry --version # Should show: Poetry (version 1.8.2)
3. Set Up the Environment
# From the project root:
poetry install
This will create a virtual environment and install all dependencies.
To activate the environment :
poetry shell
4. Running Crashens Detector
You can run Crashens Detector via Poetry or as a Python module:
Basic Scan (from file)
crashlens scan examples/retry-test.jsonl
Demo Mode (built-in sample data)
crashlens scan --demo
๐จ Crashens Detector Token Waste Report ๐จ ๐ Analysis Date: 2025-07-31 15:22:08
| Metric | Value |
|---|---|
| Total AI Spend | $0.09 |
| Total Potential Savings | $0.07 |
| Wasted Tokens | 1,414 |
| Issues Found | 8 |
| Traces Analyzed | 12 |
๐ข Fallback Failure | 5 traces | $0.07 wasted | Fix: remove redundant fallbacks ๐ฏ Wasted tokens: 1,275 ๐ Traces (5): demo_fallback_01, demo_fallback_02, demo_fallback_03, demo_fallback_04, demo_fallback_05
โ Overkill Model | 2 traces | $0.0007 wasted | Fix: optimize usage ๐ฏ Wasted tokens: 31 ๐ Traces (2): demo_overkill_01, demo_overkill_02
๐ Retry Loop | 1 traces | $0.0002 wasted | Fix: exponential backoff ๐ฏ Wasted tokens: 108 ๐ Traces (1): demo_retry_01
Top Expensive Traces
| Rank | Trace ID | Model | Cost |
|---|---|---|---|
| 1 | demo_norm_03 | gpt-4 | $0.03 |
| 2 | demo_norm_04 | gpt-4 | $0.02 |
| 3 | demo_fallback_05 | gpt-3.5-turbo | $0.02 |
Cost by Model
| Model | Cost | Percentage |
|---|---|---|
| gpt-4 | $0.09 | 99% |
| gpt-3.5-turbo | $0.0012 | 1% |
Why Crashens Detector? (vs. grep + Excel, LangSmith, or basic logging)
- ๐ grep + spreadsheet: Too manual, error-prone, no cost context
- ๐ธ LangSmith: Powerful but complex, requires full tracing/observability stack
- ๐ Logging without cost visibility: You miss $ waste and optimization opportunities
- ๐ Crashens Detector runs 100% locallyโno data leaves your machine.
Features (Ultra-Specific)
- โ Detects retry-loop storms across trace IDs
- โ Flags gpt-4, Claude, Gemini, and other expensive model usage where a cheaper model (e.g., gpt-3.5, Claude Instant) would suffice
- โ Scans stdin logs from LangChain, LlamaIndex, custom logging
- โ Generates Markdown cost reports with per-trace waste
What Makes Crashens Detector Different?
- ๐ต Model pricing fallback (auto-detects/corrects missing cost info)
- ๐ Security-by-design (runs 100% locally, no API calls, no data leaves your machine)
- ๐ฆ Coming soon: Policy enforcement, live CLI firewall, more integrations
๐ Log File Structure
Your logs must be in JSONL format (one JSON object per line) and follow this structure:
{"traceId": "trace_9", "startTime": "2025-07-19T10:36:13Z", "input": {"model": "gpt-3.5-turbo", "prompt": "How do solar panels work?"}, "usage": {"prompt_tokens": 25, "completion_tokens": 110, "total_tokens": 135}, "cost": 0.000178}
- Each line is a separate API call (no commas or blank lines between objects).
- Fields must be nested as shown:
input.model,input.prompt,usage.completion_tokens, etc.
Required fields:
traceId(string): Unique identifier for a group of related API callsinput.model(string): Model name (e.g.,gpt-4,gpt-3.5-turbo)input.prompt(string): The prompt sent to the modelusage.completion_tokens(int): Number of completion tokens used
Optional fields:
cost(float): Cost of the API callname,startTime, etc.: Any other metadata
๐ก Crashens Detector expects JSONL with per-call metrics (model, tokens, cost). Works with LangChain logs, OpenAI api.log, Claude, Gemini, and more.
๐ Usage: Command Line Examples
After installation, use the crashlens command in your terminal (or python -m crashlens if running from source).
1. Scan a log file
crashlens scan path/to/your-logs.jsonl
- Scans the specified log file and generates a
report.mdin your current directory.
2. Demo mode (built-in sample data)
crashlens scan --demo
- Runs analysis on built-in example logs (requires
examples-logs/demo-logs.jsonlfile). - Note: If installing from PyPI, you'll need to create sample logs or use your own data.
- From source: Demo data is included in the repository.
3. Scan from stdin (pipe)
cat path/to/your-logs.jsonl | crashlens scan --stdin
- Reads logs from standard input (useful for pipelines or quick tests).
4. Paste logs interactively
crashlens scan --paste
- Reads JSONL data from clipboard (paste and press Enter to finish).
5. Generate detailed category reports
crashlens scan --detailed
- Creates grouped JSON files in
detailed_output/by issue type (fallback_failure.json, retry_loop.json, etc.).
6. Get cost summaries
crashlens scan --summary # Cost summary with breakdown
crashlens scan --summary-only # Summary without trace IDs
- Shows cost analysis with or without detailed trace information.
7. Change output format
crashlens scan --format json # JSON output
crashlens scan --format markdown # Markdown format
- Default format is
slackfor team sharing.
8. Get help
crashlens --help
crashlens scan --help
- Shows all available options and usage details.
๐งฉ Example Workflow
- Install Crashens Detector:
pip install crashlens # OR clone and install from source as above
- Scan your logs:
crashlens scan path/to/your-logs.jsonl # OR python -m crashlens scan path/to/your-logs.jsonl
- Open
report.mdin your favorite Markdown viewer or editor to review the findings and suggestions.
๐ Logging Helper
To make log analysis seamless, you can use our crashlens-logger package to emit logs in the correct structure for Crashens Detector. This ensures compatibility and reduces manual formatting.
Example usage:
pip install --upgrade crashlens_logger
from crashlens_logger import CrashLensLogger
logger = CrashLensLogger()
logger.log_event(
traceId=trace_id,
startTime=start_time,
endTime=end_time,
input={"model": model, "prompt": prompt},
usage=usage
# Optionally add: type, level, metadata, name, etc.
)
- The logger writes each call as a JSONL line in the required format.
- See the
crashlens-loggerrepo for full docs and advanced usage.
๐ Troubleshooting & Tips
- File not found: Make sure the path to your log file is correct.
- No traces found: Your log file may be empty or not in the expected format.
- Cost is $0.00: Check that your logโs model names match those in the pricing config.
- Virtual environment issues: Make sure youโre using the right Python environment.
- Need help? Use
crashlens --helpfor all options.
๐ ๏ธ Full Installation (Advanced/Dev)
Alternative: Install from Source (GitHub)
If you want the latest development version or want to contribute, you can install Crashens Detector from source:
- Clone the repository:
git clone <repo-link> cd crashlens
- (Optional but recommended) Create a virtual environment:
- On Mac/Linux:
python3 -m venv .venv source .venv/bin/activate
- On Windows:
python -m venv .venv .venv\Scripts\activate
- On Mac/Linux:
- Install dependencies:
pip install -r requirements.txt # Or, if using Poetry: poetry install
- Run Crashens Detector:
python -m crashlens scan path/to/your-logs.jsonl # Or, if using Poetry: poetry run crashlens scan path/to/your-logs.jsonl
๐ฌ Support
For questions, issues, or feature requests, open an issue on GitHub or contact the maintainer.
๐ License
MIT License - see LICENSE file for details.
Crashens Detector: Find your wasted tokens. Save money. Optimize your AI usage.
Scan from stdin (pipe or paste)
cat examples/retry-test.jsonl | poetry run crashlens scan --stdin
5. Output: The Markdown Report
After every scan, Crashens Detector creates or updates report.md in your current directory.
Example Structure
# Crashens Detector Token Waste Report
๐งพ **Total AI Spend**: $0.123456
๐ฐ **Total Potential Savings**: $0.045678
| Trace ID | Model | Prompt | Completion Length | Cost | Waste Type |
|----------|-------|--------|------------------|------|------------|
| trace_001 | gpt-4 | ... | 3 | $0.00033 | Overkill |
| ... | ... | ... | ... | ... | ... |
## Overkill Model Usage (5 issues)
- ...
## Retry Loops (3 issues)
- ...
## Fallback Failures (2 issues)
- ...
6. Troubleshooting
- File not found: Ensure the path to your log file is correct.
- No traces found: Your log file may be empty or malformed.
- Cost is $0.00: Check that your
pricing.yamlmatches the model names in your logs. - Virtual environment issues: Use
poetry runto ensure dependencies are available.
7. Example Commands
# Scan a log file
poetry run crashlens scan examples/demo-logs.jsonl
# Use demo data
poetry run crashlens scan --demo
# Scan from stdin
cat examples/demo-logs.jsonl | poetry run crashlens scan --stdin
๐ Complete Command Reference
Basic Usage
crashlens scan [OPTIONS] [LOGFILE]
๐ฏ Examples
# Scan a specific log file
crashlens scan logs.jsonl
# Run on built-in sample logs
crashlens scan --demo
# Pipe logs via stdin
cat logs.jsonl | crashlens scan --stdin
# Read logs from clipboard
crashlens scan --paste
# Generate detailed category JSON reports
crashlens scan --detailed
# Cost summary with categories
crashlens scan --summary
# Show summary only (no trace details)
crashlens scan --summary-only
๐ง All Options
| Option | Description | Example |
|---|---|---|
-f, --format |
Output format: slack, markdown, json |
--format json |
-c, --config |
Custom pricing config file path | --config my-pricing.yaml |
--demo |
Use built-in demo data (requires examples-logs/demo-logs.jsonl) | crashlens scan --demo |
--stdin |
Read from standard input | cat logs.jsonl | crashlens scan --stdin |
--paste |
Read JSONL data from clipboard | crashlens scan --paste |
--summary |
Show cost summary with breakdown | crashlens scan --summary |
--summary-only |
Summary without trace IDs | crashlens scan --summary-only |
--detailed |
Generate detailed category JSON reports | crashlens scan --detailed |
--detailed-dir |
Directory for detailed reports (default: detailed_output) | --detailed-dir my_reports |
--help |
Show help message | crashlens scan --help |
๐ Detailed Reports
When using --detailed, Crashens Detector generates grouped category files:
detailed_output/fallback_failure.json- All fallback failure issuesdetailed_output/retry_loop.json- All retry loop issuesdetailed_output/fallback_storm.json- All fallback storm issuesdetailed_output/overkill_model.json- All overkill model issues
Each file contains:
- Summary with total issues, affected traces, costs
- All issues of that type with trace IDs and details
- Specific suggestions for that category
๐ Input Sources
Crashens Detector supports multiple input methods:
- File input:
crashlens scan path/to/logs.jsonl - Demo mode:
crashlens scan --demo(requires examples-logs/demo-logs.jsonl file) - Standard input:
cat logs.jsonl | crashlens scan --stdin - Clipboard:
crashlens scan --paste(paste logs interactively)
๐ Output Formats
- slack (default): Slack-formatted report for team sharing
- markdown: Clean Markdown for documentation
- json: Machine-readable JSON for automation
๐ก Pro Tips
- Use
--demoto test Crashens Detector without your own logs - Use
--detailedto get actionable JSON reports for each issue category - Use
--summary-onlyfor executive summaries without trace details - Combine
--stdinwith shell pipelines for automation
๐ค Contributing
We welcome contributions! Please see our Contributing Guidelines for details.
Quick Start for Contributors
- Fork and clone the repository
- Set up development environment:
poetry install - Run tests:
poetry run pytest
- Run linting:
poetry run black crashlens/ tests/ poetry run flake8 crashlens/ tests/
- Test CLI:
poetry run crashlens scan examples-logs/demo-logs.jsonl
Development Requirements
- Python 3.12+
- Poetry for dependency management
- Black for code formatting
- Flake8 for linting
- Pytest for testing
- MyPy for type checking (optional)
Branch Protection & CI
This repository uses branch protection rules that require:
- โ Pull request reviews before merging
- โ Status checks to pass (CI tests, linting, etc.)
- โ Conversations resolved before merging
- โ Branch up-to-date before merging
All contributions must:
- Pass automated tests
- Follow code style guidelines
- Include appropriate documentation
- Be submitted via pull request (no direct pushes to main)
See CONTRIBUTING.md for detailed contribution guidelines.
๐ Security
For security issues, please see our Security Policy.
8. Support
- ๐ฌ Questions: Use GitHub Discussions
- ๐ Bug Reports: Open a GitHub Issue
- ๐ง Private Issues: Contact security@crashlens.dev
๐ License
MIT License - see LICENSE file for details.
Crashlens Detector: Find your wasted tokens. Save money. Optimize your AI usage. ๐ฏ
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 crashlens_detector-1.5.0.tar.gz.
File metadata
- Download URL: crashlens_detector-1.5.0.tar.gz
- Upload date:
- Size: 43.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.2 CPython/3.12.10 Windows/11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4da0259a1ca4f19a687abb192e62e4556fff34cc8068bd0e3a40ab6eab977de
|
|
| MD5 |
bfb8a122d994c1a8afbbc128570b1bea
|
|
| BLAKE2b-256 |
354ac2d94cc250f070133b2dbcc5242ea843b74666cd550d953c373760ef04cd
|
File details
Details for the file crashlens_detector-1.5.0-py3-none-any.whl.
File metadata
- Download URL: crashlens_detector-1.5.0-py3-none-any.whl
- Upload date:
- Size: 53.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.2 CPython/3.12.10 Windows/11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
314ff90a2aed277973fd611f27b62d05610e608b53b7f7b494e0a4e3a4bfc517
|
|
| MD5 |
1c89368ae93c037c9d4356f24fcc7ad0
|
|
| BLAKE2b-256 |
b224c3246c3ef8eae2fba30e5568875566f8c849f0053e88db9dc50851c20d55
|