Skip to content

Releases: HKUDS/nanobot

v0.1.4.post3

Choose a tag to compare

@Re-bin Re-bin released this 28 Feb 18:01

🐈 nanobot v0.1.4.post3 just dropped — 33 PRs merged, 16 new contributors! You guys are unstoppable 🔥

This release is all about making the agent smarter by seeing less junk: cleaner context, hardened session history, and fewer ghost messages. Less noise in → less hallucination out. Plus a shiny new Matrix channel and experimental thinking mode.

Highlights

  • Agent Loop Hardening — Empty assistant messages (no content, no tool calls) are now filtered instead of poisoning context; LLM error responses are no longer saved to history, preventing permanent 400-error loops; message tool suppression scoped to same-channel only (#1314, #1198, #1206)
  • Context Noise Reduction — Runtime metadata (time, channel, chat ID) separated into an untrusted layer and excluded from session history, so the agent sees only what matters — fewer tokens, less confusion, less hallucination (#1126, #1222)
  • Session Safety — Base64 images stripped from history to prevent context overflow; null responses no longer corrupt future turns (#1191, #1314)
  • Matrix Channel — Full Matrix (Element) chat channel support with E2EE, media uploads, and typing indicators (#420, #1239)
  • Provider Compatibility — Short alphanumeric tool_call_id for Mistral; list-type tool arguments handled gracefully; explicit provider selection in config (#1293, #1294, #1214, #1316)
  • Thinking Mode (experimental) — New reasoning_effort config enables LLM reasoning for supported models; session history preserves reasoning_content and thinking_blocks across turns (#1351, #1330, #1074)
  • Subagent Improvements/stop cancels spawned subagents; streamlined prompt eliminates dead code and reuses ContextBuilder (#1180, #1347)
  • Feishu — Interactive card text extraction fix, configurable reaction emoji, corrected bot permissions (#1323, #1257, #1317, #1348)
  • DingTalk — Images and media sent as proper message types instead of plain-text links (#1337)
  • Telegram — Media groups aggregated into a single inbound message (#1258)
  • QQ — Fixed C2C reply permissions, disabled file log on read-only filesystems (#1307, #1346)
  • WhatsApp — Message deduplication prevents redundant agent processing (#1325)
  • Shell & Security — Full Windows path parsing in workspace guard; configurable path_append for subprocess PATH (#1286, #1083)
  • Memory & Concurrency — WeakValueDictionary for consolidation locks eliminates race conditions and manual cleanup (#1326)
  • Workspace — Automatic template synchronization restores critical files on startup (#1253)

What's Changed

  • fix: preserve reasoning_content in messages for thinking-enabled models by @haosenwang1018 in #1074
  • feat/fix(exec): add path_append config to extend PATH for subprocess by @aiguozhi123456 in #1083
  • feat: add stable system layer + untrusted runtime context layer by @pikaxinge in #1126
  • feat: /stop cancels spawned subagents via session tracking by @coldxiangyu163 in #1180
  • feat: support explicit provider selection in config by @Re-bin in #1214
  • Fix assistant messages without tool calls not being saved to session history by @VITOHJL in #1198
  • Fix: The base64 images are stored in the session history, causing context overflow. by @dxtime in #1191
  • feat: add Matrix (Element) chat channel support by @tanishra in #420
  • fix(agent): only suppress final reply when message tool sends to same… by @chengyongru in #1206
  • fix(web): use self.api_key instead of undefined api_key by @yongPhone in #1228
  • fix(telegram): aggregate media groups into a single inbound message by @KimGLee in #1258
  • feat(feishu): make reaction emoji configurable by @kimkitsuragi26 in #1257
  • feat: automatic workspace template synchronization by @honjiaxuan in #1253
  • Fix Matrix channel initialization and configuration by @tanishra in #1239
  • fix(agent): avoid persisting runtime context metadata into history by @KimGLee in #1222
  • fix: update heartbeat tests to match two-phase tool-call architecture by @intelliot in #1200
  • Fix(prompt): guide llm grep using timestamp by @aiguozhi123456 in #1278
  • fix: generate short alphanumeric tool_call_id for Mistral compatibility by @Re-bin in #1293
  • fix: remove overly broad "codex" keyword from openai_codex provider by @nikolasdehor in #1316
  • fix: prevent session poisoning from null/error LLM responses by @nikolasdehor in #1314
  • fix the feishu interactive message text cannot be extracted by @azhengzz in #1323
  • Modify Feishu bot permissions in README by @yankeguo in #1317
  • fix: pass msg_id in QQ C2C reply to avoid proactive message permissio… by @GabrielWithTina in #1307
  • fix: handle list-type tool arguments in _tool_hint by @Michael-lhh in #1294
  • fix(shell): parse full Windows absolute paths in workspace guard by @fengxiaohu in #1286
  • refactor: use WeakValueDictionary for consolidation locks by @Re-bin in #1326
  • fix: add message deduplication to WhatsApp channel by @spartan077 in #1325
  • feat(dingtalk): send images as image messages, keep files as attachments by @asdf17128 in #1337
  • refactor: streamline subagent prompt by reusing ContextBuilder and SkillsLoader by @Re-bin in #1347
  • fix(qq): disable botpy file log to fix read-only filesystem error by @zerone0x in #1346
  • feat: add reasoning_effort config to enable LLM thinking mode by @Re-bin in #1351
  • fix(lark): Remove non-existent stop() call on Lark ws.Client when enable lark channel by @yorkhellen in #1348
  • fix(providers): allow reasoning_content in message history by @fengxiaohu in #1330

New Contributors

Full Changelog: v0.1.4.post2...v0.1.4.post3

v0.1.4.post2

Choose a tag to compare

@Re-bin Re-bin released this 24 Feb 16:31

🐈 nanobot v0.1.4.post2 is here — 32 PRs merged, 14 new contributors! The community is on fire 🔥

This release focuses on reliability: a completely redesigned heartbeat, prompt caching for lower API costs, hardened provider compatibility, and dozens of channel-level fixes. Fewer surprises, more stability.

Highlights

  • Heartbeat Overhaul — Replaced fragile token detection with a virtual tool-call decision mechanism; heartbeat is now truly silent when idle (#1102, #1054, #1039, #1036)
  • Prompt Cache Optimization — Dynamic context (time, session) moved from system prompt to user message, enabling persistent prompt cache hits (#1115)
  • Agent Reliability — Behavioral constraints, full tool history in context, and actionable error hints (#1046)
  • Slack — Thread-isolated sessions, mrkdwn post-processing for bold/header artifacts, socket error handling (#1048, #1107, #957)
  • Feishu — Rich-text image extraction in post messages, file download API fix (#1090, #986)
  • Email — Proactive sends work even when autoReply is disabled, smarter dedup eviction (#1077, #959)
  • Provider Fixes — DeepSeek reasoning_content normalization, empty content block filtering, API key hot-reload via @property (#947, #955, #949, #1071, #1098)
  • Security — Path traversal prevention using relative_to() instead of startswith() (#956)
  • MCP — Configurable timeouts to prevent agent hangs, removed conflicting defaults for HTTP transport (#950, #1062)
  • Memory — Fixed TypeError when LLM returns dict arguments during consolidation (#1061)
  • Discord — Break typing indicator loop on persistent HTTP failure (#1029)
  • CLI — DingTalk, QQ, Email added to nanobot status output (#982)
  • Packaging — Workspace templates moved to nanobot/templates/ for proper pip packaging (#1043)
  • Docs — systemd user service deployment guide (#968)

What's Changed

  • fix: change VolcEngine litellm prefix from openai to volcengine by @init-new-world in #951
  • fix(context): Fix 'Missing reasoning_content field' error for deepseek provider. by @homorunner in #947
  • Remove redundant tools description by @vincentchen0x2-dev in #939
  • feat(cli): add DingTalk, QQ, and Email to channels status output by @luoyingwen in #982
  • fix(security): prevent path traversal bypass via startswith check by @nghiahsgs in #956
  • fix(slack): add exception handling to socket listener by @nghiahsgs in #957
  • fix(session): handle errors in legacy session migration by @nghiahsgs in #958
  • fix(email): evict oldest half of dedup set instead of clearing entirely by @nghiahsgs in #959
  • fix(loop): serialize /new consolidation and preserve session on archival failure by @Athemis in #881
  • fix(qq): make start() long-running per base channel contract by @nghiahsgs in #962
  • docs: add systemd user service instructions to README by @katafractari in #968
  • fix(mcp): add 30s timeout to MCP tool calls to prevent agent hangs by @eliumusk in #950
  • fix(providers): normalize empty reasoning_content to None at provider level by @nghiahsgs in #955
  • fix(feishu): replace file.get with message_resource.get to fix feishu file download problem by @FloRainRJY in #986
  • fix(provider): filter empty text content blocks causing API 400 by @eliumusk in #949
  • feat(channels): add send_progress option to control progress message … by @luoyingwen in #1000
  • fix(heartbeat): route heartbeat runs to enabled chat context by @KimGLee in #1036
  • refactor: move workspace/ to nanobot/templates/ for packaging by @Re-bin in #1043
  • improve agent reliability: behavioral constraints, full tool history, error hints by @Re-bin in #1046
  • feat(slack): isolate session context per thread by @pjbakker in #1048
  • fix(heartbeat): deliver agent response to user and fix HEARTBEAT_OK detection by @Re-bin in #1054
  • fix(heartbeat): make start idempotent and require exact HEARTBEAT_OK by @cyzlmh in #1039
  • fix: break Discord typing loop on persistent HTTP failure by @nikolasdehor in #1029
  • fix(heartbeat): replace HEARTBEAT_OK token with virtual tool-call decision by @Re-bin in #1102
  • fix(web): resolve API key on each call + improve error message by @coldxiangyu163 in #1098
  • Fix: memory consolidation TypeError when LLM returns dict arguments by @suportly in #1061
  • feat(feishu): support images in post (rich text) messages by @xzq-xu in #1090
  • fix(email): allow proactive sends when autoReplyEnabled is false by @chengyongru in #1077
  • **fix(mcp): Remove default timeout for HTTP transport to avoid tool imeout conflicts by @dulltackle in #1062
  • fix: resolve API key at call time so config changes take effect without restart by @haosenwang1018 in #1071
  • fix: stabilize prompt prefix for better cache reuse by @pikaxinge in #1115
  • fix(slack): post-process slackify_markdown to fix leftover bold artifacts by @devops-tomorrow-io in #1107

New Contributors

Full Changelog: v0.1.4.post1...v0.1.4.post2

v0.1.4.post1

Choose a tag to compare

@Re-bin Re-bin released this 21 Feb 13:09

🎉 Another big release from the 🐈 nanobot community — thanks to all contributors, especially our 19 new ones!

This release brings major channel improvements across Feishu, Slack, and Discord, a new provider, prompt caching, and a significant agent loop refactor. More reliable, more capable, leaner code 😄.

Highlights

  • Feishu Media — Bot can now send and receive images, audio, and files (#844, #922)
  • Slack Media Upload — Send files directly from the agent (#904)
  • Discord Long Messages — Automatically splits messages exceeding 2000 characters (#900)
  • VolcEngine Provider — New LLM provider support (#812)
  • Prompt Caching — Anthropic and OpenRouter cache_control support for lower costs (#854, #905)
  • MCP Auth Headers — Custom HTTP headers for authenticated MCP servers (#807)
  • Telegram Improvements — Configurable reply-to behavior, /help bypasses ACL (#879, #824)
  • CLI Subagent Support — CLI now routes through message bus, enabling full subagent support (#908)
  • Reliable Memory — Memory consolidation uses structured tool calls instead of fragile JSON parsing (#866)
  • Leaner Agent Loop — Extracted memory logic, merged redundant methods, -31% lines (#930)
  • Smarter File Editing — edit_file now shows a diff when old_text doesn't match (#921)
  • Bug Fixes — MCP reconnection, session key persistence, duplicate replies, cron execution, and more (#892, #902, #832, #821, #823, ...)

What's Changed

  • feat(feishu): support sending images, audio, and files by @KinglittleQ in #844
  • fix: Codex provider routing for GitHub Copilot models by @Molunerfinn in #836
  • fix: wait for killed process after shell timeout to prevent fd leaks by @nikolasdehor in #851
  • Fix safety guard false positive on 'format' in URLs by @rubychilds in #820
  • fix: remove dead pub/sub code from MessageBus by @AlexanderMerkel in #870
  • fix: use loguru native formatting to prevent KeyError on curly braces by @nikolasdehor in #864
  • Fix: Add UTF-8 encoding and unicode support for JSON output by @chtangwin in #455
  • fix(tools): resolve relative file paths against workspace by @omdv in #653
  • fix(cron): validate timezone inputs when adding jobs by @Athemis in #763
  • fix(agent): handle non-string values in memory consolidation by @jswxharry in #644
  • feat: add Anthropic prompt caching via cache_control by @tercerapersona in #854
  • fix: allow retry for models that send interim text before tool calls by @nikolasdehor in #825
  • fix: prevent duplicate memory consolidation tasks per session by @nikolasdehor in #823
  • fix: /help command bypasses ACL on Telegram by @nikolasdehor in #824
  • feat: Add VolcEngine LLM provider support by @init-new-world in #812
  • feature: Added custom headers for MCP Auth use. by @dxtime in #807
  • feat: Agent is able to reply to original message (Telegram Channel) by @DaryeDev in #815
  • fix: make cron run command actually execute the agent by @ClaytonWWilson in #821
  • feat: make Telegram reply-to-message behavior configurable, default false by @Re-bin in #879
  • fix: fixed not logging tool uses if a think fragment had them attached. by @DaryeDev in #833
  • fix: Resolve "Unrecognized chat message" error for StepFun and strict providers by @Tevkanbot in #795
  • feat: add OpenRouter prompt caching via cache_control by @tercerapersona in #905
  • feat(slack): add media file upload support by @pjbakker in #904
  • fix: convert remaining f-string logger calls to loguru native format by @nikolasdehor in #903
  • fix: split Discord messages exceeding 2000-character limit by @nikolasdehor in #900
  • fix: store session key in metadata to avoid lossy filename reconstruction by @nikolasdehor in #902
  • fix(agent): avoid duplicate email replies when message tool already sends by @KimGLee in #832
  • fix: allow MCP reconnection after transient failure by @nikolasdehor in #892
  • refactor: route CLI interactive mode through message bus by @Re-bin in #908
  • feat(feishu): add multimedia download support for images, audio and files by @coldxiangyu163 in #922
  • fix(tools): provide detailed error messages in edit_file when old_text not found by @themavik in #921
  • fix: preserve interim content as fallback when retry produces empty response by @nikolasdehor in #887
  • refactor(loop): remove interim text retry, use system prompt constraint instead by @Re-bin in #928
  • fix(memory): Enforce memory consolidation schema with a tool call by @rudy-of-the-corner in #866
  • refactor: extract memory consolidation to MemoryStore, slim down agent loop by @Re-bin in #930
  • fix(agent): keep empty fallback sentinel CLI-only by @Athemis in #926

New Contributors

Full Changelog: v0.1.4...v0.1.4.post1

v0.1.4

Choose a tag to compare

@Re-bin Re-bin released this 18 Feb 14:38

🎉 Another big release from the 🐈 nanobot community — thanks to all contributors, especially our 18 new ones!

This release adds MCP tool server support, real-time progress streaming so users actually see what the agent is doing, and a wave of new providers (Custom OpenAI-compatible, GitHub Copilot, OpenAI Codex, SiliconFlow). Channels got a lot of love too — Telegram now handles media uploads and long messages, Slack got proper mrkdwn and thread replies, Feishu supports rich text. We also added Docker Compose for one-command deployment, scoped sessions to workspace, and switched to json_repair for bulletproof LLM response parsing. Less silence, more providers, better channels — that's the nanobot way.

Highlights

  • MCP Support — Connect external tool servers via Model Context Protocol (#554)
  • Progress Streaming — Agent shows what it's doing during multi-step tool execution (#802)
  • New Providers — Custom OpenAI-compatible endpoints, GitHub Copilot, OpenAI Codex, SiliconFlow (#786, #720, #312, #151, #630)
  • Channel Improvements — Telegram media uploads & message splitting, Slack thread replies & mrkdwn, Feishu rich text (#747, #694, #717, #784, #629, #593)
  • Docker Compose — One-command deployment (#765)
  • Workspace-scoped Sessions — Sessions now live inside workspace with legacy migration (#713)
  • Robust JSON Parsing — json_repair for handling malformed LLM responses (#664)

What's Changed

  • 优化飞书卡片信息中的markdown标题显示 by @C-Li in #593
  • feat: add custom provider and non-destructive onboard by @Re-bin in #604
  • Upgrade Onboarding feature by @lukemilby in #583
  • fix: bug #370, support temperature configuration by @wymcmh in #560
  • fix: Cache expiration issue related fixes by @chengyongru in #590
  • 增加支持飞书富文本内容接收。Add support for receiving Feishu rich text content. by @C-Li in #629
  • fix(providers): clamp max_tokens to >= 1 before calling LiteLLM by @themavik in #617
  • 修复corn忽略时区设置的问题,并在缺省时自动使用本机时区 by @C-Li in #625
  • feat(tools): add mcp support by @SergioSV96 in #554
  • fix: use json_repair for robust LLM response parsing by @Re-bin in #664
  • Add OpenAI Codex OAuth login and provider support by @pinhua33 in #151
  • Fix/Convert Markdown to Slack's mrkdwn formatting by @alekwo in #704
  • fix(telegram): Slash commands failing access check due to missing username in sender_id by @TomLisankie in #701
  • fix(telegram): split long messages to avoid Message is too long error by @zhouzhuojie in #694
  • slack: use slackify-markdown for proper mrkdwn formatting by @xek in #717
  • feat: add ClawHub skill by @Re-bin in #758
  • fix(cron): preserve timezone for cron schedules by @jcpoyser in #744
  • feat: Added GitHub Copilot as Provider by @DaryeDev in #720
  • fix: avoid sending empty content entries in assistant messages by @zhuhui-in in #748
  • feat: Allow Agent to upload media files (voice, pictures, documents) to Telegram Channel by @DaryeDev in #747
  • fix(config): mcpServers env variables should not be converted to snake case by @fyhertz in #766
  • Enable Cron Tool on CLI Agent. by @DaryeDev in #746
  • feat: add Docker Compose support for easy deployment by @srajasimman in #765
  • feat: add custom provider with direct openai-compatible support by @Re-bin in #786
  • slack: Added replyInThread logic and custom react emoji in config by @hyudryu in #784
  • [ADD] GitHub copilot support by @jeroenev in #312
  • feat: add SiliconFlow provider support by @mtics in #630
  • Scope Session Storage to Workspace (with legacy fallback) by @kiplangatkorir in #713
  • feat: stream intermediate progress to user during tool execution by @Re-bin in #802

New Contributors

Full Changelog: v0.1.3.post7...v0.1.4

v0.1.3.post7

Choose a tag to compare

@Re-bin Re-bin released this 13 Feb 06:21

🎉 Another big release from the 🐈 nanobot community — thanks to all contributors, especially our 8 new ones!

This release fixes a critical WhatsApp bridge security vulnerability, redesigns the memory system from the ground up (two plain files + grep, no RAG), and adds interleaved chain-of-thought for smarter multi-step reasoning. We also welcome MiniMax as a new provider, and unified /new command across all platforms. Less code, more reliable — that's the nanobot way.

What's Changed

  • Support MoChat Channel, an agent-first IM platform by @tjb-tech in #389
  • fixed dingtalk exception. by @Mrart in #439
  • feat: add MiniMax provider support via LiteLLM by @tars90percent in #307
  • fix:cli input clean and display issue by @zcxixixi in #488
  • fix: pydantic deprecation configdict by @SergioSV96 in #516
  • feat: add interleaved chain-of-thought to agent loop by @Re-bin in #538
  • feat(cron): add 'at' parameter for one-time scheduled tasks by @3927o in #533
  • fix(subagent): add edit_file tool and time context to sub agent by @Re-bin in #543
  • feat: redesign memory system — two-layer architecture with grep-based retrieval by @Re-bin in #565
  • feat: add /new command by @Qinnnnnn in #569
  • Add max iterations info to fallback message by @3927o in #567
  • fix(security): bind WhatsApp bridge to localhost + optional token auth by @Re-bin in #587

New Contributors

Full Changelog: v0.1.3.post6...v0.1.3.post7

v0.1.3.post6

Choose a tag to compare

@Re-bin Re-bin released this 10 Feb 03:04

🎉 The 🐈 nanobot community keeps growing — thanks to all the amazing contributors who made this release possible!

Tip

Due to security concerns, this version has a vulnerability in WhatsApp. Please do not install this version. Instead, install v0.1.3.post7 or higher.

This release brings more channels (DingTalk, Slack, Email, QQ), a smoother nanobot agent CLI experience, provider cleanup, and README polish. Want to see where we're heading? Check out our roadmap discussion: From Lightweight Agent to Agent Kernel — we'd love your feedback! 👉 #431

What's Changed

New Contributors

Full Changelog: v0.1.3.post5...v0.1.3.post6

v0.1.3.post5

Choose a tag to compare

@Re-bin Re-bin released this 07 Feb 18:08

🎉 The 🐈 nanobot community keeps growing — thanks to all the amazing contributors who made this release possible!

Tip

Due to security concerns, this version has a vulnerability in WhatsApp. Please do not install this version. Instead, install v0.1.3.post7 or higher.

🐈 nanobot now supports more LLMs (DashScope/Qwen, Moonshot/Kimi, DeepSeek), hangs out in more places (Discord, Feishu), and got a serious security checkup. 🐈 nanobot has you covered.

What's Changed

  • add feishu channel support by @huhu-tiger in #84
  • feat: add DeepSeek provider support by @kyya in #38
  • chore: change 'depoly' to 'deploy' by @vivganes in #174
  • feat: added runtime environment summary to system prompt by @DeeJ4yNg in #107
  • feat: discord support by @anunay999 in #24
  • feat: add Moonshot provider support by @Rheasilvia in #202
  • Security: Critical vulnerabilities found - Shell Injection, Path Traversal, and LiteLLM RCE by @kingassune in #77
  • fix: correct API key environment variable for vLLM mode by @popcell in #42
  • [Fix-204]: use correct ZAI_API_KEY for Zhipu/GLM models #204 by @wcmolin in #205
  • Feat: Add DashScope support for improved accessibility by @ZJUCQR in #46
  • Fixes Access Denied because only the LID was used. by @adrianhoehne in #287
  • feat: add telegram proxy support and add error handling for channel s… by @adieUkid in #289

New Contributors

Full Changelog: v0.1.3.post4...v0.1.3.post5

v0.1.3.post4

Choose a tag to compare

@Re-bin Re-bin released this 04 Feb 09:33

🎉 Thanks to all the amazing contributors who made this release possible!

Tip

Due to security concerns, this version has a vulnerability in WhatsApp. Please do not install this version. Instead, install v0.1.3.post7 or higher.

This release brings exciting new features including vLLM/local LLM support, Gemini & Zhipu & Bedrock providers, Telegram vision & voice support, Docker deployment, and important bug fixes. We're thrilled to see the 🐈nanobot community growing!

What's Changed

New Contributors

Full Changelog: https://github.com/HKUDS/nanobot/commits/v0.1.3.post4