Releases: whiteducksoftware/flock
0.5.500
What's Changed
- feat(engines): Azure Entra ID / Managed Identity auth via lm_kwargs passthrough (#377) by @nmeisenzahl in #379
- chore(deps): bump urllib3 from 2.5.0 to 2.6.3 by @dependabot[bot] in #381
- feat: Add GuardComponent framework for pluggable input/output safety guards by @Copilot in #382
- chore: bump version to 0.5.402 for PyPI publish by @AndreRatzenberger in #384
- update/litellm: update litellm to version == 1.83.0 by @tilman-sattler in #385
- update/litellm: ugrade litellm to version == 1.83.7 by @tilman-sattler in #386
- chore(deps-dev): bump vite from 7.2.4 to 7.3.3 in /src/flock/frontend by @dependabot[bot] in #387
- update/dspy: update dspy to fix transitive dependency issues by @tilman-sattler in #388
- fix/requirements: update requirements.txt by @tilman-sattler in #389
- chore(deps-dev): bump rollup from 4.52.4 to 4.60.3 in /src/flock/frontend by @dependabot[bot] in #390
- chore(deps-dev): bump flatted from 3.3.3 to 3.4.2 in /src/flock/frontend by @dependabot[bot] in #391
- chore(deps): bump gitpython from 3.1.45 to 3.1.50 by @dependabot[bot] in #392
- chore(deps): bump tornado from 6.5.2 to 6.5.5 by @dependabot[bot] in #393
- chore(deps): bump mistune from 3.1.4 to 3.2.1 by @dependabot[bot] in #394
- chore(deps): bump lodash from 4.17.21 to 4.18.1 in /src/flock/frontend by @dependabot[bot] in #396
- chore(deps): bump mcp from 1.20.0 to 1.23.0 by @dependabot[bot] in #397
- chore(deps-dev): bump postcss from 8.5.6 to 8.5.14 in /src/flock/frontend by @dependabot[bot] in #398
- chore(deps): bump pillow from 12.0.0 to 12.2.0 by @dependabot[bot] in #395
- chore(deps-dev): bump minimatch from 9.0.5 to 9.0.9 in /src/flock/frontend by @dependabot[bot] in #399
- chore(deps): bump nbconvert from 7.16.6 to 7.17.1 by @dependabot[bot] in #401
- chore(deps): bump jupyter-server from 2.17.0 to 2.18.0 by @dependabot[bot] in #400
- update/jupyter: bump notebook version by @tilman-sattler in #402
- update/pytest: updating pytest-asyncio version by @tilman-sattler in #403
- chore(deps): bump pytest from 8.4.2 to 9.0.3 by @dependabot[bot] in #404
- chore(deps): bump virtualenv from 20.35.4 to 20.36.1 by @dependabot[bot] in #405
- chore(deps): bump uuid from 13.0.0 to 14.0.0 in /src/flock/frontend by @dependabot[bot] in #406
- update/sentence-transformers: bump version for transformers package t… by @tilman-sattler in #407
- chore(deps-dev): bump picomatch from 4.0.3 to 4.0.4 in /src/flock/frontend by @dependabot[bot] in #408
- update/python-dotenv: bump version for litellm and python-dotenv to close alerts by @tilman-sattler in #409
- chore(release): bump version to 0.5.500 by @AndreRatzenberger in #411
New Contributors
- @nmeisenzahl made their first contribution in #379
- @dependabot[bot] made their first contribution in #381
- @Copilot made their first contribution in #382
Full Changelog: 0.5.400...0.5.500
Flock 0.5.400: OpenClaw Integration 🦞
First-class OpenClaw agent support — use external AI agents with tools, skills, and multi-step reasoning in your Flock pipelines.
🎯 TL;DR
- 🦞 OpenClaw agents —
flock.openclaw_agent("alias")with the same fluent API - ✅ Same DX —
.consumes().publishes()just works - ✅ Full toolkit — tools, skills, web search, file access, multi-step reasoning
- ✅ Mix freely — OpenClaw + native agents in the same pipeline
- ✅ Streaming parity — CLI + dashboard SSE streaming with automatic fallback
- ✅ Fan-out + multi-output — full parity with native engine semantics
- ✅ Zero breaking changes — all existing Flock features work unchanged
- 🔒 SecretStr tokens — gateway tokens masked in repr/logs by default
🌟 What's New
🦞 OpenClaw Engine (Phase 1)
Use OpenClaw agents as first-class Flock pipeline participants:
from flock import Flock, OpenClawConfig, GatewayConfig
flock = Flock(
openclaw=OpenClawConfig(
gateways={
"codex": GatewayConfig(
url="http://localhost:19789",
token_env="OPENCLAW_CODEX_TOKEN",
)
}
)
)
# One-line swap: agent() → openclaw_agent()
implementer = (
flock.openclaw_agent("codex")
.description("Implements features using tools and reasoning")
.consumes(FeatureSpec)
.publishes(Implementation)
)
# Mix freely with standard LLM agents
reviewer = flock.agent("reviewer").consumes(Implementation).publishes(Review)Or auto-discover gateways from environment:
export OPENCLAW_CODEX_URL=http://localhost:19789
export OPENCLAW_CODEX_TOKEN=your-tokenflock = Flock(openclaw=OpenClawConfig.from_env())SSE Streaming (CLI + Dashboard)
- Dashboard: streams SSE deltas to WebSocket sinks in real-time
- CLI: Rich terminal live panels with lobster label 🦞
- Fallback: automatic non-streaming fallback if SSE fails mid-flight
- Concurrency guard: same single-stream CLI guard as DSPy engine
Fan-Out + Multi-Output
- Single output fan-out: JSON array contract with fixed or dynamic range
- Multi-output groups: JSON envelope contract keyed by slot/type name
- Per-slot validation: schema + cardinality constraints enforced before publish
Error Handling
| Failure | Exception | Retried? |
|---|---|---|
| Gateway unreachable / timeout | RuntimeError |
Yes |
| Auth failure (401/403) | ValueError |
No (fail-fast) |
| Invalid JSON response | RuntimeError |
Yes (repair attempt) |
| Rate limit (429) / server error (5xx) | RuntimeError |
Yes |
Reliability Counters
Built-in telemetry for parse retries, fallback triggers, repair success rates — logged every 25 requests.
🛡️ Security
SecretStrtokens —GatewayConfig.tokenuses PydanticSecretStr, masked inrepr()andmodel_dump()- No token logging — verified zero token exposure in source code
- Env-first config —
token_envresolves from environment at construction time
🏗️ CI/CD
- PyPI publish workflow now triggers on GitHub releases instead of push-to-main
- Fixed double-publish matrix bug, bumped
actions/checkoutto v4
📊 Release Stats
- 2,300+ tests (155 OpenClaw-specific across 6 test files)
- 3,230 lines of OpenClaw test code
- 1,316 lines engine implementation
- 494 lines SSE streaming implementation
- 398 lines integration guide
- 6 working examples in
examples/11-openclaw/ - Phase 1–4 design spec in
docs/specs/004-openclaw-integration/
📖 Documentation
- OpenClaw Integration Guide — config, streaming, remote setup, troubleshooting
- Examples — from "Hello Pizza" to competitive intelligence pipelines
- Design Spec — full Phase 1–4 roadmap
What's Changed
- feat: OpenClaw integration — Phase 1 (spawn mode, dashboard badge, examples & docs) by @AndreRatzenberger in #376
Full Changelog: 0.5.20...0.5.400
📦 Install
pip install flock-core==0.5.400Built with 🦞 by the Flock team at white duck
0.5.20
What's Changed
- chore: integrate Codecov for dynamic coverage badges by @AndreRatzenberger in #331
- feat(security): Introduce Context Provider boundary with
BaseContextProvider+FilteredContextProvider; orchestrator‑bound identity viaBoundContextProvider; remove infrastructure access fromContext; evaluate provider beforeContextcreation; add docs/examples/tests; bump to0.5.10. Target Python3.12+. by @AndreRatzenberger in #332 - feat: REST API enhancements with correlation tracking and error handling by @AndreRatzenberger in #335
- Release v0.5.20: Complete Architectural Refactoring by @AndreRatzenberger in #336
Full Changelog: 0.5.8...0.5.20
0.5.8
What's Changed
- feat: Complete Logic Operations UX - JoinSpec & BatchSpec Real-Time Visualization by @AndreRatzenberger in #325
- feat: finish evaluate_batch implementation by @AndreRatzenberger in #326
- feat: Add OrchestratorComponent system with logging and examples by @AndreRatzenberger in #327
- chore: sub-exception logging by @AndreRatzenberger in #328
- feat: Multi-Output Fan-Out with Comprehensive Documentation by @AndreRatzenberger in #329
Full Changelog: 0.5.3...0.5.8
0.5.3
What's Changed
- Fix DSPy streaming deadlock + reorganize examples with learning path by @AndreRatzenberger in #322
- fix: correct docs URL and add MIT license by @AndreRatzenberger in #323
- feat: Logic Operations - Predicates, JoinSpec, BatchSpec (v0.5.3) by @AndreRatzenberger in #324
Full Changelog: 0.5.0...0.5.3
Flock 0.5.0: The Blackboard Revolution 🚀
Complete architectural rewrite from workflow orchestration to event-driven intelligence
We're excited to announce Flock 0.5.0, a ground-up reimplementation of our multi-agent orchestration framework. This release moves from workflow-based coordination to a proven Blackboard Architecture pattern, delivering the scalability, observability, and type safety needed for production AI systems.
🎯 TL;DR
- ✅ 80% smaller - Removed PyTorch, cut install size from 3.2GB → 650MB
- ✅ 100-500x faster handoffs - Instant agent coordination (<1ms)
- ✅ Type-safe contracts - Pure Pydantic models with compile-time validation
- ✅ Real-time dashboard - WebSocket streaming with dual visualization modes
- ✅ Production safety - Circuit breakers, feedback prevention, visibility controls
- ❌ Zero backward compatibility - This is a complete rewrite
⚠️ BREAKING CHANGES
This release has ZERO backward compatibility with 0.4.x
Flock 0.5 is not an incremental update—it's a complete architectural reimplementation. All 0.4 code will need to be rewritten.
Major Breaking Changes
| Component | 0.4 | 0.5 |
|---|---|---|
| Architecture | Workflow orchestration | Blackboard pattern |
| Agent Definition | Agent class + FlockFactory |
Fluent builder: flock.agent().consumes() |
| Type System | String signatures | Pydantic models with @flock_type |
| Routing | Explicit Router config |
Automatic type-based matching |
| Execution | flock.run(context) |
flock.publish() + run_until_idle() |
| Dependencies | Temporal.io + PyTorch | Event-driven + DuckDB |
Migration Effort:
- Small systems (1-5 agents): 1-2 days
- Medium systems (6-20 agents): 1 week
- Large systems (20+ agents): 2-4 weeks
🌟 What's New
🏗️ Blackboard Architecture
Flock 0.5 adopts the Blackboard Architecture pattern—a proven approach from classical AI research (Hearsay-II, 1970s) that's seeing renewed adoption in modern LLM systems.
Why Blackboard?
- Proven Pattern: Battle-tested in production systems for 50+ years
- Natural Parallelism: Agents execute concurrently without explicit coordination
- Loose Coupling: Add/remove agents without breaking the system
- Observable: Every interaction flows through a single, queryable store
- Scalable: O(n) complexity vs O(n²) in direct agent-to-agent communication
Recent research shows blackboard + MCP achieves competitive performance with SOTA multi-agent systems while using fewer tokens (arxiv.org/abs/2507.01701).
Before (0.4): Workflow Orchestration
# Explicit handoffs, sequential execution
context = FlockContext(data)
result = await flock.run(context, entry_agent="start")After (0.5): Event-Driven Blackboard
# Publish data, agents coordinate automatically
await flock.publish(UserRequest(query="..."))
await flock.run_until_idle() # Parallel execution🎨 Real-Time Dashboard
Launch: flock dashboard → http://localhost:3000
Features:
- Dual Visualization Modes:
- Agent View: Network graph showing agent relationships and message flows
- Blackboard View: Data lineage showing artifact transformations
- WebSocket Streaming: Zero-lag updates as agents execute
- Trace Viewer: 7 modes (Timeline, Waterfall, Gantt, Flamegraph, Sunburst, Icicle, Sankey)
- SQL Query Interface: AI-queryable telemetry via DuckDB
- Agent Metrics: Real-time message counts, execution status, streaming tokens
🔒 Type-Safe Contracts
Pure Pydantic models replace string-based signatures:
from flock import flock, flock_type
from pydantic import BaseModel
@flock_type
class UserRequest(BaseModel):
query: str
max_results: int = 10
@flock_type
class Results(BaseModel):
findings: list[str]
confidence: float
# Type-driven flow - no router config needed!
researcher = flock.agent("researcher").consumes(UserRequest).publishes(Results).does(research)
summarizer = flock.agent("summarizer").consumes(Results).publishes(Summary).does(summarize)Benefits:
- ✅ Compile-time validation catches type errors early
- ✅ IDE autocomplete and type checking
- ✅ Self-documenting contracts
- ✅ Automatic routing based on type relationships
🛡️ Production Safety
Circuit Breakers:
flock = Flock.builder().with_circuit_breaker(
failure_threshold=5,
timeout_seconds=30
).build()Feedback Prevention:
agent = flock.agent("analyzer")
.consumes(Report)
.publishes(Analysis)
.prevents_feedback() # Won't consume its own output
.does(analyze)Visibility Controls:
@flock_type
class PatientData(BaseModel):
diagnosis: str
visibility: TenantVisibility(tenant_id="hospital-123")
# Only agents with matching tenant_id can see this5 Visibility Types:
PublicVisibility- Anyone can consumePrivateVisibility- Only producer can consumeTenantVisibility- Multi-tenant isolationLabelledVisibility- Role-based access (RBAC-style)AfterVisibility- Time-delayed release
📊 AI-Queryable Telemetry
DuckDB + OpenTelemetry for production observability:
- 10-100x faster than SQLite for analytical queries
- Jaeger-compatible distributed traces
- SQL interface in dashboard for custom queries
- AI-queryable: LLMs can write queries to analyze behavior
Example Dashboard Query:
SELECT
agent_name,
AVG(duration_ms) as avg_duration,
COUNT(*) as executions
FROM agent_runs
WHERE started_at > NOW() - INTERVAL '1 hour'
GROUP BY agent_name
ORDER BY avg_duration DESC;🔧 MCP (Model Context Protocol) Integration
Extensible tool ecosystem:
# Use community MCP servers
flock.with_mcp_server(
name="brave-search",
command="npx",
args=["-y", "@modelcontextprotocol/server-brave-search"],
env={"BRAVE_API_KEY": os.getenv("BRAVE_API_KEY")}
)
# Or create custom tools
@flock_tool
async def custom_tool(param: str) -> str:
"""Your custom tool logic."""
return f"Processed: {param}"💾 Persistent Blackboard Store
SQLite-backed storage with full audit trail:
from flock.store import FilterConfig
# Query artifacts by type, tags, time range
artifacts = await flock.store.query_artifacts(
FilterConfig(
type_names={"UserRequest"},
tags={"priority:high"},
start=datetime(2024, 1, 1)
),
limit=100
)Features:
- ✅ Every artifact persisted with metadata
- ✅ Consumption tracking (who, what, when)
- ✅ Tag-based filtering and correlation IDs
- ✅ Time-range queries
📈 Performance Improvements
| Metric | 0.4 | 0.5 | Improvement |
|---|---|---|---|
| Install Size | 3.2 GB | 650 MB | 80% smaller |
| Dependencies | 47 pkgs | 23 pkgs | 51% fewer |
| Agent Handoff | 100-500ms | <1ms | 100-500x faster |
| Routing | O(n²) | O(n) | Linear scaling |
| PyTorch | Required | Removed | ✅ |
Benchmark: 10-Agent Pipeline
- Sequential: 5.2s → 0.8s (6.5x faster)
- Parallel: 3.1s → 0.2s (15.5x faster)
- Memory: 450 MB → 90 MB (80% less)
🗑️ Removed Features
The following components have been removed in 0.5:
- ❌ Temporal.io integration - Replaced with event-driven coordination
- ❌ PyTorch dependency - Removed 2.5GB unnecessary dependency
- ❌ Router class - Type system provides automatic routing
- ❌ FlockContext - Use immutable Artifacts instead
- ❌ Agent base class - Use async functions with
.does(handler) - ❌ Module system - Use
@flock_toolor MCP servers - ❌ String signatures - Use Pydantic models with
@flock_type
📚 Migration Guide
Quick Migration Pattern
0.4 Agent:
class MyAgent(Agent):
def __init__(self):
self.input_signature = "query: str"
self.output_signature = "results: List[str]"
async def execute(self, context: FlockContext) -> str:
query = context.data["query"]
results = await self.process(query)
context.set_result({"results": results})
return "next_agent"0.5 Agent:
@flock_type
class Query(BaseModel):
query: str
@flock_type
class Results(BaseModel):
results: list[str]
async def my_handler(query: Query) -> Results:
results = await process(query.query)
return Results(results=results)
agent = flock.agent("my_agent").consumes(Query).publishes(Results).does(my_handler)Key Changes:
- ✅ Pydantic models instead of strings
- ✅ Functions instead of Agent classes
- ✅ Fluent builder pattern
- ✅ No explicit routing (type-driven)
- ✅ Store queries for results
📖 Complete Migration Guide with step-by-step examples
🚀 Getting Started
Installation
pip install flock-core==0.5.0Hello World
from flock import Flock, flock, flock_type
from pydantic import BaseModel
@flock_type
class Greeting(BaseModel):
name: str
@flock_type
class Response(BaseModel):
message: str
async def greet(greeting: Greeting) -> Response:
return Response(message=f"Hello, {greeting.name}!")
# Build orchestrator
orchestrator = (
Flock.builder()
.with_agent(
flock.agent("greet...0.4.52
What's Changed
- Hide 'run flock' pane and improve accessibility by @AndreRatzenberger in #118
- Feat/base-url by @AndreRatzenberger in #120
- Flock MCP: Support Streamable HTTP Transport by @tilman-sattler in #119
- Feat/docker-code-env by @AndreRatzenberger in #121
- Feat/file-append by @AndreRatzenberger in #122
- fix: https proxy to route server https to webapp http by @AndreRatzenberger in #123
- Fix/middleware by @AndreRatzenberger in #124
- Fix/feedback by @AndreRatzenberger in #125
- fix: themes form preview by @AndreRatzenberger in #126
- feat: upate package versioning by @AndreRatzenberger in #129
Full Changelog: 0.4.51...0.4.52
0.4.51
What's Changed
- Added MCP info to readme by @AndreRatzenberger in #101
- Fix: #104 - Rework Logging by @AndreRatzenberger in #105
- fix: workflows trigger from master to main by @AndreRatzenberger in #106
- versioning for triggering workflow by @AndreRatzenberger in #107
- fix: Flock banner fix by @AndreRatzenberger in #108
- fix: README improvements and small UI design issues by @AndreRatzenberger in #110
- fix: #111 - chat feedback formular always open in standalone mode by @AndreRatzenberger in #112
- feat: [skip publish] will make a pr/merge with no publish and just the build afterwards / sync submodule by @AndreRatzenberger in #113
- Feat: Opik Integration + Evaluation with Opik by @AndreRatzenberger in #114
- fix: #98 - Fix/chat in sidebar by @AndreRatzenberger in #116
- Implemented ZenDesk Tools as mcp + small fixes by @AndreRatzenberger in #117
Full Changelog: 0.4.5...0.4.51
0.4.5 - MCP Server Support has landed!
What's Changed
- Modelcontextprotocol (MCP) - Features: Part 1 (Foundations): MCP-Tools, Servers and Tool discovery. by @tilman-sattler in #95
Create a server
ws_fetch_server = FlockFactory.create_mcp_server(
name="fetch_server",
enable_tools_feature=True,
connection_params=FlockFactory.WebsocketParams(
url="ws://localhost:4001/message"
),Add it to Flock
flock = Flock(
name="mcp_testbed",
servers=[
ws_fetch_server
]
)And tell the flock agents which server to use
webcrawler_agent = FlockFactory.create_default_agent(
name="webcrawler_agent",
description="Expert for looking up and retrieving web content",
input="query: str | User-Query, initial_url: Optional[str] | Optional url to start search from.",
output="answer: str | Answer to user-query, page_url: str | The url of the page where the answer was found on, page_content: str | Markdown content of the page where the answer was found.",
servers=[ws_fetch_server], # servers are passed here.
)Done! The Flock agent has now access to every tool the server offers.
Full Changelog: 0.4.3...0.4.5
0.4.3
What's Changed
- README and small UI design fixes / magpie logo by @AndreRatzenberger in #93
- added high-level changelog to readme by @AndreRatzenberger in #94
Full Changelog: 0.4.1...0.4.3
