Apache-2.0 · Python 3.10–3.13 · two packages, one idea

An agent is a loop.
The rest is a workspace.

Send messages and tool schemas to a model. If it calls a tool, run it and loop. If it returns text, stop. Agentino is that loop in about 12,000 lines of Python with three dependencies. Runspace is where you put it in front of people: a Slack-style workspace with channels, threads and direct messages, or a single-pane chat — from the same YAML file.

I built these to learn the agentic stack from the inside, in Python.Why →

weather.py
# the whole API: decorate a function, hand it to an Agent
from agentino kimport Agent, tool
@tool
async def get_weather(city: tstr) -> str:
"""Look up current weather for a city."""
return f"It's 22°C in {city}."
agent = Agent(
instructions="You're a helpful assistant.",
tools=[get_weather],
)
print(kawait agent.run("Weather in Lisbon?"))
workspace.yml
# the whole config: name the agents, serve the room
name: Acme Ops
apps:
analyst:
name: Ada
role: Data analyst
soul: analyst/SOUL.md
tools: analyst/tools/
max_turns: 10
$ python -m workspace.serve workspace.yml
→ streaming chat · channels · cron · widgets

Two projects. One question decides it.

Is a person going to talk to this agent? If no, you want Agentino on its own. If yes, you want Runspace — and Agentino is one of the runtimes you can plug into it.

The runtime

Agentino

A tool-calling loop with the parts you actually need around it: config, retries, gates, sessions, a scheduler.

Reach for it when
  • A script that has to call two APIs and decide something
  • A cron job that reads a mailbox and files what it finds
  • A CLI that answers questions about a codebase
  • Anything with no human waiting on the other end
pip install agentino-frameworkSource on GitHub →
The workspace

Runspace

Two finished interfaces for agents people talk to: a Slack-style team workspace, and a single-pane chat. Streaming, file upload, history, channels and scheduled work come with them.

Reach for it when
  • You want a UI and do not want to build one
  • Several agents in channels, like colleagues
  • An agent reachable from Telegram as well as the web
  • Answers that should render as a chart, not a paragraph
pip install "runspace[agentino,workspace]"Source on GitHub →
Runspace holds the room. Agentino is one runtime in it. A CLI harness is another. Runspace does not depend on Agentino — you install the adapter you want.
Agentino

Small enough to read in an afternoon.

86 modules, about 12,000 lines, three runtime dependencies — httpx, pyyaml, croniter. 657 tests. No graph DSL, no DAG editor, no vector database, no hosted plan. If a feature only makes sense for one deployment, it belongs in that deployment, not here.

@tool decorator
Type hints become a JSON schema. No registry, no base class.
YAML config
Agents, pipelines and tool directories declared in a file.
Staged pipelines
Multi-stage flows with verdicts and jumps between stages.
Gates and hooks
Approve, block or rewrite a tool call before it runs.
Resilience
Retry with backoff, history compaction, a typed error taxonomy.
Sessions
JSONL transcripts you can read with cat.
Scheduler
Cron jobs with file, SQLite or in-memory stores.
Transports
Telegram, Slack, WhatsApp and WebSocket channels.
Workers
Fork an agent, or give one a tool that spawns another.
Knowledge
TF-IDF and embedding search over a document set.
Standard tools
Files, web, memory, weather, documents, translation.
JSON events
A machine-readable event stream for non-Python harnesses.
Runspace

A Slack for your agents, and a chat when that is all you need.

The part nobody wants to build twice. Team mode gives you a sidebar, channels, threads, direct messages, a member grid, an activity log and a settings surface — your agents appear in it the way colleagues do. Dialog mode is a single conversation with a history sidebar. Same workspace.yml, same backend; switch with one line, or ship both and let the user toggle.

Team mode
# general
# invoices
# alerts
Ada
Max
Nova
M
Max
Overdue run finished — 2 invoices, €330.
A
Ada
Posting the weekly summary to #general now.
Channels, threads, DMs, a member grid. Agents sit in it like colleagues.
Dialog mode
New chat
Q3 margins
Referee cards
Home advantage
A
Ada
Liverpool, 84 points. Chart below.
One conversation, a history sidebar, an agent picker. Nothing else.

Both render the same fenced blocks a tool emits — chart, datatable, kpi, insight — as real components. Runspace also splices the canonical block back over whatever the model echoed, so a truncated or mangled payload never reaches the browser.

Streaming chat
Server-sent events, tool-call progress, attachments. A disconnect does not lose the reply.
Channels
Telegram in and out, with pairing and group mention routing.
Routines
Scheduled work declared in a file and run by a cron service.
Swappable adapters
Store, vision, transport, embeddings and clock behind Protocols, chosen by env.
Demos

These are the product, not mock-ups.

Each one is a workspace.yml and a tools directory, served by the same package you can install. The two modes below are the two component sets Runspace ships.

Okkam

live
Team mode · the flagship

Retail analytics. An agent clusters an SKU catalogue with a dendrogram engine, answers questions about it, and draws KPI, chart and insight blocks inline. This is team mode — the same WorkspaceShell described above, running for real.

Touchline

Dialog mode · soon

Nine Premier League seasons — 3,420 matches — queried by an agent writing SQL. Ask it which referees show the most cards, or why home advantage collapsed in 2020/21. Built, not yet deployed.

Single-pane chat

Dialog mode

Dialog mode on its own: one conversation, a history sidebar, an agent picker. It ships in @runspace/ui; there is no standalone deployment of it yet.

Lightweight on purpose. Three dependencies, no graph DSL, no hosted plan — small enough that reading the source is a reasonable way to learn it.

Built and maintained by one person, in the open. Why these exist →