FlowJet
FlowJet is one agent runtime, two surfaces:
| Surface | Entry point | What it gives you |
|---|---|---|
| Terminal CLI | fj |
A friendly one-shot coding agent — ask in plain English, get an answer |
| HTTP service | flowjet-server / fj serve |
ACP over WebSocket + an OpenAI-compatible API (/v1/responses, /v1/chat/completions, /v1/models) |
Both are the same distribution and the same flowjet.core runtime: one nano
bootstrap, one stream mapper, one RuntimeEvent contract. The terminal renders
those events as a progress line; the server renders them as SSE or ACP updates.
# CLI
fj explain this repo
fj -f what did we decide last time # continue the latest conversation
fjf what did we decide last time # alias of fj -f
# Server (OpenAI-compatible + ACP)
flowjet-server # or: fj serve --port 8618
It runs on soothe-nano — tools, skills, MCP, subagents, and progressive loading — with SQLite persistence so every conversation is resumable.
Package: flowjet · CLI aliases:
fj,fjf(=-f) · Server:flowjet-server· Runtime: soothe-nano · Naming details: docs/naming.md
Upgrading from 1.x? The distribution and all import paths were renamed. See docs/upgrade.md.
Install
pip install flowjet # CLI only (one runtime dependency: soothe-nano)
pip install 'flowjet[server]' # + the HTTP service (fastapi, uvicorn, ACP)
# or
uv tool install 'flowjet[server]'
Requires Python 3.11+. The server half is an optional extra — fj never imports
FastAPI or uvicorn.
Configure
Option A — Local model (guided setup):
fj setup
This walks you through an OpenAI-compatible endpoint (Ollama, LM Studio, vLLM, …) and writes the basics to ~/.soothe/config/nano.yml.
Option B — Cloud (no config file needed):
export OPENAI_API_KEY=sk-...
fj summarize README.md
Without a nano.yml, FlowJet falls back to OPENAI_API_KEY or ANTHROPIC_API_KEY.
Doctor
Check whether your machine is ready to run fj (tool binaries, providers, observability):
fj doctor # quick check
fj doctor --deep # thorough check
fj doctor --live-llm # actually call the model
fj doctor --format json # machine-readable
Conversations
Threads persist in SQLite, so you can pick up where you left off — continue the latest, jump to a specific one, or list them:
fj -f and now add tests # continue this project's latest active thread
fj -t abc123 continue from here # continue a specific thread
fj -l # list recent threads
-f is scoped to the project you are in — the git repo root, or the current directory when it is not a repo — so parallel work in other checkouts never hijacks your thread. fj -l still lists every thread; pick one up from anywhere with -t ID.
Flags
fj [options] [--] <query...>
| Flag | Meaning |
|---|---|
-f / --follow |
Continue the latest active thread in this project directory |
-t ID / --thread |
Continue (or pin) a specific thread (overrides -f) |
-l / --list |
List recent threads (newest first) |
-n NUM |
How many threads -l shows (0 = all) |
-c PATH / --config |
Use an alternate nano.yml |
-w DIR / --workspace |
Workspace root |
--no-stream |
Wait for the full answer instead of streaming |
-v / --verbose |
Mirror tool calls on stderr |
-tand-fcan be combined;-twins (explicit id overrides follow).
Shell completion is AI-assisted — it predicts natural-language intents, not just flags:
eval "$(fj completion zsh)" # or: fj completion bash
Extend
Skills
FlowJet ships with AgentSkills (planning, TDD, debugging, document tools, MCP builder, and more). Add your own in nano.yml:
skills:
- ~/.soothe/skills/my-reviewer
- ./skills/deploy
Each skill is a SKILL.md with frontmatter; progressive loading keeps the catalog compact and loads skills on demand.
MCP servers
Connect any Model Context Protocol server:
mcp_servers:
- name: filesystem
transport: stdio
command: npx
args: ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
With defer: true (the default), MCP tools activate on demand.
Server
Start the service and point any OpenAI-compatible client at it:
flowjet-server # defaults: host :: (dual-stack), port 8618
fj serve --port 8618 # same thing from the CLI
from openai import OpenAI
client = OpenAI(api_key="local", base_url="http://127.0.0.1:8618/v1")
print(client.responses.create(model="default", input="Hello"))
| HTTP | Purpose |
|---|---|
GET /health |
Liveness + thread-pool metrics |
GET /v1/models |
Logical model ids |
POST /v1/responses |
Create a response (stream=true → SSE) |
GET / DELETE /v1/responses/{id} |
Retrieve / cancel a response |
POST /v1/chat/completions |
Chat Completions (non-stream + SSE) |
WS /acp |
Agent Client Protocol (JSON-RPC) |
FlowJet options travel in extra_body.flowjet:
| Field | Values | Default | Meaning |
|---|---|---|---|
projection |
report | progress | developer |
report |
How much SSE detail to expose |
session |
string | new fj-<uuid> |
Isolates workspace + conversation thread |
interaction_mode |
agent | ask |
agent |
ask is hard read-only |
metadata |
object | — | Opaque bag forwarded to the runtime |
Environment
| Variable | Default | Meaning |
|---|---|---|
FLOWJET_API_KEY |
unset | If set, require Bearer auth |
FLOWJET_MODELS |
default |
Comma-separated logical model ids |
FLOWJET_HOST |
:: |
Bind host (dual-stack IPv4/IPv6) |
FLOWJET_PORT |
8618 |
Bind port |
FLOWJET_HOME |
~/.flowjet |
Root for per-session workspaces |
FLOWJET_NANO_CONFIG |
unset | Optional nano.yml (else $SOOTHE_HOME/config/nano.yml) |
FLOWJET_THREAD_POOL_MIN |
2 |
Min isolation worker threads |
FLOWJET_THREAD_POOL_MAX |
8 |
Max isolation worker threads |
FLOWJET_THREAD_POOL_IDLE_TIMEOUT |
300 |
Scaled-worker idle exit seconds (0 = never) |
FLOWJET_MAX_REQUESTS_PER_WORKER |
100 |
Recycle worker after N turns (0 = unlimited) |
FLOWJET_REUSE_RUNNER |
true |
Reuse agent adapter per worker |
FLOWJET_REQUEST_TIMEOUT |
0 |
Per-run timeout seconds (0 = none; set in production) |
FLOWJET_READY_TIMEOUT |
30 |
Max wait for post-turn worker ready |
FLOWJET_ALLOW_EXTERNAL_WORKSPACE |
false |
Allow metadata.workspace outside FLOWJET_HOME |
FLOWJET_CORS_ORIGINS |
* |
Comma-separated browser origins allowed to call the API |
Security model
The two surfaces have deliberately different invariants (enforced in
flowjet.core.modes, not by whichever module loaded first):
| CLI | Server | |
|---|---|---|
allow_paths_outside_workspace |
True (your machine) |
False (per-request workspace, non-overridable) |
bypass interaction mode |
available | rejected — tools must never escape the request workspace |
| API key | — | optional FLOWJET_API_KEY (Bearer, constant-time compare) |
FLOWJET_CORS_ORIGINS defaults to * with credentials enabled so browser
clients work out of the box; set it to an explicit origin list in production.
Full protocol reference and deployment guide: deploy/README.md, docs/specs/RFC-001-openai-compatible-api.md.
Development
git clone https://github.com/caesar0301/flowjet-agent.git
cd flowjet-agent
make sync-dev # dev + server extras
make test # unit + integration + server suites
make test-server # HTTP/ACP suites only
make run # start the server locally
make lint
CI runs format, lint, and tests on Python 3.11–3.13; releases go GitHub Release → PyPI.
Powered by
Built on soothe-nano. For a full TUI coding agent from the same stack, see mirasoth/soothe.
License
MIT
Metadata
Release files for flowjet 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| flowjet-2.0.0.tar.gz | 234.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| flowjet-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 487.5 kB
Release files / flowjet-2.0.0.tar.gz
| Download URL | flowjet-2.0.0.tar.gz |
|---|---|
| Size | 234.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9570fa4fbdb72c42dcdf799f92acdd55801008f7987421f4b226133760a49c51
|
|
BLAKE2b-256 checksum How to use checksums |
60984c202f41c92bd20e5e400b30846218053e17ceec36fa89dfd301b4b32d26
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / flowjet-2.0.0-py3-none-any.whl
| Download URL | flowjet-2.0.0-py3-none-any.whl |
|---|---|
| Size | 252.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
569f7736cfee8d07cdaed080a4bcf0672a39c72700aa5fa3abf0336b66e5a979
|
|
BLAKE2b-256 checksum How to use checksums |
f1be0ec76dc4454a1ea8cb954509f4ca46abf2adf69ee6e0a849a3a16a66ad30
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|