Skip to main content

Terminal-based AI agent — a function-calling loop with minimum harness

Project description

Slife

Terminal-based AI agent — a function-calling loop with minimum harness. Chat with an LLM that calls tools, remembers everything, and orchestrates other agents over MQTT.

┌─────────────────────────────────────────────────────────────┐
│  Terminal UI (Textual)                                      │
│  ────────────────────────────────────────────────────────── │
│  Agent Loop — LLM + Tools + Stream + Memory + A2A + Inbox  │
│  ┌───────────┬──────────┬───────────┬─────────────────────┐ │
│  │ MCP Proxy │ A2A Mesh │ Subagents │ Built-in Plugins    │ │
│  │ (gateway) │ (MQTT)   │ (workers) │ Memory · MCP · WX   │ │
│  └───────────┴──────────┴───────────┴─────────────────────┘ │
│  Permanent Memory — hybrid search (grep + FTS5 + semantic)  │
└─────────────────────────────────────────────────────────────┘

Install

Zero prerequisites. The install script auto-installs uv and Node.js if needed.

Install script (recommended)

macOS / Linux / WSL:

curl -fsSL https://raw.githubusercontent.com/juzcn/slife/main/install.sh | bash

Windows PowerShell:

powershell -ExecutionPolicy Bypass -Command "irm https://raw.githubusercontent.com/juzcn/slife/main/install.ps1 | iex"

Try without installing

uvx --from git+https://github.com/juzcn/slife.git slife

Update

Re-run the install script — it auto-preserves optional packages (llama-cpp-python, sentence-transformers) from the previous install.

Uninstall

# macOS / Linux / WSL
curl -fsSL https://raw.githubusercontent.com/juzcn/slife/main/uninstall.sh | bash

# Windows PowerShell
powershell -ExecutionPolicy Bypass -Command "irm https://raw.githubusercontent.com/juzcn/slife/main/uninstall.ps1 | iex"

Uninstall removes the binaries. User data (~/.slife/, ~/.credstore/) is listed but not removed — delete manually for a full reset.

Quick Start

credstore set-password              # first time only — encrypted backup
credstore set DEEPSEEK_API_KEY       # store API key (masked input)
slife

The default config ships with pre-configured MCP servers: filesystem + shell, code search, web fetch, search APIs.

How It Works

Slife is a function-calling loop: you type → the LLM decides what tools to call → Slife executes them → the LLM responds → repeat.

You: "Find all TODO comments and create GitHub issues for them"
  → LLM calls search_content("TODO")
  → LLM calls github__create_issue(...) for each one
  → LLM: "Created 7 issues. All linked above."

Every turn is permanently recorded. On restart, recent conversations are restored.

Configuration

Two-layer model — secrets in OS keyring, config in JSON5:

Layer Storage Contents
Secrets OS keyring (credstore) API keys, tokens — encrypted at OS level
Config ~/.slife/slife.json5env: ${VAR} references + non-secret values
env: {
  DEEPSEEK_API_KEY: "${DEEPSEEK_API_KEY}",   // → resolved from keyring at runtime
}

models: {
  providers: {
    deepseek: {
      base_url: "https://api.deepseek.com",
      api_key: "${DEEPSEEK_API_KEY}",
      models: [{ model: "deepseek-v4-pro", name: "DeepSeek V4 Pro", reasoning: true }],
    },
  },
},
active_model: "deepseek/deepseek-v4-pro",

Secrets never reach the LLM context. All tool output is sanitized before reaching the model — API key patterns are auto-masked.

Features

Tools

All unified as OpenAI function definitions. The LLM sees no difference between native, MCP, or A2A tools.

Category Description
Native System info, Python execution, env/config management, skill loading, CLI discovery
MCP / REST Filesystem, shell, code search, web fetch, any MCP server (stdio or HTTP)
Skills On-demand plugins loaded via list_skills / use_skill
CLI Auto-discovered external commands, persisted across restarts
A2A Agent discovery, task routing, subagents, broadcast (13 tools)

Memory — Always On

Every conversation turn is permanently recorded. Hybrid search across four modes:

Mode Best for
grep Exact strings — error messages, file paths, code
fts5 Topic / keyword search with ranked snippets
hybrid Semantic recall (FTS5 + vec0 vector search, RRF merge)
time Browse by date

Embedding backends: local GGUF (BGE-M3, ~300 MB, offline), HuggingFace transformers, or OpenAI-compatible API. Keyword search works without any embedding backend.

Plugins

Three built-in plugins run as independent processes on Streamable HTTP transport:

