Highlight
- Standard Operating Procedures (Experimental): Added the
agentscope.sopmodule for splitting a task into ordered milestones, each verified before the next one starts, with run state that can be persisted and resumed. The agent service also exposes/sopendpoints to store procedures, start runs, and review steps by hand. - Team Pipeline: Added a
TeamPipelineclass where a leader agent delegates tasks to member agents, which run concurrently and hand their results back. - More Realtime Voice Models: Added OpenAI Realtime, Gemini Live, and xAI Grok Voice models to the realtime voice agent.
- Terminal UI: Introduced the
agentscope.tuimodule, a full-screen terminal interface for chatting with agents and running realtime voice sessions vialaunch_realtime_ui. - AskUser Tool: Added
AskUser, an external tool that lets agents ask users multiple-choice questions. - MiniMax Model and Jev-based Model Routing: Added the MiniMax chat model (M3 by default), and a
ModelRouterMiddlewarebacked by the newagentscope.classifiermodule (with Jev support) that picks the chat model for each reply. - DingTalk Knowledge Base Tools: Agents on DingTalk channels can now search DingTalk knowledge bases.
- Safer Shell Permission Checks: Tightened read-only command detection so destructive
git,sed, andteeusages no longer skip permission confirmation.
What's Changed
- feat(realtime): support xAI Grok voice API model by @DavdGao in #2553
- ci(github): track pr state with awaiting review / awaiting changes labels by @DavdGao in #2560
- feat(realtime): support OpenAI Realtime API model by @DavdGao in #2552
- feat(realtime): support Gemini Live API model by @DavdGao in #2556
- feat(tool): add AskUser, an external tool for asking the user by @DavdGao in #2573
- feat(channel): add DingTalk knowledge base tools by @iluv7 in #2464
- feat(tui): add rich textual chat interface by @DavdGao in #2507
- fix(utils): preserve property names during schema flattening by @Tsubaki-01 in #2575
- fix(agent): include paths in tool validation errors by @liugy789 in #2584
- feat(sop): standard operating procedures — fixed milestones, each verified by @DavdGao in #2393
- docs: announce AgentScope v2 skill support by @DavdGao in #2578
- fix(realtime): request a response after a caller-committed turn by @DavdGao in #2559
- fix(channel): preserve wakeups for messages arriving during run finalization by @CoralGarden52 in #2521
- fix(realtime): report tool call arguments in the event stream by @DavdGao in #2593
- fix(app): assign unique AG-UI message IDs to tool results by @liugy789 in #2555
- fix(utils): preserve instance values during schema flattening by @Tsubaki-01 in #2592
- test(mcp): derive the expected tool description from doc by @fszcd in #2611
- fix(storage): make packaged alembic.ini ASCII-safe for non-UTF-8 locales by @fszcd in #2607
- docs: fix dead realtime docs links in README and news by @Shxiao101 in #2600
- docs: point eslint plugin links to the npm package pages by @Shxiao101 in #2602
- docs: fix broken apple container install link by @Shxiao101 in #2601
- feat(tui): add launch_realtime_ui for voice sessions by @DavdGao in #2594
- fix(sop): write out what a step actually kept by @DavdGao in #2616
- fix(realtime): reconnect before sending text input by @wuwenbo0626 in #2591
- fix(realtime): drop the previous session's terminal events on reconnect by @L4XB in #2588
- fix(tool): only validate external result metadata on success by @DavdGao in #2623
- test(read): use portable missing file path by @wangtaotaotao95 in #2620
- fix(tool): bound glob search tool output by @liugy789 in #2572
- feat(model): add ollama model cards for qwen3-7b, llama3.2, and phi4-mini by @nuthalapativarun in #1753
- fix(agent): preserve reply usage in final messages by @liugy789 in #2562
- test(workspace): skip POSIX-shell-dependent tests on Windows hosts without coreutils by @fszcd in #2609
- fix(formatter): keep media from tool results after all tool messages of a turn by @alanhuangyoo in #2613
- fix(model): preserve Anthropic streaming content blocks by @RICARDO51167 in #2495
- fix(formatter): drop empty Gemini text parts by @wangtaotaotao95 in #2641
- fix(formatter): drop empty hint text by @wangtaotaotao95 in #2656
- fix(rag): read the text inside grouped shapes in PPTParser by @L4XB in #2660
- fix(formatter): preserve first rendered history marker by @wangtaotaotao95 in #2643
- docs: update ecosystem image in READMEs by @Osier-Yi in #2673
- fix(examples): rename the default MCP client to match the server it runs by @L4XB in #2644
- fix(tui): hide realtime messages that fail to send by @wuwenbo0626 in #2646
- fix(tool): stop classifying tee as a read-only command by @harbinresearcher in #2629
- fix(message_bus): expire the in-memory try_lock claim after ttl_secs by @L4XB in #2654
- fix(console): propagate caller cancellation by @wangtaotaotao95 in #2658
- fix(app): pass model card's context_size to chat model by @code-code567 in #2597
- fix(tool): validate AskUser question constraints by @wuwenbo0626 in #2586
- ci(issue-triage): verify new bug reports with an agent by @DavdGao in #2678
- fix(ci): let the triage workflows create their environment by @DavdGao in #2680
- fix(realtime): include reply ID in interrupt events by @Tsubaki-01 in #2692
- fix(rag): drop empty and whitespace-only chunks in ApproxTokenChunker by @iluv7 in #2687
- fix(embedding): expose DashScope multimodal capability by @Tsubaki-01 in #2701
- fix(tool): copy the tool lists a ToolGroup is constructed with by @sxh313 in #2721
- feat(model): add model cards for the latest models by @DavdGao in #2727
- fix(agent): propagate cancellation after interruption cleanup by @Cryocell77 in #2650
- fix(middleware): prevent KeyError in budget middleware when ReplyEndEvent is swallowed by @Terminator666666 in #2419
- fix(rag): preserve image-only and header-only Excel sheets by @yang0228 in #2666
- fix(tool): sort ripgrep output by path so Grep pagination is stable by @DavdGao in #2726
- fix(embedding): avoid blocking the event loop by @Tsubaki-01 in #2703
- fix(agent): keep tool-result metadata and timestamps when truncating by @Lesereingrape in #2754
- fix(realtime): reset local transport across restarts by @wangtaotaotao95 in #2740
- feat(workflows): cap open issues and claims at five per contributor by @DavdGao in #2761
- fix(formatter): fall back to the media placeholder in xAI tool results by @lihongyuan99 in #2751
- fix(tool): check every sed -e expression against the denylist by @lihongyuan99 in #2747
- fix(tool): count written lines the way Read numbers them by @lihongyuan99 in #2734
- fix(storage): keep native datetimes for promoted DateTime columns by @lihongyuan99 in #2749
- fix(utils): honour set_timestamp_factory in all entities by @lihongyuan99 in #2733
- feat(classifier): add Jev support and chat model routing middleware by @qbc2016 in #2758
- fix(rag): support float metadata filters in Qdrant by @Shy7777 in #2783
- fix(embedding): keep the cache when a batch cannot fit its size limit by @sxh313 in #2790
- fix(tool): judge sed long options that carry an inline value by @sxh313 in #2795
- fix(formatter): forward the images of collapsed messages in xAI multi-agent history by @Lesereingrape in #2808
- docs: fix commit format examples in contributing guides by @yc2bgr8 in #2811
- fix(scheduler): normalize standard cron weekday numbering by @dafyy321-pixel in #2770
- fix(workspace): skip agentscope deps when building the gateway image by @sxh313 in #2803
- fix(middleware): stop inheriting the previous reply's routed model by @sxh313 in #2793
- fix(workspace): deregister stateless MCPs from sandbox gateway by @qbc2016 in #2777
- fix(rag): keep text inside nested Word tables by @ydflow in #2759
- fix(memory): deduplicate selected files before limiting retrieval by @Shy7777 in #2776
- chore(version): bump version to 2.0.9 by @DavdGao in #2887
- fix(response): honor configured timestamp factory by @wangtaotaotao95 in #2822
- fix(a2a): keep observed messages when the reply is rejected before sending by @ydflow in #2875
- fix(tool): respect empty model input types by @wuwenbo0626 in #2857
- chore(credential): remove the empty _kimi module left over from the moonshot rename by @kyy-logs in #2884
- fix(rag): normalize Word and Excel parser errors by @iluv7 in #2881
- docs: point the PyPI documentation link to the v2 docs by @zaher-m in #2882
- style: correct two typos in comments by @kbkb628 in #2836
- fix(formatter): respect xAI image input types by @wangtaotaotao95 in #2823
- fix(tool): clarify Windows asyncio subprocess error in LocalBackend by @lwylab in #2837
- fix(tool): refresh the read cache after Edit and Write by @ydflow in #2865
- fix(rag): preserve images in PowerPoint picture placeholders by @twei43846-afk in #2851
- fix(tui): count changed lines that start with a diff marker by @lihongyuan99 in #2830
- fix(pipeline): keep multimodal goals intact in verifier retry instructions by @ydflow in #2860
- fix(formatter): preserve DeepSeek images and Moonshot videos by @qbc2016 in #2825
- feat(models): add MiniMax chat model support (M3 default) by @octo-patch in #1764
- feat(pipeline): support leader-member delegation in a
TeamPipelineclass by @DavdGao in #2764 - fix(model): enable image and video input for Kimi K2.7 Code models by @DavdGao in #2890
- fix(tool): parse attached sed short-option values by @wangtaotaotao95 in #2824
- fix(tool): stop git subcommands from passing the read-only fast path with destructive arguments by @ydflow in #2883
- fix(workspace): return the registered client from add_mcp by @qbc2016 in #2781
- fix(agent): interpolate current time into the compression prompt by @ydflow in #2867
- fix(rag): keep text and NA-like values intact in ExcelParser by @DavdGao in #2893
- feat(app): standard operating procedures at the service layer by @DavdGao in #2617
- fix(app): guard parked inbox continuations by @014-code in #2849
New Contributors
- @Tsubaki-01 made their first contribution in #2575
- @fszcd made their first contribution in #2611
- @L4XB made their first contribution in #2588
- @wangtaotaotao95 made their first contribution in #2620
- @alanhuangyoo made their first contribution in #2613
- @harbinresearcher made their first contribution in #2629
- @code-code567 made their first contribution in #2597
- @sxh313 made their first contribution in #2721
- @Cryocell77 made their first contribution in #2650
- @Terminator666666 made their first contribution in #2419
- @Lesereingrape made their first contribution in #2754
- @lihongyuan99 made their first contribution in #2751
- @Shy7777 made their first contribution in #2783
- @yc2bgr8 made their first contribution in #2811
- @dafyy321-pixel made their first contribution in #2770
- @ydflow made their first contribution in #2759
- @kyy-logs made their first contribution in #2884
- @zaher-m made their first contribution in #2882
- @kbkb628 made their first contribution in #2836
- @lwylab made their first contribution in #2837
- @twei43846-afk made their first contribution in #2851
Full Changelog: v2.0.8...v2.0.9