Sakana AI Introduces Sakana Fugu: An Orchestration Model That Moves Tasks Across a Dynamic Pool for Frontier LLMs

Today, Sakana AI was launched Goodbye Fugu. It is a multi-agent orchestration system that behaves like a single model. You send the request to a single destination. Fugu decides how he will be handled internally. It solves the task directly when that is enough. Also assembles and coordinates a team of professional models when needed. The complexity of a multi-agent system does not reach your code.
The TL;DR
- Fugu delivers a multi-agent system behind a single OpenAI-compatible API.
- Fugu Ultra leads many coding and consulting benchmarks.
- An orchestrator overrides the individual models it combines.
- Exit and target compliance with supplier routing and single-vendor risk.
- The route is proprietary, so the choice of model for each question remains hidden.
What is Sakana Fugu
Fugu itself is a model language. Trained to drive other LLMs in the agent area. That pool includes the events themselves, which are called recursively. Fugu manages model selection, assignment, validation, and integration.
Instead of rigidly coded roles or workflows, Fugu learns to coordinate. It determines when to transmit and how agents should communicate with each other. Then it combines their work into one answer. From the outside, you call one model. Inside, an integrated system of experts does the work.
Sakana AI features this as a hedge against single-vendor dependency. If one provider restricts access, Fugu routes around the disruption. The research team cites recent export controls on Anthropic’s Fable and Mythos models as motivation. Over time, new models can be rolled into the pool.
Fugu and Fugu Ultra: Two Models, One API
Fugu ships in two versions, both behind one compatible OpenAI-API:
- Fugu balances robust performance with low latency. It’s an automation for daily coding, code reviews, and chatbots. It’s also compatible with tools like Codex. You can remove certain agents from their pool. That helps teams meet data, privacy, and compliance requirements.
- Fugu Ultra optimized for a high level of response to complex, multi-step problems. It connects a deep pool of professional agents. Its pool is fixed, so exit is not available. The current model ID is
fugu-ultra-20260615.
Research Behind the Orchestrator
Fugu builds on the two ICLR 2026 papers Trinity and Conductor in studied orchestration.
THREE uses a lightweight flexible connector for every few turns. Assign Concept, Task, or Validation roles to dynamically assign tasks. The operator you are trained through reinforcement learning. Discovers natural language linking techniques and focused instruction for various LLM pools.
Together, they demonstrate systems that can learn to integrate and route agents for each task. That replaces a manually designed workflow.
Interactive Descriptor
Press Run the orchestration to view route steps.
‘; Q(‘#agent’).innerHTML = ”; Q(‘#answer’).innerHTML = ‘Waiting to run…‘; Q(‘#status’).textContent=”Ready.”; } Q(‘#resetBtn’).addEventListener(‘click’, function(){ if(!state.busy) reset(); }); function addStep(n, role, html){ var d = document.createElement(‘div’); d.className=”step”; var r = role ? ‘‘+role+’‘ : ”; d.innerHTML = ‘
‘+n+’
‘+r+html+’
‘; Q(‘#log’).appendChild(d); Q(‘#log’).scrollTop = Q(‘#log’).scrollHeight; } function Bars agents(used){ var box = Q(‘#agents’); box.innerHTML=”; used.forEach(function(u){ var line = document.createElement(‘div’); line.className=”agentline”; line.innerHTML = ‘‘+AGENTS[u.id].name+’‘+’‘+’‘+u.role+’‘; box.appendChild(row); var bar = line.querySelector(‘i’); setTimeout(function(){ bar.style.width = (40+Math.random()*55)+’%’; }, 120); }); } function run(){ if(state.busy) return; state.busy = true; Q(‘#runBtn’).disabled = true; Q(‘#resetBtn’).disabled = true; Q(‘#log’).innerHTML=”; Q(‘#agent’).innerHTML=”; Q(‘#answer’).innerHTML=’Orchestrating_‘; Q(‘#status’).textContent=”Runningu2026″; var task = Q(‘#task’).value; var ultra = state.model===’ultra’; var pool = activePool(); var workers = pool.filtha(worker(a){return a!==’self’;}); if(workers.length===0) workers=[‘self’]; var T = FUNCTIONS[task]; // select mode: ultra or research/repro/reason => multi-agent team var team = ultra || function===’research’ || function===’repro’ || function===’reason’; var steps = []; steps.push({d:300, role:null, html:’Request accepted by a one conclusion. There is no client-side multi-agent code.’}); steps.push({d:600, role:null, html:’Determine: ‘+(group?’this task has multiple steps) get the team together.’:’one strong model is enough — solve directlythen confirm.’)}); is used = []; if (team){ var thinker = staff[0]; var worker = workers[1] || employees[0]; var verifier = employees[2] || employees[0]; steps.push({d:700, role:’Thinker’, html:’‘+AGENTS[thinker].name+’ writes the plan and destroys the function.’}); steps.push({d:700, role:’Worker’, html:’‘+AGENTS[worker].name+’ perform subtasks and generate candidate output.’}); if(pool.indexOf(‘self’)>-1){ steps.push({d:600, role:’Worker’, html:’Fugu releases a to call yourself again in a difficult little problem.’}); } steps.push({d:700, role:’Verifier’, html:’‘+AGENTS[verifier].name+’ checks the result and flags the fields for review.’}); used = [{id:thinker,role:’Thinker’},{id:worker,role:’Worker’},{id:verifier,role:’Verifier’}]; if(pool.indexOf(‘self’)>-1) used.push({id:’self’, role:’Worker’}); } else { var solo = staff[0]; steps.push({d:700, role:’Worker’, html:’‘+AGENTS[solo].name+’ handles the function in one pass.’}); steps.push({d:700, role:’Verifier’, html:’‘+AGENTS[(workers[1]||solo)].name+’ validates diff before returning.’}); used = [{id:solo,role:’Worker’},{id:(workers[1]||solo), role:’Verifier’}]; } if(state.restricted){ steps.splice(2,0,{d:650, role:null, html:’)‘+AGENTS[state.restricted].name+’ is banned. Rounding it out — no merge change.’}); } steps.push({d:700, role:null, html:’Merge agents work on one honest answer.’}); // dedupe used by the ID that saves the first role var seen={}; used = used.filter(function(u){ if(bon[u.id]) return false; we have seen[u.id]=1; return true; }); var i=0, n=0; function next(){ if(i>=steps.length){ finish(used, T); come back; } var s = steps[i++]; n++; setTimeout(function(){ addStep(n, s.role, s.html); if(n===Math.min(4,steps.length-1)) agentBars(used); next(); }, sd); } Next(); } end function(used, T){ setTimeout(function(){ QA(‘#agents .bar i’).forEach(function(b){ b.style.width=”100%”; }); var mhtml = T.metrics.map(function(m){ return ‘
‘+m[0]+’‘+m[1]+’
‘; }).join(”); Q(‘#answer’).innerHTML = ‘
‘+T.answer+’
‘+mhtml; Q(‘#status’).textContent=”Done. Routing details are proprietary and not displayed in production.”; state.busy=false; Q(‘#runBtn’).disabled=false; Q(‘#resetBtn’). disabled=false; sz(); }, 500); } Q(‘#runBtn’).addEventListener(‘click’, run); Q(‘#work’).addEventListener(‘change’, function(){ if(!state.busy) reset(); }); renderModel(); // —–automatically resize WordPress iframe embeds —- function sz(){ var h = root.offsetHeight + 40; if(window.parent && window.parent!==window){ window.parent.postMessage({type:’fugu-sim-height’, height:h}, ‘*’); } } window.addEventListener(‘load’, sz); window.addEventListener(‘resize’, sz); setTimeout(sz, 300); // observe DOM changes that affect height if(window.MutationObserver){ new MutationObserver(sz).observe(root, {childList:true, subtree:true, attributes:true}); }})();



