Skip to content

Repository files navigation

tillm

Text-interface LLM control plane for the semcod/coru ecosystem.

Drives shell and terminal clients (aider, claude, codex, gemini, qwen-code, opencode, devin) from one registry and execution pipeline. Pair with gillm for graphical control (focus, inject, capture, orchestrator DSL).

VersionPythonLicense

AI Cost Tracking

PyPIVersionPythonLicenseAI CostHuman TimeModel

  • 🤖 LLM usage: $2.0537 (57 commits)
  • 👤 Human dev: ~$2253 (22.5h @ $100/h, 30min dedup)

Generated on 2026-07-19 using openrouter/deep/deep-v4-pro


PackageInterfaceRole
tillmtext / shellvendor CLI registry, drive, multi-client matrix, transports
gillmgraphicalGUI domain + *2gillm adapters (REST :8220, MCP, …)

Contents

Architecture

SUMD (description) → DOQL/source (code) → taskfile (automation) → testql (verification)

Sources: SUMD.md · app.doql.less

flowchart TB
subgraph adapters [Input adapters — packages]
NL[nlp2tillm]
URI[uri2tillm]
CLI[cli2tillm]
MCP[mcp2tillm]
REST[rest2tillm]
end
subgraph control [Control layer]
DSL[dsl2tillm.dispatch]
SCH[JSON Schema]
ES[(EventStore)]
end
subgraph domain [Domain — src/tillm]
REG[registry]
DRV[drive / matrix]
TR[binary / docker / http]
end
NL --> DSL
URI --> DSL
CLI --> DSL
MCP --> DSL
REST --> DSL
DSL --> SCH
DSL --> REG
DSL --> DRV
DRV --> TR
DSL --> ES
Loading

Control layer packages

PackageRolePort
dsl2tillmDSL + JSON Schema + CQRS bus
uri2tillmtillm:// → DSL
nlp2tillmNL → DSL
cli2tillmShell REPL
mcp2tillmMCP stdio
rest2tillmFastAPI /v1/dsl8216

Details: docs/control-layer.md · packages/README.md

Installation

Core (editable dev)

git clone <repo> tillm &&cd tillm
pip install -e ".[dev]"

Control layer (all *2tillm packages)

bash packages/install-dev.sh

Optional ecosystem siblings

pip install -e ../nlp2dsl ../intract ../redsl ../proxym ../llx # adjust paths

Note:tillm and *2tillm are not yet published on PyPI. Use editable installs from the repo.

Quick start

# List registered shell clients
tillm clients
# Dry-run (plans command, saves prompt, does not execute)
tillm drive --client aider --prompt "Refactor ticket PLF-1"# Execute (requires client env vars — see configuration)
tillm drive --client aider --prompt "Refactor ticket PLF-1" --execute
# NLP → drive intent
tillm nlp "aider: napraw testy"# Ecosystem validation
tillm validate
# Control layer
dsl2tillm exec HEALTH
rest2tillm serve --port 8216

tillm drive always saves the prompt under .koru/tillm/prompts/ before dry-run or execute.

Shell clients

Eight clients in the registry. Live status: tillm clients (ok / ~ / --).

ClientHeadlessAutomation profile
claude-codeclaude -p--dangerously-skip-permissions
aider--message-file
codexcodex exec--dangerously-bypass-approvals-and-sandbox
gemini-cligemini -p--yolo
qwen-codeqwen -p
opencodeopencode run
devindevin -p--permission-mode dangerous
clinedry-run only

Per-client setup: docs/clients/

API providers

A client is the tool tillm drives; a provider is the API or subscription serving the model behind it. The same claude binary can talk to Anthropic (native) or to any Anthropic-protocol vendor such as z.ai (GLM) by overriding the endpoint + token environment for the subprocess.

ProviderKindToken envclaude-codeaider/codex
anthropicsubscriptionANTHROPIC_API_KEYnative
openaiapiOPENAI_API_KEYnative
z.ai (GLM)apiZAI_API_KEY
deepseekapiDEEPSEEK_API_KEY
google (Gemini)apiGEMINI_API_KEY
openrouterapiOPENROUTER_API_KEY
moonshot (Kimi)apiMOONSHOT_API_KEY
xai (Grok)apiXAI_API_KEY
groqapiGROQ_API_KEY
mistralapiMISTRAL_API_KEY
minimax (M2)apiMINIMAX_API_KEY
qwen (DashScope)apiDASHSCOPE_API_KEY
ollamalocal

