Skip to main content

ffwf-tau-coding-agent

The interface of Tau, a programmable coding agent harness: the tau command, its Textual terminal UI, and the headless run paths behind tau -p and tau --mode rpc.

Tau began as a Python port of the TypeScript project pi-mono, which is still read as the reference implementation when porting or debugging; it now diverges from pi deliberately in several places.

Install

pip install ffwf-tau-coding-agent            # headless: the CLI, `tau -p`, `--mode rpc`
pip install 'ffwf-tau-coding-agent[tui]'     # add the interactive TUI
pip install ffwf-tau                         # the same thing, under the guessable name

Python 3.11 or newer. Pulls in ffwf-tau-agent-core, and through it ffwf-tau-llm. Note the ffwf- prefix: tau, tau-llm, and tau-ai on PyPI are unrelated projects.

ffwf-tau is a metapackage holding no code; it depends on ffwf-tau-coding-agent[tui] and nothing else. Use it when you want one short name, and this distribution when you want to choose extras.

Extra Adds Needed for
ffwf-tau-coding-agent[tui] textual, rich the interactive TUI. tau -p runs a full turn without it
ffwf-tau-coding-agent[jmfts] ffwf-tau-jmfts --store jmfts session storage

The interface is an extra, not a base dependency. A headless install is 15 packages and 13 MB; adding [tui] makes it 27 packages and 31 MB. Both extras report their own absence — asking for the TUI or for --store jmfts without the matching extra fails with the install command you need, not a traceback.

Two names for one command

The install puts both tau and ffwf-tau on your PATH. They are the same entry point, not a link: each is a wrapper pip owns and removes on uninstall.

Type tau. PyPI reserves distribution names but not command names, and at least one unrelated project ships its own tau; in an environment holding both, whichever installed last owns the name and neither pip nor uv says a word. ffwf-tau cannot be taken, which makes it the right name inside scripts, systemd units, and Dockerfiles. If tau --version does not report τ, ffwf-tau --version will.

Run

tau                                 # interactive TUI
tau -p "list the files here"        # headless: print a transcript, exit
tau -p --mode json "..."            # headless: JSONL lifecycle events instead of text
tau --mode rpc                      # drive τ as a subprocess over stdio (JSON-RPC 2.0)
tau -e permission_gate.py           # load an extension from a path
tau --help                          # the exact contract; treat this page as the stale one

tau -p and tau --mode rpc both write and resume real sessions under ~/.tau/sessions/, so a headless run appears in the TUI's sidebar and can be picked up interactively later. --no-session means nothing is persisted.

Flags worth knowing: -m/--model, -t/--tools and -nt/--no-tools, -e/--extension PATH, --thinking {off,minimal,low,medium,high,xhigh}, --max-turns N, -c/--continue, --session REF, --fork REF, --store {file,jmfts}.

There is no turn limit by default. An agent run ends when the model stops calling tools, a tool terminates it, an extension's budget guard aborts it, or you press Escape. --max-turns N adds a ceiling for one run, and "max_turns": N in ~/.tau/config.json sets a standing one.

Configure

On first run τ writes ~/.tau/config.json from a default shipped inside the package. It holds the models map that --model resolves names against, plus per-extension config and the session_store block. A model entry names the provider, the base URL, and the context window, so pointing τ at a local OpenAI-compatible server (vLLM, llama.cpp, Ollama) is a config edit rather than a code change.

The TUI

Built on Textual. Streamed text renders at 30 Hz; tool calls and their results appear as their own blocks.

Key Action
Ctrl+Enter send the message
Ctrl+B toggle the session sidebar
Ctrl+N new chat
Ctrl+G browse the conversation tree
Ctrl+Z roll back the last turn
Ctrl+R / Ctrl+T show or hide reasoning / tool blocks
Ctrl+E extensions
Ctrl+P command palette
Escape cancel the current generation

The sidebar and the tree browser are two different things. The sidebar picks which session to open — a flat list grouped by date. Ctrl+G opens a browser over the branch structure inside the current conversation, where you navigate to an earlier node, summarise a branch, or elide a span. Typed commands cover the rest: /compact, /tree, /fork, /extensions.

Why it is a separate package

Everything here is presentation and process management. The agent lives in ffwf-tau-agent-core, which has no Textual dependency and never imports this package. ffwf-tau-jmfts is a peer rather than a dependency: --store jmfts imports it lazily and fails at startup if it is absent, never falling back to files without saying so.

If you want the agent rather than the interface, use the runtime directly:

import asyncio
from tau_agent_core import create_agent_session


async def main():
    session = create_agent_session(model="gpt-4o", tools=["read", "bash"])
    print(await session.prompt("What is in this directory?"))


asyncio.run(main())

Docs

  • docs/tau-coding-agent.md — design notes for this package.
  • docs/CLI-PLAN.md — the flag set and its status.
  • docs/REMOTE-CONTROL.md, docs/RPC-PROTOCOL.md--mode rpc.
  • docs/EXTENSIONS-WALKTHROUGH.md — writing an extension to load with -e.

Repository: https://github.com/jmccardle/tau

The rest of Tau

Distribution Imports as What it is
ffwf-tau-llm tau_llm the provider and streaming layer
ffwf-tau-agent-core tau_agent_core the agent loop, tools, sessions, extensions
ffwf-tau-jmfts tau_jmfts a JMFTS-backed session store

MIT © Fight Fire with Fire Robotics, LLC

Download files

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

Source Distribution

ffwf_tau_coding_agent-0.9.7.tar.gz (675.0 kB view details)

Uploaded Source

Built Distribution

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

ffwf_tau_coding_agent-0.9.7-py3-none-any.whl (323.6 kB view details)

Uploaded Python 3

File details

Details for the file ffwf_tau_coding_agent-0.9.7.tar.gz.

File metadata

  • Download URL: ffwf_tau_coding_agent-0.9.7.tar.gz
  • Upload date:
  • Size: 675.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for ffwf_tau_coding_agent-0.9.7.tar.gz
Algorithm Hash digest
SHA256 7b73a24267230b0174aa680f80feedf81c21218c8e7b4bc55d159374f77a91fc
MD5 48a9b4b8ddb58c34fab55c345e21d78b
BLAKE2b-256 65603e384dacc11ec0e4f58a8ef431e0b45b29972c1e9686baeefcd54a7da5a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for ffwf_tau_coding_agent-0.9.7.tar.gz:

Publisher: publish.yml on jmccardle/tau

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ffwf_tau_coding_agent-0.9.7-py3-none-any.whl.

File metadata

File hashes

Hashes for ffwf_tau_coding_agent-0.9.7-py3-none-any.whl
Algorithm Hash digest
SHA256 5a398416af2614c8d39f0ff367b77db9cdef1702ea7333c52624a1c52c6c16a8
MD5 4000a27515091cac624861bfaa8a8715
BLAKE2b-256 b4cdbfd791d19955d246ff7ee45ae69f90224f62a5c6922a8f6a553f064a4aed

See more details on using hashes here.

Provenance

The following attestation bundles were made for ffwf_tau_coding_agent-0.9.7-py3-none-any.whl:

Publisher: publish.yml on jmccardle/tau

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.9.7 This release

2 files

0.9.6

2 files

0.9.5

2 files

0.9.4

2 files

0.9.3

2 files

0.9.2

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page