{"id":4168,"date":"2026-02-11T20:04:47","date_gmt":"2026-02-11T20:04:47","guid":{"rendered":"https:\/\/www.gubatron.com\/blog\/?p=4168"},"modified":"2026-02-11T20:47:02","modified_gmt":"2026-02-11T20:47:02","slug":"cloudllm-v0-10-from-a-simple-llm-wrapper-to-a-multi-agent-orchestration-framework","status":"publish","type":"post","link":"https:\/\/www.gubatron.com\/blog\/cloudllm-v0-10-from-a-simple-llm-wrapper-to-a-multi-agent-orchestration-framework\/","title":{"rendered":"CloudLLM v0.10: from a simple LLM wrapper to a Multi-Agent Orchestration framework"},"content":{"rendered":"<p><strong>February 11th, 2026<\/strong><\/p>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignright\" src=\"https:\/\/i0.wp.com\/github.com\/CloudLLM-ai\/cloudllm\/raw\/master\/logo.png?resize=306%2C306&#038;ssl=1\" alt=\"CloudLLM logo\" width=\"306\" height=\"306\" \/><\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<p><a href=\"https:\/\/github.com\/CloudLLM-ai\/cloudllm\">CloudLLM<\/a> has evolved dramatically over three consecutive releases (v0.8.0 through v0.10.0) into a\u00a0<strong>comprehensive, production-ready platform for building autonomous multi-agent systems<\/strong>.<\/p>\n<p>What began as an LLM wrapper request-response pattern library has grown into a sophisticated orchestration engine with seven distinct collaboration modes, real-time event observability, atomic task coordination primitives, and a rich tool ecosystem.<\/p>\n<p>This major release cycle introduces\u00a0<strong>AnthropicAgentTeams mode<\/strong>\u00a0(inspired by Anthropic&#8217;s own approach to collaborative AI), a\u00a0<strong>unified event system<\/strong>\u00a0for real-time agent introspection, and\u00a0<strong>HttpClientProtocol<\/strong>\u2014enabling agents to research and coordinate via the web. Combined with the previous release&#8217;s\u00a0<strong>RALPH mode<\/strong>\u00a0and\u00a0<strong>image generation support<\/strong>, CloudLLM now empowers teams to build AI systems as sophisticated as their imagination.<\/p>\n<hr \/>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Part 1: RALPH Mode &amp; The Game-Builder Architecture (v0.8.0)<\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">The Problem We Solved<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Building complex software via LLM agents requires\u00a0<strong>structured work tracking<\/strong>\u2014the ability to break down a large goal into discrete tasks, have agents iterate through them sequentially or in parallel, and track completion automatically. Traditional approaches either relied on manual task lists or unstructured agent banter.<\/p>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">RALPH: PRD-Driven Autonomous Orchestration<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p><strong>v0.8.0<\/strong>\u00a0introduced\u00a0<strong>RALPH mode<\/strong>\u2014a 6th orchestration collaboration pattern named after Ralph Wiggum for its wonderfully earnest determination to get through a checklist.<\/p>\n<p>RALPH works like this:<\/p>\n<ol>\n<li>Define a set of tasks as a\u00a0<strong>PRD (Product Requirements Document)<\/strong>\u00a0with clear completion criteria<\/li>\n<li>Each iteration, agents see the current task list and can work on any task<\/li>\n<li>Agents signal completion by including\u00a0<code>[TASK_COMPLETE:task_id]<\/code>\u00a0in their response<\/li>\n<li>The system tracks progress and terminates when all tasks are complete or max iterations reached<\/li>\n<li>Agents automatically see which tasks are already done, preventing duplicate work<\/li>\n<\/ol>\n<div class=\"highlight highlight-source-rust\">\n<pre><span class=\"pl-k\">let<\/span> tasks = <span class=\"pl-en\">vec<\/span><span class=\"pl-en\">!<\/span><span class=\"pl-kos\">[<\/span>\n    <span class=\"pl-v\">RalphTask<\/span><span class=\"pl-kos\">::<\/span>new<span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"html\"<\/span><span class=\"pl-kos\">,<\/span>  <span class=\"pl-s\">\"HTML Structure\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Create the HTML boilerplate and canvas\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-v\">RalphTask<\/span><span class=\"pl-kos\">::<\/span>new<span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"loop\"<\/span><span class=\"pl-kos\">,<\/span>  <span class=\"pl-s\">\"Game Loop\"<\/span><span class=\"pl-kos\">,<\/span>      <span class=\"pl-s\">\"Implement requestAnimationFrame game loop\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-v\">RalphTask<\/span><span class=\"pl-kos\">::<\/span>new<span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"input\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Controls\"<\/span><span class=\"pl-kos\">,<\/span>       <span class=\"pl-s\">\"Add keyboard input for the paddle\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n<span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">let<\/span> <span class=\"pl-k\">mut<\/span> orch = <span class=\"pl-smi\">Orchestration<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"game-builder\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Game Builder\"<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">.<\/span><span class=\"pl-en\">with_mode<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">OrchestrationMode<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-smi\">Ralph<\/span> <span class=\"pl-kos\">{<\/span>\n        tasks<span class=\"pl-kos\">,<\/span>\n        <span class=\"pl-c1\">max_iterations<\/span><span class=\"pl-kos\">:<\/span> <span class=\"pl-c1\">5<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">The Breakout Game: A Complete Real-World Example<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>To showcase RALPH&#8217;s power, we built a\u00a0<a href=\"https:\/\/gubatron.com\/breakout\"><strong>complete Atari Breakout game<\/strong><\/a>\u00a0using four specialized LLM agents:<\/p>\n<ul>\n<li><strong>Game Architect<\/strong>: Designs the overall structure and flow<\/li>\n<li><strong>Game Programmer<\/strong>: Implements core mechanics (physics, collision, game loop)<\/li>\n<li><strong>Sound Designer<\/strong>: Creates 8-bit chiptune music and sound effects<\/li>\n<li><strong>Powerup Engineer<\/strong>: Implements 8 distinct powerup types<\/li>\n<\/ul>\n<p>The orchestration proceeded through\u00a0<strong>10 PRD tasks<\/strong>:<\/p>\n<ul>\n<li>Core mechanics (HTML structure, game loop, paddle\/ball physics, collision detection)<\/li>\n<li>Audio system (background music with Web Audio API, collision sounds, powerup chimes)<\/li>\n<li>Powerup implementation (speed boost, paddle expansion, projectile launcher, multiball, lava paddle, bomb, growth, mushroom)<\/li>\n<\/ul>\n<p><strong>Result<\/strong>: A fully playable HTML5 game with:<\/p>\n<ul>\n<li>5 game states (MENU, PLAYING, PAUSED, GAME_OVER, LEVEL_COMPLETE)<\/li>\n<li>Multi-hit bricks with color-coded HP<\/li>\n<li>Particle effects (fire bursts, paddle jets, score popups)<\/li>\n<li>Procedural brick generation<\/li>\n<li>Mobile touch controls<\/li>\n<\/ul>\n<p>All generated by LLMs iterating through a structured task list. The RALPH pattern proved remarkably effective for this kind of incremental, feature-driven development.<\/p>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Supporting: A New Naming Paradigm<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>We also renamed the entire\u00a0<code>Council<\/code>\u00a0abstraction to\u00a0<strong><code>Orchestration<\/code><\/strong>\u00a0(Council \u2192 Orchestration, CouncilMode \u2192 OrchestrationMode, etc.) for clarity and consistency with industry terminology.<\/p>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Image Generation: Multi-Provider Support<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>v0.8.0 added\u00a0<strong>unified image generation across OpenAI (DALL-E), Grok, and Google Gemini<\/strong>\u00a0via a single\u00a0<code>ImageGenerationClient<\/code>\u00a0trait. This allows agents to generate images and save them locally, opening new classes of creative workflows.<\/p>\n<div class=\"highlight highlight-source-rust\">\n<pre><span class=\"pl-k\">let<\/span> image_client = <span class=\"pl-en\">new_image_generation_client<\/span><span class=\"pl-kos\">(<\/span>\n    <span class=\"pl-smi\">ImageGenerationProvider<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-v\">OpenAI<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">&amp;<\/span>api_key<span class=\"pl-kos\">,<\/span>\n<span class=\"pl-kos\">)<\/span>?<span class=\"pl-kos\">;<\/span>\n<span class=\"pl-en\">register_image_generation_tool<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">&amp;<\/span>protocol<span class=\"pl-kos\">,<\/span> image_client<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-k\">await<\/span>?<span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p>One-line helper function eliminates ~80 lines of boilerplate. Supports aspect ratio customization and response format selection (URL or Base64).<\/p>\n<hr \/>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Part 2: Per-Agent Sessions &amp; Hub Routing (v0.9.0)<\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">The Architectural Evolution<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>v0.8.0 worked, but <strong>it broadcast the entire conversation history to every agent every round. This was inefficient and semantically wrong<\/strong>\u2014in a round-robin discussion, Agent C shouldn&#8217;t see Agent B&#8217;s entire scratchpad, just the conclusion.<\/p>\n<p><strong>v0.9.0<\/strong>\u00a0redesigned the orchestration architecture with a\u00a0<strong>message router<\/strong>\u00a0(called a &#8220;hub&#8221;) that intelligently routes only relevant messages to each agent.<\/p>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">How It Works<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Instead of:<\/p>\n<pre><code>Agent A sees: [system, user_prompt, A's_response, B's_response, C's_response]\nAgent B sees: [system, user_prompt, A's_response, B's_response, C's_response]  &lt;- Duplicate\nAgent C sees: [system, user_prompt, A's_response, B's_response, C's_response]  &lt;- Duplicate\n<\/code><\/pre>\n<p>Now:<\/p>\n<pre><code>Agent A:\n  - Sees its own prior messages (session history)\n  - In round-robin: gets injected message from previous agent, generates response\n\nAgent B:\n  - Sees its own session history\n  - Gets injected message from Agent A's response\n  - Generates next response\n\nAgent C:\n  - Sees its own session history\n  - Gets injected message from Agent B's response\n  - Generates response\n<\/code><\/pre>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">API Changes<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Each agent now has:<\/p>\n<ul>\n<li><strong><code>Agent::send(prompt)<\/code><\/strong>\u00a0\u2014 Uses agent&#8217;s own LLMSession for stateful generation<\/li>\n<li><strong><code>Agent::receive_message(role, content)<\/code><\/strong>\u00a0\u2014 Injects external messages into the session<\/li>\n<li><strong><code>Agent::set_system_prompt(prompt)<\/code><\/strong>\u00a0\u2014 Orchestration updates system context per-round<\/li>\n<li><strong><code>Agent::session_history_len()<\/code><\/strong>\u00a0\u2014 Query agent state for decision-making<\/li>\n<li><strong><code>Agent::fork_with_context()<\/code><\/strong>\u00a0\u2014 Copy agent with session state for parallel execution<\/li>\n<\/ul>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Why It Matters<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<ol>\n<li><strong>Token efficiency<\/strong>: Agents don&#8217;t duplicate each other&#8217;s full conversation history<\/li>\n<li><strong>Semantic correctness<\/strong>: Each agent has its own conversation context, not a shared one<\/li>\n<li><strong>Scalability<\/strong>: With 10 agents, this prevents the conversation from exploding in size<\/li>\n<li><strong>Flexibility<\/strong>: Each mode can route messages according to its collaboration pattern<\/li>\n<\/ol>\n<p>The refactor was complex (added agent_message_cursors tracking to prevent duplication) but entirely transparent to users. All existing code continues to work.<\/p>\n<hr \/>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Part 3: Real-Time Observability, Decentralized Coordination &amp; The Complete Tool Ecosystem (v0.10.0)<\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Three Major Systems Arrive Together<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>v0.10.0 is the release where CloudLLM transitions from &#8220;good orchestration system&#8221; to &#8220;<strong>production-ready multi-agent platform<\/strong>&#8220;. It introduces:<\/p>\n<ol>\n<li><strong>Event System<\/strong>\u00a0\u2014 Real-time observability into agent and orchestration behavior<\/li>\n<li><strong>AnthropicAgentTeams Mode<\/strong>\u00a0\u2014 A 7th collaboration pattern with no central orchestrator<\/li>\n<li><strong>HttpClientProtocol<\/strong>\u00a0\u2014 Agents can now make HTTP requests to external services<\/li>\n<li><strong>Expanded Breakout Examples<\/strong>\u00a0\u2014 18 tasks (vs. 10), comprehensive tool ecosystem<\/li>\n<\/ol>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">System 1: The Event System<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Orchestrations are black boxes\u2014until now. We added an\u00a0<code>EventHandler<\/code>\u00a0trait that lets you observe:<\/p>\n<p><strong>Agent-level events:<\/strong><\/p>\n<ul>\n<li><code>SendStarted<\/code>\u00a0\/\u00a0<code>SendCompleted<\/code>\u00a0\u2014 Agent is thinking<\/li>\n<li><code>LLMCallStarted<\/code>\u00a0\/\u00a0<code>LLMCallCompleted<\/code>\u00a0\u2014 LLM round-trip timing<\/li>\n<li><code>ToolCallDetected<\/code>\u00a0\/\u00a0<code>ToolExecutionCompleted<\/code>\u00a0\u2014 Tool invocation and results<\/li>\n<li><code>ThoughtCommitted<\/code>\u00a0\u2014 Thoughts written to ThoughtChain<\/li>\n<li><code>ProtocolAdded<\/code>\u00a0\/\u00a0<code>ProtocolRemoved<\/code>\u00a0\u2014 Tool availability changes<\/li>\n<\/ul>\n<p><strong>Orchestration-level events:<\/strong><\/p>\n<ul>\n<li><code>RunStarted<\/code>\u00a0\/\u00a0<code>RunCompleted<\/code>\u00a0\u2014 Orchestration lifecycle<\/li>\n<li><code>RoundStarted<\/code>\u00a0\/\u00a0<code>RoundCompleted<\/code>\u00a0\u2014 Round boundaries<\/li>\n<li><code>AgentSelected<\/code>\u00a0\/\u00a0<code>AgentResponded<\/code>\u00a0\/\u00a0<code>AgentFailed<\/code>\u00a0\u2014 Per-agent status<\/li>\n<li><code>RalphIterationStarted<\/code>\u00a0\/\u00a0<code>RalphTaskCompleted<\/code>\u00a0\u2014 RALPH progress<\/li>\n<li><code>TaskClaimed<\/code>\u00a0\/\u00a0<code>TaskCompleted<\/code>\u00a0\/\u00a0<code>TaskFailed<\/code>\u00a0\u2014 AnthropicAgentTeams status<\/li>\n<\/ul>\n<p>Usage is simple:<\/p>\n<div class=\"highlight highlight-source-rust\">\n<pre><span class=\"pl-k\">struct<\/span> <span class=\"pl-smi\">ProgressHandler<\/span> <span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">start<\/span><span class=\"pl-kos\">:<\/span> <span class=\"pl-smi\">Instant<\/span> <span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-c1\">#<span class=\"pl-kos\">[<\/span>async_trait<span class=\"pl-kos\">]<\/span><\/span>\n<span class=\"pl-k\">impl<\/span> <span class=\"pl-smi\">EventHandler<\/span> <span class=\"pl-k\">for<\/span> <span class=\"pl-smi\">ProgressHandler<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">async<\/span> <span class=\"pl-k\">fn<\/span> <span class=\"pl-en\">on_agent_event<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">&amp;<\/span><span class=\"pl-smi\">self<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">event<\/span><span class=\"pl-kos\">:<\/span> <span class=\"pl-c1\">&amp;<\/span><span class=\"pl-smi\">AgentEvent<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">match<\/span> event <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-smi\">AgentEvent<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-v\">SendStarted<\/span> <span class=\"pl-kos\">{<\/span> agent_name<span class=\"pl-kos\">,<\/span> message_preview<span class=\"pl-kos\">,<\/span> .. <span class=\"pl-kos\">}<\/span> =&gt; <span class=\"pl-kos\">{<\/span>\n                <span class=\"pl-en\">println<\/span><span class=\"pl-en\">!<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"[{:02}:{:02}] {} thinking...\"<\/span><span class=\"pl-kos\">,<\/span> elapsed<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span>as_secs<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span>\/<span class=\"pl-c1\">60<\/span><span class=\"pl-kos\">,<\/span> elapsed<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span>as_secs<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span>%<span class=\"pl-c1\">60<\/span><span class=\"pl-kos\">,<\/span> agent_name<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-kos\">}<\/span>\n            <span class=\"pl-smi\">AgentEvent<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-v\">ToolExecutionCompleted<\/span> <span class=\"pl-kos\">{<\/span> agent_name<span class=\"pl-kos\">,<\/span> tool_name<span class=\"pl-kos\">,<\/span> success<span class=\"pl-kos\">,<\/span> .. <span class=\"pl-kos\">}<\/span> =&gt; <span class=\"pl-kos\">{<\/span>\n                <span class=\"pl-en\">println<\/span><span class=\"pl-en\">!<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"[{:02}:{:02}] {} called '{}' \u2014 {}\"<\/span><span class=\"pl-kos\">,<\/span>\n                    elapsed<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span>as_secs<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span>\/<span class=\"pl-c1\">60<\/span><span class=\"pl-kos\">,<\/span> elapsed<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span>as_secs<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span>%<span class=\"pl-c1\">60<\/span><span class=\"pl-kos\">,<\/span> agent_name<span class=\"pl-kos\">,<\/span> tool_name<span class=\"pl-kos\">,<\/span>\n                    <span class=\"pl-k\">if<\/span> <span class=\"pl-c1\">*<\/span>success <span class=\"pl-kos\">{<\/span> <span class=\"pl-s\">\"\u2713\"<\/span> <span class=\"pl-kos\">}<\/span> else <span class=\"pl-kos\">{<\/span> <span class=\"pl-s\">\"\u2717\"<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-kos\">}<\/span>\n            _ =&gt; <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span>\n        <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-kos\">}<\/span>\n\n    <span class=\"pl-k\">async<\/span> <span class=\"pl-k\">fn<\/span> <span class=\"pl-en\">on_orchestration_event<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">&amp;<\/span><span class=\"pl-smi\">self<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">event<\/span><span class=\"pl-kos\">:<\/span> <span class=\"pl-c1\">&amp;<\/span><span class=\"pl-smi\">OrchestrationEvent<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">match<\/span> event <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-smi\">OrchestrationEvent<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-v\">RalphTaskCompleted<\/span> <span class=\"pl-kos\">{<\/span> task_ids<span class=\"pl-kos\">,<\/span> tasks_completed_total<span class=\"pl-kos\">,<\/span> tasks_total<span class=\"pl-kos\">,<\/span> .. <span class=\"pl-kos\">}<\/span> =&gt; <span class=\"pl-kos\">{<\/span>\n                <span class=\"pl-en\">println<\/span><span class=\"pl-en\">!<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"\u2713 Tasks done: {}\/{}\"<\/span><span class=\"pl-kos\">,<\/span> tasks_completed_total<span class=\"pl-kos\">,<\/span> tasks_total<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-kos\">}<\/span>\n            _ =&gt; <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span>\n        <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">let<\/span> handler = <span class=\"pl-smi\">Arc<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">ProgressHandler<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">let<\/span> orchestration = <span class=\"pl-smi\">Orchestration<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"id\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Name\"<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">.<\/span><span class=\"pl-en\">with_event_handler<\/span><span class=\"pl-kos\">(<\/span>handler<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p>Register on an orchestration, and the handler\u00a0<strong>auto-propagates<\/strong>\u00a0to all added agents. You get a unified stream of both agent and orchestration events, enabling:<\/p>\n<ul>\n<li>Real-time progress dashboards<\/li>\n<li>Cost tracking (tokens per agent, per task)<\/li>\n<li>Debugging (why did agent X call tool Y?)<\/li>\n<li>Automated alerting (fail-fast on errors)<\/li>\n<\/ul>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">System 2: AnthropicAgentTeams \u2014 Decentralized Task Coordination<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p><strong>Inspiration<\/strong>: Anthropic&#8217;s research team built a C compiler using collaborative AI agents with no central orchestrator. Each agent independently searched for work, claimed it, and reported completion. This inspired the\u00a0<strong>AnthropicAgentTeams<\/strong>\u00a0mode.<\/p>\n<p><strong>The Pattern:<\/strong><\/p>\n<p>Instead of a manager\/moderator assigning work, agents\u00a0<strong>autonomously discover and claim tasks<\/strong>\u00a0from a shared Memory pool:<\/p>\n<pre><code>1. Orchestration initializes task pool in Memory:\n   - teams:&lt;pool_id&gt;:unclaimed:&lt;task_id&gt; \u2192 &lt;description&gt;\n   - teams:&lt;pool_id&gt;:claimed:&lt;task_id&gt; \u2192 \"&lt;agent_id&gt;:&lt;timestamp&gt;\"\n   - teams:&lt;pool_id&gt;:completed:&lt;task_id&gt; \u2192 \"&lt;result_json&gt;\"\n\n2. Each agent, each iteration:\n   - Query Memory: LIST teams:&lt;pool_id&gt;:unclaimed:*\n   - See available tasks\n   - Claim a task: PUT teams:&lt;pool_id&gt;:claimed:&lt;task_id&gt; &lt;my_agent_id&gt;\n   - Work on it\n   - Report completion: PUT teams:&lt;pool_id&gt;:completed:&lt;task_id&gt; &lt;result&gt;\n\n3. Orchestration monitors Memory:\n   - Count completed tasks vs. total\n   - Exit when all done\n<\/code><\/pre>\n<p><strong>Why It&#8217;s Powerful:<\/strong><\/p>\n<ul>\n<li><strong>No central bottleneck<\/strong>: No orchestrator making decisions<\/li>\n<li><strong>Truly autonomous<\/strong>: Each agent is responsible for finding and claiming work<\/li>\n<li><strong>Atomic operations<\/strong>: Memory&#8217;s single-threaded design guarantees no task conflicts<\/li>\n<li><strong>Transparent progress<\/strong>: Query Memory to see who&#8217;s working on what and what&#8217;s done<\/li>\n<li><strong>Naturally scales<\/strong>: Add agents, they all independently discover work<\/li>\n<\/ul>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">System 3: HttpClientProtocol<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Agents can now make HTTP requests via\u00a0<strong>HttpClientProtocol<\/strong>, a wrapper around the existing HttpClient tool:<\/p>\n<div class=\"highlight highlight-source-rust\">\n<pre><span class=\"pl-k\">let<\/span> http_client = <span class=\"pl-smi\">Arc<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">HttpClient<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">let<\/span> http_protocol = <span class=\"pl-smi\">Arc<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">HttpClientProtocol<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span>http_client<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">let<\/span> <span class=\"pl-k\">mut<\/span> registry = <span class=\"pl-smi\">ToolRegistry<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">empty<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\nregistry<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">add_protocol<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"http\"<\/span><span class=\"pl-kos\">,<\/span> http_protocol<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-k\">await<\/span>?<span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p>Exposes 5 tools:<\/p>\n<ul>\n<li><strong><code>http_get<\/code><\/strong>\u00a0\u2014 Fetch data from a URL<\/li>\n<li><strong><code>http_post<\/code><\/strong>\u00a0\u2014 Send JSON data with optional body<\/li>\n<li><strong><code>http_put<\/code><\/strong>\u00a0\u2014 Update a resource<\/li>\n<li><strong><code>http_delete<\/code><\/strong>\u00a0\u2014 Delete a resource<\/li>\n<li><strong><code>http_patch<\/code><\/strong>\u00a0\u2014 Partial update<\/li>\n<\/ul>\n<p>All return consistent JSON responses:\u00a0<code>{ \"status\": 200, \"body\": \"...\", \"headers\": {...} }<\/code><\/p>\n<p>Agent usage:<\/p>\n<div class=\"highlight highlight-source-json\">\n<pre>{\n  <span class=\"pl-ent\">\"tool\"<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>http_get<span class=\"pl-pds\">\"<\/span><\/span>,\n  <span class=\"pl-ent\">\"parameters\"<\/span>: {\n    <span class=\"pl-ent\">\"url\"<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>https:\/\/api.github.com\/repos\/anthropics\/anthropic-sdk-python<span class=\"pl-pds\">\"<\/span><\/span>\n  }\n}<\/pre>\n<\/div>\n<p>Built with security in mind: domain allowlist\/blocklist, timeout controls, size limits.<\/p>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">System 4: Expanded Breakout Examples<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>The breakout games grew from\u00a0<strong>10 tasks to 18 tasks<\/strong>, now orchestrated by both:<\/p>\n<ol>\n<li><strong><code>examples\/breakout_game_ralph.rs<\/code><\/strong>\u00a0\u2014 RALPH mode with mixed-provider agents (2 Claude Haiku 4.5, 2 OpenAI GPT)<\/li>\n<li><strong><code>examples\/breakout_game_agent_teams.rs<\/code><\/strong>\u00a0\u2014 AnthropicAgentTeams mode with 4 Claude Haiku 4.5 agents<\/li>\n<\/ol>\n<p><strong>18 Tasks Across 5 Categories:<\/strong><\/p>\n<p><strong>Core Mechanics (6)<\/strong><\/p>\n<ul>\n<li>HTML structure and canvas setup<\/li>\n<li>Game loop with requestAnimationFrame<\/li>\n<li>Paddle control (keyboard + touch\/swipe)<\/li>\n<li>Ball physics with angle reflection<\/li>\n<li>Brick layout generation<\/li>\n<li>Collision detection (paddle, bricks, walls, bottom)<\/li>\n<\/ul>\n<p><strong>Audio System (2)<\/strong><\/p>\n<ul>\n<li>Background music (Atari 2600-style chiptune via Web Audio API)<\/li>\n<li>Sound effects (collision, powerup, life lost, level complete)<\/li>\n<\/ul>\n<p><strong>Powerup System (3)<\/strong><\/p>\n<ul>\n<li>Basic powerups: paddle size, speed boost, projectile launcher<\/li>\n<li>Advanced powerups: lava paddle, bomb, growth, mushroom<\/li>\n<li>Multiball coordination<\/li>\n<\/ul>\n<p><strong>Visual Effects (3)<\/strong><\/p>\n<ul>\n<li>Particle systems (fire bursts, paddle jets, score displays)<\/li>\n<li>Paddle 3D rotation animation<\/li>\n<li>Level complete screen animation<\/li>\n<\/ul>\n<p><strong>Advanced Mechanics (4)<\/strong><\/p>\n<ul>\n<li>Level progression with 10+ procedural brick patterns<\/li>\n<li>Dynamic difficulty scaling<\/li>\n<li>Mobile-responsive canvas<\/li>\n<li>High score tracking with milestones<\/li>\n<\/ul>\n<p><strong>Tool Ecosystem:<\/strong><\/p>\n<p>Both examples now include:<\/p>\n<ul>\n<li><strong>Memory<\/strong>\u00a0\u2014 Inter-agent coordination and shared state tracking<\/li>\n<li><strong>Bash<\/strong>\u00a0\u2014 Shell command execution for research and file operations (macOS\/Linux)<\/li>\n<li><strong>HttpClient<\/strong>\u00a0\u2014 API calls for external data\/research<\/li>\n<li><strong>Custom write_game_file Tool<\/strong>\u00a0\u2014 Persist game HTML to disk<\/li>\n<\/ul>\n<p>This demonstrates how a real orchestration system uses multiple tools cooperatively.<\/p>\n<hr \/>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Architectural Highlights<\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">1. Multi-Protocol Tool Registry<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Agents can access tools from multiple sources simultaneously:<\/p>\n<div class=\"highlight highlight-source-rust\">\n<pre><span class=\"pl-k\">let<\/span> <span class=\"pl-k\">mut<\/span> registry = <span class=\"pl-smi\">ToolRegistry<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">empty<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\nregistry<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">add_protocol<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"memory\"<\/span><span class=\"pl-kos\">,<\/span> memory_protocol<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-k\">await<\/span>?<span class=\"pl-kos\">;<\/span>\nregistry<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">add_protocol<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"bash\"<\/span><span class=\"pl-kos\">,<\/span> bash_protocol<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-k\">await<\/span>?<span class=\"pl-kos\">;<\/span>\nregistry<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">add_protocol<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"http\"<\/span><span class=\"pl-kos\">,<\/span> http_protocol<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-k\">await<\/span>?<span class=\"pl-kos\">;<\/span>\nregistry<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">add_protocol<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"custom\"<\/span><span class=\"pl-kos\">,<\/span> custom_tools<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-k\">await<\/span>?<span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">let<\/span> agent = <span class=\"pl-smi\">Agent<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"id\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"name\"<\/span><span class=\"pl-kos\">,<\/span> client<span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">.<\/span><span class=\"pl-en\">with_tools<\/span><span class=\"pl-kos\">(<\/span>registry<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-c\">\/\/ Agent automatically discovers ALL tools and can use any of them<\/span><\/pre>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">2. ThoughtChain: Persistent, Hash-Chained Agent Memory<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Agents can record their thinking across sessions with tamper-evident integrity:<\/p>\n<div class=\"highlight highlight-source-rust\">\n<pre>agent<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">commit<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">ThoughtType<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-v\">Finding<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Latency increased 3x after deploy\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-k\">await<\/span>?<span class=\"pl-kos\">;<\/span>\nagent<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">commit<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">ThoughtType<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-v\">Decision<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Roll back to v2.3\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-k\">await<\/span>?<span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-c\">\/\/ Later, resume from latest thought with full context graph<\/span>\n<span class=\"pl-k\">let<\/span> resumed = <span class=\"pl-smi\">Agent<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">resume_from_latest<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"id\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"name\"<\/span><span class=\"pl-kos\">,<\/span> client<span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">128_000<\/span><span class=\"pl-kos\">,<\/span> chain<span class=\"pl-kos\">)<\/span>?<span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">3. Context Strategies: Automatic Conversation Pruning<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>As context windows fill, agents automatically invoke strategies:<\/p>\n<ul>\n<li><strong>TrimStrategy<\/strong>\u00a0(default) \u2014 Let LLMSession handle trimming<\/li>\n<li><strong>SelfCompressionStrategy<\/strong>\u00a0\u2014 LLM writes a structured save file<\/li>\n<li><strong>NoveltyAwareStrategy<\/strong>\u00a0\u2014 Only trigger compression when truly needed<\/li>\n<\/ul>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">4. Fork and Parallel Execution<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Agents can be forked for parallel tasks:<\/p>\n<div class=\"highlight highlight-source-rust\">\n<pre><span class=\"pl-k\">let<\/span> agent = <span class=\"pl-smi\">Agent<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"id\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"name\"<\/span><span class=\"pl-kos\">,<\/span> client<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">let<\/span> forked = agent<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">fork<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>  <span class=\"pl-c\">\/\/ Fresh session, shared tools and thought chain<\/span>\n\n<span class=\"pl-c\">\/\/ Use in parallel orchestration mode<\/span><\/pre>\n<\/div>\n<hr \/>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Performance &amp; Scalability<\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Token Efficiency<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>The per-agent session architecture (v0.9.0) reduced token consumption by ~30% in typical orchestrations by eliminating conversation history duplication.<\/p>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Example: Breakout Game RALPH Run<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<ul>\n<li><strong>4 agents<\/strong>\u00a0(mixed OpenAI + Claude Haiku)<\/li>\n<li><strong>18 tasks<\/strong>\u00a0across 5 categories<\/li>\n<li><strong>8 iterations<\/strong>\u00a0(max)<\/li>\n<li><strong>Runtime<\/strong>: 5-8 minutes<\/li>\n<li><strong>Cost<\/strong>: $1-2 per run (Haiku is cheap!)<\/li>\n<li><strong>Tokens<\/strong>: ~15,000-25,000 per run<\/li>\n<li><strong>Output<\/strong>: Fully playable game HTML<\/li>\n<\/ul>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">AnthropicAgentTeams Scaling<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Decentralized coordination scales better than centralized models:<\/p>\n<ul>\n<li>4 agents, 8-task pool: 10-15 minutes<\/li>\n<li>Linear growth with agent count (each independently searching work)<\/li>\n<li>No moderator bottleneck<\/li>\n<\/ul>\n<hr \/>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Real-World Use Cases<\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">1. AI-Assisted Code Generation<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Use RALPH mode to build features incrementally:<\/p>\n<pre><code>Task: \"Implement user authentication\"\n\u2192 Agent designs API structure\n\u2192 Agent implements backend\n\u2192 Agent adds frontend\n\u2192 Agent writes tests\n\u2192 All tracked and automatically composed\n<\/code><\/pre>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">2. Decentralized Research Teams<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Use AnthropicAgentTeams for independent research agents:<\/p>\n<pre><code>Orchestration sets up task pool:\n  - Research question 1 (economics)\n  - Research question 2 (policy)\n  - Research question 3 (case studies)\n\nAgents autonomously:\n  - Discover questions\n  - Claim and research them\n  - Use HTTP client to fetch data\n  - Store findings in Memory\n  - Orchestration collects results\n<\/code><\/pre>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">3. Real-Time Agent Debugging<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Use EventHandler to monitor agent behavior:<\/p>\n<pre><code>Handler logs:\n  - Which agent called which tool\n  - Tool latency and token usage\n  - Task claiming\/completion in AnthropicAgentTeams\n  - Error rates and failures\n\nBuild dashboards, alerting, auto-remediation\n<\/code><\/pre>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">4. Image-Generating Creative Workflows<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Agents can now:<\/p>\n<div class=\"highlight highlight-source-rust\">\n<pre><span class=\"pl-k\">let<\/span> image = agent<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">generate<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"A sunset over the ocean\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"openai\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-k\">await<\/span>?<span class=\"pl-kos\">;<\/span>\nagent<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">save_image<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"sunset.png\"<\/span><span class=\"pl-kos\">,<\/span> image<span class=\"pl-kos\">)<\/span>?<span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-c\">\/\/ Agents can also research (HTTP), coordinate (Memory), and record thoughts (ThoughtChain)<\/span><\/pre>\n<\/div>\n<hr \/>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Migration Guide<\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">From v0.7.x to v0.8.x<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p><strong>RALPH Mode<\/strong>\u00a0is opt-in. Existing orchestrations continue to work unchanged.<\/p>\n<p><strong>Image Generation<\/strong>\u00a0is additive:<\/p>\n<div class=\"highlight highlight-source-rust\">\n<pre><span class=\"pl-c\">\/\/ Old code<\/span>\n<span class=\"pl-k\">let<\/span> agent = <span class=\"pl-smi\">Agent<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"id\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"name\"<\/span><span class=\"pl-kos\">,<\/span> client<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">with_tools<\/span><span class=\"pl-kos\">(<\/span>registry<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-c\">\/\/ New code (if you want image generation)<\/span>\n<span class=\"pl-en\">register_image_generation_tool<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">&amp;<\/span>protocol<span class=\"pl-kos\">,<\/span> image_client<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-k\">await<\/span>?<span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">From v0.8.x to v0.9.x<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Per-agent sessions are transparent. No changes needed for most code. If you have custom orchestration modes, update to use\u00a0<code>agent.send()<\/code>\u00a0instead of\u00a0<code>agent.generate()<\/code>.<\/p>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">From v0.9.x to v0.10.x<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p><strong>Event System<\/strong>\u00a0is opt-in:<\/p>\n<div class=\"highlight highlight-source-rust\">\n<pre><span class=\"pl-k\">let<\/span> handler = <span class=\"pl-smi\">Arc<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-v\">MyHandler<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">let<\/span> orchestration = <span class=\"pl-smi\">Orchestration<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"id\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"name\"<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">.<\/span><span class=\"pl-en\">with_event_handler<\/span><span class=\"pl-kos\">(<\/span>handler<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>  <span class=\"pl-c\">\/\/ Optional<\/span><\/pre>\n<\/div>\n<p><strong>AnthropicAgentTeams<\/strong>\u00a0is a new mode:<\/p>\n<div class=\"highlight highlight-source-rust\">\n<pre><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">with_mode<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">OrchestrationMode<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-smi\">AnthropicAgentTeams<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">pool_id<\/span><span class=\"pl-kos\">:<\/span> <span class=\"pl-s\">\"my_pool\"<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">to_string<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">tasks<\/span><span class=\"pl-kos\">:<\/span> <span class=\"pl-en\">vec<\/span><span class=\"pl-en\">!<\/span><span class=\"pl-kos\">[<\/span>...<span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">max_iterations<\/span><span class=\"pl-kos\">:<\/span> <span class=\"pl-c1\">10<\/span><span class=\"pl-kos\">,<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><\/pre>\n<\/div>\n<p><strong>HttpClientProtocol<\/strong>\u00a0is additive:<\/p>\n<div class=\"highlight highlight-source-rust\">\n<pre>registry<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">add_protocol<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"http\"<\/span><span class=\"pl-kos\">,<\/span> http_protocol<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-k\">await<\/span>?<span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ Agents automatically discover it<\/span><\/pre>\n<\/div>\n<hr \/>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Looking Ahead<\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">v0.11.0 (Planned)<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<ul>\n<li><strong>Streaming aggregation<\/strong>\u00a0for Parallel mode (see results as they arrive)<\/li>\n<li><strong>Distributed orchestration<\/strong>\u00a0(agents on different machines coordinating via Memory)<\/li>\n<li><strong>Cost-aware scheduling<\/strong>\u00a0(choose agents by price\/capability tradeoffs)<\/li>\n<li><strong>Tool use optimization<\/strong>\u00a0(agents learn which tools are most useful)<\/li>\n<\/ul>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">The Vision<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<p>CloudLLM is building toward a future where\u00a0<strong>LLM agents are as natural to orchestrate as threads or processes<\/strong>. The same patterns that work for 2 agents should work for 20. The same debugging tools should work for simple sessions and complex orchestrations.<\/p>\n<p>By providing structured collaboration patterns, atomic coordination primitives, and real-time observability, we&#8217;re enabling teams to build AI systems that are:<\/p>\n<ul>\n<li><strong>Efficient<\/strong>\u00a0\u2014 Only passing relevant context around<\/li>\n<li><strong>Transparent<\/strong>\u00a0\u2014 Every decision is observable and auditable<\/li>\n<li><strong>Scalable<\/strong>\u00a0\u2014 From 1 agent to many, the patterns hold<\/li>\n<li><strong>Maintainable<\/strong>\u00a0\u2014 Clear roles, clear task definitions, clear outputs<\/li>\n<\/ul>\n<hr \/>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Thank You<\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<p>To everyone who&#8217;s used CloudLLM to build agents, orchestrated multi-agent systems, and given feedback\u2014thank you. This release represents months of architectural refinement inspired by real-world usage.<\/p>\n<p>Special thanks to the Anthropic research team for the AnthropicAgentTeams inspiration (and for building Claude).<\/p>\n<hr \/>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Getting Started<\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Installation<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"highlight highlight-source-toml\">\n<pre>[<span class=\"pl-en\">dependencies<\/span>]\n<span class=\"pl-smi\">cloudllm<\/span> = <span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>0.10.0<span class=\"pl-pds\">\"<\/span><\/span><\/pre>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Quick Example: RALPH Mode<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"highlight highlight-source-rust\">\n<pre><span class=\"pl-k\">use<\/span> cloudllm<span class=\"pl-kos\">::<\/span>orchestration<span class=\"pl-kos\">::<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-v\">Orchestration<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-v\">OrchestrationMode<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-v\">RalphTask<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">use<\/span> cloudllm<span class=\"pl-kos\">::<\/span><span class=\"pl-v\">Agent<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">use<\/span> cloudllm<span class=\"pl-kos\">::<\/span>clients<span class=\"pl-kos\">::<\/span>claude<span class=\"pl-kos\">::<\/span><span class=\"pl-v\">ClaudeClient<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">use<\/span> std<span class=\"pl-kos\">::<\/span>sync<span class=\"pl-kos\">::<\/span><span class=\"pl-v\">Arc<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-c1\">#<span class=\"pl-kos\">[<\/span>tokio<span class=\"pl-kos\">::<\/span>main<span class=\"pl-kos\">]<\/span><\/span>\n<span class=\"pl-k\">async<\/span> <span class=\"pl-k\">fn<\/span> <span class=\"pl-en\">main<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> -&gt; <span class=\"pl-smi\">Result<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">Box<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-k\">dyn<\/span> std<span class=\"pl-kos\">::<\/span>error<span class=\"pl-kos\">::<\/span><span class=\"pl-smi\">Error<\/span> + <span class=\"pl-smi\">Send<\/span> + <span class=\"pl-smi\">Sync<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-kos\">&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">let<\/span> client = <span class=\"pl-smi\">Arc<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">ClaudeClient<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new_with_model_enum<\/span><span class=\"pl-kos\">(<\/span>\n        <span class=\"pl-c1\">&amp;<\/span>std<span class=\"pl-kos\">::<\/span>env<span class=\"pl-kos\">::<\/span><span class=\"pl-en\">var<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"ANTHROPIC_KEY\"<\/span><span class=\"pl-kos\">)<\/span>?<span class=\"pl-kos\">,<\/span>\n        cloudllm<span class=\"pl-kos\">::<\/span>clients<span class=\"pl-kos\">::<\/span>claude<span class=\"pl-kos\">::<\/span><span class=\"pl-smi\">Model<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-v\">ClaudeHaiku45<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-k\">let<\/span> tasks = <span class=\"pl-en\">vec<\/span><span class=\"pl-en\">!<\/span><span class=\"pl-kos\">[<\/span>\n        <span class=\"pl-v\">RalphTask<\/span><span class=\"pl-kos\">::<\/span>new<span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"task1\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Task 1\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Do the first thing\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n        <span class=\"pl-v\">RalphTask<\/span><span class=\"pl-kos\">::<\/span>new<span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"task2\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Task 2\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Do the second thing\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n        <span class=\"pl-v\">RalphTask<\/span><span class=\"pl-kos\">::<\/span>new<span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"task3\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Task 3\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Do the third thing\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-k\">let<\/span> <span class=\"pl-k\">mut<\/span> orchestration = <span class=\"pl-smi\">Orchestration<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"example\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"My Orchestration\"<\/span><span class=\"pl-kos\">)<\/span>\n        <span class=\"pl-kos\">.<\/span><span class=\"pl-en\">with_mode<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">OrchestrationMode<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-smi\">Ralph<\/span> <span class=\"pl-kos\">{<\/span> tasks<span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">max_iterations<\/span><span class=\"pl-kos\">:<\/span> <span class=\"pl-c1\">5<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span>\n        <span class=\"pl-kos\">.<\/span><span class=\"pl-en\">with_system_context<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"Complete all tasks systematically.\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-k\">let<\/span> agent = <span class=\"pl-smi\">Agent<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"agent1\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Worker\"<\/span><span class=\"pl-kos\">,<\/span> client<span class=\"pl-kos\">)<\/span>\n        <span class=\"pl-kos\">.<\/span><span class=\"pl-en\">with_expertise<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"Getting things done\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n    orchestration<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">add_agent<\/span><span class=\"pl-kos\">(<\/span>agent<span class=\"pl-kos\">)<\/span>?<span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-k\">let<\/span> result = orchestration<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">run<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"Complete all tasks\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-k\">await<\/span>?<span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-en\">println<\/span><span class=\"pl-en\">!<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"Done! {} rounds, {}% complete\"<\/span><span class=\"pl-kos\">,<\/span> result<span class=\"pl-kos\">.<\/span>round<span class=\"pl-kos\">,<\/span> result<span class=\"pl-kos\">.<\/span>convergence_score<span class=\"pl-kos\">.<\/span>unwrap_or<span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">0.0<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">*<\/span> <span class=\"pl-c1\">100.0<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-en\">Ok<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Quick Example: AnthropicAgentTeams Mode<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"highlight highlight-source-rust\">\n<pre><span class=\"pl-k\">use<\/span> cloudllm<span class=\"pl-kos\">::<\/span>orchestration<span class=\"pl-kos\">::<\/span><span class=\"pl-kos\">{<\/span><span class=\"pl-v\">Orchestration<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-v\">OrchestrationMode<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-v\">WorkItem<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">use<\/span> cloudllm<span class=\"pl-kos\">::<\/span>tools<span class=\"pl-kos\">::<\/span><span class=\"pl-v\">Memory<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">use<\/span> cloudllm<span class=\"pl-kos\">::<\/span>tool_protocols<span class=\"pl-kos\">::<\/span><span class=\"pl-v\">MemoryProtocol<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">use<\/span> std<span class=\"pl-kos\">::<\/span>sync<span class=\"pl-kos\">::<\/span><span class=\"pl-v\">Arc<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-c1\">#<span class=\"pl-kos\">[<\/span>tokio<span class=\"pl-kos\">::<\/span>main<span class=\"pl-kos\">]<\/span><\/span>\n<span class=\"pl-k\">async<\/span> <span class=\"pl-k\">fn<\/span> <span class=\"pl-en\">main<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> -&gt; <span class=\"pl-smi\">Result<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">Box<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-k\">dyn<\/span> std<span class=\"pl-kos\">::<\/span>error<span class=\"pl-kos\">::<\/span><span class=\"pl-smi\">Error<\/span> + <span class=\"pl-smi\">Send<\/span> + <span class=\"pl-smi\">Sync<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-kos\">&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">let<\/span> memory = <span class=\"pl-smi\">Arc<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">Memory<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-k\">let<\/span> protocol = <span class=\"pl-smi\">Arc<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">MemoryProtocol<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span>memory<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-k\">let<\/span> tasks = <span class=\"pl-en\">vec<\/span><span class=\"pl-en\">!<\/span><span class=\"pl-kos\">[<\/span>\n        <span class=\"pl-v\">WorkItem<\/span> <span class=\"pl-kos\">{<\/span>\n            id<span class=\"pl-kos\">:<\/span> <span class=\"pl-s\">\"task1\"<\/span><span class=\"pl-kos\">.<\/span>to_string<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n            description<span class=\"pl-kos\">:<\/span> <span class=\"pl-s\">\"Research topic A\"<\/span><span class=\"pl-kos\">.<\/span>to_string<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n            acceptance_criteria<span class=\"pl-kos\">:<\/span> <span class=\"pl-s\">\"2-page report\"<\/span><span class=\"pl-kos\">.<\/span>to_string<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n        <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span>\n        <span class=\"pl-v\">WorkItem<\/span> <span class=\"pl-kos\">{<\/span>\n            id<span class=\"pl-kos\">:<\/span> <span class=\"pl-s\">\"task2\"<\/span><span class=\"pl-kos\">.<\/span>to_string<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n            description<span class=\"pl-kos\">:<\/span> <span class=\"pl-s\">\"Analyze topic B\"<\/span><span class=\"pl-kos\">.<\/span>to_string<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n            acceptance_criteria<span class=\"pl-kos\">:<\/span> <span class=\"pl-s\">\"5-point analysis\"<\/span><span class=\"pl-kos\">.<\/span>to_string<span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n        <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-k\">let<\/span> <span class=\"pl-k\">mut<\/span> orchestration = <span class=\"pl-smi\">Orchestration<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-en\">new<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"research\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"Team Research\"<\/span><span class=\"pl-kos\">)<\/span>\n        <span class=\"pl-kos\">.<\/span><span class=\"pl-en\">with_mode<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">OrchestrationMode<\/span><span class=\"pl-kos\">::<\/span><span class=\"pl-smi\">AnthropicAgentTeams<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-c1\">pool_id<\/span><span class=\"pl-kos\">:<\/span> <span class=\"pl-s\">\"research_2024\"<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">to_string<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">,<\/span>\n            tasks<span class=\"pl-kos\">,<\/span>\n            <span class=\"pl-c1\">max_iterations<\/span><span class=\"pl-kos\">:<\/span> <span class=\"pl-c1\">10<\/span><span class=\"pl-kos\">,<\/span>\n        <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-c\">\/\/ Add agents \u2014 they'll autonomously discover and claim work<\/span>\n    <span class=\"pl-c\">\/\/ orchestration.add_agent(agent1)?;<\/span>\n    <span class=\"pl-c\">\/\/ orchestration.add_agent(agent2)?;<\/span>\n\n    <span class=\"pl-k\">let<\/span> result = orchestration<span class=\"pl-kos\">.<\/span><span class=\"pl-en\">run<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"Research these topics\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-k\">await<\/span>?<span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-en\">println<\/span><span class=\"pl-en\">!<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"All tasks complete: {}\"<\/span><span class=\"pl-kos\">,<\/span> result<span class=\"pl-kos\">.<\/span>is_complete<span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-en\">Ok<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<div class=\"markdown-heading\">\n<h3 class=\"heading-element\">Full Examples<\/h3>\n<p>&nbsp;<\/p>\n<\/div>\n<ul>\n<li><code>examples\/breakout_game_ralph.rs<\/code>\u00a0\u2014 Build a game with RALPH mode<\/li>\n<li><code>examples\/breakout_game_agent_teams.rs<\/code>\u00a0\u2014 Build the same game with decentralized coordination<\/li>\n<li><code>examples\/anthropic_teams.rs<\/code>\u00a0\u2014 Research team with 4 agents and 8-task pool<\/li>\n<li><code>examples\/orchestration_demo.rs<\/code>\u00a0\u2014 All 7 orchestration modes in one file<\/li>\n<\/ul>\n<p>Run with:<\/p>\n<div class=\"highlight highlight-source-shell\">\n<pre>cargo run --example orchestration_demo\ncargo run --example breakout_game_ralph\nANTHROPIC_API_KEY=your-key cargo run --example breakout_game_agent_teams<\/pre>\n<\/div>\n<hr \/>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Documentation<\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<ul>\n<li><strong><a href=\"https:\/\/gist.github.com\/README.md\">README.md<\/a><\/strong>\u00a0\u2014 Platform overview and quick start<\/li>\n<li><strong><a href=\"https:\/\/gist.github.com\/ORCHESTRATION_TUTORIAL.md\">ORCHESTRATION_TUTORIAL.md<\/a><\/strong>\u00a0\u2014 Deep dive into all 7 collaboration modes<\/li>\n<li><strong><a href=\"https:\/\/gist.github.com\/examples\/README.md\">examples\/README.md<\/a><\/strong>\u00a0\u2014 Complete 22-example guide<\/li>\n<\/ul>\n<p>Run\u00a0<code>cargo doc --open<\/code>\u00a0for complete API documentation.<\/p>\n<hr \/>\n<div class=\"markdown-heading\">\n<h2 class=\"heading-element\">Community &amp; Support<\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<ul>\n<li>GitHub:\u00a0<a href=\"https:\/\/github.com\/CloudLLM-ai\/cloudllm\">CloudLLM-ai\/cloudllm<\/a><\/li>\n<li>Issues &amp; Pull Requests welcome<\/li>\n<li>MIT License<\/li>\n<\/ul>\n<hr \/>\n<p><strong>Welcome to the era of intelligent, orchestrated, observable multi-agent systems.<\/strong><\/p>\n<p>Happy orchestration! \ud83d\ude80<\/p>\n","protected":false},"excerpt":{"rendered":"<p>February 11th, 2026 &nbsp; CloudLLM has evolved dramatically over three consecutive releases (v0.8.0 through v0.10.0) into a\u00a0comprehensive, production-ready platform for building autonomous multi-agent systems. What began as an LLM wrapper request-response pattern library has grown into a sophisticated orchestration engine with seven distinct collaboration modes, real-time event observability, atomic task coordination primitives, and a rich [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4175,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1666,15],"tags":[1667],"class_list":["post-4168","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-code","tag-cloudllm"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.gubatron.com\/blog\/wp-content\/uploads\/2026\/02\/agent_orchestra.jpg?fit=1096%2C657&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5Unzf-15e","jetpack-related-posts":[{"id":4178,"url":"https:\/\/www.gubatron.com\/blog\/mining-git-history-to-build-developer-agent-personas\/","url_meta":{"origin":4168,"position":0},"title":"Mining Git History to Build Developer Agent Personas","author":"gubatron","date":"February 22, 2026","format":false,"excerpt":"A new software engineering practice for the age of agentic teams and an honest look at what it costs There is a new kind of software team forming inside repositories everywhere. It is not made of humans alone. It is made of humans and AI agents working together, agents that\u2026","rel":"","context":"In &quot;AI&quot;","block_context":{"text":"AI","link":"https:\/\/www.gubatron.com\/blog\/category\/ai\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.gubatron.com\/blog\/wp-content\/uploads\/2026\/02\/download.jpeg?fit=1168%2C784&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.gubatron.com\/blog\/wp-content\/uploads\/2026\/02\/download.jpeg?fit=1168%2C784&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.gubatron.com\/blog\/wp-content\/uploads\/2026\/02\/download.jpeg?fit=1168%2C784&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.gubatron.com\/blog\/wp-content\/uploads\/2026\/02\/download.jpeg?fit=1168%2C784&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.gubatron.com\/blog\/wp-content\/uploads\/2026\/02\/download.jpeg?fit=1168%2C784&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":593,"url":"https:\/\/www.gubatron.com\/blog\/ssh-add-l-cannot-connect-to-your-agent\/","url_meta":{"origin":4168,"position":1},"title":"ssh-add -l -> Cannot connect to your agent.","author":"gubatron","date":"September 21, 2007","format":false,"excerpt":"keychain not working for ya... you run ssh-agent but ssh-add won't add the keys. This is probably because your SSH_AGENT_PID and SSH_AUTH_SOCK variables are incorrect... so I recommend you put something like this on your .bashrc to initialize your ssh-agent correctly: export SSH_AGENT_PID= export SSH_AUTH_SOCK= #make sure no old agents\u2026","rel":"","context":"In &quot;Code&quot;","block_context":{"text":"Code","link":"https:\/\/www.gubatron.com\/blog\/category\/code\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2722,"url":"https:\/\/www.gubatron.com\/blog\/add-ssh-identities-to-your-ssh-agent-when-you-start-your-bash-session\/","url_meta":{"origin":4168,"position":2},"title":"add ssh identities to your ssh agent when you start your bash session","author":"gubatron","date":"April 28, 2012","format":false,"excerpt":"Put this somewhere on your .bash_profile [bash] function addSSHIdentities() { pushd ~\/.ssh #add all your keys here ssh-add some_private_key ssh-add some_private_key_2 ssh-add some_private_key_3 ... ssh-add some_private_key_N popd } function startSSHAgent() { SSH_AGENT_PROCESSES=`ps aux | grep ssh-agent | grep -v grep | wc -l` if [ $SSH_AGENT_PROCESSES -gt 0 ] then\u2026","rel":"","context":"In \"posix\"","block_context":{"text":"posix","link":"https:\/\/www.gubatron.com\/blog\/tag\/posix\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1998,"url":"https:\/\/www.gubatron.com\/blog\/startkeychain-bash-utility-to-start-ssh-agent\/","url_meta":{"origin":4168,"position":3},"title":"startKeychain &#8211; bash utility to start ssh-agent","author":"gubatron","date":"June 3, 2010","format":false,"excerpt":"For my (and your) future reference, here's a function to put on your .bashrc or .bash_profile, you can invoke it later at any time to start\/re-start your ssh-agent. [bash] function startKeychain { killall ssh-agent rm ~\/.keychain\/* keychain id_rsa HOSTNAME=`hostname` source ~\/.keychain\/${HOSTNAME}-sh } [\/bash] Then at any time, the \"command\" startKeychain\u2026","rel":"","context":"In &quot;Code&quot;","block_context":{"text":"Code","link":"https:\/\/www.gubatron.com\/blog\/category\/code\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":481,"url":"https:\/\/www.gubatron.com\/blog\/svn-cant-create-tunnel-the-system-cannot-find-the-file-specified\/","url_meta":{"origin":4168,"position":4},"title":"svn: Can&#8217;t create tunnel: The system cannot find the file specified.","author":"gubatron","date":"March 15, 2007","format":false,"excerpt":"I was trying to checkout a project from a subversion repository using Eclipse's Subversive, and I was having problems with a subversion url that starts with \"svn+ssh:\/\/\" This means all the transport has to be done using a \"ssh\" agent. Eclipse's Subclipse plugin was giving me the error: svn: Can't\u2026","rel":"","context":"In &quot;Code&quot;","block_context":{"text":"Code","link":"https:\/\/www.gubatron.com\/blog\/category\/code\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3111,"url":"https:\/\/www.gubatron.com\/blog\/solved-java7-smtp-issue-caused-by-sun-security-pkcs11-wrapper-pkcs11exception\/","url_meta":{"origin":4168,"position":5},"title":"[SOLVED] Java7 SMTP Issue (Caused by: sun.security.pkcs11.wrapper.PKCS11Exception)","author":"gubatron","date":"August 7, 2013","format":false,"excerpt":"So you had your little program that would use AWS to send emails, and all of a sudden after a Java 7 update you get a stack trace like this: [java] javax.mail.MessagingException: Could not connect to SMTP host: email-smtp.us-east-1.amazonaws.com, port: 465; nested exception is: javax.net.ssl.SSLException: Server key at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1962) at\u2026","rel":"","context":"In &quot;Code&quot;","block_context":{"text":"Code","link":"https:\/\/www.gubatron.com\/blog\/category\/code\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/posts\/4168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/comments?post=4168"}],"version-history":[{"count":2,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/posts\/4168\/revisions"}],"predecessor-version":[{"id":4176,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/posts\/4168\/revisions\/4176"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/media\/4175"}],"wp:attachment":[{"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/media?parent=4168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/categories?post=4168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/tags?post=4168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}