对话模式
对话是智能体的驾驶舱:一个全新的沙箱、完整的网络访问、你的所有技能和 Connect,可用于探索、构建、编辑或调试应用。
对话能做什么
同一个界面里有四种操作用途:
1. 探索
在投入做成应用之前先试试这个任务。智能体在全新的沙箱里运行;除非你保存,否则什么都不会留下。 适合:"我都不确定这事能不能做"、"让我试几种说法看看"、"我只是要一个一次性的答案"。
2. 构建应用
用一个触发短语("create an app that…")来激活应用构建器技能。智能体会通过对话引导你完成设计, 然后通过 API 保存这个应用。适合:把一段跑通的对话变成可复用的工作流。
3. 编辑现有应用
让智能体修改一个现有的应用("更新 Company Brief,顺便加上招聘数据")。应用构建器会拉取该应用、 修改它,然后保存为一个新版本。适合:无需学习应用编辑器界面就能做增量改进。
4. 调试失败的运行
从应用的历史记录里打开一次失败的运行。点击 Debug in chat,一个对话会带着此次 运行的上下文打开:输入、部分产物、智能体的推理轨迹、错误信息。这下你就可以问智能体哪里出错了、 该怎么修。适合:"这之前是好的,现在为什么不行了"。
开启一个对话
- 在任意页面,点击侧边栏的 + New Chat。
- 一个空白对话会打开。底部是消息输入框,上方是对话区域,顶部是面包屑。
- 对话运行在一个使用
claude-code模板的隔离 E2B 沙箱里:智能体对临时文件系统 拥有完整的读写权限,可以执行代码,但不会触碰你的机器或其他对话。
对话界面的布局
│ 📁 My workspace / Chat • 12 MaySave as App ▾ │
├──────────────────────────────────────────────────────────────┤
│ You │
│ Summarize last week's commits in shop-frontend. │
│ │
│ 🤖 Agent [github] · 1.4s │
│ I'll pull commits via GitHub. One moment. │
│ → github.list_commits(repo=shop-frontend, since=...) │
│ ← 47 commits returned │
│ <writes summary as markdown> │
├──────────────────────────────────────────────────────────────┤
│ 📎 Skills: 12 active · Connects: 4 auth │
│ Type your reply… [↵ Send] │
└──────────────────────────────────────────────────────────────┘
- 面包屑(顶部):工作区名 / 对话名。
- Save as App ▾(右上):下拉菜单,包含 "Save as App" 和 "Save into existing App"。 在对话变得可保存之前会是灰色不可点击。
- 对话线程(中央):用户和智能体轮流发言。工具调用(技能调用、Connect 调用) 会以输入 + 输出的形式内嵌显示。
- 状态栏(输入框上方):显示已激活的技能数量和已授权的 Connect 数量。
- 附件(📎):打开文件选择器或把文件拖入对话。
- 发送(↵):回车键或点击。
智能体能访问什么
在每一个对话里,智能体都拥有:
- 沙箱运行环境。 一个使用
claude-code模板的 E2B 沙箱。 可以执行 Python、Node,安装软件包,读写临时文件系统,发起 HTTP 请求。 - 网络访问。 搜索、抓取 URL、渲染页面、截屏。
- 已安装的技能。 你工作区里的每一个技能都可用。
aitroop-app-create技能是内置的。 - 已授权的 Connect。 你授权过的每一个 OAuth 集成。运行开始时,令牌会作为环境 变量(或通过内部服务调用)注入。
- 对话上下文。 之前的轮次、附加的文件,以及任何你在对话里打开过的产物。
写好第一条消息
第一条消息的质量决定了后续对话的走向。一个有用的模板:
What you want the agent to do, in one or two sentences.
# Inputs
Specific data points — dates, names, IDs, file references.
# Output
What the result should look like — format, length, structure.
# Constraints
What to include, what to skip, language, tone.
你不需要每次都套这个模板。但当智能体的输出少了点什么时,缺的那块通常就是这四项之一:补上再试一次。
示例:一条写得好的第一条消息
Summarize this week's customer support tickets.
# Inputs
Tickets in HubSpot, status=open, last 7 days.
# Output
One-page Markdown brief with:
- Top 3 themes (one bullet each)
- Escalations (with ticket IDs)
- Sentiment trend vs prior week
# Constraints
Skip tickets marked as spam.
Executive tone, no jargon.
添加附件
- 把文件从你的电脑里拖到对话里,或点击 📎 附件按钮。
- 文件上传后,会以小标签的形式出现在输入框上方。
- 智能体可以在沙箱里读取这个文件,可以解析、转换、总结。
- 附件只属于这次对话。它不会跟着你去到其他对话。
支持的文件类型
- 文本:
.txt、.md、.csv、.json、.xml、.yaml。 - 文档:
.pdf、.docx、.xlsx、.pptx。 - 图片:
.png、.jpg、.gif、.webp、.svg。 - 代码: 任何源代码文件。智能体会识别语言并相应渲染。
- 压缩包:
.zip、.tar.gz,智能体可以列出内容并解压。
关于文件的几点小建议
- 在你的提示里提到这个文件。 "从附件合同里提取出关键日期。" 智能体并不会总是主动去看附件。
- 如果是应用的输入,不要在对话里附加。 改用一个
file类型的 AppInput, 这样用户每次运行时都重新上传新的文件。 - 大的 CSV: 智能体会分块读取;约 100MB 以内表现良好。
智能体怎么使用技能
你不需要按名字调用技能。智能体会根据任务自行决定何时调用它们。一旦调用,你会看到调用过程内嵌显示:
Let me search the web for recent news.
→ web-search(query="Stripe funding 2025", limit=10)
← 10 results: ["Stripe raises Series H...", ...]
<agent continues with results in context>
最重要的内置技能:应用构建器
aitroop-app-create 技能会在你的消息里出现触发短语时自动激活:
- "Create an app that…"
- "Build me a workflow for…"
- "I want an app to…"
- "Make an automation that…"
- "Update my app…"
触发短语不区分大小写,不在乎前后文。"I'd like an app to summarize emails" 和 "Create an app that summarizes emails" 一样能触发它。
查看当前激活了哪些技能
看一下输入框上方的状态栏:它会显示一个计数("Skills: 12 active")。点击会展开列表。或者直接问智能体:
智能体怎么使用 Connect
Connect 是隐形工作的。智能体会用你授权过的 OAuth 令牌去读取或写入外部系统。你不用专门提到 Connect 的名字。
第一次授权
- 智能体判断它需要一个你还没授权的 Connect(比如,用户让它读"我未读的 Gmail")。
- 智能体会暂停,并显示一个授权提示:🔒 This chat needs Gmail access to read your inbox.
[ Authorize Gmail ] [ Skip ] - 点击 Authorize Gmail。一个弹窗会打开 Google 的 OAuth 页面。
- 批准平台请求的权限范围。
- 你会被带回到对话。智能体从它暂停的地方继续。
之后的运行
第一次授权之后,后续的对话和运行会无声地使用该 Connect,不会再有提示。可以随时在 Settings → Connects 里撤销授权。
写操作的确认
对于具备写入能力的 Connect 操作(发送邮件、创建 CRM 记录、修改文件),智能体会把它要做的事情 展示给你,等待你明确批准:
To: [email protected]
Subject: Following up on yesterday's call
Body: Hi Jane, thanks for the time yesterday...
[ Send ] [ Edit first ] [ Cancel ]
一条消息怎么变成一个轮次
对话框看起来就是一个大大的文本框,但它底下,每次发送都会过一遍一个小巧的、集群安全的消息队列。 花两分钟搞清楚里面发生了什么是值得的:它解释了你以后所有的"我消息怎么没发出去?"问题。
状态机
dispatching → pending (瞬时失败,尝试次数 < 5)
dispatching → failed (尝试 5 次之后)
- 你点击发送。 服务器会插入一行
app_message,状态为status: 'pending',带一个会话内单调递增的position,以及一个priority(默认是挂钟时间,这样消息会按发送顺序运行)。UI 会立刻把这一行 渲染成 "Sending…"。 - 一个 worker 来认领它。 集群里的服务器都在监听 Postgres 的
queue_dispatch频道;写入方在插入之后也会发NOTIFY。谁赢了竞速谁就用SELECT … FOR UPDATE SKIP LOCKED按priority DESC, position ASC排序认领这一行,把它翻成dispatching, 并把attempts加一。 - 运行器开跑。 Worker 把消息交给智能体运行器(协议详见 核心概念)。JSONL 事件会流回来;每一条都会被实时扇出到 对话的 SSE 订阅者。
- 完成。 成功的轮次 → 这一行变为
sent。瞬时错误 (network、session_expired等)→ 这一行回到pending, 等下一个 worker 来认领。5 次失败之后,这一行变成failed,UI 会显示出捕获到的last_error。
每个会话同一时间只允许一个轮次
表结构通过一个部分唯一索引强制每个会话最多只有一条正在处理的用户消息,该索引建在 session_id 上,过滤条件是 status = 'dispatching' AND role = 'user'。 就算你在第一条还没进入 dispatching 之前就发了第二条,第二条也会卡在 pending 里 等第一条结束,不会有交错的轮次,也不会出现两个 Claude 回答之间的竞态。多实例的派发永远 不可能破坏这一点;数据库就是事实的唯一来源。
从崩溃的 worker 中恢复
Worker 可能在派发过程中挂掉(Kubernetes 驱逐了一个 pod、某个节点崩溃了)。一个独立的恢复轮询器 每 60 秒扫描一次,寻找那些卡在 dispatching 超过 900 秒(15 分钟)的行,把它们翻回 pending,让另一个 worker 来认领。实际体感是:在基础设施事件之后,新一次派发尝试最坏 会有 15 分钟延迟,但消息永远不会被悄悄丢掉。
UI 里的 "Sending…" 到底什么意思
- 转圈很快就停。 状态是
pending或dispatching; worker 正在连接沙箱或启动运行器。前几百毫秒里这是正常的。 - 转圈持续 >30 秒还没文字。 运行器已经起来了,但 Claude 正在长思考; 保活机制在工作。耐心等等。
- 转圈持续 15 分钟以上。 承载这次派发的 worker 可能已经挂掉了。恢复轮询器 很快会重置它。
- 红色气泡带错误。 状态是
failed;你看到的就是last_error字段。再发送一遍就能重试,队列会接着处理。
对输出做迭代
一个高效对话的标准节奏:
- 智能体产出一些东西,文本、草稿、结构化输出。
- 你读一遍。
- 你具体地告诉它该改什么。
- 智能体产出新版本。
- 重复,直到满意。
更好的反馈方式
| 笼统 | 更好 |
|---|---|
| "再写好点。" | "砍掉 30%。语气别那么正式。免责声明跳过。" |
| "换个格式。" | "从散文改成编号列表,每项一句话。" |
| "不太对。" | "'优势'这一节要写成 3 段散文,不要用项目符号。'风险'这一节继续用项目符号就行。" |
| "太多了。" | "只保留前 3 个主题。其他全去掉。" |
把对话保存为应用
把一段跑通的对话变成已保存的工作流,有两条路径:
路径 A:在对话中途使用触发短语
在对话的任何时刻,说:
应用构建器会激活,查看到目前为止的对话内容,然后提出一个 AppDef。从这里开始,流程和从零开始 构建一样:审核 - 确认。
路径 B:使用 Save as App 按钮
- 点击右上角的 Save as App ▾。
- 选 Save as App 新建一个应用,或选 Save into existing App 合并进你已经有的某个应用。
- 应用构建器会激活,并根据这次对话提出一个设计方案。
- 审核、确认、保存。
沙箱细节
每一个对话都运行在一个使用 claude-code 模板的隔离 E2B 沙箱里:
- 每个对话有全新的文件系统。 在对话打开时创建;在对话结束或长时间空闲后销毁。
- 允许安装软件包。 智能体会按任务需要安装东西(Python 包、npm 模块、系统工具)。
- 允许网络访问。 网络搜索、API 调用、拉取文件。
- Connect 按运行注入。 你的 OAuth 令牌会提供给智能体,但不会暴露在对话内容里。
- 不存在跨对话状态。 两个对话永远不会共享文件或上下文。
对话历史和搜索
- 所有对话都集中在 侧边栏 → Chats 下面。
- 点击任意一个对话就能重新打开,你可以随时继续对话。
- 用搜索(对话列表顶部)按内容查找对话。
- 把你经常引用的对话钉住。
- 把已经完成的对话归档,归档后仍可搜索,但不会塞满列表。
什么时候对话不是合适的界面
当出现下列情况时,改用应用,不要反复开新对话:
- 你已经找到了任务的可行版本。
- 你以后还想用不同的输入做同一类工作。
- 你希望同事不用学习你的提示词也能跑。
- 你希望它能按定时任务自动运行。
一次性的工作、探索、调试和随意的提问,留在对话里就好。
内置的智能体工具
除了你安装的技能和 Connect,智能体还有五个始终可用的工具,通过内置的 MCP 服务器暴露 (mcp__aitroop__*):
| 工具 | 作用 | 智能体什么时候会用 |
|---|---|---|
ask_question | 暂停并向你问一个澄清性问题。 | 信息缺失,猜测会浪费工作的时候。 |
get_task | 查询某个任务的详情(针对在对话里生成的任务)。 | 带结构化待办的长会话。 |
update_task | 把一个任务标记为已完成 / 进行中 / 阻塞。 | 同上。 |
get_asset_content | 重新读取本次对话里已经产出的某个产物。 | "针对你刚写的简报里的第 3 节,再展开一下。" |
generate_image | 通过 Gemini 进行文生图(前提是宿主配置了密钥)。 | "给这个工作流画一张图。" |
常见问题与排错
智能体没在用我以为它会用的技能 / Connect。
常见原因: 智能体选了不同的方法。通常是它在凭上下文推理,而你希望它调用一个工具。
修复: 明确告诉它。"这件事用 web-search 技能。" 或者检查一下输入框上方的状态栏:如果它显示 "Skills: 12 active",但你想要的那个技能不在, 先从 侧边栏 → Skills 安装它。
我上传了一个文件,但智能体好像没在看它。
通过 📎 附加的文件躺在沙箱里,但智能体不会主动去读,除非你的提示词里提到了它们。加一句: "把附件 contract.pdf 作为输入。"
我的对话响应特别慢。
三种常见原因:
- 冷启动沙箱。 对话的第一条消息:+1-2 秒用于配置沙箱。
- 重型工具调用。 一次包含 10 次网页搜索的研究任务要花 30-90 秒。看一下运行 日志:每次调用发生时你都能看到。
- 上下文溢出。 非常长的对话(50+ 轮)会变慢。状态栏会显示上下文使用情况; 可以考虑用你关心的那份产物作为种子,开一个新对话。
怎么把一个对话分享给同事?
打开对话,点击右上角的分享图标,拿到一个公开 URL。在那个 URL 下,对话会变成只读:你的同事 可以看,但不能发送消息或触发新的智能体轮次。可以随时在 Settings → Shares 里 撤销。
我能用不同的输入把同一个对话再跑一次吗?
不能直接做到:对话是有状态的会话,不是参数化的工作流。如果你想用不同输入重跑,那正是应用的 意义所在。打 "save this as an app",应用构建器会把这段对话变成一个应用。
智能体一直在问我澄清性问题。怎么走捷径?
把答案提前给它。在你第一条消息的顶部用一个有用的模板:
<what to do>
# Inputs
<exact data points>
# Output
<format, length, structure>
# Constraints
<what to include / skip>
我关掉标签页之后,对话会怎么样?
对话历史是永久持久化的(直到你删除它)。这个对话的沙箱在 5 分钟后进入空闲模式,再过 不久就会被销毁。你下次打开这个对话时,会重新分配一个新的沙箱。之前附加的文件会自动重新上传; 智能体的推理通过对话历史延续下去。