用户说"启动 MockLab"并提供接口文档后,执行以下步骤:
text
1. 获取文档内容
- 本地文件路径 → Read 工具读取
- URL 链接 → web_fetch 抓取
- 直接粘贴内容 → 直接使用
2. 模型自主解析文档
- 提取所有接口:路径、方法、请求/响应字段
- 推断每个字段的 Mock 生成规则
- 整理 inner_schemas(嵌套子结构)
- 整理 partner 信息(渠道号、签名格式等)
- 判断跨接口状态关联(ref 字段)
3. 保存 Schema 到 schema_store/
- 文件名:schema_store/{project_name}.json
- project_name 由模型根据文档内容生成(如"平安银行"、"微信支付")
4. 启动 Mock Server
python {skill_path}/mock_server.py --port 18080 --project {project_name}
5. 自动打开浏览器
http://localhost:18080
6. 告知用户服务已启动,介绍如何使用
模型根据字段语义自动推断 rule,写入 Schema:
字段特征rule生成结果渠道/合作方 IDfixed:{值}固定值随机数random:66位随机数字时间戳timestamp:ms毫秒时间戳手机号phone11位真实号段手机号身份证idcard18位合法身份证姓名name中文姓名车牌号plate合规车牌号金额amount:lo-hi指定范围金额利率rate:lo-hi指定范围利率Tokentoken:3232位随机字符串枚举enum:a,b,c 或 enum:k=v,k=v枚举值自增序列sequence:{key}自增序列号国标码province:code省市国标码+名称日期date:format格式化日期嵌套对象nested:{schema_name}引用 inner_schemas对象数组array:{schema_name}数组,元素引用 inner_schemas子对象object:{schema_name}引用 inner_schemas跳过skip不生成(sign 等)请求镜像mirror取请求 body 中同名字段的值,原样返回动态取 bodybody:data.order_id取请求 body 中嵌套字段动态取路径path:order_id取 URL 路径参数动态取参数query:page取 URL query string 参数动态取头header:Authorization取请求头动态取状态state:token取跨次调用状态(ref 字段)条件包含when:{"field":"status","eq":"1"}满足条件时才返回该字段
模型根据字段名和中文含义自主判断,无需用户指定:
phone、 mobile、 手机 → phoneidcard、 身份证、 证件号 → idcardname、 姓名、 cust_name → nameplate、 license、 车牌 → plateamount、 amt、 金额、 loan → amountrate、 利率 → rateprovince、 省份 → province:codecity、 城市 → city:province_codesign、 签名 → skipciphertext、 加密 → skip(标注加密占位)seq、 no、 编号、 订单 → sequence:{field_name}rule: "nested:{schema_name}" 引用 inner_schemas"[SM4加密占位]""is_ref": true → 自动存入状态表state_store.json,服务重启不丢失示例(accessToken 跨接口传递):
json
// applyAccessToken 响应字段
{ "name": "accessToken", "rule": "token:32", "is_ref": true }
// 后续接口请求字段
{ "name": "accessToken", "rule": "state:accessToken" }
推荐在 UI 上直接配置( http://localhost:18080 选中接口后顶部设置栏)。
勾选"延迟" → 输入最小值和最大值(ms)。也可以在 Schema JSON 里写:
json
{ "delay": "200-500" }
写法效果"delay": "300"固定 300ms"delay": "200-500"随机 200500ms3s"delay": "1000-3000"大压力测试 1
推荐在 UI 上直接配置,清晰分隔每个参数。
勾选"错误" → 选择错误类型 → 填概率/错误码/消息。也可以在 Schema JSON 里写:
json
{ "error": "500@0.05:ERR001:自定义错误消息" }
格式: 错误类型[@概率[:错误码[:消息]]]
字段说明错误类型HTTP状态码(500/400/401/403/404/429)或 timeout / network_error / rate_limit概率0.0~1.0,1.0 = 100% 触发错误码自定义业务错误码(如 ERR001)消息自定义错误消息内容
把请求参数原样反射回响应,让接口"更逼真":
json
{
"name": "下单",
"path": "/order/create",
"req_fields": [
{ "name": "order_id", "type": "string" },
{ "name": "amount", "type": "number" }
],
"resp_fields": [
{ "name": "order_id", "rule": "mirror" },
{ "name": "amount", "rule": "mirror" },
{ "name": "status", "rule": "fixed:PAID" }
]
}
请求 {"order_id": "A123", "amount": 100} → 响应 {"order_id": "A123", "amount": 100, "status": "PAID"}
根据请求内容动态生成响应,不只是返回假数据:
json
{ "name": "order_id", "rule": "path:order_id" }
GET /order/{order_id} → 响应中 order_id 引用 URL 里实际的值
json
{ "name": "page", "rule": "query:page" }
GET /list?page=2 → 响应中 page 取 query 参数值
json
{ "name": "user_phone", "rule": "body:user.phone" }
请求 {"user": {"phone": "13800138000"}} → 响应 {"user_phone": "13800138000"}
json
{ "name": "token", "rule": "state:access_token" }
取上一次登录接口存入的 access_token 状态
json
{ "name": "vip_discount", "rule": "amount:0-0.5", "when": {"field": "body.is_vip", "op": "eq", "value": true} }
{ "name": "discount", "rule": "fixed:0", "when": {"field": "body.is_vip", "op": "exists"} }
只有满足条件时才返回该字段,支持 eq / ne / gt / lt / contains / exists / not_exists
bash
python {skill_path}/mock_server.py --port 18080 --project {project_name}
text
{skill_path}/
├── SKILL.md
├── mock_server.py # FastAPI 服务(内嵌 HTML UI)
└── schema_store/ # 由服务器自动创建
├── {project_1}.json
└── {project_2}.json
服务器运行后创建:
schema_store/ 目录state_store.json 状态文件POST /mock/load 实时加载新项目(无需重启)