表单创建 Agent 化方案
讨论日期:2026-08-25
状态:方案讨论完成,待输出 PRD
范围:DynamicFormTool 表单搭建
一、背景
当前运营通过 DynamicFormTool 搭建表单,流程:
选择表单类型 → 输入表单名称 → 从 8 种组件中拖拽字段 → 配置每个字段属性 → 保存
核心痛点:
- 需要逐个字段拖拽配置,重复劳动
- 多语言表单需要在各语言版本中重复配置
- 表单结构是定式的(字段名 → 组件类型 → 配置),不需要模板
二、为什么不需要模板
和落地页搭建不同,表单创建不需要模板:
| 维度 | 落地页搭建 | 表单创建 |
|---|---|---|
| 组件数量 | 30+ | 8 |
| 布局复杂度 | 二维(上下+左右+嵌套) | 一维(线性从上到下) |
| 视觉风格 | 重要(配色/氛围/品牌感) | 不重要(功能优先) |
| 组件映射 | 需要参考模板确定排列 | 确定性映射(字段名→组件类型) |
表单组件映射是确定性的:
| 运营说 | Agent 映射 | 配置 |
|---|---|---|
| "姓名" / "名称" / "昵称" | → input (text) |
label, required |
| "邮箱" / "Email" | → email |
label, 自动校验 |
| "手机号" / "电话" / "联系方式" | → input (tel) |
label, required |
| "国家" / "所在地区" / "地区" | → country |
label, 下拉列表 |
| "理由" / "说明" / "备注" / "描述" | → textarea |
label, maxLength |
| "上传" / "截图" / "图片" / "照片" | → image |
label, maxSize |
| "附件" / "文件" / "简历" | → file |
label, accept |
| "选择" / "选项" / "类型" | → select |
label, options[] |
三、Agent 交互流程
👤 "创建一个活动报名表单:
姓名、邮箱、手机号、所在国家、报名理由、上传作品截图"
🤖 Agent:
1. 字段解析与映射:
姓名 → input (text), required
邮箱 → email, required
手机号 → input (tel), required
所在国家 → country
报名理由 → textarea, maxLength=200
上传作品截图 → image
2. 调 saveActivityPageConfig 创建表单
3. 返回:"表单已创建,预览链接:xxx"
进阶:运营可以指定字段属性
👤 "创建报名表单:
姓名(必填)、邮箱(必填)、手机号(选填)、
报名类型(下拉:个人/团队/企业)、备注(最多500字)"
🤖 Agent:
1. 解析字段 + 属性:
姓名 → input, required=true
邮箱 → email, required=true
手机号 → input(tel), required=false
报名类型 → select, options=["个人","团队","企业"]
备注 → textarea, maxLength=500
四、Agent 需要处理的边界场景
| 场景 | Agent 行为 |
|---|---|
| 运营说的字段名模糊(如"联系方式") | 映射为 input(text),标注"建议改为手机号或邮箱组件" |
| 运营说的字段无法映射(如"身份证号") | 映射为 input(text),标注"无专用组件,使用文本输入" |
| 运营没指定必填/选填 | 默认全部必填,确认时标注"未指定,已默认设为必填" |
| 运营想修改已创建的表单 | 引导到 DynamicFormTool 编辑页面,Agent 不做修改 |
| 多语言表单 | 当前仅支持英文原版创建,多语言翻译仍需在编辑器中手动完成 |
五、Agent Tool 设计(初稿)
| Tool | 输入 | 输出 |
|---|---|---|
parse_form_fields |
自然语言描述 | 字段列表(name, type, config) |
create_form |
name, fields[], flowType | 表单 ID + 预览链接 |
get_form_component_types |
— | 可用组件类型列表(8 种) |
六、待讨论
- 多语言表单:Agent 是否支持"创建英文版 + 自动翻译其他语言版本"?
- 表单类型选择:
flowId(普通表单/投票/报名等)是否需要 Agent 自动判断?