功能说明

这是什么

AI 工地验收开放接口:把某个工地一次验收的现场照片/视频,连同验收标准,提交给 AI 做合规检测,返回一份结构化验收报告——每个检查项给出 PASS(合规)/ FAIL(违规)/ MISSING(缺失)/ UNKNOWN(无法判断)、画面证据、整改建议,并附总体结论与评分。

数据怎么传(重要)

  1. 一次请求 = 一次验收。请求里 projectId(工地)+ requestId(请求 ID)唯一确定一次验收。不要把不相关的内容拼到一次请求里。
  2. requestId 是幂等键(关键)。由调用方为每一次”想计费的验收”生成一个唯一值(如 UUID,自行保存):
    • 重试复用同一个 requestId —— 网络超时、未收到回调等情况重发,服务端按 (projectId, requestId) 识别为同一次,直接返回已存结果,不重跑 AI、不重复计费
    • 重新验收换一个新 requestId —— 哪怕同一工地、同一天,只要是新的 requestId 就是一次新的分析,会重新计费
    • 服务端不存在”强制重检”开关:analyze 调一次(新 requestId)就计一次费;只想看历史结果请走 /result(纯读、不计费)。
  3. 按”分项”组织 checkItems。验收标准通常拆成若干分项(检查点),每个分项对应 checkItems 里的一条:
    • acceptanceCriteria:该分项的验收标准原文(可带 HTML,服务端自动去标签);
    • medias:属于该分项的照片/视频。
    • AI 对每个分项只依据它自己的 medias 判定,逐项分析后合并成一份报告。所以媒体必须按分项归组——哪些图/视频对应哪个检查点,就放进那个分项的 medias,不要把全部图一股脑塞给一个分项。
    • 即使只有一个检查点,也作为 1 个分项传(checkItems 含 1 条)。
  4. 媒体限制:每个分项 ≤ 20 张图片、≤ 5 个视频;单个视频时长 ≤ 5 分钟(由调用方保证);一次请求 ≤ 20 个分项。

调用流程

  1. POST /openapi/aiAcceptance/analyze 提交(projectId + requestId + checkItems,可选 callbackUrl)。AI 分析较慢,接口异步受理、立即返回,不会等分析完成。
  2. 取结果二选一:
    • 传了 callbackUrl → 分析完成后,结果会 POST 回调到该地址(回调体见「查询 AI 验收结果」的响应结构);
    • 没传 → 用 GET /openapi/aiAcceptance/result?projectId=&requestId= 轮询;分析进行中 status=RUNNING(或 data 为空),完成后 status=SUCCESS 并返回报告。
  3. 额度:工地的 AI 验收有额度/次数限制,余量或次数不足时 analyze 对新 requestId 直接返回错误(不受理),错误信息会说明原因(如需更多请联系销售购买)。

鉴权

与其它 openapi 接口一致:header 中携带 timestampclientCodesign

AI 工地验收分析(异步受理)

接口地址:/openapi/aiAcceptance/analyze

请求方式:POST

请求数据类型:application/json

响应数据类型:*/*

接口描述:

提交一次 AI 验收分析(按分项)。统一异步:接口立即受理并返回,后台按分项依次跑 AI 并计费;传 callbackUrl 则完成后回调,不传则用「查询 AI 验收结果」接口按 工地+requestId 轮询。requestId 为调用方幂等键:同 (projectId, requestId) 重试不重跑 AI、不重复计费;重新验收换新 requestId(会重新计费)。余量不足 / 工地不属于当前租户 / 分项数超过本工地剩余可验次数 / 系统繁忙 时直接返错误。鉴权同其它 openapi(header 携带 timestamp、clientCode、sign)。

媒体限制:单次最多 20 个分项;每个分项最多 20 张图片、5 个视频(服务端校验,超出报错);单个视频时长请控制在 5 分钟以内(由调用方保证,服务端不做时长校验,超长可能导致 AI 分析失败或超时)。

请求示例:

{
  "projectId": 100001,
  "requestId": "a1b2c3d4-2026-0623-muGong-0001",
  "operatorId": 2001,
  "callbackUrl": "https://thirdparty.com/ai/callback",
  "checkItems": [
    {
      "acceptanceCriteria": "轻钢龙骨间距不大于400mm,吊杆无松动",
      "medias": [
        { "type": "image", "url": "https://cdn.thirdparty.com/longgu1.jpg" },
        { "type": "video", "url": "https://cdn.thirdparty.com/longgu.mp4" }
      ]
    },
    {
      "acceptanceCriteria": "墙面瓷砖铺贴平整,空鼓率不超过5%,砖缝宽窄均匀",
      "medias": [
        { "type": "image", "url": "https://cdn.thirdparty.com/cizhuan1.jpg" },
        { "type": "image", "url": "https://cdn.thirdparty.com/cizhuan2.jpg" }
      ]
    }
  ]
}

请求参数:

参数名称 参数说明 请求类型 是否必须 数据类型 schema
OpenAiAcceptanceRequest AI 验收分析请求 body true OpenAiAcceptanceRequest OpenAiAcceptanceRequest
  projectId 工地ID(真实平台工地,须属于当前租户) true integer(int64)
  requestId 请求ID(调用方生成的唯一幂等键;重试复用同值不重复计费,重验换新值) true string
  operatorId 操作人ID(计费审计用,不传按 -1) false integer(int64)
  callbackUrl 回调地址(为空则用 /result 轮询;有值则完成后回调) false string
  checkItems 分项列表(每项一次 AI,单次上限 20 项) true array CheckItem
    acceptanceCriteria 该分项验收标准原文(可带 HTML,服务端自动去标签) true string
    medias 该分项媒体列表(≤20 张图片、≤5 个视频;视频单个≤5分钟由调用方保证) true array Media
      type 媒体类型,可用值:image,video true string
      url 媒体URL(须公网可访问,禁止内网地址) true string

响应状态:

状态码 说明 schema
200 OK(已受理) R«受理结果»
400 业务错误(额度不足/越权/超次数/系统繁忙,详见 message)
401 Unauthorized
403 Forbidden
404 Not Found

响应参数:

参数名称 参数说明 类型 schema
code 状态码(0 成功) integer(int32) integer(int32)
data 受理结果 object
  accepted 是否已受理 boolean
  projectId 工地ID integer(int64)
  requestId 请求ID(与入参一致) string
  message 受理提示(含结果获取方式说明) string
message 提示信息(错误时为错误原因) string
successful 是否成功 boolean

响应示例:

{
    "code": 0,
    "data": {
        "accepted": true,
        "projectId": 100001,
        "requestId": "a1b2c3d4-2026-0623-muGong-0001",
        "message": "已受理,分析完成后将回调 callbackUrl;也可用 /result 按工地+requestId 查询"
    },
    "message": "",
    "successful": true
}

查询 AI 验收结果

接口地址:/openapi/aiAcceptance/result

请求方式:GET

请求数据类型:application/x-www-form-urlencoded

响应数据类型:*/*

