AbstractAssistant is a macOS-first tray app and CLI that hosts a local, durable agent:
- agent loop:
abstractagent(ReAct / CodeAct / MemAct) - durability:
abstractruntime(runs + waits + ledger + artifacts) - providers/tools/media:
abstractcore
See also:
- README.md (docs hub)
- architecture.md (durability + tool boundary, diagrams)
- api.md (CLI + programmatic API)
pip install "abstractassistant"assistant trayRunning assistant with no subcommand also starts the tray UI.
Voice listening mode (tray):
assistant tray --listening-mode waitValid modes: none, stop, wait, full, ptt.
assistant run --prompt "What is in this repo and where do I start?"Override provider/model:
assistant --provider ollama --model qwen3:4b-instruct run --prompt "Summarize my last changes"Select agent kind (CLI only):
assistant --agent codeact run --prompt "Refactor this function safely"Defaults:
- Tray UI defaults come from
config.toml(or built-in defaults). By default: providerlmstudio, modelqwen/qwen3-next-80b. - CLI
rundefaults to providerollama, modelqwen3:4b-instruct, agentreact.
Tip: global flags (like --provider, --model, --agent, --data-dir) go before the subcommand.
AbstractAssistant delegates provider access to AbstractCore.
- Local providers:
- Ollama: ensure the daemon is running, then use
--provider ollama - LMStudio: enable the local server, then use
--provider lmstudio
- Ollama: ensure the daemon is running, then use
- Cloud providers:
- set API keys via environment variables (for example
OPENAI_API_KEY,ANTHROPIC_API_KEY)
- set API keys via environment variables (for example
Tool calls are surfaced as a durable wait and require explicit approval by default:
- safe/read-only tools can be auto-approved
- writes, shell execution, and unknown tools require approval
Evidence in code:
- default policy:
abstractassistant/core/tool_policy.py - durable wait/resume:
abstractassistant/core/agent_host.py
CLI:
- prompts interactively when a tool batch requires approval
--approve-all-toolsauto-approves all tool calls (dangerous)
Tray UI:
- “Tools” lets you choose All tools vs a Custom allowlist
- per-tool default approval mode for the current session
Use the paperclip button to attach local files.
What happens (evidence: abstractassistant/core/agent_host.py):
- attachments are stored as runtime artifacts when possible
- file “handles” are kept model-safe (relative to
workspace_rootwhen configured, otherwise filename) - default max attachment size is 25 MiB (override via
ABSTRACTGATEWAY_MAX_ATTACHMENT_BYTES)
Audio notes:
- common containers like
.wav,.mp3,.m4a,.ogg,.flac,.aac,.webm - audio attachments are pre-transcribed via AbstractVoice when available, and the transcript is attached as text
Video notes:
- common containers like
.mp4,.mov,.mkv,.webm,.avi,.wmv,.m4v - AbstractAssistant does not bundle
ffmpeg. If your provider/media pipeline relies onffmpegfor frame extraction, ensure it is on your PATH.
The tray UI supports multiple sessions and persists them under your data directory:
- index:
sessions.json - legacy/base session:
session.json - additional sessions:
sessions/<session_id>/...
Evidence: abstractassistant/core/session_index.py, abstractassistant/core/session_store.py
Tray mode can load an optional config.toml:
- pass explicitly:
assistant --config /path/to/config.toml tray - auto-discovery:
config.tomlin current directory, then in the package directory
Common keys (evidence: abstractassistant/config.py):
[llm]
default_provider = "lmstudio"
default_model = "qwen/qwen3-next-80b"
max_tokens = 32000
temperature = 0.7Note: assistant run currently uses CLI defaults and flags; it does not read config.toml.
By default, state is stored in ~/.abstractassistant/:
session.json: transcript snapshot + last run id (fast UX state)sessions.json: session registry + active session idruntime/: AbstractRuntime stores (durability source of truth)
Override with:
assistant --data-dir /path/to/dir tray- Tray fails to start: reinstall:
pip install --upgrade "abstractassistant". - Provider errors:
- local: ensure LMStudio/Ollama is running
- cloud: ensure API keys are set
- Microphone hears nothing (macOS): System Settings → Privacy & Security → Microphone → enable access for AbstractAssistant, then restart.
- Reset state: use “Clear” in the UI, or delete your data dir (
~/.abstractassistant/by default).