Skip to main content

/usr/bin/cat for LLMs

Project description

/usr/bin/cat for LLMs

llcat is an unambitious dumb program for LLM I/O.

That's why it's great!

llcat

You can handle this!

Very Quick Start

Got 0.3 seconds to spare?

List the models on OpenRouter:

uvx llcat -s https://openrouter.ai/api -m

Run that right now.

I'll wait.


llcat solves all your problems.

Yes. Even that one.

It can also:

  • Pipe things from stdin and/or be prompted on the command line.
  • Store conversation history optionally, as a boring JSON file.
  • Do tool calling using the OpenAI spec. There's an example in this repository (and below).
  • Use local or remote servers, authenticated or not.
  • List models using -m without arguments. Specify a model with the argument.

Free Samples? Sure! It's Free Software.

  • pipx install llcat
  • uvx llcat

Dependencies? Just the requests library.

Note: It's llcat, not llmcat. Let's keep it pronounceable.

Examples

Start a chat with llama:

$ llcat -s https://openrouter.ai/api \
        -m meta-llama/llama-3.2-3b-instruct:free \
        -c /tmp/convo.txt \
        -k $(cat openrouter.key) \
        "What is the capital of France?"

Continue with Qwen:

$ llcat -s https://openrouter.ai/api \
        -m qwen/qwen3-4b:free \
        -c /tmp/convo.txt \
        -k $(cat openrouter.key) \
        "And what about Canada?"

And finish on the local network:

$ llcat -s http://192.168.1.21:8080 \
        -c /tmp/convo.txt \
        "And what about Japan?"

One conversation, hopping across models and servers.

Pure sorcery.

Summon Some More

Want to store state? Let's go!

$ source examples/fancy.sh
$ llc-server http://192.168.1.21:8080
$ llc "write a diss track where the knapsack problem hates on the towers of hanoi"

Go read the four lines of fancy.sh

Surprise! Environment variables and a wrapper function. That's all you need.

The Tool Call To Rule Them All

This example, a very strange way to play mp3s, uses the sophisticated 21 line tool_program.py included in this repository. Some people call it MCP, llcat calls it subprocess.run.

This demo also uses DA`/50's pretty little streaming markdown renderer, streamdown.

tc

Kablam! Alright a16z where's my $50 million?

The enterprise applications are limitless...

Conversant Conversations?

Sure! Conversation.sh is six lines of bash.

It even has inspectable tool calls and realtime observability with Human-in-the-Loop! Wowza! I'll settle for merely $40 million.

2026-01-09_07-35

Boring Documentation

usage: llcat [-h] [-c CONVERSATION] [-m [MODEL]] [-k KEY] [-s SERVER]
                [-tf TOOL_FILE] [-tp TOOL_PROGRAM]
                [prompt ...]

positional arguments:
  prompt                Your prompt

options:
  -h, --help            show this help message and exit
  -c, --conversation CONVERSATION
                        Conversation history file
  -m, --model [MODEL]   Model to use (or list models if no value)
  -k, --key KEY         API key for authorization
  -s, --server SERVER   Server URL (e.g., http://::1:8080)
  -tf, --tool_file TOOL_FILE
                        JSON file with tool definitions
  -tp, --tool_program TOOL_PROGRAM
                        Program to execute tool calls

Now it's your turn.


Brought to you by DA`/50: Make the future obvious.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

llcat-0.6.2.tar.gz (5.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

llcat-0.6.2-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file llcat-0.6.2.tar.gz.

File metadata

  • Download URL: llcat-0.6.2.tar.gz
  • Upload date:
  • Size: 5.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.11

File hashes

Hashes for llcat-0.6.2.tar.gz
Algorithm Hash digest
SHA256 531c15982af26e812b2e4b2eb088a0a8f107602cf79a0ea956bfb11fe8c8af21
MD5 cf7a8d9517ac2a4e15b240d573d9bc3a
BLAKE2b-256 50f699a9252880ae67e525f24e42b23034f47ee4526d7743e253146448d89cc3

See more details on using hashes here.

File details

Details for the file llcat-0.6.2-py3-none-any.whl.

File metadata

  • Download URL: llcat-0.6.2-py3-none-any.whl
  • Upload date:
  • Size: 5.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.11

File hashes

Hashes for llcat-0.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 0f761397cf612192f46533d61f5f2ace266263d7585b02b0d3d3d584ff436e27
MD5 484a5e3f03c9ba09e37457d9abf5c106
BLAKE2b-256 127aeb05885937d4f953dc107f80906cc8de7fb53f9524c573627001749224ae

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page