π nanobot v0.1.5 is here π β 66 PRs merged, 27 new contributors, and the first release with its own home.
We're excited to announce that nanobot now has an official website at nanobot.wiki, with multilingual documentation in English, Chinese, Japanese, Korean, Spanish, and French. Building it reminded us why we do this: nanobot has always belonged to the open-source community, and a proper home β one that speaks your language β felt overdue. Every doc page, every translation, every example is open and contribution-ready. That's not going to change.
Now, about the release itself. If v0.1.4.post6 was about decomposing the foundation, v0.1.5 is about making the building livable. The agent can now run for hours without losing its mind. Memory got a proper architecture. And running nanobot in production went from "possible" to "comfortable." This is the release where nanobot stops being a prototype and starts being infrastructure.
Highlights
-
Long-running tasks got more reliable β Long-running tasks received a ground-up reliability pass. The runtime now handles
CancelledErrorwithout orphaning subprocesses, retry classification uses structured error metadata instead of regex-on-error-text (so a 429 quota exhaustion stops immediately while a rate limit waits and retries), SDK-level auto-retries were disabled to prevent request amplification, and Azure retries no longer double-dip. If your agent runs cron jobs, orchestrates tools overnight, or handles bursty traffic β this is the release that makes those sessions stick. (#2733, #2762, #2759, #2761, #2765) -
Memory got an architecture β meet Dream β The new two-stage memory system separates live conversation history from consolidated long-term knowledge. Dream runs as a background consolidation pass β think of it as the agent sleeping on what it learned β backed by git-versioned storage so every memory state is recoverable. Legacy
HISTORY.mdfiles migrate automatically. Jinja2 templating arrived alongside Dream, giving you control over how the agent shapes its responses and memory summaries. This isn't a feature bolted on β it's the memory system nanobot should have had from day one. (#2717, #2779, and 10+ follow-up hardening commits) -
Running nanobot in production got real β
execcalls are now sandboxed viabwrapand containers run as non-root by default. The exec tool no longer leaks host environment variables to the LLM. API port binds to localhost by default. Config secrets support${VAR}interpolation so you never have to hardcode a key again. A newnanobot-apiDocker service gives you an isolated OpenAI-compatible endpoint out of the box. WhatsApp bridge gained automatic local auth. These aren't glamorous changes β they're the reason you'll sleep through the night after deploying. (#1940, #2831, #2830, #2841, #2715) -
Three new providers, and GPT-5 is ready β GPT-5 model family support landed with proper temperature handling. Xiaomi MiMo joined for on-device inference fans. Baidu Qianfan arrived for the Chinese ecosystem. Dashscope and ModelArk got proper thinking parameter control. And
reasoning_content(chain-of-thought from DeepSeek-R1, Kimi, MiMo) is now visible and preserved through the full message pipeline. nanobot keeps meeting users wherever their models are. (#2788, #2495, #2811, #2840, #2770) -
Channels kept getting better β Email now extracts attachments with MIME filtering and filename sanitization. WhatsApp gained voice transcription via Groq/OpenAI Whisper. Feishu auto-removes reactions after processing and supports video downloads. Telegram renders tool hints as collapsible blockquotes, supports DM threads, and splits oversized streamed replies. WeChat multimodal alignment continued. Langfuse integration landed for production observability. And
/statusnow shows web search provider usage alongside cache hit rates. (#2815, #2530, #2812, #2810, #2793, #2520, #2659, #2832, #2703) -
Developer experience, quietly β Built-in
grepandglobtools give the agent native code search. The Tool class was refactored with proper JSON Schema for parameters. The Python SDK facade enables programmatic per-session isolation. The CLI gained--configfor multi-instance setups. Web search was unified underWebToolsConfigwith toggle controls. And the test suite grew to 1,142 tests, all green. (#2754, #2780, #2653, #2740, #2643)
Community
Welcome to our 27 new contributors who made their first contribution in this release.
v0.1.5 is shaped by a simple conviction: an AI agent framework earns trust not by adding features, but by being the kind of software you'd run unattended on a Friday night. Memory that doesn't forget. Retries that don't amplify. Sandboxes that don't leak. Every contributor who hardened a boundary, caught a race condition, or added a test β you made nanobot more trustworthy today than it was yesterday. That's the only metric that matters.
Full Changelog: v0.1.4.post6...v0.1.5
What's Changed
- fix(skill-creator): Fix grammar in SKILL.md: 'another the agent' by @quanmou in #2586
- feat: add OpenAI-compatible API by @goxofy in #1362
- feat(agent): add CompositeHook for composable lifecycle hooks by @sontianye in #2615
- feat: add Python SDK facade and per-session isolation by @Re-bin in #2653
- fix: three minor user-facing fixes (#2651, #2566, #2579) by @04cb in #2656
- fix: Prevent ExecTool registration in Subagent when exec_config.enable is False by @yorkhellen in #2648
- feat(channel): matrix/discord enhancement by @chengyongru in #2673
- Feat(WeiXin): WeXin multimodal capabilities and align with version 2.1.1 by @xcosmosbox in #2614
- fix(test): fix flaky test_fixed_session_requests_are_serialized by @chengyongru in #2676
- fix: restore GitHub Copilot auth flow by @RongLei-intel in #2668
- fix(agent): message tool incorrectly replies to original chat when targeting different chat_id by @WormW in #2474
- fix: ExecTool to block root directory paths when restrict_to_workspace is enabled by @yorkhellen in #2683
- fix(providers): only apply cache_control for Claude models on OpenRouter by @Tejas1Koli in #2687
- feat(provider): show cache hit rate in /status (#2645) by @chengyongru in #2703
- feat(cron): add deliver parameter to support silent jobs by @xgzlucario in #2718
- chore(provider): Use OpenAI Responses API for Azure OpenAI Provider by @kunalk16 in #2661
- test(matrix): skip cleanly when optional deps are missing by @haosenwang1018 in #2741
- feat(cli): add --config option to channels login and status commands by @masterlyj in #2740
- feat: harden agent runtime for long-running tasks by @Re-bin in #2733
- feat(channel): channel enhancement by @chengyongru in #2769
- fix: restore Weixin typing indicator by @cypggs in #2646
- feat(provider): add Xiaomi MiMo LLM support by @LingaoM in #2495
- feat(provider): support reasoning_content in OpenAI compat provider by @LingaoM in #2770
- fix(restart): send completion notice after channel is ready and unify⦠by @imfondof in #2745
- feat: unify web tool config under WebToolsConfig + add web tool toggle controls by @Shiniese in #2643
- fix: Support media directory access when
restrict_to_workspaceis enabled by @Shiniese in #2743 - fix: Retry-After was ignored, causing premature retries (now honors header/json hints) by @pikaxinge in #2761
- fix: stop retry amplification (12β4 requests) by disabling SDK auto-retries by @pikaxinge in #2759
- feat(memory): two-stage memory system with Dream consolidation by @chengyongru in #2717
- feat: integrate Jinja2 templating for agent responses and memory cons⦠by @JackLuguibin in #2779
- fix(security): add ssrfWhitelist config to unblock Tailscale/CGNAT (#2669) by @04cb in #2715
- refactor: streamline Tool class methods and improve type handling by @JackLuguibin in #2780
- fix(provider): restore reasoning_content and extra_content in message⦠by @LingaoM in #2786
- feat(providers): add GPT-5 model family support by @friday-james in #2788
- perf(cache): stabilize tool prefix caching under MCP tool churn by @pikaxinge in #2722
- fix(docker): rewrite github ssh git deps to https for npm build by @Wenzhang-Chen in #1700
- feat(agent): add built-in grep and glob search tools by @Re-bin in #2754
- fix(cli): prevent spinner ANSI escape codes from being printed verbatim by @chengyongru in #2809
- feat(telegram): render tool hints as expandable blockquotes by @chengyongru in #2810
- feat(provider): add Qianfan provider support by @chengyongru in #2811
- feat(feishu): auto-remove reaction after processing and support video download by @chengyongru in #2812
- fix: stop leaking reasoning_content to stream output by @chengyongru in #2817
- fix(dream): allow LLM to retry on tool errors by @chengyongru in #2824
- fix(web-search): fix Jina search request format and restore DuckDuckGo fallback by @KimGLee in #2808
- Fix: add asyncio timeout guard for DuckDuckGo search by @hoaresky in #2805
- fix(telegram): support threads in DMs by @IlyaSemenov in #2793
- refactor(agent): streamline hook method calls and enhance error logging by @JackLuguibin in #2794
- feat: sandbox exec calls with bwrap and run container as non-root (minimally fixes #1873) by @kinchahoy in #1940
- chore: add codespell support (config, workflow to detect/not fix) and make it fix a few typos by @yarikoptic in #121
- security: prevent exec tool from leaking process env vars by @benlenarts in #2831
- docs: another two places for renaming assitant to agent by @qixinbo in #2835
- expand /status to show web search provider usage limits (#2820) by @wanghesong2019 in #2832
- security: support ${VAR} env var interpolation for config secrets by @benlenarts in #2830
- fix(shell): kill subprocess on CancelledError to prevent orphan proce⦠by @LingaoM in #2765
- fix(feishu): match bot's own open_id in _is_bot_mentioned to prevent β¦ by @yq612 in #2719
- feat(provider): ζ·»ε Langfuse θ§ζ΅εΉ³ε°ηιζζ―ζ by @lang07123 in #2659
- fix(matrix): fix e2ee authentication by @limdingwen in #2596
- feat(whatsapp): add voice message transcription via OpenAI/Groq Whisper by @franciscomaestre in #2530
- fix(whatsapp): detect phone vs LID by JID suffix, not field name by @franciscomaestre in #2531
- Fix cron reminder notifications being suppressed by @mrbob-git in #2449
- fix(telegram): split oversized final streamed replies by @Michael-lhh in #2520
- feat(email): add attachment extraction support by @benlenarts in #2815
- feat(agent): Adjust thinking method for Dashscope and Modelark by @power88 in #2840
- feat(docker): add nanobot-api service with isolated workspace by @dividduang in #2841
- fix: make app-layer retry classification structured (408/409/timeout/connection) by @pikaxinge in #2762
- fix(status): use correct AgentLoop attribute for web search config by @yanghan-cyber in #2844
New Contributors
- @quanmou made their first contribution in #2586
- @goxofy made their first contribution in #1362
- @sontianye made their first contribution in #2615
- @RongLei-intel made their first contribution in #2668
- @WormW made their first contribution in #2474
- @Tejas1Koli made their first contribution in #2687
- @masterlyj made their first contribution in #2740
- @cypggs made their first contribution in #2646
- @LingaoM made their first contribution in #2495
- @imfondof made their first contribution in #2745
- @Shiniese made their first contribution in #2643
- @friday-james made their first contribution in #2788
- @Wenzhang-Chen made their first contribution in #1700
- @hoaresky made their first contribution in #2805
- @IlyaSemenov made their first contribution in #2793
- @kinchahoy made their first contribution in #1940
- @yarikoptic made their first contribution in #121
- @qixinbo made their first contribution in #2835
- @wanghesong2019 made their first contribution in #2832
- @yq612 made their first contribution in #2719
- @lang07123 made their first contribution in #2659
- @limdingwen made their first contribution in #2596
- @franciscomaestre made their first contribution in #2530
- @mrbob-git made their first contribution in #2449
- @power88 made their first contribution in #2840
- @dividduang made their first contribution in #2841
- @yanghan-cyber made their first contribution in #2844
Full Changelog: v0.1.4.post6...v0.1.5