sofias-sdk-lite
Build multi-node agents on a declarative graph and run them against RabbitMQ.
sofias-sdk-lite gives you:
- An agent graph — LLM nodes, function nodes, delegation nodes (agent-to-agent), aggregator nodes (fan-in), and planner nodes (dynamic DAGs), wired together with explicit routing strategies.
- A messaging layer — pydantic wire models (
AgentTaskMessage,StreamFragment, delegation contracts) and a RabbitMQ transport (client, consumer, publisher, RPC, delegation transport) built onaio-pikaand RabbitMQ Streams. - A runner —
AgentRunnerconsumes tasks from a queue, resolves per-request settings, executes your agent, and streams the response back — with graceful shutdown, retries, and circuit breakers built in. - Bring your own LLM —
LLMCallableis a protocol. Wrap any HTTP client, local model, or provider SDK in ~15 lines; no vendor lock-in.
Nothing here depends on a private backend, an internal config service, or a specific LLM vendor. Everything infrastructure-specific is a constructor argument or a protocol you implement yourself.
Install
pip install sofias-sdk-lite
# or
uv add sofias-sdk-lite
Requires Python 3.11+ and a running RabbitMQ broker (with the Streams plugin enabled) if you use the runner or streaming responses.
Quickstart
A minimal agent with a single function node:
import asyncio
from sofias_sdk_lite import (
AgentBuilder,
AgentMessage,
BaseAgentSettings,
InputContract,
NodeContract,
OutputContract,
)
class GreetInput(InputContract):
name: str
class GreetOutput(OutputContract):
greeting: str
class HelloSettings(BaseAgentSettings):
pass
def greet(data: dict, context: dict | None = None) -> dict:
return {"greeting": f"Hello, {data['name']}!"}
async def main() -> None:
contract = NodeContract(input_schema=GreetInput, output_schema=GreetOutput)
agent = (
AgentBuilder("hello_agent", version="0.1.0")
.with_settings_class(HelloSettings)
.with_contract(input_schema=GreetInput, output_schema=GreetOutput)
.add_function_node("greeter", contract, process_fn=greet)
.set_entry_node("greeter")
.set_terminal("greeter")
.build()
)
response = await agent.execute(AgentMessage(content=GreetInput(name="World")))
print(response.content) # {"greeting": "Hello, World!"}
asyncio.run(main())
See examples/ for a runner against a local RabbitMQ
(docker-compose.yml included), tool loops, streaming, and agent-to-agent
delegation.
Running an agent against RabbitMQ
from sofias_sdk_lite import AgentRunner, RunnerConfig, RabbitMQConfig, AgentMessage
class MyAgentRunner(AgentRunner):
settings_class = MySettings
def build_agent(self, settings, workflow):
return (
AgentBuilder("my_agent")
.with_settings_class(type(settings))
.with_response_workflow(workflow)
# ... nodes, routing ...
.build()
)
def prepare_input(self, task, history, role):
return AgentMessage(
content=MyInput(message=task.content, role=role),
conversation_id=task.conversation_id,
)
if __name__ == "__main__":
MyAgentRunner(
RunnerConfig(
queue="my-agent-tasks",
agent_name="my_agent",
rabbitmq=RabbitMQConfig(host="localhost"),
)
).run()
Scope (v1)
Core agent graph, RabbitMQ messaging, and the runner ship today. Memory,
MCP tool discovery, and LLM adapter implementations are intentionally out
of scope for v1 — the SDK ships the relevant protocols
(MemoryProvider, ToolProvider, LLMCallable) so you can plug in your
own, and these become optional extras in a later release.
License
Apache-2.0. See LICENSE.
Release files for sofias-sdk-lite 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sofias_sdk_lite-0.1.2.tar.gz | 120.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sofias_sdk_lite-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 278.9 kB
Release files / sofias_sdk_lite-0.1.2.tar.gz
| Download URL | sofias_sdk_lite-0.1.2.tar.gz |
|---|---|
| Size | 120.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e0579aef92340707436235aa691a40ac8af384c7f5b35ab5020e5b9a3ac51fbe
|
|
BLAKE2b-256 checksum How to use checksums |
f15faf846cd80ef016532c221972ac37e11e7d5f7e2edf6d08dff31624c315ed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / sofias_sdk_lite-0.1.2-py3-none-any.whl
| Download URL | sofias_sdk_lite-0.1.2-py3-none-any.whl |
|---|---|
| Size | 158.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2d1764fbc24c469fec286a8fdbd080711ec78dfaedc401e1696492ea7f1ac0c7
|
|
BLAKE2b-256 checksum How to use checksums |
1a06e08fd03a44a7f6c74c829369255832d1330c003f2b7f83401b98f0490e8b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|