接口描述:

按 工地+requestId 查询 AI 验收分析结果(纯读,不计费、不触发 AI)。analyze 受理后即有一行 status=RUNNING,完成后变为 SUCCESS/AI_EMPTY/BILLING_BLOCKED;可重复轮询。未命中时 data 为空。也用作 analyze 回调体的结构。

请求参数:

参数名称 参数说明 请求类型 是否必须 数据类型 schema
projectId 工地ID query true integer(int64)
requestId 请求ID(与 analyze 入参一致) query true string

响应状态:

状态码 说明 schema
200 OK R«AI验收结果»
401 Unauthorized
403 Forbidden
404 Not Found

响应参数:

参数名称 参数说明 类型 schema
code 状态码(0 成功) integer(int32) integer(int32)
data AI 验收结果(未命中为 null) object
  projectId 工地ID integer(int64)
  requestId 请求ID string
  status 状态,可用值:RUNNING(分析中),SUCCESS,AI_EMPTY,BILLING_BLOCKED string
  analysisDate 分析日期 yyyy-MM-dd string
  billingBlocked 是否被计费拦截(true 时未跑 AI) boolean
  billingErrorCode 计费错误码,可用值:INSUFFICIENT_QUOTA,PROJECT_CALL_LIMIT_EXCEEDED string
  errorMsg 错误提示 string
  usedTimes 本工地累计验收次数 integer(int32)
  maxTimes 本工地次数上限 integer(int32)
  remainingQuota 组织树可见订阅余量 integer(int32)
  report 汇总后的验收报告 object
    analysis 分析详情 object
      meta 元信息 object
        inspection_node 验收阶段 string
        image_quality_check 画质评价 string
        overall_score 总体评分(0-100) integer
      summary 总体结论 object
        status 总体状态,可用值:PASS,FAIL,MISSING string
        conclusion 综述 string
      checklist_items 检查项列表 array
        item_name 检查项名称 string
        standard_desc 标准摘要 string
        status 检查项状态,可用值:PASS,FAIL,MISSING,UNKNOWN string
        evidence 画面证据描述 string
        rectification 整改建议(FAIL 时) string
        related_media 关联媒体 array
          type 媒体类型 string
          url 媒体URL string
    images 本次送 AI 的全部媒体 array
    analyzedAt 分析时间 string
message 提示信息 string
successful 是否成功 boolean

响应示例:

{
    "code": 0,
    "data": {
        "projectId": 100001,
        "requestId": "a1b2c3d4-2026-0623-muGong-0001",
        "status": "SUCCESS",
        "analysisDate": "2026-06-23",
        "billingBlocked": false,
        "billingErrorCode": "",
        "errorMsg": "",
        "usedTimes": 1,
        "maxTimes": 5,
        "remainingQuota": 3,
        "report": {
            "analysis": {
                "meta": { "inspection_node": "木工验收", "image_quality_check": "清晰", "overall_score": 85 },
                "summary": { "status": "FAIL", "conclusion": "主体工艺良好,但吊杆间距存在一处违规。" },
                "checklist_items": [
                    {
                        "item_name": "轻钢龙骨间距",
                        "standard_desc": "间距不大于400mm",
                        "status": "FAIL",
                        "evidence": "照片中可见龙骨间距明显大于400mm。",
                        "rectification": "调整龙骨间距至400mm以内后复检。",
                        "related_media": [ { "type": "image", "url": "https://cdn.thirdparty.com/a.jpg" } ]
                    }
                ]
            },
            "images": [ { "type": "image", "url": "https://cdn.thirdparty.com/a.jpg" } ],
            "analyzedAt": "2026-06-23 14:32:10"
        }
    },
    "message": "",
    "successful": true
}
作者:admin  创建时间:2026-06-24 15:26
最后编辑:admin  更新时间:2026-06-24 18:09