Appearance
🐣 小a的界面选择
Agent 能干、能记了,但还没有"脸"——用户怎么跟它对话?要不要做个漂亮的 TUI(像 pi 那样全屏、不闪、带颜色)?老z的回答很干脆:TUI 是大坑,能不做就不做(第 19 章的警告)。我们先用最简单的——print 模式,行输出,够用。
29.1 为什么不做 TUI
🧙 TUI 的代价(第 19 章详讲过):
- 差分渲染、同步输出、组件体系——每一个都是大工作量
- 不同终端兼容性(iTerm2/Windows Terminal/老终端)
- 调试难(界面闪烁错位,看不到中间状态)
除非你的产品就是 CLI 本身(pi 是),否则别碰 TUI。 我们的学习目标是"理解 Agent",不是"造终端 UI"。先用 print 模式跑通,TUI 留给长大后再说。
29.2 print 模式:行输出
最简的交互——一行一行读写:
typescript
// cli.ts
import { createInterface } from "readline";
import { runAgent } from "./agent.ts";
import { tools } from "./tools/index.ts";
const rl = createInterface({
input: process.stdin,
output: process.stdout,
});
const config = {
model: "claude-sonnet-4-5",
system: "你是编程助手。可以用 read/write/bash 工具。先理解需求,再动手。",
tools,
maxTurns: 20,
};
console.log("🤖 Agent 已就绪(输入 exit 退出)");
function prompt() {
rl.question("\n你 > ", async (input) => {
if (input.trim() === "exit") { rl.close(); return; }
process.stdout.write("\n🤖 ");
await runAgent(config, input);
prompt(); // 递归,继续下一轮
});
}
prompt();🧙 print 模式的特点:
readline读输入,stdout.write输出- Agent 的流式输出直接打到终端(第 26 章的
process.stdout.write)- 没有全屏控制、没有差分渲染——但能跑、能用
这就是 pi 的 print 模式(第 20 章)的极简版。适合脚本、CI、简单交互。
29.3 print 模式适合什么
🧙 print 模式的适用场景:
- 个人快速使用(终端里问答)
- 脚本集成(
pi "修个 bug" | 下一步)- CI/自动化(不需要交互,直接出结果)
不适合:
- 长对话历史滚动(行输出会一直往下,难回看)
- 复杂交互(选择菜单、编辑)
- 给非技术用户用
29.4 三种交互模式对比(呼应第 20 章)
| 模式 | 我们有吗 | 适合 |
|---|---|---|
| 交互 TUI | ❌ 没有(大坑) | 人机日常使用(pi 用的) |
| print 模式 | ✅ 有(本章) | 脚本/CI/简单交互 |
| RPC 模式 | ❌ 没有 | 编辑器集成 |
🐣 小a:"那我以后想做编辑器集成(RPC)呢?"
🧙 "那得加 JSONL 协议(第 21 章)。但又是工作量——先 print 跑通,RPC 留给长大(第 31 章)。YAGNI:你现在不需要编辑器集成,就别做。"
本章小结
🐣 小a的第二十九课
┌──────── 交互层 ────────┐ │ │ │ • TUI 是大坑,别碰 │ │ (除非产品就是 CLI) │ │ │ │ • print 模式够用: │ │ readline + stdout │ │ → 行输出,简单能用 │ │ │ │ • 适合:脚本/CI/简单 │ │ • 不适合:长对话/复杂 │ │ │ │ • TUI/RPC 留给长大 │ └────────────────────────┘
关键认知:交互层从最简开始。print 模式 ~20 行就能跑。TUI/RPC 都是"长大后"的事。别为了酷而上 TUI——它的代价比你想象的大。
课后实验
- 写出 cli.ts:照着代码,跑起来跟你的 Agent 对话。
- 体验局限:聊 10 轮,感受"行输出一直往下、难回看"——体会 TUI 的价值(以及代价)。
- 管道测试:试
echo "介绍下自己" | tsx cli.ts,看 print 模式怎么被脚本调用。
下一章:Agent 能用了,但安全吗?加守门机制。 → 第 30 章 · 安全与扩展