Plugin Role
slife-mcp Gateway for external MCP servers (stdio + HTTP)
slife-memory Diary database with hybrid search
slife-wechat Bidirectional WeChat via iLink ClawBot

External MCP servers (filesystem, fetch, search, any OpenAPI spec) are configured in slife.json5 and auto-connected at startup. Third-party MCP servers need no Slife SDK — any stdio or HTTP MCP server works.

A2A — Agent-to-Agent

Two transports, one interface:

Transport Use case
MQTT Remote peers over Mosquitto broker
HTTP Streamable Direct agent-to-agent
Subagent Local child processes (always available)

Unified inbox serializes human, WeChat, MQTT, and subagent messages through a single queue.

Progressive Disclosure

Not all tools are in every request. Three categories use lightweight summaries:

Category Browse Load
Memory memory_search memory_open
Skills list_skills use_skill
MCP mcp_list_tools mcp_set_disclosure("eager")

Keyboard Shortcuts

Key Action
Ctrl+C (in input) Quit
Ctrl+C (elsewhere) Copy
Esc Cancel agent loop
Ctrl+L Focus input
Home / End Scroll to top / bottom

CLI

Flag Description
--agent <id> Agent identity — memory isolation key + A2A mesh name (default: slife)

Optional Extras

Extra Enables
slife[gguf] Local GGUF embeddings (offline)
slife[transformer] HuggingFace transformer embeddings (~2 GB)
slife[embeddings] Both of the above

Linux / macOS — builds from source (C compiler is standard on these platforms):

uv tool install "slife[gguf]" --reinstall

Windows — no C++ compiler by default, so use a pre-built wheel. Pick the one that matches your setup:

Your setup Wheel Notes
No compiler, any GPU or none v0.3.34-vulkan Safest — uses Vulkan if GPU present, falls back to CPU
NVIDIA GPU + CUDA 12 v0.3.34-cu132 CUDA 12.x
NVIDIA GPU + CUDA 11 v0.3.34-cu125 CUDA 11.x
AMD GPU v0.3.34-hip-radeon ROCm
uv tool install --with "llama-cpp-python @ https://github.com/abetlen/llama-cpp-python/releases/download/v0.3.34-vulkan/llama_cpp_python-0.3.34-py3-none-win_amd64.whl" slife --reinstall

First use — download a GGUF model and enable it:

curl -LO https://huggingface.co/ChristianAzinn/bge-m3-gguf/resolve/main/bge-m3-Q4_K_M.gguf

Then launch slife and tell it: enable local embeddings with bge-m3-Q4_K_M.gguf

Development

git clone https://github.com/juzcn/slife.git
cd slife
uv sync --all-extras

uv run credstore set-password        # first time
uv run credstore set DEEPSEEK_API_KEY
uv run slife

Dev mode auto-detects: data files stay in the project directory. Production installs use ~/.slife/.

# Run tests
uv run pytest

# With coverage
uv run pytest --cov=slife --cov=credstore --cov-report=term-missing

Architecture

Slife is a minimum-harness agent. The harness only does what the LLM physically cannot: execute tools, maintain conversation state, stream responses, persist memory. Everything else — reasoning, planning, tool selection, error recovery — is the LLM's job.

See DESIGN.md for the full architecture: agent loop, tool system, plugin contract, MCP gateway, memory database, A2A mesh, credential security model, and project structure.

License

MIT

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

slife-0.3.19.tar.gz (235.1 kB view details)

Uploaded Source

Built Distribution

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

slife-0.3.19-py3-none-any.whl (252.6 kB view details)

Uploaded Python 3

File details

Details for the file slife-0.3.19.tar.gz.

File metadata

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

File hashes

Hashes for slife-0.3.19.tar.gz
Algorithm Hash digest
SHA256 fb28acd8e1d1b1912442d7dfac43ef549214579dec7c2d94701badfe543cb26b
MD5 db8ffc199bebd666fc866122a8e03d08
BLAKE2b-256 48746159218c24eeb8eb33539b7a041a2e9634b0c2cfeb6177be82216ff52311

See more details on using hashes here.

File details

Details for the file slife-0.3.19-py3-none-any.whl.

File metadata

  • Download URL: slife-0.3.19-py3-none-any.whl
  • Upload date:
  • Size: 252.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for slife-0.3.19-py3-none-any.whl
Algorithm Hash digest
SHA256 44c019681ebc5f7d6c0ca1a803cf1ea4b9bc0b887569fd6a0f781967846762be
MD5 7a53a04385c893ae6f5f0ae7408272cd
BLAKE2b-256 1ffc3a9b7bc751925435d8a88adf7bacc60baa174f40eca76f9541344b7aab45

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