Skip to main content
当开发者需要快速验证或调试一个智能体时,可以直接在终端中与它对话、查看完整的事件流,无需启动 Web 服务,也无需手动分发 reply_stream 产出的数十种事件。 AgentScope 为此提供两种终端界面:agentscope.console 逐行打印事件流,只依赖核心安装;agentscope.tui 基于 Textual 提供全屏交互界面,支持 Markdown 渲染、键盘选择确认与 AskUser 问答表单。 两个模块的接口与适用场景如下:

启动交互对话

launch_console 接收一个构造完成的智能体,接管终端交互的全部环节:
与智能体在终端中对话
运行后各交互环节的行为如下: launch_console 支持以下参数:
Agent | PipelineProtocol
必填
要交互的智能体,或任意满足 PipelineProtocol 的流水线。
str
默认值:"user"
用户消息的发送者名称,同时用作输入提示符。
str
默认值:"default"
输出详细程度,取值为 "quiet"、"default" 或 "debug",详见控制输出详细程度。
int | None
默认值:"20"
单条工具结果的最大打印行数,超出部分折叠为提示行,None 表示不截断。
launch_console 与 launch_tui 都不包含会话管理与持久化:对话状态保存在 agent.state 中,随进程退出而结束。若需要多用户、多会话与持久化存储,请使用智能体服务。

嵌入事件渲染器

当开发者自己掌控运行逻辑(例如多智能体流水线、测试脚本)时,可以只使用 ConsoleRenderer 完成打印。渲染器是被动的:事件如何产生、输入与确认如何处理,均由调用方决定。
在自己的代码中渲染事件流
渲染器按回复标识区分事件的归属,因此多个智能体顺序发言时可以复用同一个实例:
渲染多智能体流水线
渲染器对各类事件的处理规则如下:
工具确认、外部执行等需要人工介入的事件,渲染器只负责显示提醒;如何收集确认结果并继续回复由调用方实现,可参考人机协作。

控制输出详细程度

launch_console 与 ConsoleRenderer 均通过 verbosity 参数控制输出的详细程度,三档依次递增:
渲染器会静默跳过未知的事件类型(debug 档打印一行类型名),因此事件协议新增类型不会影响既有的渲染逻辑。

启动全屏界面

需要更完整的交互体验时,可以用 launch_tui 打开全屏对话界面。全屏界面依赖 Textual,需要先安装 tui 扩展(agentscope[full] 已包含):
安装全屏界面依赖
launch_tui 的用法与 launch_console 相同,传入构造完成的智能体即可。下面的例子额外装配了 AskUser,智能体提问时界面会弹出键盘操作的问答表单:
在全屏界面中与智能体对话
界面全部通过键盘操作,各交互环节的行为如下:
回复进行期间输入框依然可用:新消息会排队,reply_stream 按顺序逐个调用,同一个智能体的上下文不会被并发回复同时修改。
launch_tui 支持以下参数:
Agent | PipelineProtocol
必填
要交互的智能体,或任意满足 PipelineProtocol 的流水线。
Sequence[Msg]
默认值:"()"
开始交互前先显示的历史消息。
str
默认值:"user"
输入框发出的消息的发送者名称。

显示实时语音会话

实时语音智能体的输入是持续的音频流,因此使用单独的 launch_realtime_ui:界面显示双方的转写文本、工具调用与确认卡片,确认、打断与文字输入通过 agent.send() 交回智能体,音频本身由传输播放,不进入界面。运行前需要同时安装实时语音与全屏界面的依赖:
安装实时语音与全屏界面依赖
界面只借用智能体与传输,两者都需要由开发者先启动,界面退出后也不会替开发者关闭:
用全屏界面运行语音会话
launch_realtime_ui 与 launch_tui 的行为差异如下: launch_realtime_ui 支持以下参数:
RealtimeAgent
必填
已连接的实时语音智能体。
TransportBase
必填
已启动的音频传输,负责采集与播放音频。
Sequence[Msg]
默认值:"()"
开始交互前先显示的历史消息。
str
默认值:"user"
输入框发出的消息的发送者名称。

嵌入界面组件

开发者已有自己的 Textual 应用时,可以直接使用 agentscope.tui 的两个组件。组件只负责显示 Msg,不消费事件也不修改对话历史,两者的分工如下: 下面的例子把 ChatUI 接到开发者自己的运行后端 runtime 上,由后端把事件应用到消息(Msg.append_event())并推送变化的消息:
在 Textual 应用中嵌入 ChatUI
直接修改原有的 Msg 对象不会刷新界面。初始加载或整体替换历史时调用 set_messages(),流式更新时调用 update_message()。