前言
大家好,这里是新人作者煤球。
停更了很久,干什么去了?做了一个牛逼的东西------Remora。

这是一个正在打磨中的原生 macOS 的 SSH 管理工具,类似于 Termius、Xshell等。
最终的目标,是把一整套日常远程工作流放到一个相对顺手的桌面应用里,比如连接主机、查看文件、进终端处理问题,省的在多个工具之间来回切换。
市面上已经有很多同类产品了,为什么还要再造一个轮子?
答案很简单。
追求足够轻量化,追求100%原生开发,追求100%开源

在这个前提下,也同样补全了AI能力,为这个SSH管理工具补上最后一段体验:当你正在看一段输出、排查一个错误、或者判断下一条命令该怎么下达的时候,让 AI 刚好在旁边帮得上忙。
这是一些截图预览:


言归正传,这篇文章重点还是讲一下我们是如何集成AI能力,涉及了哪些方面的考量,做了哪些技术层面和产品层面的优化等。
如果你也在做或者正准备做AI类产品,也许会有所帮助。

正文
配置能力
用户先选 provider,再选 model、base URL、语言和行为开关,API Key 单独进 Keychain,而不是直接混在普通设置里。
它支持 OpenAI compatible 和 Claude compatible 两套接口,同时又预置了 OpenAI、Anthropic、OpenRouter、DeepSeek、Qwen、Ollama 这些 provider,兼顾开箱即用和自定义 endpoint 的灵活性。
上下文能力
我们并不是简单地把用户输入直接发给模型,而是从终端 runtime 里抽一份上下文快照,大致包含下面这些信息:
- 当前是本地 shell 还是 SSH
- 连的是哪台机器
- 当前工作目录
- 最近的终端输出
- 必要时的多轮对话上下文
- 用户希望回复使用的语言
- 当然,排除掉所有隐私信息
可能在传统应用里面这块比较简单,但是终端类产品实现起来着实有点费劲。
因为终端上下文本身不是干净可读的文本,而是一堆掺杂了 ANSI 控制序列、提示符、回显、光标控制信息的流式输出。
如果把这些原样扔给模型,AI 大概率会误判,或者干脆被噪音淹没。
所以 Remora 先在 runtime 层做了 transcript 的整理和清洗,只保留适合给模型看的那部分文本。同时,工作目录也不是想当然地从某个状态字段里拿,而是尽量从终端协议本身去推断,拿不到再退回 pwd 探测。
终端里的 AI 如果不知道你当前在哪个目录、刚刚执行了什么、报错是什么,它其实很难给出靠谱建议。
协议层
Remora 没有让模型自由发挥地输出一大段自然语言,它直接要求模型只返回固定 JSON 结构,内容只有三部分:摘要、命令建议、警告。
这是所有AI应用落地都必须遵循的规范,值得参考。
这样做的好处非常直接。
- UI 更稳定:前端直接解析JSON就能正常渲染;
- 交互更明确:每条命令建议都可以直接做 Insert、Run、Copy;
- 可控:就算换 provider、换模型,最终渲染逻辑不需要跟着改;
- 错误更容易处理:如果模型没按格式来,服务层能立刻识别,而不是把一坨半结构化文本继续往后传;
做AI类产品,最害怕的就是 UI 和交互因为 AI 的不稳定而变得不可预测。
🌟 记忆能力
任何 AI 产品都会面临记忆问题。
上下文越来越长,请求越来越慢,成本越来越高,带来的后果就是体验越来越差。
Remora 在这里没有才用类似 OpenClaw 这种"无限记忆"的模式,而是更务实的做了上下文压缩。
总要帮用户省点token不是。
当上下文历史超出阈值时,把更早的部分压缩成一个 summary turn,只保留最近几轮原文。
既能保留连续性,又控制了体积,不会每次都把整段历史原样重发。
不同的方案有各自的取舍。
对终端来说,这个取舍也许恰到好处。绝大多数时候,用户不可能在终端里面和AI做长篇讨论,肯定是围绕当前几次命令和刚刚发生的错误继续追问。只要最近几轮还在,前文有一个压缩摘要,体验就已经足够了。
交互能力
Remora 的 Terminal AI 没有做成独立页面,而是做成 terminal pane 旁边的 drawer。
如果 AI 是一个需要切换的单独页面,用户会产生明显的割裂。现在的做法是:终端还左边输出,AI 在右边给解释和快捷介入的按钮。
其实这也是目前主流的交互模式。
在具体交互上,我们做了几个小巧思:
- 提供了 quick actions (快捷指令):比如 Explain Output、Suggest Next Command、Fix Last Error;
- 能根据常见报错做 smart assist:比如 permission denied、command not found、no such file;
- 支持排队提问:前一条还没返回时,后一条会乖乖在后面排队;
- 支持 thinking 式交互 和渐进式 summary,减轻等待时的停顿感;
- 还专门处理了输入法场景,避免中文输入过程中按回车被误判成发送;
这些都不是核心能力,但它们离用户更近,也是用户对于一个产品的第一手的体验。
安全边界
所有AI产品都应该严格恪守安全边界。
Remora 允许模型给命令建议,也允许用户一键插入、一键运行、一键复制,但它没有默认让模型自动执行命令。
同时每条建议都有风险等级,用户可以先看目的,再决定要不要用;如果开启了确认选项,运行前还会有确认弹窗。
一定要让用户感知到"建议"和"执行"的区别。
尤其在 SSH 场景下,很多命令的影响是真实而且不可逆的。
比起做一个看起来更智能、但边界模糊的产品,我们更愿意让 AI 负责辅助判断,真正执行的权限还是得抓在手里。
难点复盘
其实每一步都能难 🤣 。
非得挑出来三点,也能唠:
怎么拿到有效的上下文
终端输出天然嘈杂,工作目录也不是总能直接拿到,很多细节都要靠 runtime 层自己清洗和补偿。
怎么收敛 AI 的不稳定性
模型会跑偏、provider 有差异、响应格式也可能不稳定。
如果没有结构化约束和统一解码,UI 会变得非常的脆弱。
怎么让 AI 无感融入产品
入口位置、消息队列、输入法兼容、建议执行确认,这些都跟模型无关,但它们决定了这个功能是不是一个真正可用的产品能力。