# 创建Agent经验总结(实战版) > 基于本仓库实际落地的 **Android应用开发助手**(已发布可用)沉淀:从“想法→工作流→落库→发布→验证→避坑”一套流程。 ## 1. 目标与验收标准 - **目标**:在 Agent 管理页面出现一个“可运行/可使用”的 Agent,并且能通过 `/api/v1/executions` 正常触发执行并拿到结果。 - **关键验收**: - **状态**:Agent 为 `published` 或 `running`(否则普通用户无法执行) - **工作流**:`workflow_config` 必须包含合法的 `nodes` / `edges`,能从 `start` 走到 `end` - **数据链路**:LLM prompt 能正确拿到用户输入(一般是 `{{query}}` / `{{user_query}}`) ## 2. 两种创建方式:UI vs 脚本 ### 2.1 UI 创建(适合调试) - 优点:所见即所得、方便调整 prompt/连线/节点参数 - 缺点:重复劳动多,不利于批量/版本化 ### 2.2 脚本创建(推荐用于“生成一批可运行Agent/一键复现”) - 典型做法:写一个 `backend/scripts/generate_xxx_agent.py`,直接用 SQLAlchemy 创建或更新 Agent。 - 本仓库示例: - `backend/scripts/generate_android_agent.py`(Android应用开发助手) - `backend/scripts/generate_content_agent.py`(内容生成助手) ## 3. Agent 能不能“运行”,最关键的规则 ### 3.1 Agent 状态与执行权限 后端创建执行时会做状态校验:**非 owner 执行必须是 `published/running`**。 对应代码(要点:状态不对会 403): ```103:104:backend/app/api/executions.py if agent.status not in ["published", "running"] and agent.user_id != current_user.id: raise HTTPException(status_code=403, detail="Agent未发布或无权执行") ``` **经验**: - 如果你希望“创建出来立刻可用”,脚本里就直接写 `status="published"`。 - 如果你希望“先草稿”,脚本里写 `draft`,但要用 owner 测试或再部署发布。 ### 3.2 workflow_config 的最低要求 - 必须包含: - `nodes`: 节点数组 - `edges`: 连线数组 - 且能通过校验(创建接口会校验): - 参考:`backend/app/api/agents.py` 中 `create_agent` 会调用 `validate_workflow(...)` **经验**: - 最小可运行工作流:`start -> llm -> end` - 复杂工作流建议:`start -> 分析(llm) -> 分流(condition) -> 子分支(llm/transform) -> 汇总(transform) -> 输出优化(llm) -> end` ## 4. 数据流转与 Prompt 设计(决定“是否答非所问”) ### 4.1 输入字段命名建议 本平台执行 Agent 时,常见输入会放在: - `query` - `USER_INPUT` Android 示例项目也是这样发起的: - `query = 用户输入` - `USER_INPUT = 用户输入` **经验**: - prompt 里优先用 `{{query}}`(平台链路更稳定) - 如果你做了 transform 映射,可统一成 `user_query` 再用 `{{user_query}}` ### 4.2 先分析、再生成:降低跑偏 常见稳定结构: - 第 1 个 LLM:**需求抽取/结构化**(JSON 输出) - 后续 LLM:拿着“结构化需求 + 原始需求”做生成/诊断/优化 这样可以显著减少“答非所问”,也便于条件分支与 transform 做数据拼接。 ## 5. 条件分支的关键坑:`sourceHandle` 条件节点“走哪个分支”,靠 edge 的 `sourceHandle` 来区分(例如 `true` / `false`)。 对应引擎逻辑(要点:**只保留 sourceHandle == branch 的边**): ```1936:1961:backend/app/services/workflow_engine.py if node.get('type') == 'condition': branch = result.get('branch', 'false') # 只保留:不是从条件节点出发的边,或 从条件节点出发且sourceHandle匹配分支的边 edges_to_remove = [] edges_to_keep = [] for edge in active_edges: if edge['source'] == next_node_id: edge_handle = edge.get('sourceHandle') if edge_handle == branch: edges_to_keep.append(edge) else: edges_to_remove.append(edge) else: edges_to_keep.append(edge) active_edges = edges_to_keep ``` **经验**: - 条件节点的出边必须带 `sourceHandle`,而且值要与引擎产出的 `branch` 完全一致(常用:`true`/`false`) - 否则会出现: - 分支全跑 / 分支全不跑 / 走错分支 ## 6. 用脚本创建“可运行Agent”的推荐模板 核心点: - 查用户(owner) - 构造 `nodes/edges` - 若同名存在则更新,否则创建 - 设置 `status="published"` 本仓库可直接复用(已验证创建成功): - `backend/scripts/generate_android_agent.py` 运行方式: ```bash cd /home/renjianbo/aiagent python3 backend/scripts/generate_android_agent.py ``` 运行后会输出 Agent ID、节点数、边数,且状态为 `published`。 ## 7. 如何验证 Agent “真的可运行” ### 7.1 前端验证 - 进入 **Agent管理** - 找到 Agent(例如:Android应用开发助手) - 状态为 **已发布/运行中** - 点击 **使用**,输入一句话触发执行 ### 7.2 API 验证(推荐可自动化) 1) 登录获取 token(form-urlencoded) 2) 发起执行: ```json POST /api/v1/executions { "agent_id": "你的agent_id", "input_data": { "query": "帮我生成一个登录页", "USER_INPUT": "帮我生成一个登录页" } } ``` 3) 轮询状态: - `GET /api/v1/executions/{execution_id}/status` 4) 获取结果: - `GET /api/v1/executions/{execution_id}` ## 8. 常见问题与排查清单 - **Agent 列表里看到了,但点“使用”无权限/403** - 检查 `status` 是否为 `published/running` - 是否为 owner 在测试草稿 - **LLM 输出跑偏/答非所问** - 是否把用户输入稳定透传到了 `{{query}}` - 是否先做“需求结构化”再生成 - prompt 是否过泛、缺少输出格式约束 - **条件节点后续分支乱跑** - 检查条件节点出边是否有 `sourceHandle=true/false` - 检查引擎分支值是否与 sourceHandle 对齐 - **输出结构混乱** - 建议末端增加 `llm-format` 做统一 Markdown 格式化 - end 节点尽量只输出最终 `output` 字段(不要拼接用户 query) ## 9. 本次落地成果(可复用资产) - **可运行 Agent**:Android应用开发助手(脚本创建,状态 `published`) - **生成脚本**:`backend/scripts/generate_android_agent.py` - **Prompt 方案文档**:`androidExampleDemo/多功能android应用智能体的提示词.md` --- 最后更新:2026-01-20