Flowra
Flow infra for building stateful, persistent LLM agents with tool use, parallel execution, and crash recovery. Requires Python 3.12+.
Features
- State machine agents — define agents as
Agent[Spec, Result]classes with@stepmethods, a single entry point, and typed spec/result contracts - Persistent state —
Scalar[T]andMutableList[T]with incremental dirty-tracking and pluggable storage (in-memory, file-based, or custom) - Tool integration —
@tooldecorator for local functions, MCP server support, DI into tool handlers, agents as tools for LLM-driven delegation - LLM abstraction — provider-agnostic
LLMProviderinterface with immutable message types and real-time streaming (shipsAnthropicVertexProvider,AnthropicFoundryProvider,AnthropicBedrockProvider,OpenAIProvider,AzureOpenAIProvider,OpenAIResponsesProvider,GoogleVertexProvider) - Agents as tools —
@agent_tooldecorator exposes an agent as a tool the LLM can call autonomously; sub-agent runs its own system prompt and tool loop - Cooperative interrupts —
InterruptTokenfor graceful cancellation across the entire execution tree - Pre-built agents —
ChatAgent(multi-turn chat with session history) andTurnAgent(single-turn LLM tool loop with hooks and caching)
Installation
# Base package (no LLM providers)
pip install flowra
# With specific providers
pip install flowra[anthropic]
pip install flowra[bedrock]
pip install flowra[openai]
pip install flowra[google]
# All providers
pip install flowra[providers]
Quick start
import asyncio
from flowra.agent import AgentRuntime, InMemorySessionStorage
from flowra.lib import LLMConfig
from flowra.lib.chat import ChatAgent, ChatConfig, ChatResult, ChatSpec
from flowra.llm import SystemMessage, TextBlock
from flowra.llm.providers.openai import OpenAIProvider
async def main() -> None:
async with OpenAIProvider(api_key="sk-...") as provider:
config = ChatConfig(
llm_config=LLMConfig(provider=provider, model="gpt-4o"),
system=[SystemMessage(blocks=[TextBlock(text="You are a helpful assistant.")])],
)
runtime = AgentRuntime(
agents={"chat": ChatAgent},
storage=InMemorySessionStorage(),
services={ChatConfig: config},
)
while True:
user_input = input("You: ")
if not user_input:
break
result = await runtime.run(agent=ChatAgent, spec=ChatSpec.text(user_input))
if isinstance(result, ChatResult) and result.response:
print(f"Assistant: {result.response}")
asyncio.run(main())
Package structure
flowra/
├── llm/ # LLM abstraction (messages, blocks, provider interface)
├── tools/ # Tool definition, registration, execution
├── agent/ # Agent framework + execution engine + persistence
└── lib/ # Pre-built agents (ChatAgent, TurnAgent, hooks, caching)
Documentation
- Getting Started — from installation to a working chatbot with tools in 5 minutes
- Working with LLMs — providers, streaming, structured output, caching, extended thinking
- Tools — tool groups, MCP servers, service injection
- Agents — custom agents, state machines, control flow, parallel execution
- Patterns — multi-agent patterns: router, pipeline, race, fan-out
- Observability — hooks, spans, MLflow and OTel integrations
Development
make deps # install dependencies (uv sync)
make check # lint + test
make chat # run interactive console chat example
Metadata
Release files for flowra 0.0.91
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| flowra-0.0.91.tar.gz | 874.8 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| flowra-0.0.91-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.1 MB
Release files / flowra-0.0.91.tar.gz
| Download URL | flowra-0.0.91.tar.gz |
|---|---|
| Size | 874.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
33b9c75793e243a6953a9b6e74b41fcc72336bf3cd1745ae826a6cd3c18274e7
|
|
BLAKE2b-256 checksum How to use checksums |
b7f7f53cdd7e447c703afd25a23d604f7365eb9be4cfbd679dc5a10ef07c1822
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.4 {"installer":{"name":"uv","version":"0.13.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / flowra-0.0.91-py3-none-any.whl
| Download URL | flowra-0.0.91-py3-none-any.whl |
|---|---|
| Size | 215.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8f4d812135bc61d472c4800b42b340c0ef377655474b018509f7a8a6a0aae42d
|
|
BLAKE2b-256 checksum How to use checksums |
a0551c56ee1bdb681d428b2e106d4bf838c2f7ce04c61664988afd1aa9d06ff3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.4 {"installer":{"name":"uv","version":"0.13.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for flowra 0.0.91
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.