终端控制台
从源码跑的时候,在终端里看它此刻在干什么:开场先自检一遍,然后每一轮对话打成一张「回合卡片」——收到了什么、怎么判断的、最后说了什么。它只读日志和数据库,不连聊天平台、不调模型、不写文件。
打开
.venv/bin/python -m aeria.terminal --root .
--root 是数据和日志的根目录(data/、config/ 所在的那一层),默认当前目录。在 macOS 上从源码启动运行时(python -m aeria.main),它会自己在「终端」里开一个窗口跑这个命令:先等这次启动以后每个人格连上 Discord,再自检,再进实时视图。已经开着一个就不再开;.env 里写 CONSOLE_ON_START=false 就不开。桌面版启动运行时会把这一项设成 false,用桌面版的人看不到这个窗口。
自检
每一项都是只读的,各有自己的超时;在开场动画放的时候就在后台跑,动画放完结果多半已经齐了:
| 项 | 看什么 |
|---|---|
| 运行环境 | Python 版本、是不是在虚拟环境里、Aeria 版本 |
| 配置 | config/ 下的配置能不能读、要看的人格注册了没有 |
| 密钥 | 该有的令牌、模型密钥有没有(值永远不显示) |
| 进程 | 有没有正好一个 aeria.main 在跑:两个以上会抢网页后台的端口和 Discord 连接 |
| WebUI | 网页后台的端口连不连得上 |
| Discord | 这次启动以后,每个配了令牌的人格都连上了没有 |
| 数据库 | 每个人格的库在不在、能不能只读打开、完整性检查过不过 |
| 每个人格 | 此刻在睡、在做事还是醒着,心情、精力、压力 |
| 日志 | 这次启动以来有几条错误 |
| 磁盘 | 剩余空间、日志文件多大 |
每一项落成 ✓、⚠ 或 ✗。有 ✗ 也照样进实时视图,最上面挂一条红色横幅。只想要结果:--check-only,退出码 0 是全绿、1 是有 ⚠、2 是有 ✗,可以放进脚本里。
回合卡片
实时视图里,平常的后台事件一行一条;每一轮对话收成一张卡片:
- 最显眼的两行:他说了什么,它回了什么(或者为什么没回);
- 下一级:决定、规划、状态、情绪,理由码翻成中文;
- 最后一行暗色小字:排查用的细节(档位、耗时、闸门)。
按键:q 退出,p 暂停(新事件先攒着,继续时补上),c 切换正文显示、隐藏。Ctrl-C 任何时候都能干净退出。
常用参数
| 参数 | 作用 |
|---|---|
--persona <人格 ID> |
只看一个人格(默认 all) |
--since 2h / --replay 5 |
先回放一段时间、或最近几轮,再接实时 |
--hide-content |
正文打码成「⋯⋯(9 字)」,录屏、截图时用 |
--compact |
每轮只占一两行 |
--raw |
每张卡片下面附上原始日志行(已脱敏) |
--no-anim |
不播动画、不输出转义码;输出进了管道、设了 NO_COLOR、TERM=dumb 时自动这样 |
--show-noise |
连 httpx、uvicorn 的噪音行也显示 |
对应的代码
- 入口和参数:
src/aeria/terminal/app.py;自检:terminal/checks.py的default_checks;实时视图和按键:terminal/live.py的LiveView.handle_key;卡片怎么排:terminal/render.py的render_card。这个包故意不 importaeria.bot、discord这些重的东西,要秒开、闲着几乎不占 CPU。 - 启动时自动打开:
src/aeria/console_window.py(只在 macOS;CONSOLE_ON_START,src/aeria/config.py的Environment.console_on_start);桌面版关掉它:desktop/src-tauri/src/runtime.rs。 - 测试:
tests/test_terminal_checks.py、tests/test_terminal_cards.py、tests/test_terminal_render.py、tests/test_console_window.py等十个test_terminal_*/test_console_*文件。
没做到的
- 只在 macOS 上会自己弹出来;Linux、Windows 上要自己开一个终端跑。
- 它读的是日志和数据库,卡片要等这一轮的结局写进去才拼得完整:一轮迟迟没有结局,默认 30 秒后先打半张卡(
--no-reply-timeout)。 - 「进程」那一项按 launchd 的托管方式查(标签默认
com.aeria.runtime);用别的方式托管,这一项会报 ⚠。