应用
应用是 Aitroop 中可重复工作的基本单元,把一次性的好对话变成可定时运行的工作流。本页讲创建、运行、编辑、版本管理和分享。
创建应用:四阶段流程
你通过与智能体对话来创建应用。内置的 aitroop-app-create 技能(即应用构建器)每次都会按照结构化的四阶段流程进行。理解这些阶段有助于你引导对话,并预期接下来会发生什么。
阶段 0:理解意图
当你的消息中包含触发词时,应用构建器会激活,并提出 1 到 5 个澄清性问题:
- 应用应该做什么?一句话目标。
- 它需要哪些输入?自由文本、文件、日期、选项?
- 它应该产出什么?报告、代码文件、电子表格、结构化数据?
- 有多少步骤 / 阶段?单次智能体调用,还是多阶段流水线?
- 需要哪些特定工具或集成?网页搜索、文件处理、OAuth?
阶段 1:设计应用
应用构建器会构造完整的 AppDef JSON。它会选定:
- 名称:根据应用的功能确定,采用标题大小写。
- 图标:一个匹配使用场景的 emoji。
- 标签:可搜索的关键词。
- 输入:为每个变量挑选合适的类型:
text用于短标识符,textarea用于长内容,select用于固定选项,daterange用于时间区间,file用于上传。 - 阶段:默认单阶段。仅在工作天然存在可分离步骤时才会拆分为多阶段。
- 产物:
markdown用于散文,csv用于表格,json用于结构化数据,html用于可渲染页面,image用于视觉素材,code用于源文件。 - 资源:添加应用所需的技能和连接。
- 超时:默认 3 分钟,重度研究类应用会提到 5-10 分钟。
阶段 2:校验
在保存之前,应用构建器会执行内部检查:
- 输入、阶段、产物中的每个
id都唯一。 - 阶段目标里每一个
{{field_id}}引用都对应一个真实的输入。 - 阶段之间的引用(阶段 2 读取阶段 1 的产物)连接正确。
- 如果应用应该有可见输出,那么至少要有一个阶段产出产物。
required: true只用在真正会阻塞运行的输入上。- 目标足够具体:含糊的目标会被改写。
如果校验失败,应用构建器会自行修复问题,而不是反过来问你。只有当校验通过后,你才会看到阶段 3。
阶段 3:通过 API 创建或更新
应用构建器会调用平台的 REST API:
POST https://app.aitroop.net/api/apps
Authorization: Bearer <AT_USER_TOKEN>
Content-Type: application/json
# Existing App
PUT https://app.aitroop.net/api/apps/<appId>
Authorization: Bearer <AT_USER_TOKEN>
Content-Type: application/json
请求体就是完整的 AppDef JSON。平台会持久化它,分配一个版本号,并返回应用 ID。整个过程你看不到,它在幕后完成。
阶段 4:向用户呈现
应用构建器会反馈以下信息:
- 应用名称和功能说明。
- 输入列表及其类型。
- 阶段列表及其描述。
- 会产出哪些产物。
- 应用 ID:便于你后续查找。
- 提供进一步打磨的选项。
此刻应用就已经上线、可运行,并存在于你的应用库中。
示例:三种复杂度的三个应用
简单:单输入、单阶段
in plain English for a non-technical audience. Input is
the term. Output is a 200-word explanation.
Agent: <designs the App, no clarifying questions
needed since you gave inputs+output+length up front>
App: Plain English Explainer 📖
Input: term (text, required)
Stage: Explain {{term}} in ~200 words for a
non-technical audience...
Output: explanation.md (markdown)
中等:多输入、单阶段,需要一个连接
from the last N days into a priority-ranked list.
Agent: Two questions:
1. Default for N (number of days)?
2. How many emails should the summary cover?
You: Default N=3. Top 20 emails.
Agent: <designs the App>
App: Email Triage 📧
Inputs:
days_back (number, default 3)
max_emails (number, default 20)
Stage: Read the last {{days_back}} days of unread Gmail.
Rank top {{max_emails}} by urgency...
Output: triage.md (markdown)
Resources: skills=[], connects=[google]
注意 connects 中的 google。首次运行这个应用时,你会被提示授权 Gmail 访问权限。之后再运行就不会再提示了。
复杂:多阶段并带有人工审核步骤
companies matching an ICP description. Stage 2: enrich
each with public info. Stage 3: I review and remove
rows. Stage 4: draft personalized emails for survivors.
Agent: <asks 3 questions, you answer>
App: Outreach Pipeline 🎯
Inputs:
icp (textarea, required)
target_count (number, default 30)
Stages:
1. find (agent) → leads.csv
2. enrich (agent) → enriched.csv
3. review (human, paused until you approve)
4. draft (agent) → drafts.md
Resources: skills=[web-search], connects=[]
运行这个应用时,平台会自动执行阶段 1 和阶段 2。阶段 3 会暂停,并在审核面板中展示 enriched.csv。你删除不需要的行后,点击Approve and continue。阶段 4 会以审核后的子集继续运行。
运行应用
从应用库运行
- 点击侧边栏的 Apps。
- 点击你想运行的应用。
- 应用页面会打开,左边是表单,右边是输出占位。
- 填写必填字段(带红色星号标记的)。
- 可选字段会显示占位提示或预填的默认值。
- 点击 Run(位于表单底部的大号按钮)。
运行期间你会看到什么
页面会分屏,右侧面板会填入:
- 顶部的阶段指示器:"Stage 1 of 3: research_and_write"。
- 推理轨迹:智能体的计划、工具调用(网页搜索、技能调用)、部分输出。
- 产物实时预览:智能体在写入产物的同时,你能实时看到它出现。
- 运行控制:运行过程中,可以使用 Cancel 按钮取消。
运行结束后会发生什么
产物会保存到运行历史。在产物预览面板,你可以:
- Download:选择一种格式(产物的原生格式,或针对可渲染内容的 PDF/DOCX)。
- Copy:把原始内容复制到剪贴板。
- Edit in chat:打开一个针对此产物的新对话,便于快速调整。
- Share:生成一个指向产物的链接(可见性取决于应用设置)。
未更改的输入
下次再进入应用页面时,表单会自动预填上一次使用的输入。点击字段旁的重置图标(🔄)可以将它清回默认值。
用相同输入重新运行
在任意一次历史运行上,点击 Re-run,即可用相同输入复制一次运行。适用于:刷新时效性数据(例如"最新资讯"类应用)、验证一致性、在不同版本之间做提示词的 A/B 对比。
编辑应用
对话式编辑(推荐用于非琐碎的改动)
- 在应用页面,点击 Edit in chat(有时显示为"Chat with this App")。
- 会打开一段对话,并把应用的设计作为上下文加载进来。
- 用自然语言告诉智能体你想改什么。例如:
- "加一个 select 类型的输入用于输出语言,选项为 English / Chinese / Spanish。"
- "把这一个阶段拆成 'research' 和 'write',把研究笔记作为上下文传给写作阶段。"
- "把超时改成 10 分钟。"
- "删掉 company_url 这个输入。"
- 智能体会给你一份差异说明:什么改了、什么没改。
- 批准后,智能体会调用
PUT /api/apps/{id}。新版本就此保存。
直接字段编辑(用于快速改动)
- 在应用页面,点击 Edit。
- 编辑器会打开,所有字段一览无余:名称、图标、标签、输入、阶段、产物、资源。
- 直接修改任意字段:
- 点击某个输入的类型下拉框,把 text 切换为 textarea。
- 点击某个选项进行重命名。
- 在目标字段中输入,编辑给智能体的指令。
- 拖动输入项以重新排序。
- 点击 Save。新版本保存。
编辑目标:常见模式
阶段目标承载了应用大部分的行为逻辑。常见的编辑方式:
- 添加结构:"输出格式:A 部分(一段话) / B 部分(项目符号列表)……"
- 添加约束:"最多 500 字。""只使用最近 12 个月的来源。"
- 添加个性化挂钩:"匹配
{{tone}}中描述的受众语气。" - 提升具体性:把模糊动词("review")替换为具体动词("给出 1-10 分并附理由")。
版本管理
每次保存都会创建一个新版本。版本按 v1、v2、v3…… 编号。应用页面上有一个 Versions 标签页,列出所有版本。
在 Versions 标签页中你可以
- 查看历史:每个版本的保存时间、保存人、变更摘要。
- 查看某个版本的完整 AppDef:点击任意版本,查看其完整配置。
- 对比两个版本:选择两个版本,并排查看差异。
- 回滚:一键将任意旧版本提升为"当前版本"。当前行为会随之回退;你回滚之前的那个版本仍会保留在历史里。
定时任务与版本管理
定时任务默认使用应用的当前版本。所以如果你周日修复了一个 bug,周一的定时运行就会用上修复后的版本。
若需要稳定性(例如面向客户的报告,不应突然变化),可以把定时任务固定到某个具体版本。被固定的定时任务会忽略后续的应用编辑。
分享与访问
每个应用有三种可见性:
- Private:只有你能看到和运行。默认。
- Team:工作区内所有人都能看见。最适合团队共享的内部应用。
- Public link:任何有链接的人都能运行(具体取决于套餐)。即便如此,每次运行的输入和输出依然各自沙箱化。
团队应用下的按用户连接
当一位团队成员运行一个团队应用时,运行会使用他们自己的连接,而不是你的。一个共享的"每日邮件分诊"应用,由你运行时读取你的 Gmail,由同事运行时读取同事的 Gmail。每个用户都会授权自己的连接。
Fork(复刻)
任何对团队应用有查看权限的人,都可以对它执行 fork:创建一份属于自己的私有副本,并拥有独立的版本历史。适用于"我想要这个应用,但要做点自己的修改",又不希望影响共享版本的场景。
多阶段应用详解
什么时候该使用多阶段
满足以下任一情形时,可以考虑多阶段:
- 工作天然可拆分为"先做 X,然后基于 X 的结果做 Y"。
- 你希望只重跑最后一步,而不必重跑之前那些昂贵的步骤。
- 中间需要一个人工审批检查点。
- 某一步需要确定性的转换(在两个
agent阶段之间插入一个script阶段)。
阶段之间如何共享数据
每个阶段的产物都会自动对下一个阶段可用。在下一个阶段的目标中用模板语法引用即可:
Take the CSV produced by Stage 1 ({{ stages.find.leads }})
and enrich each row with the company's funding history.
Output the same CSV with three new columns:
total_funding, last_round, last_round_date.
三种阶段类型的实际用法
agent:默认类型
智能体读取输入(以及任意先前的产物),使用已安装的技能和已授权的连接,产出声明的产物。最适合:推理、摘要、起草、研究。
script:确定性转换
一个 Python 或 Node 脚本,在沙箱内运行,不调用语言模型。最适合:过滤 CSV、去重、格式转换、精确算术。速度快、可预测。
human:暂停以待审核
运行会暂停。平台向用户展示目标文本和先前的产物。用户可以修改、批准或拒绝。下一个阶段使用人工产出的内容继续运行。最适合:审批检查点、"挑出最好的 N 项"、"发送前修复任何看起来不对的地方"。
实战示例:只重跑最后一个阶段
假设你的三阶段应用顺利跑完了,但最后一个阶段的草稿不理想。为了避免重做阶段 1 和阶段 2:
- 从应用的 Runs 标签页中打开该次运行。
- 点击 Re-run from stage…
- 选择 Stage 3。
- 阶段 1 和阶段 2 的产物会被复用,阶段 3 会带着你修过的内容再跑一遍。
从 API 角度看,同样的操作如下:
Content-Type: application/json
{
"input": { ...same form values as the prior run... },
"start_from_stage_index": 2,
"prior_execution_id": "exec_8f4c2e1b"
}
关于完整的执行生命周期、取消、门控和 SSE 流式输出,请参见 执行记录。
通过 API 调用应用
在界面中能做的一切,也都通过 REST 提供。当你想从 webhook、CI 任务、另一个智能体或同事的脚本中触发应用时,这非常有用。
认证
在 Settings → API Tokens → Create 处获取一个 token。把它当作密码:范围最小化、定期轮换、绝不入仓。所有接口都要求:
核心接口
| 方法与路径 | 作用 |
|---|---|
GET /api/apps | 列出你的所有应用。 |
POST /api/apps | 创建一个应用。请求体为完整的 AppDef JSON。 |
GET /api/apps/:appId | 获取某个应用的当前定义。 |
PUT /api/apps/:appId | 更新(会保存一个新版本)。 |
DELETE /api/apps/:appId | 归档应用(30 天内可恢复)。 |
POST /api/apps/:appId/run | 触发一次执行。请求体包含 input,以及可选的 is_test、start_from_stage_index、prior_execution_id。 |
GET /api/app-executions/:execId | 轮询状态 / 产物。 |
GET /api/app-executions/:execId/stream | 实时事件的 SSE 流。 |
POST /api/app-executions/:execId/cancel | 停止一次正在运行的执行。 |
端到端示例:触发应用、等待完成、下载产物
EXEC=$(curl -s -X POST \
https://app.aitroop.net/api/apps/app_8f4c2e1b/run \
-H "Authorization: Bearer $AT_USER_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "input": { "company_name": "Stripe" } }' \
| jq -r .id)
# 2. Wait until done (poll, or use SSE)
while true; do
STATUS=$(curl -s \
-H "Authorization: Bearer $AT_USER_TOKEN" \
https://app.aitroop.net/api/app-executions/$EXEC \
| jq -r .status)
echo "status: $STATUS"
[[ "$STATUS" == "completed" || "$STATUS" == "failed" ]] && break
sleep 5
done
# 3. Download the artifact
ART=$(curl -s -H "Authorization: Bearer $AT_USER_TOKEN" \
https://app.aitroop.net/api/app-executions/$EXEC/artifacts \
| jq -r '.[0].id')
curl -s -H "Authorization: Bearer $AT_USER_TOKEN" \
https://app.aitroop.net/api/artifacts/$ART/download \
-o brief.md
当应用失败时
常见的失败模式及其诊断方式:
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 超时 | 阶段超过了 timeout_ms | 调高超时,或拆成两个阶段 |
| "Connect not authorized" | 所需的连接被撤销 | 在 Settings → Connects 中重新授权 |
| "Required input missing" | 表单在某个必填字段为空时被提交 | 谨慎设置必填,或修正表单 |
| 输出含糊或泛泛 | 目标不够具体 | 编辑目标:添加结构、约束、示例 |
| 格式错乱 | 阶段目标要求了一种格式,但声明的是另一种 | 对齐目标与 artifact_defs.format |
"Debug in chat" 工作流
- 打开失败的运行。
- 点击 Debug in chat。
- 会打开一段新对话,并带上该次运行的完整上下文:输入、部分产物、智能体的推理轨迹、错误。
- 与智能体交流:"为什么失败了?我应该改什么?"
- 智能体会进行诊断、给出修复建议,并且通常会直接编辑应用以应用修复。
- 重新运行。
需要避免的常见错误
- 目标含糊。"Do research" 太模糊了。要写明来源、深度、输出结构。
- 缺少产物。一个没有
artifact_defs的阶段不会产出任何可见内容。 - 必填项过多。能给默认值的就给。冗长的表单容易被放弃。
- 超时过短。重度研究需要 5-10 分钟(
timeout_ms: 600000)。 - 输入类型错误。长文本用
textarea,不要用text。固定选项用select。 - 过度拆分。如果在一次对话中它就是一个完整的想法,一个阶段就够了。不要预先拆。
- 目标过短。两行的目标通常不如一份带结构和约束的 10 行目标好用。
常见问题与排错
我的应用每次运行输出都不一致,怎么收紧?
按以下顺序使用两个杠杆:
- 收紧目标。添加带编号的输出结构、字数指标,以及可接受输出的示例。当规范越精确,智能体匹配得就越接近。
- 降低模型的自由度。在目标里加上:"如果对任何部分不确定,请说 'insufficient data',而不要猜测。"当被允许时,智能体更愿意给出保守的答复,而不是自信地猜。
对于真正确定性的转换(解析、过滤、格式化),请用 script 阶段替换智能体阶段。
某个阶段可以根据输入跳过自身吗?
可以。在控制它的输入上使用 show_if(例如 "show_if": "include_competitors == true"),并且在目标中使用条件块: {{#if include_competitors}} ... {{/if}}。智能体读取的是未渲染的目标,因此真正告诉它是否要做这项工作的,是这个条件块。
如何把一个应用的输出传给另一个应用?
两种模式:
- 定时任务 + webhook。让应用 A 的定时任务 POST 到应用 B 的
/run接口。把产物 URL 作为输入传过去。 - 通过 script 阶段串联。阶段 1 通过 API 调用应用 A 并读取产物。阶段 2 及之后在同一个应用中继续。
原生的"应用组合"功能已在路线图上。
两个人可以同时编辑同一个应用吗?
勉强可以。每次保存都是一个新版本,所以两人并行编辑不会互相覆盖。但"当前版本"指针归最后保存者所有。对于正在积极开发的团队应用,建议商定一位负责人,或使用对话式编辑(它会通过智能体被串行化)。
如何导出应用的定义?
-H "Authorization: Bearer $AT_USER_TOKEN" \
-o my-app.json
把 JSON 保存到 git、分享给同事,或通过 POST /api/apps 粘贴到一个新工作区。
能导入别人导出的应用吗?
可以。打开 Apps → New → Import JSON,粘贴 AppDef,点击保存。平台会校验并在你的工作区中创建应用。所需的技能和连接会被列出来;首次运行时会提示你授权连接。
我的应用目标引用了一个用户尚未授权的连接,会怎样?
平台会在启动沙箱之前就检测到这一点。运行会转为 failed,并附带 connect_unauthorized,指明缺失的提供商。系统会在界面中提示用户授权,之后即可重试。对于定时运行,会提醒该定时任务的所有者。
能否限制谁可以运行应用?
有三种控制方式:
- 可见性:private / team / public link。
- 按角色限制运行:按组织角色限制(仅管理员、仅成员)。在 Apps → Settings 下配置。
- 按用户的连接:即便同事能运行你的应用,运行使用的也是他们自己的 token,而不是你的。