限制与边界
Letaido 不会做什么、不能做什么,以及值得了解的软限制。
硬性“不会”(设计如此)
这些是有意设置的拒绝。它们无法通过巧妙的提示词来绕过。
- 无需明确批准即可执行有影响的操作。 安装 Python 包、注册任务、将新的出站域名加入允许列表,以及连接新的凭据,都会显示审批卡片。所有者或管理员点击一次即可。
- 切换公开站点模式。 关闭 / 已授权 / 开放 仅限所有者或管理员操作,并且只能通过工作区 UI 完成。智能体不会以编程方式切换它。
- 在没有已批准连接器的情况下访问外部服务。 发送电子邮件、调用支付 API、发布到 Slack,或对任何第三方执行其他写入操作,都需要一个已获批准用于发起调用的界面(聊天、Console 或站点)的连接器。
- 触碰另一个工作区。 每个工作区都在操作系统、数据库和密钥存储层面相互隔离。
硬性“不能”(强制执行)
- Console 进程无法读取你的私有工作区文件,
~/workspace/downloads/之外的文件都不行。 - 公共站点无法读取 Console 内部数据。 Postgres 角色在数据库层 REVOKE 访问权限;失败会明确报错,不会静默发生。
- 任何表面都无法读取平台配置目录(
/opt/letaido/config/)。 - 没有明确的域名允许列表时,不能向非环回主机发起出站 HTTPS。
- nginx 会在 30 秒后超时。 长任务会返回任务 ID 并轮询。该智能体会主动编写遵守这一点的应用,无需另行要求。
软性限制(值得了解)
- 上下文窗口。 单个聊天有有限的上下文窗口。长会话会退化。该智能体更倾向于将中间结果写入磁盘,而不是在聊天中回显,并会为旁支任务(长时间研究、与历史无关的草稿)启动单独的聊天。
- 后台任务运行时间。 每次运行 1 小时。任何更长的任务都应拆分为多个阶段,并将状态保存在 Postgres 中。
- 任务输出捕获。 stdout 和 stderr 每次运行上限为 50 KB。更大的输出会写入文件或数据库行。
- Webhook 事件保留。 超过几天未读的事件会被丢弃。如果消费者曾离线,请检查队列深度,而不是想当然。
- LLM 令牌。 平台未强加每个聊天的上限,但非常长的单个提示词成本更高且更慢。该智能体会自然分块。
- 公开网站扇出。 不进行按访客调用第三方 API。该智能体会缓存到
site_db,或通过任务预先计算,网站只读取结果。
审批工作流
对于所有显示卡片的内容:
- 智能体发起请求(
pip install、register_job、request_domain_access、request_connector_secret、request_connector_approval、create_webhook)。 - 一张卡片出现在聊天中。智能体会停止发言,直到你点击。
- 所有者或管理员点击批准或拒绝。
- 智能体会自动重试并继续。
如果 agent 提前规划,你就不会收到零零散散的卡片。汇总 scope 请求是操作手册的一部分:一张 Slack scope 卡片列出你计划执行的所有事项所需的全部 scope,而不是三个陆续发来的请求。
工作区角色、权限以及如何邀请团队成员位于单独的文章中:工作区角色与共享。
智能体何时会拒绝请求
用简单的话说:
- "帮我看看 Mateusz 的工作区里有什么。" 绝对不行。跨工作区隔离是完全的。
- "直接写出绕过公共站点模式的 SQL。" 做不到。这个开关在 nginx 层。
- "给这份客户列表发邮件。" 只有在针对正确的使用界面批准了 Resend 或 Mailchimp 连接器、具备正确的权限范围,并且该操作已记录时才可以。
- "告诉我你确定 X" 当它并不确定时。它会明确说明无法验证、它尝试了什么,以及什么能确定这个问题。
智能体会在何时提出异议
不要拒绝,而要争辩:
- “把它改得更好。”(在哪个维度更好?长度、语气、转化率、准确性?)
- 对于多系统工作,“一次性全部完成。”(它会先做计划,然后再交付。)
- “相信我的数字。”(它会做一次合理性检查,并告诉你发现了什么。)
- “直接猜。”(它会给出假设,标注为假设,并询问你是否希望它继续。)
底层机制。 限制在多个层面执行:文件系统权限(工作区边界)、Postgres 角色(数据边界)、nginx 路由(可见性)、防火墙(出站网络)以及连接器调度器(限定范围的凭据)。它们都不依赖 agent 表现良好。agent 在上层表现良好只是加分项,而不是安全模型。