🎉 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
- @KinglittleQ made their first contribution in #844
- @Molunerfinn made their first contribution in #836
- @nikolasdehor made their first contribution in #851
- @rubychilds made their first contribution in #820
- @AlexanderMerkel made their first contribution in #870
- @chtangwin made their first contribution in #455
- @omdv made their first contribution in #653
- @Athemis made their first contribution in #763
- @jswxharry made their first contribution in #644
- @tercerapersona made their first contribution in #854
- @init-new-world made their first contribution in #812
- @dxtime made their first contribution in #807
- @ClaytonWWilson made their first contribution in #821
- @Tevkanbot made their first contribution in #795
- @pjbakker made their first contribution in #904
- @KimGLee made their first contribution in #832
- @coldxiangyu163 made their first contribution in #922
- @rudy-of-the-corner made their first contribution in #866
Full Changelog: v0.1.4...v0.1.4.post1