jeevesagent.architecture.blackboard¶
Blackboard: shared state board with a coordinator picking the next contributor each round.
Classical AI: Erman et al. 1980 (Hearsay-II). Han & Zhang 2025 revived for LLM agents (arXiv:2507.01701). Salemi et al. 2026 (arXiv:2510.01285) reports +13-57% relative improvement on data-discovery tasks.
Pattern¶
Initialize the blackboard with the user’s problem statement.
Each round, the coordinator reads the blackboard and picks one agent to contribute next (or terminates).
The chosen agent runs with the blackboard view in its prompt and produces a contribution.
The contribution is appended to the blackboard.
Loop until the coordinator terminates or
max_roundsis hit.The decider synthesizes the final answer from the blackboard.
decider=Nonefalls back to the lastanswer-kind contribution, or the most recent contribution if no answer-kind exists.
Coordinator API¶
The coordinator is a Agent that produces JSON in this shape:
{"terminate": bool, "next_agent": str|null, "instruction": str|null}
If terminate is true, the loop ends. Otherwise next_agent
must name one of the configured agents. If the coordinator emits an
unknown name or malformed JSON, the round is skipped and a warning
event fires (Blackboard does not crash on coordinator misbehavior).
Set coordinator=None to fall back to round-robin selection —
useful for testing / prototyping but defeats the “contribute when
relevant” feature of the architecture.
Strengths¶
Decentralized contribution; agents react to current state rather than being forced into a fixed delegation graph.
Transparent state — the blackboard is the audit log.
Weaknesses¶
Coordinator quality is critical. A bad coordinator picks wrong agents and the system stalls.
Blackboard state grows monotonically; long sessions can blow up the LLM context.
“Theoretically interesting but rarely outperforms hierarchical or graph in production” (2026 taxonomy guide). Reserve for exploratory research / data-discovery problems.
Attributes¶
Classes¶
Public + per-agent private state for the architecture. |
|
Coordinator + agents + decider, mediated by a shared |
|
One contribution on the blackboard. |
Module Contents¶
- class jeevesagent.architecture.blackboard.Blackboard[source]¶
Public + per-agent private state for the architecture.
- post(author: str, content: str, *, kind: str = 'contribution', private_to: str | None = None) BlackboardEntry[source]¶
- render_for(agent_name: str) str[source]¶
Format the blackboard state as a string for
agent_name.Includes every public entry and the agent’s own private scratchpad if any.
- private: dict[str, list[BlackboardEntry]]¶
- public: list[BlackboardEntry] = []¶
- class jeevesagent.architecture.blackboard.BlackboardArchitecture(*, agents: dict[str, jeevesagent.agent.api.Agent], coordinator: jeevesagent.agent.api.Agent | None = None, decider: jeevesagent.agent.api.Agent | None = None, max_rounds: int = 10, coordinator_instructions: str | None = None, decider_instructions: str | None = None)[source]¶
Coordinator + agents + decider, mediated by a shared blackboard.
- declared_workers() dict[str, jeevesagent.agent.api.Agent][source]¶
- async run(session: jeevesagent.architecture.base.AgentSession, deps: jeevesagent.architecture.base.Dependencies, prompt: str) collections.abc.AsyncIterator[jeevesagent.core.types.Event][source]¶
- name = 'blackboard'¶
- class jeevesagent.architecture.blackboard.BlackboardEntry[source]¶
One contribution on the blackboard.
- timestamp: datetime.datetime¶
- jeevesagent.architecture.blackboard.DEFAULT_COORDINATOR_INSTRUCTIONS = Multiline-String¶
Show Value
"""You coordinate a team of specialist agents on a shared problem. Read the blackboard state below and decide: - Should we terminate now? (Has a satisfactory answer been written?) - If continuing, which agent should contribute next? - What specific instruction should that agent receive? Available agents: {agents} Output JSON exactly: {{"terminate": <bool>, "next_agent": <str|null>, "instruction": <str|null>}} If terminating, set next_agent and instruction to null. """
- jeevesagent.architecture.blackboard.DEFAULT_DECIDER_INSTRUCTIONS = Multiline-String¶
Show Value
"""You synthesize the final answer from a multi-agent blackboard discussion. Read the blackboard state below and produce the best answer you can. Cite specific contributions when useful; acknowledge dissent if it matters. """