Ordered by popularity/recency; ✓ in the claude-code column means the vendor exposes an Anthropic-compatible endpoint. Each provider carries a token_url (where to create the key — shown before token prompts), curated model list, and probe models. Default provider precedence: --provider > TILLM_PROVIDER env > stored default (koru tillm can set it).

tillm providers # list with token status
tillm provider set z.ai # prompt for token (stored chmod 600), auto-probe
tillm provider test z.ai # live connectivity check
tillm drive --client claude-code --provider z.ai --prompt "..." --execute
export TILLM_PROVIDER=z.ai # provider for every drive (koru autonomy uses this)

Token precedence: process env var beats the store (~/.config/tillm/providers.json, override dir via TILLM_CONFIG_DIR). For z.ai the Anthropic-compatible endpoint (https://api.z.ai/api/anthropic) drives claude-code with ANTHROPIC_BASE_URL/ANTHROPIC_AUTH_TOKEN; the OpenAI-compatible endpoint serves aider/codex via OPENAI_API_BASE. Interactive picker: koru tillm (koru-side UI over this registry). Full guide: docs/providers.md.

Multi-client orchestration

tillm drive --clients aider,codex --prompt "review auth" --parallel 2
tillm drive --all --prompt "review" --execute --profile automation
tillm drive --all --prompt "review" --quorum 2 --fail-fast

DSL equivalent:

DRIVE_MATRIX CLIENTS aider,codex PROMPT "review" PARALLEL 2
DRIVE_MATRIX ALL PROMPT "review" EXECUTE true PROFILE automation

Configuration

Copy .env.example.env. tillm auto-loads<project>/.env (via project_env + optional env2llm):

# .env — tillm reads this automatically from project root
OPENROUTER_API_KEY=sk-or-v1-...
LLM_MODEL=openrouter/deepseek/deepseek-v4-pro
AIDER_MODEL=openrouter/deepseek/deepseek-v4-pro # optional; defaults from LLM_MODEL
tillm drive --client aider --prompt "fix tests" --execute

Install env2llm integration: pip install -e ".[env]" or pip install -e ../env2llm

Full reference: docs/configuration.md

Environment variables

VariableDefaultPurpose
TILLM_DEFAULT_CLIENTaiderDefault for tillm nlp
TILLM_EXECUTE_PROFILEdefaultautomation for CI
TILLM_BACKENDbinarydocker for compose exec
TILLM_NLP2DSLoffExternal NLP2DSL bridge

Optional NLP2DSL bridge

export TILLM_NLP2DSL=1
export NLP2DSL_BACKEND_URL=http://localhost:8010
tillm nlp "uruchom claude dla ticketu PLF-123"

Without the service, tillm uses a deterministic local parser.

Version and updates

Check installed version

pip show tillm | grep Version # core: 0.1.32
cat VERSION
pip show dsl2tillm rest2tillm # control layer: 0.1.0
tillm clients
tillm validate

Update from repo (current workflow)

cd tillm
git pull
pip install -e ".[dev]"
bash packages/install-dev.sh
python -m pytest tests/test_tillm.py packages/*/tests -q

Update vendor CLIs (independent)

pip install -U aider-chat
npm update -g @anthropic-ai/claude-code @openai/codex @google/gemini-cli

When published to PyPI:

pip install -U tillm dsl2tillm uri2tillm nlp2tillm cli2tillm mcp2tillm rest2tillm

Testing

python -m pytest tests/test_tillm.py packages/*/tests -q
dsl2tillm validate-schema
dsl2tillm exec HEALTH

Examples

Runnable smoke tests per shell client (OpenRouter + tillm):

cp examples/openrouter/env.example .env # set OPENROUTER_API_KEYsource examples/openrouter/load-env.sh
bash examples/aider/execute.sh
bash examples/run-all-dry-run.sh

See examples/README.md.

Documentation

DocumentDescription
examples/README.mdPer-client CLI smoke scripts
docs/README.mdDocumentation index
docs/configuration.md.env, OpenRouter, env vars
docs/control-layer.md*2tillm packages
docs/clients/Per-client setup
packages/README.mdControl layer quick reference
SUMD.mdArchitecture description
CHANGELOG.mdRelease history
TODO.mdRemaining work

License

Licensed under Apache-2.0.

About

Text-interface LLM control plane for semcod/coru shell automation (pair with gillm for GUI).

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages