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 →
# the whole API: decorate a function, hand it to an Agentfrom agentino kimport Agent, tool@toolasync 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?"))# the whole config: name the agents, serve the roomname: Acme Opsapps: 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 · widgetsIs 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.
A tool-calling loop with the parts you actually need around it: config, retries, gates, sessions, a scheduler.
pip install agentino-frameworkSource on GitHub →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.
pip install "runspace[agentino,workspace]"Source on GitHub →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.
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.
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.
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.
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.
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.
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 →