Metadata-Version: 2.3
Name: lmti
Version: 1.5.1
Summary: Language Model Terminal Interface.
License: MIT
Requires-Dist: prompt-toolkit>=3.0.52
Requires-Dist: rich>=14.3.3
Requires-Dist: lmdk>=1.2.1
Requires-Dist: pyyaml>=6.0.3
Requires-Python: >=3.12, <3.14
Project-URL: Homepage, https://github.com/nachollorca/lmti
Description-Content-Type: text/markdown

# Language Model Terminal Interface

Often I just want to talk to LMs without the agentic clutter: I dont want it to read my stuff, access my files or consume through a gazillion tokens of tools, skills, MCPs and what not. I just want a recipe for gazpacho, c'mon :(

For that, I normally have to log into a WebApp from a provider (i.e. Mistral LeChat, Gemini, ChatGPT). But I live on the terminal, so I made a thin wrapper.

![assets/demo.gif](assets/demo.gif)

If somehow you landed here but you are looking for an actual agent that can manage your system, I'd recommend you look into [pi](https://pi.dev/), [opencode](https://opencode.ai/) or [mistral-vibe](https://github.com/mistralai/mistral-vibe) (in that order). If your desire is to become vendor locked and further push private companies in their quest for the oligopoly, you could check Claude Code or Codex, I guess :)

## FAQ
- Can I talk with LMs from different providers from the terminal? - **Yes :)**
- Does the app have access to my files? - **No**
- Can the app run terminal commands? - **Nope**
- Can the app execute code? - **Nein**
- Does the app have any sort of agentic loop? - **Negative**
- Can I connect the app to MCPs or other tools? - **Also no**

## Installation
`uv tool install lmti`

## Usage
```bash
# Start with the default model
lmti

# Start with a specific model
lmti -m vertex:gemini-2.5-flash
```
`lmti` **supports several commands:** to reset a conversation, undo some message, change models, etc.
Simply type forward slash (`/`) while on the REPL to see a list of actions.

## Config

Settings live in `~/.config/lmti.yaml`; API keys in `~/.lmti/auth.yaml`.
Conversation history is under `~/.lmti/history/`.
Many settings can also be changed from the REPL (`/model`, `/render`, etc.).

`~/.config/lmti.yaml`:

```yaml
settings:
  render_markdown: true
  model: mistral:mistral-small-2603
models:
- mistral:mistral-small-2603
- vertex:gemini-2.5-flash
```

`~/.lmti/auth.yaml`:

```yaml
MISTRAL_API_KEY: your-key-here
```

## Known limitations

With `render_markdown: true` (the default), assistant replies are streamed through [Rich](https://github.com/Textualize/rich) `Live` + `Markdown`. In practice you may see duplicated lines (“echo”), layout glitches, or other artifacts while tokens arrive. This comes from how Rich redraws live content when output overflows the terminal—not from the model itself.

Upstream workarounds exist (for example [chatlas #71](https://github.com/posit-dev/chatlas/pull/71), which monkeypatches `LiveRender` for [rich #3263](https://github.com/Textualize/rich/issues/3263) until [rich #3637](https://github.com/Textualize/rich/pull/3637) lands), but they do not fully solve streaming markdown in our stack. A durable fix likely means replacing the current **prompt-toolkit + Rich** UI with something built for live TUI updates (e.g. [Textual](https://github.com/Textualize/textual)). That is a large refactor and is tracked in [#14](https://github.com/nachollorca/lmti/issues/14)—not planned for the near term.

Until then you can turn off live markdown with `/render` or set `render_markdown: false` in config.

## Development

### Structure
```text
src/lmti/
├── cli.py      # Argument parsing and entry point
├── config.py   # Configuration management
├── errors.py   # Error handling
├── repl.py     # Main REPL loop logic
├── ui.py       # Terminal UI (prompt-toolkit and rich)
├── commands/   # Slash command implementations
└── __init__.py
```

### Tooling
We use `just` for development tasks. Use:
- `just sync`: Updates lockfile and syncs environment.
- `just format`: Lints and formats with `ruff`.
- `just check-types`: Static analysis with `ty`.
- `just check-complexity`: Cyclomatic complexity checks with `complexipy`.
- `just test`: Runs pytest with 90% coverage threshold.

See [`justfile`](justfile) for a complete list of dev commands.

### Contribute
1. **Hooks**: Install pre-commit hooks via `just install-hooks`.
2. **Issues**: Open an issue first using the default template.
3. **PRs**: Link your PR to the relevant issue.

## License
MIT

_Made with [`mold`](https://github.com/nachollorca/mold) template_
