flock-core 0.5.0b59__py3-none-any.whl → 0.5.0b60__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of flock-core might be problematic. Click here for more details.
- flock/agent.py +181 -0
- flock/frontend/package.json +1 -1
- flock/orchestrator.py +127 -0
- {flock_core-0.5.0b59.dist-info → flock_core-0.5.0b60.dist-info}/METADATA +15 -4
- {flock_core-0.5.0b59.dist-info → flock_core-0.5.0b60.dist-info}/RECORD +8 -8
- {flock_core-0.5.0b59.dist-info → flock_core-0.5.0b60.dist-info}/WHEEL +0 -0
- {flock_core-0.5.0b59.dist-info → flock_core-0.5.0b60.dist-info}/entry_points.txt +0 -0
- {flock_core-0.5.0b59.dist-info → flock_core-0.5.0b60.dist-info}/licenses/LICENSE +0 -0
flock/agent.py
CHANGED
|
@@ -362,6 +362,22 @@ class AgentBuilder:
|
|
|
362
362
|
# Fluent configuration -------------------------------------------------
|
|
363
363
|
|
|
364
364
|
def description(self, text: str) -> AgentBuilder:
|
|
365
|
+
"""Set the agent's description for documentation and tracing.
|
|
366
|
+
|
|
367
|
+
Args:
|
|
368
|
+
text: Human-readable description of what the agent does
|
|
369
|
+
|
|
370
|
+
Returns:
|
|
371
|
+
self for method chaining
|
|
372
|
+
|
|
373
|
+
Example:
|
|
374
|
+
>>> agent = (
|
|
375
|
+
... flock.agent("pizza_chef")
|
|
376
|
+
... .description("Creates authentic Italian pizza recipes")
|
|
377
|
+
... .consumes(Idea)
|
|
378
|
+
... .publishes(Recipe)
|
|
379
|
+
... )
|
|
380
|
+
"""
|
|
365
381
|
self._agent.description = text
|
|
366
382
|
return self
|
|
367
383
|
|
|
@@ -379,6 +395,59 @@ class AgentBuilder:
|
|
|
379
395
|
mode: str = "both",
|
|
380
396
|
priority: int = 0,
|
|
381
397
|
) -> AgentBuilder:
|
|
398
|
+
"""Declare which artifact types this agent processes.
|
|
399
|
+
|
|
400
|
+
Sets up subscription rules that determine when the agent executes.
|
|
401
|
+
Supports type-based matching, conditional filters, batching, and joins.
|
|
402
|
+
|
|
403
|
+
Args:
|
|
404
|
+
*types: Artifact types (Pydantic models) to consume
|
|
405
|
+
where: Optional filter predicate(s). Agent only executes if predicate returns True.
|
|
406
|
+
Can be a single callable or sequence of callables (all must pass).
|
|
407
|
+
text: Optional semantic text filter using embedding similarity
|
|
408
|
+
min_p: Minimum probability threshold for text similarity (0.0-1.0)
|
|
409
|
+
from_agents: Only consume artifacts from specific agents
|
|
410
|
+
channels: Only consume artifacts with matching tags
|
|
411
|
+
join: Join specification for coordinating multiple artifact types
|
|
412
|
+
batch: Batch specification for processing multiple artifacts together
|
|
413
|
+
delivery: Delivery mode - "exclusive" (one agent) or "broadcast" (all matching)
|
|
414
|
+
mode: Processing mode - "both", "streaming", or "batch"
|
|
415
|
+
priority: Execution priority (higher = executes first)
|
|
416
|
+
|
|
417
|
+
Returns:
|
|
418
|
+
self for method chaining
|
|
419
|
+
|
|
420
|
+
Examples:
|
|
421
|
+
>>> # Basic type subscription
|
|
422
|
+
>>> agent.consumes(Task)
|
|
423
|
+
|
|
424
|
+
>>> # Multiple types
|
|
425
|
+
>>> agent.consumes(Task, Event, Command)
|
|
426
|
+
|
|
427
|
+
>>> # Conditional consumption (filtering)
|
|
428
|
+
>>> agent.consumes(Review, where=lambda r: r.score >= 8)
|
|
429
|
+
|
|
430
|
+
>>> # Multiple predicates (all must pass)
|
|
431
|
+
>>> agent.consumes(
|
|
432
|
+
... Order,
|
|
433
|
+
... where=[
|
|
434
|
+
... lambda o: o.total > 100,
|
|
435
|
+
... lambda o: o.status == "pending"
|
|
436
|
+
... ]
|
|
437
|
+
... )
|
|
438
|
+
|
|
439
|
+
>>> # Consume from specific agents
|
|
440
|
+
>>> agent.consumes(Report, from_agents=["analyzer", "validator"])
|
|
441
|
+
|
|
442
|
+
>>> # Channel-based routing
|
|
443
|
+
>>> agent.consumes(Alert, channels={"critical", "security"})
|
|
444
|
+
|
|
445
|
+
>>> # Batch processing
|
|
446
|
+
>>> agent.consumes(
|
|
447
|
+
... Email,
|
|
448
|
+
... batch={"size": 10, "timeout": 5.0}
|
|
449
|
+
... )
|
|
450
|
+
"""
|
|
382
451
|
predicates: Sequence[Callable[[BaseModel], bool]] | None
|
|
383
452
|
if where is None:
|
|
384
453
|
predicates = None
|
|
@@ -409,6 +478,48 @@ class AgentBuilder:
|
|
|
409
478
|
def publishes(
|
|
410
479
|
self, *types: type[BaseModel], visibility: Visibility | None = None
|
|
411
480
|
) -> PublishBuilder:
|
|
481
|
+
"""Declare which artifact types this agent produces.
|
|
482
|
+
|
|
483
|
+
Configures the output types and default visibility controls for artifacts
|
|
484
|
+
published by this agent. Can chain with .where() for conditional publishing.
|
|
485
|
+
|
|
486
|
+
Args:
|
|
487
|
+
*types: Artifact types (Pydantic models) to publish
|
|
488
|
+
visibility: Default visibility control for all outputs. Defaults to PublicVisibility.
|
|
489
|
+
Can be overridden per-publish or with .where() chaining.
|
|
490
|
+
|
|
491
|
+
Returns:
|
|
492
|
+
PublishBuilder for conditional publishing configuration
|
|
493
|
+
|
|
494
|
+
Examples:
|
|
495
|
+
>>> # Basic output declaration
|
|
496
|
+
>>> agent.publishes(Report)
|
|
497
|
+
|
|
498
|
+
>>> # Multiple output types
|
|
499
|
+
>>> agent.publishes(Summary, DetailedReport, Alert)
|
|
500
|
+
|
|
501
|
+
>>> # Private outputs (only specific agents can see)
|
|
502
|
+
>>> agent.publishes(
|
|
503
|
+
... SecretData,
|
|
504
|
+
... visibility=PrivateVisibility(agents={"admin", "auditor"})
|
|
505
|
+
... )
|
|
506
|
+
|
|
507
|
+
>>> # Tenant-isolated outputs
|
|
508
|
+
>>> agent.publishes(
|
|
509
|
+
... Invoice,
|
|
510
|
+
... visibility=TenantVisibility()
|
|
511
|
+
... )
|
|
512
|
+
|
|
513
|
+
>>> # Conditional publishing with chaining
|
|
514
|
+
>>> (agent.publishes(Alert)
|
|
515
|
+
... .where(lambda result: result.severity == "critical"))
|
|
516
|
+
|
|
517
|
+
See Also:
|
|
518
|
+
- PublicVisibility: Default, visible to all agents
|
|
519
|
+
- PrivateVisibility: Allowlist-based access control
|
|
520
|
+
- TenantVisibility: Multi-tenant isolation
|
|
521
|
+
- LabelledVisibility: Role-based access control
|
|
522
|
+
"""
|
|
412
523
|
outputs = []
|
|
413
524
|
for model in types:
|
|
414
525
|
spec = ArtifactSpec.from_model(model)
|
|
@@ -420,10 +531,80 @@ class AgentBuilder:
|
|
|
420
531
|
return PublishBuilder(self, outputs)
|
|
421
532
|
|
|
422
533
|
def with_utilities(self, *components: AgentComponent) -> AgentBuilder:
|
|
534
|
+
"""Add utility components to customize agent lifecycle and behavior.
|
|
535
|
+
|
|
536
|
+
Components are hooks that run at specific points in the agent execution
|
|
537
|
+
lifecycle. Common uses include rate limiting, budgets, metrics, caching,
|
|
538
|
+
and custom preprocessing/postprocessing.
|
|
539
|
+
|
|
540
|
+
Args:
|
|
541
|
+
*components: AgentComponent instances with lifecycle hooks
|
|
542
|
+
|
|
543
|
+
Returns:
|
|
544
|
+
self for method chaining
|
|
545
|
+
|
|
546
|
+
Examples:
|
|
547
|
+
>>> # Rate limiting
|
|
548
|
+
>>> agent.with_utilities(
|
|
549
|
+
... RateLimiter(max_calls=10, window=60)
|
|
550
|
+
... )
|
|
551
|
+
|
|
552
|
+
>>> # Budget control
|
|
553
|
+
>>> agent.with_utilities(
|
|
554
|
+
... TokenBudget(max_tokens=10000)
|
|
555
|
+
... )
|
|
556
|
+
|
|
557
|
+
>>> # Multiple components (executed in order)
|
|
558
|
+
>>> agent.with_utilities(
|
|
559
|
+
... RateLimiter(max_calls=5),
|
|
560
|
+
... MetricsCollector(),
|
|
561
|
+
... CacheLayer(ttl=3600)
|
|
562
|
+
... )
|
|
563
|
+
|
|
564
|
+
See Also:
|
|
565
|
+
- AgentComponent: Base class for custom components
|
|
566
|
+
- Lifecycle hooks: on_initialize, on_pre_consume, on_post_publish, etc.
|
|
567
|
+
"""
|
|
423
568
|
self._agent.utilities.extend(components)
|
|
424
569
|
return self
|
|
425
570
|
|
|
426
571
|
def with_engines(self, *engines: EngineComponent) -> AgentBuilder:
|
|
572
|
+
"""Configure LLM engines for agent evaluation.
|
|
573
|
+
|
|
574
|
+
Engines determine how agents process inputs. Default is DSPy with the
|
|
575
|
+
orchestrator's model. Custom engines enable different LLM backends,
|
|
576
|
+
non-LLM logic, or hybrid approaches.
|
|
577
|
+
|
|
578
|
+
Args:
|
|
579
|
+
*engines: EngineComponent instances for evaluation
|
|
580
|
+
|
|
581
|
+
Returns:
|
|
582
|
+
self for method chaining
|
|
583
|
+
|
|
584
|
+
Examples:
|
|
585
|
+
>>> # DSPy engine with specific model
|
|
586
|
+
>>> agent.with_engines(
|
|
587
|
+
... DSPyEngine(model="openai/gpt-4o")
|
|
588
|
+
... )
|
|
589
|
+
|
|
590
|
+
>>> # Custom non-LLM engine
|
|
591
|
+
>>> agent.with_engines(
|
|
592
|
+
... RuleBasedEngine(rules=my_rules)
|
|
593
|
+
... )
|
|
594
|
+
|
|
595
|
+
>>> # Hybrid approach (multiple engines)
|
|
596
|
+
>>> agent.with_engines(
|
|
597
|
+
... DSPyEngine(model="openai/gpt-4o-mini"),
|
|
598
|
+
... FallbackEngine()
|
|
599
|
+
... )
|
|
600
|
+
|
|
601
|
+
Note:
|
|
602
|
+
If no engines specified, agent uses DSPy with the orchestrator's default model.
|
|
603
|
+
|
|
604
|
+
See Also:
|
|
605
|
+
- DSPyEngine: Default LLM-based evaluation
|
|
606
|
+
- EngineComponent: Base class for custom engines
|
|
607
|
+
"""
|
|
427
608
|
self._agent.engines.extend(engines)
|
|
428
609
|
return self
|
|
429
610
|
|
flock/frontend/package.json
CHANGED
flock/orchestrator.py
CHANGED
|
@@ -84,6 +84,31 @@ class Flock(metaclass=AutoTracedMeta):
|
|
|
84
84
|
store: BlackboardStore | None = None,
|
|
85
85
|
max_agent_iterations: int = 1000,
|
|
86
86
|
) -> None:
|
|
87
|
+
"""Initialize the Flock orchestrator for blackboard-based agent coordination.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
model: Default LLM model for agents (e.g., "openai/gpt-4o-mini").
|
|
91
|
+
Can be overridden per-agent. If None, uses DEFAULT_MODEL env var.
|
|
92
|
+
store: Custom blackboard storage backend. Defaults to InMemoryBlackboardStore.
|
|
93
|
+
max_agent_iterations: Circuit breaker limit to prevent runaway agent loops.
|
|
94
|
+
Defaults to 1000 iterations per agent before reset.
|
|
95
|
+
|
|
96
|
+
Examples:
|
|
97
|
+
>>> # Basic initialization with default model
|
|
98
|
+
>>> flock = Flock("openai/gpt-4o-mini")
|
|
99
|
+
|
|
100
|
+
>>> # Custom storage backend
|
|
101
|
+
>>> flock = Flock(
|
|
102
|
+
... "openai/gpt-4o",
|
|
103
|
+
... store=CustomBlackboardStore()
|
|
104
|
+
... )
|
|
105
|
+
|
|
106
|
+
>>> # Circuit breaker configuration
|
|
107
|
+
>>> flock = Flock(
|
|
108
|
+
... "openai/gpt-4o-mini",
|
|
109
|
+
... max_agent_iterations=500
|
|
110
|
+
... )
|
|
111
|
+
"""
|
|
87
112
|
self._patch_litellm_proxy_imports()
|
|
88
113
|
self.model = model
|
|
89
114
|
self.store: BlackboardStore = store or InMemoryBlackboardStore()
|
|
@@ -113,6 +138,34 @@ class Flock(metaclass=AutoTracedMeta):
|
|
|
113
138
|
# Agent management -----------------------------------------------------
|
|
114
139
|
|
|
115
140
|
def agent(self, name: str) -> AgentBuilder:
|
|
141
|
+
"""Create a new agent using the fluent builder API.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
name: Unique identifier for the agent. Used for visibility controls and metrics.
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
AgentBuilder for fluent configuration
|
|
148
|
+
|
|
149
|
+
Raises:
|
|
150
|
+
ValueError: If an agent with this name already exists
|
|
151
|
+
|
|
152
|
+
Examples:
|
|
153
|
+
>>> # Basic agent
|
|
154
|
+
>>> pizza_agent = (
|
|
155
|
+
... flock.agent("pizza_master")
|
|
156
|
+
... .description("Creates delicious pizza recipes")
|
|
157
|
+
... .consumes(DreamPizza)
|
|
158
|
+
... .publishes(Pizza)
|
|
159
|
+
... )
|
|
160
|
+
|
|
161
|
+
>>> # Advanced agent with filtering
|
|
162
|
+
>>> critic = (
|
|
163
|
+
... flock.agent("critic")
|
|
164
|
+
... .consumes(Movie, where=lambda m: m.rating >= 8)
|
|
165
|
+
... .publishes(Review)
|
|
166
|
+
... .with_utilities(RateLimiter(max_calls=10))
|
|
167
|
+
... )
|
|
168
|
+
"""
|
|
116
169
|
if name in self._agents:
|
|
117
170
|
raise ValueError(f"Agent '{name}' already registered.")
|
|
118
171
|
return AgentBuilder(self, name)
|
|
@@ -346,6 +399,32 @@ class Flock(metaclass=AutoTracedMeta):
|
|
|
346
399
|
# Runtime --------------------------------------------------------------
|
|
347
400
|
|
|
348
401
|
async def run_until_idle(self) -> None:
|
|
402
|
+
"""Wait for all scheduled agent tasks to complete.
|
|
403
|
+
|
|
404
|
+
This method blocks until the blackboard reaches a stable state where no
|
|
405
|
+
agents are queued for execution. Essential for batch processing and ensuring
|
|
406
|
+
all agent cascades complete before continuing.
|
|
407
|
+
|
|
408
|
+
Note:
|
|
409
|
+
Automatically resets circuit breaker counters and shuts down MCP connections
|
|
410
|
+
when idle. Used with publish() for event-driven workflows.
|
|
411
|
+
|
|
412
|
+
Examples:
|
|
413
|
+
>>> # Event-driven workflow (recommended)
|
|
414
|
+
>>> await flock.publish(task1)
|
|
415
|
+
>>> await flock.publish(task2)
|
|
416
|
+
>>> await flock.run_until_idle() # Wait for all cascades
|
|
417
|
+
>>> # All agents have finished processing
|
|
418
|
+
|
|
419
|
+
>>> # Parallel batch processing
|
|
420
|
+
>>> await flock.publish_many([task1, task2, task3])
|
|
421
|
+
>>> await flock.run_until_idle() # All tasks processed in parallel
|
|
422
|
+
|
|
423
|
+
See Also:
|
|
424
|
+
- publish(): Event-driven artifact publishing
|
|
425
|
+
- publish_many(): Batch publishing for parallel execution
|
|
426
|
+
- invoke(): Direct agent invocation without cascade
|
|
427
|
+
"""
|
|
349
428
|
while self._tasks:
|
|
350
429
|
await asyncio.sleep(0.01)
|
|
351
430
|
pending = {task for task in self._tasks if not task.done()}
|
|
@@ -368,11 +447,59 @@ class Flock(metaclass=AutoTracedMeta):
|
|
|
368
447
|
return await agent.execute(ctx, artifacts)
|
|
369
448
|
|
|
370
449
|
async def arun(self, agent_builder: AgentBuilder, *inputs: BaseModel) -> list[Artifact]:
|
|
450
|
+
"""Execute an agent with inputs and wait for all cascades to complete (async).
|
|
451
|
+
|
|
452
|
+
Convenience method that combines direct agent invocation with run_until_idle().
|
|
453
|
+
Useful for testing and synchronous request-response patterns.
|
|
454
|
+
|
|
455
|
+
Args:
|
|
456
|
+
agent_builder: Agent to execute (from flock.agent())
|
|
457
|
+
*inputs: Input objects (BaseModel instances)
|
|
458
|
+
|
|
459
|
+
Returns:
|
|
460
|
+
Artifacts produced by the agent and any triggered cascades
|
|
461
|
+
|
|
462
|
+
Examples:
|
|
463
|
+
>>> # Test a single agent
|
|
464
|
+
>>> flock = Flock("openai/gpt-4o-mini")
|
|
465
|
+
>>> pizza_agent = flock.agent("pizza").consumes(Idea).publishes(Pizza)
|
|
466
|
+
>>> results = await flock.arun(pizza_agent, Idea(topic="Margherita"))
|
|
467
|
+
|
|
468
|
+
>>> # Multiple inputs
|
|
469
|
+
>>> results = await flock.arun(
|
|
470
|
+
... task_agent,
|
|
471
|
+
... Task(name="deploy"),
|
|
472
|
+
... Task(name="test")
|
|
473
|
+
... )
|
|
474
|
+
|
|
475
|
+
Note:
|
|
476
|
+
For event-driven workflows, prefer publish() + run_until_idle() for better
|
|
477
|
+
control over execution timing and parallel processing.
|
|
478
|
+
"""
|
|
371
479
|
artifacts = await self.direct_invoke(agent_builder.agent, list(inputs))
|
|
372
480
|
await self.run_until_idle()
|
|
373
481
|
return artifacts
|
|
374
482
|
|
|
375
483
|
def run(self, agent_builder: AgentBuilder, *inputs: BaseModel) -> list[Artifact]:
|
|
484
|
+
"""Synchronous wrapper for arun() - executes agent and waits for completion.
|
|
485
|
+
|
|
486
|
+
Args:
|
|
487
|
+
agent_builder: Agent to execute (from flock.agent())
|
|
488
|
+
*inputs: Input objects (BaseModel instances)
|
|
489
|
+
|
|
490
|
+
Returns:
|
|
491
|
+
Artifacts produced by the agent and any triggered cascades
|
|
492
|
+
|
|
493
|
+
Examples:
|
|
494
|
+
>>> # Synchronous execution (blocks until complete)
|
|
495
|
+
>>> flock = Flock("openai/gpt-4o-mini")
|
|
496
|
+
>>> agent = flock.agent("analyzer").consumes(Data).publishes(Report)
|
|
497
|
+
>>> results = flock.run(agent, Data(value=42))
|
|
498
|
+
|
|
499
|
+
Warning:
|
|
500
|
+
Cannot be called from within an async context. Use arun() instead
|
|
501
|
+
if already in an async function.
|
|
502
|
+
"""
|
|
376
503
|
return asyncio.run(self.arun(agent_builder, *inputs))
|
|
377
504
|
|
|
378
505
|
async def shutdown(self) -> None:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flock-core
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.0b60
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Author-email: Andre Ratzenberger <andre.ratzenberger@whiteduck.de>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -32,10 +32,13 @@ Description-Content-Type: text/markdown
|
|
|
32
32
|
<img alt="Flock Banner" src="https://raw.githubusercontent.com/whiteducksoftware/flock/master/docs/assets/images/flock.png" width="800">
|
|
33
33
|
</p>
|
|
34
34
|
<p align="center">
|
|
35
|
+
<a href="https://docs.flock.whiteduck.de" target="_blank"><img alt="Documentation" src="https://img.shields.io/badge/docs-online-blue?style=for-the-badge&logo=readthedocs"></a>
|
|
35
36
|
<a href="https://pypi.org/project/flock-core/" target="_blank"><img alt="PyPI Version" src="https://img.shields.io/pypi/v/flock-core?style=for-the-badge&logo=pypi&label=pip%20version"></a>
|
|
36
37
|
<img alt="Python Version" src="https://img.shields.io/badge/python-3.10%2B-blue?style=for-the-badge&logo=python">
|
|
37
38
|
<a href="LICENSE" target="_blank"><img alt="License" src="https://img.shields.io/pypi/l/flock-core?style=for-the-badge"></a>
|
|
38
39
|
<a href="https://whiteduck.de" target="_blank"><img alt="Built by white duck" src="https://img.shields.io/badge/Built%20by-white%20duck%20GmbH-white?style=for-the-badge&labelColor=black"></a>
|
|
40
|
+
<img alt="Test Coverage" src="https://img.shields.io/badge/coverage-77%25-green?style=for-the-badge">
|
|
41
|
+
<img alt="Tests" src="https://img.shields.io/badge/tests-743%20passing-brightgreen?style=for-the-badge">
|
|
39
42
|
</p>
|
|
40
43
|
|
|
41
44
|
---
|
|
@@ -46,7 +49,14 @@ Description-Content-Type: text/markdown
|
|
|
46
49
|
|
|
47
50
|
Flock is a production-focused framework for orchestrating AI agents through **declarative type contracts** and **blackboard architecture**—proven patterns from distributed systems, decades of experience with microservice architectures, and classical AI—now applied to modern LLMs.
|
|
48
51
|
|
|
52
|
+
**📖 [Read the full documentation →](https://docs.flock.whiteduck.de)**
|
|
49
53
|
|
|
54
|
+
**Quick links:**
|
|
55
|
+
- **[Getting Started](https://docs.flock.whiteduck.de/getting-started/installation/)** - Installation and first steps
|
|
56
|
+
- **[Tutorials](https://docs.flock.whiteduck.de/tutorials/)** - Step-by-step learning path
|
|
57
|
+
- **[User Guides](https://docs.flock.whiteduck.de/guides/)** - In-depth feature documentation
|
|
58
|
+
- **[API Reference](https://docs.flock.whiteduck.de/reference/api/)** - Complete API documentation
|
|
59
|
+
- **[Roadmap](https://docs.flock.whiteduck.de/about/roadmap/)** - What's coming in v1.0
|
|
50
60
|
|
|
51
61
|
---
|
|
52
62
|
|
|
@@ -912,13 +922,14 @@ uv run python examples/05-claudes-workshop/lesson_01_code_detective.py
|
|
|
912
922
|
- 📚 [7-Lesson Workshop](examples/05-claudes-workshop/) - Progressive lessons from basics to advanced
|
|
913
923
|
- 🆚 [The Blackboard](examples/02-the-blackboard/) - See data-driven orchestration without graphs
|
|
914
924
|
- 🎯 [Declarative Basics](examples/01-the-declarative-way/) - Understanding declarative programming
|
|
915
|
-
- 📖 [Documentation](
|
|
925
|
+
- 📖 [Documentation](https://docs.flock.whiteduck.de) - Complete online documentation
|
|
926
|
+
- 📘 [AGENTS.md](AGENTS.md) - Development guide
|
|
916
927
|
|
|
917
928
|
---
|
|
918
929
|
|
|
919
930
|
## Contributing
|
|
920
931
|
|
|
921
|
-
We're building Flock in the open. See [CONTRIBUTING.md](CONTRIBUTING.md) and [AGENTS.md](AGENTS.md)
|
|
932
|
+
We're building Flock in the open. See **[Contributing Guide](https://docs.flock.whiteduck.de/about/contributing/)** for development setup, or check [CONTRIBUTING.md](CONTRIBUTING.md) and [AGENTS.md](AGENTS.md) locally.
|
|
922
933
|
|
|
923
934
|
**We welcome:**
|
|
924
935
|
- Bug reports and feature requests
|
|
@@ -981,7 +992,7 @@ We're calling this 0.5 to signal:
|
|
|
981
992
|
|
|
982
993
|
**"Declarative contracts eliminate prompt hell. Blackboard architecture eliminates graph spaghetti. Proven patterns applied to modern LLMs."**
|
|
983
994
|
|
|
984
|
-
[⭐ Star on GitHub](https://github.com/whiteducksoftware/flock-flow) | [📖
|
|
995
|
+
[⭐ Star on GitHub](https://github.com/whiteducksoftware/flock-flow) | [📖 Documentation](https://docs.flock.whiteduck.de) | [🚀 Try Examples](examples/) | [💼 Enterprise Support](mailto:support@whiteduck.de)
|
|
985
996
|
|
|
986
997
|
</div>
|
|
987
998
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
flock/__init__.py,sha256=fvp4ltfaAGmYliShuTY_XVIpOUN6bMXbWiBnwb1NBoM,310
|
|
2
|
-
flock/agent.py,sha256=
|
|
2
|
+
flock/agent.py,sha256=V8fnLxE7vtTf5R7A-oCAY8Tq_LVf63i2EyZOf5e-gq4,31977
|
|
3
3
|
flock/artifacts.py,sha256=Xnizu0V4Jbwd1yV_FhXjUZG8Em-5GYsLt7sMX0V2OKI,2222
|
|
4
4
|
flock/cli.py,sha256=Ay_Z4KDd5wnnF1fLr0NqjMF7kRm_9X_1RXyv5GETDAY,2126
|
|
5
5
|
flock/components.py,sha256=17vhNMHKc3VUruEbSdb9YNKcDziIe0coS9jpfWBmX4o,6259
|
|
6
6
|
flock/examples.py,sha256=61xkD48yCW-aDrUXIrqrvxLtV8Vn4DrraQrHrrEUnWA,3530
|
|
7
|
-
flock/orchestrator.py,sha256=
|
|
7
|
+
flock/orchestrator.py,sha256=FJGsK9YU0J8KhLdSJU9dkDKiWs6gktniafLwUIxi_x0,33729
|
|
8
8
|
flock/registry.py,sha256=s0-H-TMtOsDZiZQCc7T1tYiWQg3OZHn5T--jaI_INIc,4786
|
|
9
9
|
flock/runtime.py,sha256=3C8AYzwwQEwFvwAsIoFN9QSQDWT8l8KzgekhPEsdUM0,8508
|
|
10
10
|
flock/service.py,sha256=cfvcsqZw9xOsEggncZ08zmiDxFiZpxsBYDSji5OIQQ8,5256
|
|
@@ -24,7 +24,7 @@ flock/engines/dspy_engine.py,sha256=Q2gPYLW_f8f-JuBYOMtjtoCZH8Fc447zWF8cHpJl4ew,
|
|
|
24
24
|
flock/frontend/README.md,sha256=OFdOItV8FGifmUDb694rV2xLC0vl1HlR5KBEtYv5AB0,25054
|
|
25
25
|
flock/frontend/index.html,sha256=BFg1VR_YVAJ_MGN16xa7sT6wTGwtFYUhfJhGuKv89VM,312
|
|
26
26
|
flock/frontend/package-lock.json,sha256=F-KmPhq6IbHXzxtmHL0S7dt6DGs4fWrOkrfKeXaSx6U,150998
|
|
27
|
-
flock/frontend/package.json,sha256=
|
|
27
|
+
flock/frontend/package.json,sha256=8cpupeJo0xlJgHiEHpBYCU-nHFiiNGJ73NfZLr5-FSg,1258
|
|
28
28
|
flock/frontend/tsconfig.json,sha256=B9p9jXohg_jrCZAq5_yIHvznpeXHiHQkwUZrVE2oMRA,705
|
|
29
29
|
flock/frontend/tsconfig.node.json,sha256=u5_YWSqeNkZBRBIZ8Q2E2q6bospcyF23mO-taRO7glc,233
|
|
30
30
|
flock/frontend/vite.config.ts,sha256=OQOr6Hl75iW7EvEm2_GXFdicYWthgdLhp4lz3d7RkJA,566
|
|
@@ -508,8 +508,8 @@ flock/themes/zenburned.toml,sha256=UEmquBbcAO3Zj652XKUwCsNoC2iQSlIh-q5c6DH-7Kc,1
|
|
|
508
508
|
flock/themes/zenwritten-dark.toml,sha256=-dgaUfg1iCr5Dv4UEeHv_cN4GrPUCWAiHSxWK20X1kI,1663
|
|
509
509
|
flock/themes/zenwritten-light.toml,sha256=G1iEheCPfBNsMTGaVpEVpDzYBHA_T-MV27rolUYolmE,1666
|
|
510
510
|
flock/utility/output_utility_component.py,sha256=yVHhlIIIoYKziI5UyT_zvQb4G-NsxCTgLwA1wXXTTj4,9047
|
|
511
|
-
flock_core-0.5.
|
|
512
|
-
flock_core-0.5.
|
|
513
|
-
flock_core-0.5.
|
|
514
|
-
flock_core-0.5.
|
|
515
|
-
flock_core-0.5.
|
|
511
|
+
flock_core-0.5.0b60.dist-info/METADATA,sha256=BFJPOOq0FFHMUP4FdjcGQO8rl5-fi0ItNfZTPhF9vlU,35901
|
|
512
|
+
flock_core-0.5.0b60.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
513
|
+
flock_core-0.5.0b60.dist-info/entry_points.txt,sha256=UQdPmtHd97gSA_IdLt9MOd-1rrf_WO-qsQeIiHWVrp4,42
|
|
514
|
+
flock_core-0.5.0b60.dist-info/licenses/LICENSE,sha256=U3IZuTbC0yLj7huwJdldLBipSOHF4cPf6cUOodFiaBE,1072
|
|
515
|
+
flock_core-0.5.0b60.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|