Overview
Swarms v16, code-named Overclock, covers the 44 commits merged after 15.0.3, from 2026-09-16 through 2026-10-02. For everything up to 15.0.3, see the v15 changelog. The 16.0.1 to 16.0.4 point releases carry work from the next cycle and are covered with v17. The release adds two new kinds of reasoning.DecisionModel asks typed questions about a state and returns calibrated probabilities instead of text, and TreeOfThoughts searches a tree of partial solutions instead of answering in one pass.
The rest of v16 is about runs you can trust and runs that are fast. A model call that fails every retry now raises AgentLLMError instead of returning an empty string, so fallback_models finally run. More structures start each task from an empty conversation, and several record answers in agent order rather than transcripts in completion order. Tool handling moved out of agent.py into a ToolManager, and the context compressor stopped tokenizing the whole history on every loop, which makes a tool turn about 5x faster on a short conversation and about 65x faster at 300 messages. Three defaults changed: temperature, dynamic_tools and MCPConnection.transport.
Highlights
- DecisionModel: choice, score and yes/no (
noul) questions about a state in one request, with typed answers and calibrated probabilities, on TypeSafe’s Jev or Cloudflare’s Clef. - TreeOfThoughts: a reasoning agent that generates, scores, prunes and searches candidate steps, then answers from the best path.
- Failures raise:
Agent.run()raisesAgentLLMErrorafter every retry fails, and tries each offallback_modelsfirst. - ToolManager: tool handling lives in
agent.tool_manager.agent.pyshrank from 4,566 to 3,227 lines. - Skills reach the model: selected skills are sent with every LLM call, and
skills_diraccepts a list of directories. - Autonomous loop budgets:
max_planning_attempts,max_subtask_iterationsandmax_subtask_loopsare constructor parameters. - More usage totals:
GraphWorkflow.usageandHeavySwarm.usage.
New features
DecisionModel
A decision model does not generate text. It answers typed questions about a state: a choice picks one option, a score rates against ordered levels, and anoul gives the probability that a statement is true. Every question is answered in one request, and each answer must come back with its own type. The default model is TypeSafe’s jev-latest, which reads TYPESAFE_API_KEY. Any name starting with clef ("clef" or "clef-flash") uses Cloudflare Workers AI and reads CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_AUTH_TOKEN, with the same response shape.
choice, score, noul), an async arun, and retries with backoff on rate limits and overloads. get_decision_models() merges the built-in names with each provider’s live list when its credentials are set. Other providers plug in through base_url, endpoint and api_key_env, or by overriding build_headers, build_payload and parse_response. Nine examples ship in examples/decision_models/. Current versions also report prices, summed usage and per-request cost. See DecisionModel.
TreeOfThoughts
TreeOfThoughts implements Tree of Thoughts (Yao et al., 2023). Each step generates num_thoughts candidates, scores each from 0 to 1 and prunes those below value_threshold, then searches breadth-first with a beam of breadth or depth-first with backtracking. max_expansions caps the cost. Every model output is a function call validated against a Pydantic schema, and every call runs on a fresh, stateless agent, so evaluations never share context. thought_description and evaluation_criteria adapt the search to a domain.
ToolManager
All tool handling moved out ofagent.py into ToolManager (swarms/agents/tool_manager.py), built once per agent as agent.tool_manager: schema setup, parsing, execution and retries, MCP, handoffs, dynamic tools and display. The 140-line tool dispatch block in _run is one call now. In the same change, ContextCompressor.should_compress skips tokenizing the history while its UTF-8 size is under the budget, since a token is never shorter than one byte. That was about 78% of a tool turn: it went from about 770 µs to 162 µs on a short conversation, and from 18.2 ms to 0.28 ms at 300 messages.
add_tool, add_tools, remove_tool, remove_tools and mcp_enabled stay on Agent. See ToolManager and the moved names under Removals and breaking changes.
Autonomous loop budgets
The three iteration budgets ofmax_loops="auto" were module constants. They are now Agent parameters with the same defaults, so an agent that sets none behaves as before. max_subtask_iterations bounds the execution-phase LLM calls, each of which re-sends the transcript, so it is the number that caps a run’s cost. Each must be at least 1, or construction raises ValueError.
Skills from several directories
skills_dir accepts one path or a list, read in order. Passing a list used to raise TypeError. When two directories hold a skill with the same name, the later one wins and a warning is logged.
system_prompt after the LLM client had copied it, so requests went out without them while each run added another copy. The skills selected for a task are sent with every call: as a system message when the call has messages, in front of the task otherwise. system_prompt is left unchanged. See Agent skills and SkillsManager.
More usage totals
GraphWorkflow.usage sums Agent.usage over every node and subgraph, counting an agent that backs several nodes once. HeavySwarm.usage also counts question generation, which runs on a bare LiteLLM and was counted nowhere before.
Improvements
Failures that surface. When an LLM call failed every retry,Agent.run() returned an empty string or the prompt, and because nothing was raised, fallback_models were never tried. It now raises AgentLLMError, chained to the provider’s error, after trying each fallback model. The turns the failed attempt added to memory are removed first, so a fallback model does not see the task twice. Current versions leave the retries to LiteLLM and walk fallback_models in one loop, with the same error. See Production best practices.
Per-task isolation. GroupChat’s async run, ReasoningDuo and ConcurrentWorkflow.run start each run from an empty conversation. A second run used to carry the first task as context, and with output_type="dict" two ConcurrentWorkflow.run calls returned the same live list. MajorityVoting.run_concurrently runs each task on its own shallow clone, so the consensus agent no longer sees another task’s votes. SelfConsistencyAgent gives each sample its own agent, so samples are independent draws again. Agent.run(n=...) passes images, callbacks and messages to every sample. (In v17 n is no longer a parameter: passed by keyword it is forwarded to the model request.)
Answers, in order. ConcurrentWorkflow returns results in agent order whether or not the dashboard is on, and records each agent’s answer rather than its transcript. RoundRobinSwarm records answers too: two agents over two loops had recorded turns growing from 335 to 3,612 characters. aggregate() sends worker turns as typed turns and records answers. batch_agent_execution works again and returns results in agent order, with None in the slot of a failed agent.
Tool execution. An agent with tools that answers in plain text records nothing extra. It used to record "[] (empty list)" and make a second LLM call to summarize it, so output_type="final" returned the summary. A failing tool batch runs once per tool_retry_attempts attempt instead of twice, so tools that already succeeded in the batch no longer run again.
Streaming and interactive mode. run_stream and arun_stream route through run(), so max_loops="auto" plans and uses its tools instead of looping with no bound. With interactive=True, the follow-up input is sent to the model, not only recorded.
Conversation storage. Conversation no longer creates ~/.swarms/conversations on every construction, which crashed Agent() on a read-only home directory. Saves go to ./conversations/ as before. A restored conversation seeds its system prompt and rules only when no history was loaded, so autosaved conversations stop gaining a system message per restart.
Examples. New examples cover decision models (a HierarchicalSwarm director, a resume screening funnel, a calibrated ensemble judge, GroupChat guardrails), Tree of Thoughts tasks with verified answers, a runnable aggregate(), and AgentSH, a self-organized multi-agent harness with no orchestrator in examples/guides/agentsh_implementation/.
Bug fixes
router(task)androuter.batch_run(tasks)work for every swarm type. They always passedimgs=None, which onlySequentialWorkflowaccepted.CouncilAsAJudgeruns its judges onmodel_namewhenjudge_agent_model_nameis unset. They had run ongpt-5.4whatever you configured. See CouncilAsAJudge.ModelRouterparses the routing reply intoModelOutputbefore reading it. It raisedAttributeErroron every task. See ModelRouter.- A failed
CronJobrun waits for the next interval instead of re-running on every one-second tick, and idle ticks no longer reset the error count. See CronJob. MCPDeployerenforcestimeoutfor blocking targets. A late result used to come back as a success; the client now gets a tool error. See MCPDeployer.aggregate()defaults to a live model,claude-sonnet-5. The old default,claude-3-sonnet-20240229, is retired, so every call without an explicit model failed.LLMCouncil.runrejects an empty or whitespace-only task withValueError. Its prompt builders moved toswarms/prompts/llm_council_prompts.py, and imports from the struct module still work.- The
heavy-swarmCLI help states the real model default,gpt-5.4, instead ofgpt-4o-mini.
Removals and breaking changes
- A model call that fails every retry raises
AgentLLMErrorinstead of returning (from swarms import AgentLLMError). Catch it, or setfallback_models. temperaturedefaults toNone(was0.5) onAgentandLiteLLM, and is sent only when set, so the provider’s default applies. Current Claude models rejected the old default with HTTP 400. If you relied on 0.5, set it.dynamic_toolsdefaults toFalse(wasTrue). Passdynamic_tools=Trueto keep tool schemas behindtool_search.MCPConnection.transportdefaults to"auto"(was"streamable_http"), so an/sseURL connects over SSE. An explicit transport still wins. See MCP integration.- Tool methods moved from
Agenttoagent.tool_manager:execute_tools,tool_execution_retry,parse_llm_output,setup_tools,setup_dynamic_tools,handle_tool_schema_ops,tool_handling,mcp_tool_handling,add_mcp_tools_to_memory,defer_tool_schemas,defer_mcp_toolsandtemp_llm_instance_for_tool_summary. Private helpers lost their underscore, for example_handoff_task_toolis nowhandoff_task_tool. Tests that patchedswarms.structs.agent.LiteLLMfor the tool summary should patchswarms.agents.tool_manager.LiteLLM. Agent.get_all_selected_toolsand the module-levelparse_done_tokeninswarms.structs.agentwere removed. Useget_autonomous_loop_tool_names()fromswarms.structs.autonomous_loop_utils.- Agents with
skills_dirnow send their skills to the model, which can change answers and token counts. CouncilAsAJudgedefaultsrandom_model_nametoFalse(wasTrue), so it no longer swaps your model for a random one.- The
"xml"output type andswarms/utils/xml_utils.pywere removed.output_type="xml"raisesValueError. Use"json"or"yaml". LLMCouncil.run()dropped thequeryalias. Callrun(task). See LLMCouncil.swarms/utils/swarm_autosave.pywas deleted in favor ofWorkspaceManager, and the unusedHierarchicalOrderRearrangeschema was removed fromhs_schemas.py.
Conclusion
v16 makes runs measurable, honest and fast.DecisionModel and TreeOfThoughts add typed decisions and searched answers, failed model calls raise instead of passing as results, more structures start each task clean, and a tool turn costs a fraction of what it did. When you upgrade from v15, catch AgentLLMError or configure fallback_models, set temperature and dynamic_tools explicitly if you relied on the old defaults, call moved tool methods through agent.tool_manager, and replace output_type="xml" and LLMCouncil.run(query=...). Install it with pip install -U swarms. See Installation.