A Python framework for building multi-agent LLM applications — LLM backends, agents, plugins, workflows, and a distributed layer for serving agents over HTTP.
Everything needed to go from a single LLM call to a fleet of coordinated, tool-using agents — without locking you into one model provider.
Ollama (sync, streaming, async, vision), OpenAI (including reasoning models), Anthropic, OpenRouter, and in-process HuggingFace Transformers — all behind one LLMBackend contract. Run local, hosted, or both with the same agent code.
Role-based agents with task execution, memory, step-by-step reasoning, and self-correction. AgentManager handles sequential pipelines, collaborative tasks, and dependency-aware workflows.
16 built-in plugins, loaded on demand and invoked automatically via TOOL: directives or native tool-calling. Fail-closed by design — every plugin explicitly declares what it exposes.
Dependency resolution via topological sort, retry logic, and optional parallel execution — with checkpoint/resume for long-running workflows.
maki serve exposes any agent over HTTP via FastAPI; AgentProxy consumes remote agents transparently, with circuit-breaking built in.
Requests Maki makes itself — Ollama, remote agents, web plugins — go through a hardened connector. URLs from web content are checked against private address ranges at connect time, redirects included, and errors are typed. Plugins are fail-closed, and destructive tools need an explicit opt-in.
Four layers, cleanly separated — the plugin system sits alongside the agent layer rather than inside it.
maki/__init__.py lazily loads exports on first access, keeping optional-dependency import costs out of the hot path.
MakiLLama, MakiOpenAI, MakiAnthropic, MakiOpenRouter, and HFBackend all implement the abstract LLMBackend contract.
Agent composes PluginHandler and ReasoningEngine mixins; AgentManager orchestrates agents via WorkflowTask and WorkflowState.
AgentServer (FastAPI) exposes agents over HTTP; AgentProxy is a remote-agent client with circuit-breaking; DistributedAgentManager mixes local and remote agents.
Connector (hardened HTTP: URL validation, connect-time IP pinning by default), shared data classes, typed exceptions, runtime config, and structured logging — used by every layer above.
Loaded on demand, gated by an explicit ALLOWED_METHODS whitelist per plugin — nothing is reachable from an LLM tool call unless it's named there.
file_readerfile_writerdirectory_readerjson_readerweb_to_mdweb_searchtrend_searchprovider_updatesalpaca_dataalpaca_newsalpaca_tradingalpaca_streamobsidian_memoryrag_memoryftp_clientimage_classifierplugin_path — no core changes needed.Core install is intentionally small — just requests, httpx, and python-dotenv. Everything else is an opt-in extra.
# clone and install from source git clone https://github.com/BowlOfData/maki.git cd maki pip install -e . # with an extra, e.g. distributed serving + dev tooling pip install -e ".[dev,distributed]" # everything pip install -e ".[all]"