Skip to content

Releases: whiteducksoftware/flock

0.5.500

19 May 12:16
44ce1fa

Choose a tag to compare

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

Full Changelog: 0.5.400...0.5.500

Flock 0.5.400: OpenClaw Integration 🦞

23 Feb 08:49
c159a72

Choose a tag to compare

First-class OpenClaw agent support — use external AI agents with tools, skills, and multi-step reasoning in your Flock pipelines.


🎯 TL;DR

  • 🦞 OpenClaw agentsflock.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-token
flock = 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

  • SecretStr tokensGatewayConfig.token uses Pydantic SecretStr, masked in repr() and model_dump()
  • No token logging — verified zero token exposure in source code
  • Env-first configtoken_env resolves 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/checkout to 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


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.400

Built with 🦞 by the Flock team at white duck

0.5.20

19 Oct 00:42
0e5a0ab

Choose a tag to compare

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 via BoundContextProvider; remove infrastructure access from Context; evaluate provider before Context creation; add docs/examples/tests; bump to 0.5.10. Target Python 3.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

16 Oct 01:32

Choose a tag to compare

What's Changed

Full Changelog: 0.5.3...0.5.8

0.5.3

13 Oct 14:58
98aeee0

Choose a tag to compare

What's Changed

Full Changelog: 0.5.0...0.5.3

Flock 0.5.0: The Blackboard Revolution 🚀

12 Oct 18:41

Choose a tag to compare

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

📖 Full Migration Guide


🌟 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 dashboardhttp://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

Dashboard Preview


🔒 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 this

5 Visibility Types:

  • PublicVisibility - Anyone can consume
  • PrivateVisibility - Only producer can consume
  • TenantVisibility - Multi-tenant isolation
  • LabelledVisibility - 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_tool or 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:

  1. ✅ Pydantic models instead of strings
  2. ✅ Functions instead of Agent classes
  3. ✅ Fluent builder pattern
  4. ✅ No explicit routing (type-driven)
  5. ✅ Store queries for results

📖 Complete Migration Guide with step-by-step examples


🚀 Getting Started

Installation

pip install flock-core==0.5.0

Hello 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...
Read more

0.4.52

30 May 07:20
185ccd7

Choose a tag to compare

What's Changed

Full Changelog: 0.4.51...0.4.52

0.4.51

24 May 12:28
cdbcadd

Choose a tag to compare

What's Changed

Full Changelog: 0.4.5...0.4.51

0.4.5 - MCP Server Support has landed!

21 May 19:22
31800a7

Choose a tag to compare

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

21 May 01:07
6742331

Choose a tag to compare

What's Changed

Full Changelog: 0.4.1...0.4.3