A lightweight, layered Agent framework for Python
What's New
2026-08 (v0.3.4)
- Web UI — A FastAPI gateway + React dashboard for agents, sessions, workspaces, and settings.
quenda webfor foreground use,quenda gatewayfor a background service. - Self-Evolution Platform — Post-run memory evolution with
automatic/review/disabledwrite modes, plus staged skill proposals with validation and rollback. - Config-Driven Providers — Declare
builtinoverrides,customOpenAI-compatible endpoints, and localllama-serverpresets directly inconfig.yaml(ADR-035).
2026-06 (v0.3.0)
- Skills Framework — Composable capability packages with instructions, resources, and tools. Discover, activate, and use skills on demand. Learn more →
- Context Compression — Automatic summarization when context grows large, with configurable policies and manual
/compresscommand. - Interaction Requests — LLM can ask users for choices, confirmations, and input via structured interaction protocol.
- Custom Tool Extensions — Agent-local tools via
extensions/tools/*.pywithconfig.yamldeclaration. - Policy System — Runtime policies for termination, tool selection, and result processing.
- Multimodal Support — Image input support with resource activation.
- 26 Model Providers — OpenAI, Anthropic, DeepSeek, DashScope, Moonshot, Ollama, and 20 more.
Quenda Code
Quenda Code is an AI coding agent that runs in your terminal. It reads your codebase, writes code, runs commands, and helps you ship.
# Install
pip install quenda quenda-code
# Start interactive session
quenda code
# One-shot task
quenda code "Add error handling to the API client"
Personal Agents
Create a long-lived local agent with its own prompts, skills, memory, sessions, and default workspace:
quenda agent create reviewer
quenda reviewer
Seed an independent agent from an installed package or source directory:
quenda agent create coder --from quenda-code
quenda agent create writer --from ./agents/writer
Agents live under ~/.quenda/agent-<name>/. Without --workspace, they work
inside their own workspace/; the same agent can enter a project explicitly:
quenda reviewer --workspace ~/Workspace/my-project
Features
- Code-aware — Reads and understands your codebase structure
- Workspace-aware — File tools resolve paths against the selected project; local execution follows explicit permissions and trust policy
- Explicit execution trust — Local shell/Python run as
local-trusted; strong isolation must use a future isolated backend - Session persistence — Conversations saved and resumable
- Interactive mode switching — Switch between
code,architect, andchatmodes - Skills on demand — Activate capability packages as needed
REPL Commands
| Command | Description |
|---|---|
/help |
Show available commands |
/mode [code|architect|chat] |
Switch interaction mode |
/model <provider>/<model> |
Switch model mid-session |
/skill list |
List available skills |
/skill activate <name> |
Activate a skill |
/compress |
Manually compress context |
/status |
Show session and token info |
/reset |
Clear conversation history |
Example Session
> read the main entry point and explain how it works
I'll read the main entry point...
[Reads src/quenda/cli.py]
The entry point is `cli.py:main()`. It defines two subcommands:
- `quenda run --agent <path>` — Run a custom agent from AGENT.md
- `quenda code` — Run Quenda Code Agent (built-in)
Each command supports one-shot mode (with a message) or REPL mode (without).
> add a --version flag to the CLI
I'll add a `--version` flag to the argument parser...
[Applies patch to cli.py]
Done. Added `--version` flag that prints the version and exits.
> run the tests
[Runs pytest]
All 42 tests passed.
Quenda SDK
Build agents in Python with a minimal API:
from quenda import Agent, tool
from quenda.providers import get_provider_registry
from quenda.tools import get_core_tools
import asyncio
@tool
def calculate(expression: str) -> float:
"""Safely evaluate a math expression."""
import ast
node = ast.parse(expression, mode='eval')
return eval(compile(node, '<string>', 'eval'), {"__builtins__": {}}, {})
model = get_provider_registry().get_model("deepseek", "deepseek-v4-flash")
agent = Agent(
name="assistant",
system_prompt="You are a helpful assistant.",
tools=[calculate, *get_core_tools(".")],
model=model,
)
async def main():
session = agent.open_session()
result = await session.send("What is 15% of 847?")
print(result)
asyncio.run(main())
📖 SDK Tutorials — 8 chapters covering agents, tools, providers, sessions, and events.
Installation
# Quenda Code — AI coding assistant (CLI)
pip install quenda quenda-code
# Quenda SDK — Build agents in Python
pip install quenda
Requires Python 3.12+. Zero required runtime dependencies.
Web UI
A FastAPI gateway plus React dashboard to manage agents, sessions, workspaces, and settings from the browser:
pip install "quenda[web]" # optional dependencies
quenda web --port 8000 # foreground (dev)
quenda gateway start # background service
quenda gateway status
quenda gateway logs
quenda gateway stop
Pages cover agents (create/edit/detail with model picker), sessions (chat with streaming events), workspaces, and settings. Sessions run through the same Host layer as the CLI.
Features
- Minimal API.
Agent,Session,@tool, and you're done. - 27 model providers. OpenAI, Anthropic, DeepSeek, DashScope, and more — one registry, one API.
- Core tools. Filesystem, local-trusted shell/Python, and user interaction.
- Skills framework. Composable capability packages with instructions and resources.
- Explicit security contracts. SSRF protection, command filtering, permissions, and fail-closed isolation requirements.
- Observable by default. Every run emits structured events for streaming and debugging.
- Context compression. Automatic summarization when context grows large.
- Self-evolution. Post-run memory writes and staged skill proposals, auditable and roll-back-able.
- Config-driven providers. Built-in overrides, custom OpenAI-compatible endpoints, and
llama-serverpresets inconfig.yaml. - Web UI. Optional FastAPI/React dashboard with
quenda webandquenda gateway.
Model Providers
Quenda ships with 27 built-in providers covering 300+ models:
| Provider | Example Models | API Key Env |
|---|---|---|
openai |
gpt-4o, gpt-4-turbo |
OPENAI_API_KEY |
anthropic |
claude-3-5-sonnet-20241022 |
ANTHROPIC_API_KEY |
agnes |
agnes-2.0-flash |
AGNES_API_KEY |
deepseek |
deepseek-chat, deepseek-v4-flash |
DEEPSEEK_API_KEY |
deepseek-anthropic |
deepseek-v4-flash (Anthropic API) |
DEEPSEEK_API_KEY |
dashscope |
qwen-max, qwen-plus |
DASHSCOPE_API_KEY |
moonshot |
moonshot-v1-8k, moonshot-v1-128k |
MOONSHOT_API_KEY |
openrouter |
anthropic/claude-3.5-sonnet |
OPENROUTER_API_KEY |
ollama |
llama3, mistral, qwen2 |
local (no key) |
Add a custom provider in 5 lines:
from quenda.providers import ProviderSpec, ModelSpec, get_provider_registry
registry = get_provider_registry()
registry.register(ProviderSpec(
id="my-provider",
name="My Provider",
base_url="https://api.example.com/v1",
api="openai-completions",
api_key="${MY_API_KEY}",
models=(ModelSpec(id="my-model", name="My Model", tool_calling=True),),
))
Agents can also declare providers in config.yaml — a builtin override, a
custom OpenAI-compatible endpoint, or a llama-server preset — and select
roles with models.default / models.vision using provider/model
(ADR-035):
providers:
openai:
api_key: "${OPENAI_API_KEY}"
local-llama:
type: llama-server
url: http://127.0.0.1:8080/v1
models:
- id: "qwen3.5:9b"
tool_calling: true
models:
default: openai/gpt-4o
vision: local-llama/qwen3.5:9b
Built-in Tools
get_core_tools(workspace) returns 11 essential framework tools:
| Tool | Capability |
|---|---|
list_files |
Browse directories (ls, find, tree) |
search_text |
Search file contents (grep, rg) |
read_file |
View files with line ranges |
write_file |
Create or overwrite files |
apply_patch |
Apply targeted text patches |
run_shell |
Execute shell commands (filtered) |
execute_python |
Run Python code in subprocess |
get_current_datetime |
Get exact current time or convert timezones |
request_interaction |
Ask the user for structured input |
request_skill_activation |
Ask Host to activate discovered skills |
activate_resource |
Attach a historical session resource |
Architecture
Interface → Host → Runtime → Kernel
| Layer | Responsibility |
|---|---|
| Kernel | Synchronous model-tool loop. No knowledge of agents, sessions, or users. |
| Runtime | Async Agent/Session/Run lifecycle. Event emission, context management. |
| Host | Persistence, identity, permissions, instruction composition, skills. |
| Interface | Event rendering, user interaction, REPL. |
Each layer depends only on the layer inside it. The Kernel is fully testable with fake models — no network required.
Documentation
| Resource | Description |
|---|---|
| Getting Started | Setup and your first agent |
| Tools Guide | All built-in tools with parameters |
| Skills Guide | Capability packages system |
| API Reference | Complete API reference |
| SDK Tutorials | Step-by-step Python SDK guide (8 chapters) |
| CLI Tutorials | Step-by-step Quenda Code guide (5 chapters) |
| Architecture Decisions | ADR records |
Contributing
Quenda is intentionally small. Before making a change, read CLAUDE.md and the ADR records.
- Identify which architectural layer owns the change.
- Prefer the smallest complete change; add tests with behavior changes.
- Do not cross established layer boundaries.
pip install -e ".[dev]" # editable install with dev tooling
pytest # run tests
ruff check src/quenda # lint
License
MIT
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 quenda-0.3.5.tar.gz.
File metadata
- Download URL: quenda-0.3.5.tar.gz
- Upload date:
- Size: 473.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b5f1f159e45fc5386e2cfc3ae519a32a0830078b9a9241085556fc35b69d4d4c
|
|
| MD5 |
4de9ac6362681f4bdd17ba59681f4034
|
|
| BLAKE2b-256 |
8f025ea372ea9b28c8d652a22cff3c029d4d51c006c82adf7a384fc52ae2fcbf
|
Provenance
The following attestation bundles were made for quenda-0.3.5.tar.gz:
Publisher:
publish-quenda.yml on xvshiting/quenda
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
quenda-0.3.5.tar.gz -
Subject digest:
b5f1f159e45fc5386e2cfc3ae519a32a0830078b9a9241085556fc35b69d4d4c - Sigstore transparency entry: 2498411614
- Sigstore integration time:
-
Permalink:
xvshiting/quenda@51e611db3b9bbad80daefe3bfc692aaceace4e01 -
Branch / Tag:
refs/tags/quenda-v0.3.5 - Owner: https://github.com/xvshiting
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-quenda.yml@51e611db3b9bbad80daefe3bfc692aaceace4e01 -
Trigger Event:
push
-
Statement type:
File details
Details for the file quenda-0.3.5-py3-none-any.whl.
File metadata
- Download URL: quenda-0.3.5-py3-none-any.whl
- Upload date:
- Size: 574.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d687723d2f8dc0ed835011502ab9039f1444c7377cffb756be1b8be682ccc2c
|
|
| MD5 |
657356fefb2ce47da69483b90defcd79
|
|
| BLAKE2b-256 |
4129a5a9899795450bab1ca866ef231e9a7e467f053c7ba09a40b963efdc3aca
|
Provenance
The following attestation bundles were made for quenda-0.3.5-py3-none-any.whl:
Publisher:
publish-quenda.yml on xvshiting/quenda
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
quenda-0.3.5-py3-none-any.whl -
Subject digest:
9d687723d2f8dc0ed835011502ab9039f1444c7377cffb756be1b8be682ccc2c - Sigstore transparency entry: 2498411628
- Sigstore integration time:
-
Permalink:
xvshiting/quenda@51e611db3b9bbad80daefe3bfc692aaceace4e01 -
Branch / Tag:
refs/tags/quenda-v0.3.5 - Owner: https://github.com/xvshiting
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-quenda.yml@51e611db3b9bbad80daefe3bfc692aaceace4e01 -
Trigger Event:
push
-
Statement type: