The terminal stage for your LangGraph agent — Claude Code-style CLI for any CompiledGraph
Project description
langstage-cli
The terminal stage for your LangGraph agent. A Claude Code-style CLI that runs any LangGraph CompiledGraph — yours, not a bundled one — with streaming, tool-call rendering, and human-in-the-loop approval.
Renamed from deepagent-code (the old package name now just installs this one, and the
deepagent-codecommand still works).
Every stage for your LangGraph agent
langstage-cli is the terminal stage of the LangStage family: write your agent once — any LangGraph CompiledGraph — and run it on every stage with the same spec string (module:attr or path/to/file.py:attr), the same langstage.toml config file, and the same LANGSTAGE_* environment variables.
| Stage | Package | Try it |
|---|---|---|
| Web app | langstage | langstage run --agent my_agent.py:graph |
| JupyterLab | langstage-jupyter | pip install langstage-jupyter, then the chat sidebar in jupyter lab |
| Terminal | langstage-cli | you are here |
| VS Code | langstage-vscode | chat participant + stdio sidecar |
| Reference agent | langstage-hermes | LANGSTAGE_AGENT_SPEC=langstage_hermes.agent:graph on any stage |
| Shared core | langgraph-stream-parser | typed events + config resolver behind every stage |
Installation
pip install langstage-cli
Or install directly from GitHub:
pip install git+https://github.com/dkedar7/langstage-cli.git
Quick Start
No agent or API key yet? See the CLI working in one command:
langstage-cli --demo "hello"
Run with the default agent (requires ANTHROPIC_API_KEY):
export ANTHROPIC_API_KEY="your_api_key"
langstage-cli
Or specify your own agent:
langstage-cli -a path/to/your_agent.py:graph
This launches an interactive conversation loop with your agent.
Usage
# Use the default agent
langstage-cli
# Send a message directly
langstage-cli "Hello, agent!"
# Specify a custom agent file
langstage-cli -a my_agent.py:graph
# Use a module path
langstage-cli -a mypackage.agents:chatbot
# Read message from a file
langstage-cli -f ./prompt.md
# Non-interactive mode (auto-approve tool calls)
langstage-cli --no-interactive
# Verbose output
langstage-cli -v
# Keyless demo agent (no API key needed)
langstage-cli --demo
# Print the resolved configuration: each value, its source, and the
# env var / langstage.toml key that sets it
langstage-cli --show-config
Commands
In the interactive loop:
/qor/quit- Exit/c- Clear conversation history/hor/help- Show help
Environment Variables
# Agent location (path/to/file.py:variable_name or module:variable)
# (DEEPAGENT_AGENT_SPEC / DEEPAGENT_SPEC still accepted as deprecated aliases)
export LANGSTAGE_AGENT_SPEC="my_agent.py:graph"
langstage-cli
# Working directory
export LANGSTAGE_WORKSPACE_ROOT="/path/to/workspace"
# Stream mode (updates or values)
export LANGSTAGE_STREAM_MODE="updates"
Configuration Files
langstage-cli reads TOML config from two locations and merges them
(project overrides global):
- Global:
~/.langstage/config.toml - Project:
langstage.tomlin the current directory or any ancestor
Legacy locations (~/.deepagents/config.toml, deepagents.toml) are still
read as fallbacks; move your config when convenient — ~/.deepagents/ now
belongs to LangChain's dcode.
Precedence: CLI args > env vars > project TOML > global TOML > defaults.
Example langstage.toml:
[agent]
spec = "my_agent.py:graph"
workspace_root = "."
[ui]
verbose = true
async_mode = false
stream_mode = "updates"
[configurable]
# seeds LangGraph RunnableConfig.configurable
thread_id = "my-thread"
CLI Options
Usage: langstage-cli [OPTIONS] [MESSAGE]
Arguments:
MESSAGE Optional input to send to the agent immediately
Options:
-a, --agent TEXT Agent spec (path/to/file.py:graph or module:graph)
-g, --graph-name TEXT Graph variable name (default: "graph")
-f, --file PATH Read message from a file (any extension)
--interactive/--no-interactive Handle interrupts (default: interactive)
--async-mode/--sync-mode Async streaming (default: sync)
--stream-mode TEXT Stream mode (updates or values)
-v, --verbose Verbose output
Creating Your Own Agent
Your agent file should export a compiled LangGraph graph:
# my_agent.py
from deepagents import create_deep_agent
from langgraph.checkpoint.memory import MemorySaver
agent = create_deep_agent(
name="My Agent",
model="anthropic:claude-sonnet-4-20250514",
checkpointer=MemorySaver(),
)
Then run it:
langstage-cli -a my_agent.py:agent
Programmatic Use
from langstage_cli import stream_graph_updates, prepare_agent_input
input_data = prepare_agent_input(message="Hello!")
for chunk in stream_graph_updates(graph, input_data):
if chunk.get("chunk"):
print(chunk["chunk"], end="")
License
MIT License - see LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file langstage_cli-0.4.0.tar.gz.
File metadata
- Download URL: langstage_cli-0.4.0.tar.gz
- Upload date:
- Size: 25.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
971f99b94411089666bbdf663f6099c6a32a8a44832d33934c9c718624b3c29e
|
|
| MD5 |
8b436be6ffc7d5159af6d87e00aa46b4
|
|
| BLAKE2b-256 |
0a909e74a16766e40822bebe977c91b517be4b886a6a07fc4d0f63ee7e85af1a
|
File details
Details for the file langstage_cli-0.4.0-py3-none-any.whl.
File metadata
- Download URL: langstage_cli-0.4.0-py3-none-any.whl
- Upload date:
- Size: 21.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7fb35eb3a8d19df1d139efb28d97febae706f471158d5d5a19cc373119445901
|
|
| MD5 |
baf783781e83c4932fef5d6e9c14ebf7
|
|
| BLAKE2b-256 |
3a3bc1b3804934e032efe87f873d9f08e32ab0df6a8fb4ae2e8b80d950997eb6
|