A comprehensive prompt analyzer for LLM optimization, security scanning, and cost estimation
Project description
PromptLint
A developer tool for analyzing, scoring, and optimizing LLM prompts with built-in security scanning and cost estimation.
Overview
PromptLint is a CLI tool that helps developers write better prompts by providing actionable feedback on clarity, cost efficiency, and security. It's designed as Phase 1 of a larger vision (PromptIR) but delivers immediate value as a standalone linting tool.
Think of it as: ESLint for prompts, with diff capabilities and security scanning.
Quick Start
Installation
# Install from source
poetry install
# Make CLI available
poetry run promptlint --help
Basic Usage
# Score a prompt
poetry run promptlint score examples/good_prompt.txt
# Compare two prompt versions
poetry run promptlint diff examples/basic_prompt.txt examples/good_prompt.txt
# Security analysis
poetry run promptlint security examples/injection_prompt.txt
# Cost estimation across models
poetry run promptlint estimate examples/good_prompt.txt
# List supported models
poetry run promptlint models
Features
1. Prompt Scoring
Scores prompts on three dimensions:
-
โจ Clarity (0-10): How well-structured and unambiguous the prompt is
- Checks for clear instructions
- Detects ambiguous phrases ("as needed", "maybe", "try to")
- Validates output format specification
- Identifies conflicting instructions
-
๐ฐ Cost Efficiency (0-10): Token count and API cost estimates
- Counts input tokens using tiktoken
- Estimates output tokens based on complexity
- Calculates cost for multiple models
- Identifies expensive patterns
-
๐ก๏ธ Security (0-10): Detects prompt injection vulnerabilities
- Finds injection patterns (e.g., "ignore all previous instructions")
- Detects unvalidated variables
- Checks for risky operations
- Rates overall security risk
2. Prompt Diffing
Compare two prompt versions and see impact:
promptlint diff old_prompt.txt new_prompt.txt
Shows:
- Line-by-line changes
- Clarity, cost, and security deltas
- Cost impact across models
- Recommendation on whether the change improves the prompt
3. Security Analysis
Dedicated security scanning:
promptlint security prompt.txt
Detects:
- Prompt injection attempts
- Unguarded user input
- Risky patterns (code execution, information disclosure)
- Provides severity ratings and remediation suggestions
4. Cost Estimation
Estimate costs across models:
promptlint estimate my_prompt.txt
# Shows costs for GPT-4o, GPT-4o-mini, and Claude 3.5 Sonnet by default
# Or specify models:
promptlint estimate my_prompt.txt --models gpt-4o,gpt-4-turbo,claude-3.5-haiku
Architecture
Project Structure
promptlint/
โโโ promptlint/
โ โโโ __init__.py
โ โโโ cli.py # Main CLI interface (Typer)
โ โ
โ โโโ core/
โ โ โโโ __init__.py
โ โ โโโ models.py # Pydantic data models
โ โ โโโ parser.py # Extract prompt structure
โ โ โโโ analyzer.py # Orchestrate analyzers
โ โ โโโ differ.py # Compare prompts
โ โ
โ โโโ analyzers/
โ โ โโโ __init__.py
โ โ โโโ clarity.py # Clarity scoring
โ โ โโโ cost.py # Cost analysis
โ โ โโโ security.py # Security scanning
โ โ
โ โโโ reporters/
โ โ โโโ __init__.py
โ โ โโโ console.py # Rich terminal output
โ โ โโโ json_reporter.py # JSON format
โ โ โโโ markdown.py # Markdown format
โ โ
โ โโโ utils/
โ โโโ __init__.py
โ โโโ tokenizer.py # Token counting
โ โโโ pricing.py # Model pricing data
โ
โโโ tests/
โ โโโ test_promptlint.py # Comprehensive tests
โ โโโ fixtures/
โ โโโ good_prompt.txt
โ โโโ bad_prompt.txt
โ โโโ injection_prompt.txt
โ
โโโ examples/
โ โโโ basic_prompt.txt
โ โโโ good_prompt.txt
โ โโโ ambiguous_prompt.txt
โ โโโ injection_prompt.txt
โ
โโโ pyproject.toml # Poetry configuration
โโโ README.md # This file
Data Models (Pydantic)
Core models form the foundation for prompt analysis:
ParsedPrompt: Structured representation of a promptInstruction: Individual instruction or directiveVariable: Placeholder/variable in promptScoreResult: Complete analysis resultIssue: Found problem in promptCostEstimate: Cost prediction for a modelDiffReport: Comparison between two prompts
Module Descriptions
Core Modules
core/parser.py
Extracts structure from raw prompt text:
parsed = PromptParser.parse_file("my_prompt.txt")
# or
parsed = PromptParser.parse(raw_text)
Detects:
- Instructions (imperative statements)
- Variables ({name}, {{name}}, , ${name})
- Conditionals (if/then logic)
- Output format requirements
- Examples
- Metadata
core/analyzer.py
Orchestrates all analyzers:
result = Analyzer.analyze(parsed_prompt, models=['gpt-4o', 'gpt-4o-mini'])
Returns ScoreResult with:
- Scores for clarity, cost, security
- List of issues found
- Suggestions for improvement
- Cost estimates for each model
core/differ.py
Compares two prompts:
report = Differ.diff_prompts("old.txt", "new.txt", models=['gpt-4o'])
# or
report = Differ.diff(parsed_old, parsed_new, models=['gpt-4o'])
Analyzers
analyzers/clarity.py
Scores prompt clarity using heuristics:
- Clear structure detection
- Instruction counting
- Ambiguous phrase detection
- Output format validation
- Conflict detection
Scoring: 5.0 base + adjustments for various factors, clamped to 0-10
analyzers/cost.py
Analyzes token count and costs:
- Token counting using tiktoken (with fallback)
- Output token estimation based on complexity
- Cost calculation for multiple models
- Expensive pattern detection
Scoring: 10.0 base, reduced for high token counts
analyzers/security.py
Detects security vulnerabilities:
High-risk patterns:
- Prompt override attempts ("ignore all previous instructions")
- System prompt disclosure ("reveal your system prompt")
- Role confusion attacks
- Code execution risks
Medium-risk patterns:
- Unvalidated variables
- Debug mode references
- Potential information disclosure
Scoring: 10.0 base, reduced by severity of findings
Reporters
reporters/console.py
Beautiful terminal output using Rich:
reporter = ConsoleReporter()
reporter.print_score_report(result)
reporter.print_diff_report(diff_report)
reporter.print_security_report(result)
reporter.print_cost_estimate(result)
reporters/json_reporter.py
JSON format for machine parsing:
json_str = JSONReporter.print_score_report(result)
reporters/markdown.py
Markdown format for documentation:
markdown_str = MarkdownReporter.score_to_markdown(result)
Utils
utils/tokenizer.py
Token counting:
tokenizer = Tokenizer()
tokens = tokenizer.count_tokens(text, model='gpt-4o')
estimated_output = Tokenizer.estimate_output_tokens(prompt_text, complexity='normal')
Supports automatic detection with tiktoken, fallback to word-based estimation.
utils/pricing.py
Model pricing data:
pricing = PricingData.get_pricing('gpt-4o')
cost = PricingData.calculate_cost('gpt-4o', input_tokens=100, output_tokens=200)
models = PricingData.get_supported_models()
CLI Commands
promptlint score [PROMPT_FILE]
Score a single prompt.
Options:
--model, -m: Primary model (default: gpt-4o)--format, -f: Output format (console, json, markdown)--output, -o: Save to file
Examples:
promptlint score my_prompt.txt
promptlint score my_prompt.txt --model gpt-4o-mini --format json
promptlint score my_prompt.txt --format markdown --output report.md
promptlint diff [OLD] [NEW]
Compare two prompts.
Options:
--format, -f: Output format (console, json, markdown)--output, -o: Save to file--models, -m: Comma-separated models to compare
Examples:
promptlint diff old.txt new.txt
promptlint diff old.txt new.txt --models gpt-4o,claude-3.5-sonnet
promptlint diff old.txt new.txt --format json --output diff.json
promptlint security [PROMPT_FILE]
Security analysis only.
Options:
--format, -f: Output format (console, json, markdown)--output, -o: Save to file
Examples:
promptlint security risky_prompt.txt
promptlint security risky_prompt.txt --format markdown --output security_report.md
promptlint estimate [PROMPT_FILE]
Cost estimation across models.
Options:
--models, -m: Comma-separated models
Examples:
promptlint estimate my_prompt.txt
promptlint estimate my_prompt.txt --models gpt-4o,gpt-4o-mini,claude-3.5-sonnet
promptlint models
List supported models and pricing.
Testing
Run the comprehensive test suite:
# Using pytest
pytest tests/
# Or with poetry
poetry run pytest tests/
# With coverage
poetry run pytest tests/ --cov=promptlint
Test categories:
- Parser tests: Variable/instruction extraction, example detection
- Analyzer tests: Clarity, cost, and security scoring
- Differ tests: Prompt comparison and impact analysis
- Integration tests: File I/O and end-to-end workflows
Example Usage
Example 1: Analyze a Prompt
$ poetry run promptlint score examples/good_prompt.txt
๐ Prompt Analysis Report
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโณโโโโโโโโโโโโโโณโโโโโโโโโโโโโโโโโโโโโโโ
โ Metric โ Score โ Details โ
โกโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฉ
โ โจ Clarity โ 9.2/10 โ โ Excellent โ
โ ๐ฐ Cost โ 8.1/10 โ โ Reasonable โ
โ ๐ก๏ธ Security โ 9.5/10 โ โ Low risk โ
โโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโ
๐ก Suggestions:
โข Adding examples would improve output quality
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Overall Score: 8.9/10
Example 2: Compare Prompts
$ poetry run promptlint diff examples/basic_prompt.txt examples/good_prompt.txt
๐ Prompt Comparison
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Added: +8 | Removed: -1 | Modified: 0
โโโโโโโโโโโโณโโโโโโโโโโโณโโโโโโโโโโโโ
โ Metric โ Delta โ Change % โ
โกโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฉ
โ Clarity โ โ +2.5 โ +25% โ
โ Security โ โ +0.0 โ 0% โ
โ Cost โ โ +0.02 โ +8% โ
โโโโโโโโโโโโดโโโโโโโโโโโดโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐ Recommendation โ
โฃโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโซ
โ โ
Clarity improved significantly โ
โ โ
This change improves the prompt overall โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Example 3: Security Analysis
$ poetry run promptlint security examples/injection_prompt.txt
๐ก๏ธ Security Analysis
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ High Severity Issues:
โข HIGH RISK: Prompt override attempt (line 2)
โ Remove or rephrase this instruction to prevent prompt injection
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Overall Security Score: 3/10
Configuration
Future support for .promptlint.yaml:
default_model: gpt-4o
output_format: console
rules:
clarity:
min_score: 7.0
cost:
max_tokens: 2000
warn_threshold: 1000
security:
min_score: 8.0
ignore_patterns:
- "# promptlint-ignore"
Technical Stack
- Python 3.11+
- Typer: CLI framework
- Rich: Terminal output formatting
- Pydantic: Data validation and models
- tiktoken: Token counting (OpenAI tokenizer)
- PyYAML: Configuration (optional, future)
Dev Dependencies
- pytest: Testing
- black: Code formatting
- ruff: Linting
- mypy: Type checking
Roadmap
Phase 1 (Current): MVP โ
- โ Prompt scoring (clarity, cost, security)
- โ Diff functionality
- โ CLI interface
- โ Multiple output formats
- โ Comprehensive tests
- โ Example prompts
Phase 2 (Next): Enhancement
- LLM-based consistency testing
- Regression testing with snapshots
- VS Code extension
- Web UI for analysis
Phase 3: PromptIR Evolution
- Graph visualization of prompt logic
- Optimization layer
- Execution simulation
- Multi-model comparison
Phase 4: SaaS
- Team collaboration
- API access
- Enterprise features
- Prompt versioning
Contributing
Contributions welcome! Areas for improvement:
- Enhanced heuristics for clarity scoring
- Support for more models and pricing data
- Plugin system for custom rules
- Performance optimizations
- Additional output formats
License
MIT
Notes
- Model pricing is current as of November 2025. Check
utils/pricing.pyfor updates. - Token counting uses tiktoken when available for accuracy. Falls back to word-based estimation.
- Security patterns are based on common OWASP prompt injection techniques.
- Clarity heuristics combine structural analysis with common best practices.
Troubleshooting
"tiktoken not found" warning
Token counting will use word-based fallback. Install tiktoken for accuracy:
poetry add tiktoken
No cost estimates shown
Check that models are supported:
promptlint models
Add unsupported models to utils/pricing.py.
Parser not finding expected instructions
The parser uses heuristics. Help by:
- Using imperative verbs (generate, create, analyze, etc.)
- Starting instructions on new lines
- Being explicit about the task
Made with โค๏ธ for prompt engineers everywhere.
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 promptlint-0.1.0.tar.gz.
File metadata
- Download URL: promptlint-0.1.0.tar.gz
- Upload date:
- Size: 33.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0431bcbd6442d4a91fd0b63a6ee8f6746030e84d7feca170f38fc75d3afb5446
|
|
| MD5 |
fc32f89e8585ed4bc2b8a64405505cd1
|
|
| BLAKE2b-256 |
03a41933e0c11c473c7724ef6b9d8cff42231dfa55714fdd98fb2a3484c78404
|
File details
Details for the file promptlint-0.1.0-py3-none-any.whl.
File metadata
- Download URL: promptlint-0.1.0-py3-none-any.whl
- Upload date:
- Size: 28.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f7aed1c67491091271f1722e8e905254a82bd644e721e87cabff166c48faa2ba
|
|
| MD5 |
d97c60b5e6f4e40320fe9380ca5a40d0
|
|
| BLAKE2b-256 |
43b0572321a2ba255c24959b67d53402773e861a000b4d22fbdd1a90f96aafb4
|