- 🤖 LLM usage: $39.3567 (297 commits)
- 👤 Human dev: ~$10784 (107.8h @ $100/h, 30min dedup)
Generated on 2026-06-08 using openrouter/deep/deep-v4-pro
Natural Language → Domain-Specific Commands — production-ready framework for transforming natural language (Polish + English) into shell, SQL, Docker, Kubernetes, browser automation, and desktop GUI commands.
pip install nlp2cmd[all]
nlp2cmd cache auto-setup # Setup Playwright browsers
# Single commands
nlp2cmd "uruchom usługę nginx" # → systemctl start nginx
nlp2cmd "znajdź pliki większe niż 100MB" # → find . -type f -size +100MB
# Multi-step browser automation
nlp2cmd -r "otwórz openrouter.ai, wyciągnij klucz API i zapisz do .env"
# Canvas drawing with video recording
nlp2cmd -r "wejdź na jspaint.app i narysuj biedronkę" --video webm
nlp2cmd -r "wejdź na jspaint.app i narysuj pająka" --video webm
nlp2cmd -r "wejdź na jspaint.app i narysuj psa" --video webm
nlp2cmd -r "wejdź na jspaint.app i narysuj kota" --video webm
nlp2cmd -r "wejdź na jspaint.app i narysuj dziecko" --video webm
# Web form filling
nlp2cmd -r "otwórz https://example.com/kontakt i wypełnij formularz i wyślij"nlp2cmd to runner — planowanie i wykonanie. Struktura zapytania (IntentIR) pochodzi z pakietów nlp2dsl; na wejściu każdego zapytania uruchamiana jest analiza nlp2dsl.
| Narzędzie | Rola |
|---|---|
nlp2dsl show |
Tylko struktura (IntentIR) — bez wykonania |
nlp2cmd plan |
Plan → Propact markdown; --execute → hybrid executor |
nlp2cmd -q … -r |
Legacy runtime (shell / browser / canvas) |
target_kind |
Executor |
|---|---|
shell, rest, mcp, ws |
Propact (shell: fallback subprocess gdy brak CLI) |
browser, sql, desktop |
nlp2cmd PipelineRunner |
--explain / --json pokazują execution_routes per krok.
# Zalecane — jedna komenda (nlp2dsl packages + nlp2cmd[integration])
cd nlp2cmd && make update
# lub ręcznie:
cd ../nlp2dsl && ./scripts/setup-dev.sh
export NLP2CMD_INTEGRATION=1
export LANG=C.UTF-8Uwaga:
nlp2cmdwymaga pakietów znlp2dsl/packages/(editable). Uruchamiaj CLI z tego samego venv comake update(which nlp2cmd→.venv/bin/nlp2cmd). Stary~/.local/bin/nlp2cmdnie widzi integracji.
make update # przeinstaluj zależności integracji (--upgrade)
make publish # update + bump patch + PyPI (nie uruchamiaj bez potrzeby)# Struktura zapytania (nlp2dsl — bez wykonania)
nlp2dsl show "znajdz pliki *.py w src"
nlp2dsl show "znajdz pliki *.py w src" --plan
# Plan + Propact (nlp2cmd)
nlp2cmd plan "znajdz pliki *.py w src"
nlp2cmd plan "znajdz pliki *.py w src" --explain
nlp2cmd plan "znajdz pliki *.py w src" --json
nlp2cmd plan "znajdz pliki *.py w src" --execute
# Workflow REST (backend nlp2dsl)
export NLP2CMD_NLP2DSL_WORKFLOW=1 NLP2DSL_BACKEND_URL=http://127.0.0.1:8010
nlp2cmd plan "Wyslij fakture na 1500 PLN do a@b.pl" --json
# Analiza wejścia przy zwykłym generate/run
NLP2CMD_SHOW_STRUCTURE=1 nlp2cmd -q "znajdz pliki *.py w src"
nlp2cmd -q "znajdz pliki *.py w src" --explain| Zmienna | Domyślnie | Opis |
|---|---|---|
NLP2CMD_INTEGRATION |
0 |
Włącza nlp2cmd plan i bridge do pakietów nlp2dsl |
NLP2CMD_QUERY_INPUT |
1 |
Analiza IntentIR na wejściu (-q, -r, plan) |
NLP2CMD_SHOW_STRUCTURE |
0 |
Zawsze pokaż analizę tekstu |
NLP2CMD_NLP2DSL_WORKFLOW |
0 |
Planner REST via /workflow/from-text |
NLP2DSL_BACKEND_URL |
http://localhost:8010 |
Backend nlp2dsl |
NLP2CMD_PROPACT_BIN |
propact |
Ścieżka do Propact CLI |
NLP2CMD_PROPACT_FALLBACK |
shell |
Subprocess gdy brak propact (tylko shell-only) |
NLP2CMD_INTRACT_GATE |
0 |
Intract: plan, show --plan, transform (-q), PipelineRunner, kroki DOM |
NLP2CMD_ENFORCE_CLARIFICATION |
0 |
nlp2dsl show blokuje niską pewność (plan — zawsze) |
NLP2CMD_POST_CHECK |
0 |
Po plan --execute: walidacja stdout vs oczekiwanie |
NLP2CMD_POST_CHECK_STRICT |
0 |
Post-check: ostrzeżenia → błędy |
NLP2CMD_EMIT_TESTQL |
0 |
Eksport scenariusza TestQL z execution record (browser) |
LANG |
— | C.UTF-8 dla polskich znaków |
Pakiet KeywordIntentDetector jest kanonicznie w nlp2cmd-intent; nlp2cmd re-eksportuje go z nlp2cmd.generation.keywords.
nlp2dsl-run jest deprecated — użyj nlp2cmd plan.
Opcjonalna warstwa policy (Intract): zakazane efekty, wymagane inputy, zgodność z intract.yaml. Nie weryfikuje stdout.
flowchart TB
subgraph integration [Ścieżka plan / show]
I[IntentIR] --> P[ExecutionPlanIR]
P --> PG[PlanStepGate]
end
subgraph legacy [Ścieżka -q -r]
T[NLP2CMD.transform] --> TV[TransformValidator]
TV --> PR[PipelineRunner]
PR --> PG2[PipelineRunnerGate]
PR --> SG[IntractStepGate — DOM]
end
PG --> RB[RuntimeBridge]
TV --> RB
PG2 --> RB
SG --> RB
RB --> M[intract.yaml + bindings.json]
export NLP2CMD_INTEGRATION=1
export NLP2CMD_INTRACT_GATE=1
nlp2cmd plan "znajdź pliki *.py w src" --json # pole contract_check
nlp2dsl show "znajdź pliki *.py w src" --plan # contract_check w output
nlp2cmd -q "znajdź pliki *.py" -r # transform + pre-execute gateSzczegóły: docs/architecture/intract-integration.md
Osobna warstwa od Intract: sprawdza wynik wykonania (linie stdout, regex, returncode).
flowchart LR
EX[plan --execute] --> OUT[stdout/stderr]
OUT --> PC[PostExecutionChecker]
PC -->|NLP2CMD_POST_CHECK=1| OK[passed / violations]
export NLP2CMD_POST_CHECK=1
nlp2cmd plan "znajdź pliki *.py w src" --execute --explainSzczegóły: docs/architecture/post-execution-validation.md
Complex queries are automatically detected and decomposed into executable action plans:
nlp2cmd -r "otwórz tab w firefox wyciągnij klucz API z OpenRouter i zapisz do .env"
# → domain=multi_step, 7 steps: navigate → check_session → click → wait → extract_key → prompt_secret → save_envThe pipeline routes queries through:
- Cache — instant lookup of previously seen multi-step patterns
- ComplexQueryDetector — regex-based multi-step detection (~0.1ms)
- ActionPlanner — rule-based decomposition for known services (10 API providers)
- KeywordIntentDetector — single-command keyword matching (1615 templates)
| Domain | Examples |
|---|---|
| Shell | find, ls, grep, ps, du, df, tar, chmod, systemctl |
| Docker | container, image, compose, volume, network |
| SQL | SELECT, INSERT, CREATE, JOIN, window functions |
| Kubernetes | kubectl, pods, deployments, services, helm |
| Browser | Playwright automation, form filling, site exploration |
| Git | commit, branch, merge, rebase, stash, tag |
| DevOps | systemctl, Ansible, Terraform, CI/CD, nginx, cron |
| API | curl, httpie, wget, REST, GraphQL |
| FFmpeg | video/audio conversion, streaming, recording |
| Package Mgmt | apt, pip, npm, yarn, snap, flatpak, brew |
| Desktop | Firefox tabs, Thunderbird, xdotool/ydotool, window mgmt |
| Canvas | jspaint.app drawing (shapes, ladybug, text) |
| Remote | SSH, SCP, rsync, tmux, VPN |
| Data | jq, csvkit, awk, sed, sqlite, pandas |
| IoT | Raspberry Pi GPIO, MQTT, sensors |
| RAG | ChromaDB, Qdrant, embeddings, LangChain |
100% accuracy with Qwen-Coder-3B, 24,355× speedup. Template pipeline + pre-warm cache eliminate 31% of queries without LLM.
from nlp2cmd.generation.evolutionary_cache import EvolutionaryCache
cache = EvolutionaryCache()
r = cache.lookup("znajdź pliki PDF większe niż 10MB") # template: ~15ms, cached: ~0.015ms
r = cache.lookup("znajdz pliki PDF wieksze niz 10MB") # typo → similarity hit!Every command result is automatically validated by a local LLM (qwen2.5:3b via Ollama). If the validator marks a result as fail, a cloud LLM (OpenRouter) suggests an improved command and optionally patches patterns.json/templates.json so the pipeline learns from the mistake.
Execute command → stdout/stderr
↓
LLM_VALIDATOR (local, ~0.5s)
query + command + output → pass/fail + score + reason
↓ fail?
LLM_REPAIR (OpenRouter cloud)
full context → improved_command + JSON patches
↓
Retry + update data files
# Example output after command execution:
llm_validator: pass
score: 0.90
reason: Found 1 camera with RTSP on the local network.
model: qwen2.5:3bConfiguration in .env:
LLM_VALIDATOR_ENABLED=true # enabled by default
LLM_VALIDATOR_MODEL=qwen2.5:3b # local Ollama model
LLM_REPAIR_ENABLED=true # cloud repair on fail
LLM_REPAIR_MODEL=qwen/qwen-2.5-coder-32b-instructTest suite: python3 examples/08_llm_validation/test_validator.py — 15 test cases, 100% accuracy with qwen2.5:3b.
Smart routing across multiple LLM providers with automatic fallbacks: paid remote → free remote → local Ollama.
User prompt → classify_task() → LiteLLM Router
├── Remote (paid) — Gemini 2.5 Pro, Qwen2.5-Coder-32B
├── Remote (free) — Qwen2.5-VL-7B, Arcee Trinity
└── Local (Ollama) — qwen2.5:7b, qwen2.5-coder:7b, bielik
8 task specializations: vision, coding, text, polish, repair, validation, fast, planning — each with dedicated model chains. Even with zero API credits, all tasks work via local models.
from nlp2cmd.llm.router import get_router
router = get_router()
resp = await router.auto_completion("napisz zapytanie SQL dla tabeli users")
# → task=coding, model=qwen2.5-coder, content="SELECT * FROM users;"Full configuration guide: Config README
Complex multi-step browser automation uses a schema-driven feedback loop — each step is validated, failures are classified, and repairs are escalated until a solution is found.
Step Schema (declarative)
↓
Execute step → Validate result (pre/post)
↓ failed?
Classify failure:
schema_error → wrong selector/URL → Page analysis (DOM scan)
page_state_error → redirect/CAPTCHA/modal → Navigate to correct page
data_error → not logged in / no key → Login flow / create key
handling_error → browser crash / timeout → Retry / escalate
↓
Repair escalation:
1. Rule-based ~0ms (selector alternatives)
2. Page analysis ~50ms (DOM scan for elements)
3. Local LLM ~500ms (qwen2.5:3b diagnosis)
4. Cloud LLM ~2s (OpenRouter 32B repair)
↓
Retry with repaired params (max 5 attempts)
Provider-agnostic: works across HuggingFace, OpenRouter, Anthropic, GitHub, Groq, and any SaaS site without hardcoded URLs — PageAnalyzer dynamically finds API key sections by scanning navigation links.
Test suite: python3 examples/08_llm_validation/test_feedback_loop.py — 19 test cases (failure classification + page analysis + multi-provider), 100% accuracy.
Native Polish NLP with 87%+ accuracy: lemmatization, fuzzy matching, diacritic normalization.
nlp2cmd "zainstaluj vlc" # → sudo apt-get install vlc
nlp2cmd "pokaż procesy zużywające pamięć" # → ps aux --sort=-%mem | head -10
nlp2cmd "znajdź pliki .log starsze niż 2 dni" # → find . -type f -name "*.log" -mtime +2Control desktop applications through natural language — works on both X11 and Wayland:
nlp2cmd -r "otwórz tab w firefox, wyciągnij klucz API z OpenRouter i zapisz do .env"
nlp2cmd -r "wejdź na jspaint.app i narysuj biedronkę" --video webm
nlp2cmd -r "otwórz Thunderbird i sprawdź pocztę"
nlp2cmd -r "zminimalizuj wszystko"Supported API services for key extraction: OpenRouter, Anthropic, OpenAI, Groq, Mistral, DeepSeek, Together, GitHub, HuggingFace, Replicate.
Record entire browser automation sessions with video output:
# Full session recording (WebM format)
nlp2cmd -r "otwórz tab w firefox wyciągnij klucz API z OpenRouter i zapisz do .env" --video webm --execute-web
# Short video clips (3-10 seconds)
nlp2cmd -r "wejdź na jspaint.app i narysuj koło" --video webm --duration 5Demo Recording: nlp2cmd-operouter-token.mp4 - Firefox automation with API key extraction
nlp2cmd -r "otwórz https://example.com/kontakt i wypełnij formularz i wyślij"
nlp2cmd -r "wejdź na strona-docelowa.pl i wypełnij formularz kontaktu"
# → Automatically explores site, finds contact form, fills with .env datanlp2cmd -r "wejdź na https://katalog-stron.pl/firmy, znajdź strony www firm i zapisz do firmy.csv"
# → Navigates profiles, extracts external websites, saves to CSVQuery → [Cache] → [ComplexDetector] → [ActionPlanner] → [KeywordDetector] → [TemplateGenerator]
↓ ↓
ActionPlan (multi-step) SingleCommand
↓ ↓
PipelineRunner ←────────────┘
├── ShellExecutionMixin
├── BrowserExecutionMixin
├── DesktopExecutionMixin
└── PlanExecutionMixin
PipelineRunner is split into 4 mixins (~4400 LOC total) for maintainability:
| Module | Lines | Responsibility |
|---|---|---|
pipeline_runner.py |
170 | Core class, mixin composition |
pipeline_runner_shell.py |
217 | Shell execution, safety policies |
pipeline_runner_browser.py |
1561 | DOM/DQL, multi-action browser automation |
pipeline_runner_desktop.py |
389 | xdotool/ydotool/wmctrl desktop control |
pipeline_runner_plans.py |
2277 | Multi-step ActionPlan execution |
# Full installation
pip install nlp2cmd[all]
# Specific components
pip install nlp2cmd[browser,nlp] # Web automation + Polish NLP
pip install nlp2cmd[sql,shell] # Database + system commands
# Desktop automation tools
nlp2cmd-install-desktop
# or: make install-desktop
# Setup Playwright browsers
nlp2cmd cache auto-setup# Generate command
nlp2cmd "pokaż pliki użytkownika" # → find $HOME -type f
nlp2cmd --dsl sql "pokaż użytkowników" # → SELECT * FROM users
# Execute immediately (run mode)
nlp2cmd -r "list files" --auto-confirm
# Multi-step with video
nlp2cmd -r "wejdź na jspaint.app i narysuj biedronkę" --video webm
# Full session recording
nlp2cmd -r "otwórz tab w firefox wyciągnij klucz API z OpenRouter i zapisz do .env" --video webm --execute-web
# Interactive mode
nlp2cmd --interactive
# Web automation
nlp2cmd web-schema extract https://example.com
nlp2cmd web-schema history --stats
# Cache management
nlp2cmd cache info
nlp2cmd cache auto-setup
nlp2cmd cache full-clear --yes
# Service mode (HTTP API)
nlp2cmd service --host 0.0.0.0 --port 8000
# Diagnostics
nlp2cmd doctor --fix
nlp2cmd --show-decision-tree "zapytanie"
nlp2cmd --show-schema
# nlp2dsl / Propact integration (requires nlp2cmd[integration])
nlp2cmd plan "znajdź pliki *.py w src"
nlp2cmd plan "znajdź pliki *.py w src" --execute
nlp2dsl show "znajdź pliki *.py w src" # structure onlyfrom nlp2cmd.generation.pipeline import RuleBasedPipeline
pipeline = RuleBasedPipeline()
# Single command
result = pipeline.process("pokaż pliki w katalogu")
print(result.command) # ls -la .
# Multi-step (auto-detected)
result = pipeline.process("otwórz openrouter.ai, wyciągnij klucz API i zapisz do .env")
print(result.domain) # multi_step
print(result.action_plan) # ActionPlan with 7 steps# Execute action plan
from nlp2cmd.pipeline_runner import PipelineRunner
runner = PipelineRunner()
result = runner.execute_action_plan(plan, dry_run=False)# Integration bridge (nlp2dsl packages)
from nlp2cmd.bridge import plan_query_via_integration, attach_query_input
attach_query_input("znajdź pliki *.py w src", verbose=True)
payload = plan_query_via_integration("znajdź pliki *.py w src")
print(payload["intent_ir"])
print(payload["propact_markdown"])pytest tests/ -v # All 1543+ tests
pytest tests/unit/ -v # Unit tests
pytest tests/e2e/ -v # End-to-end tests
pytest --cov=nlp2cmd --cov-report=html # With coverage| Document | Description |
|---|---|
| Project Structure | Architecture and module organization |
| Installation Guide | Setup instructions |
| User Guide | Complete usage tutorial |
| CLI Reference | CLI documentation |
| Python API | Python API guide |
| Examples Guide | Examples overview |
| Keyword Detection | Intent detection pipeline |
| Web Schema Guide | Browser automation |
| Cache Management | Caching system |
| Desktop Automation | Desktop GUI control |
| LLM Router Config | Multi-model routing, fallbacks, specialization |
| Canvas Drawing | jspaint.app drawing |
| Firefox Sessions | Session injection |
| Evolutionary Cache | Self-learning cache |
| Stream Protocols | SSH, RTSP, VNC, etc. |
| Service Mode | HTTP API service |
| nlp2dsl packages | IntentIR, planner, Propact bridge |
| Contributing | Development guidelines |
Licensed under Apache-2.0.
Tom Sapletta

