契约 v1 cancellation-quote.partner-dify.v1 Workflow · 无会话

注销报价 · 对外 Workflow API

与门户页 /zh/cancellation-pricing 相同业务能力:主体名称 / 统一社会信用代码 / 营业执照 → 可核验注销报价。 本页面向合作方后端接入 Dify 官方 Workflow Service API。

API Base http://43.139.35.140/v1
应用 Aijia Service Quote Parent Orchestrator (main-ssot)
Studio App ID 4062f4d9-ef1a-4e09-ac65-0726b873baa9

1. 概览

能力企业注销 / 异常修复类核价(主体核验 → 事实 → 商品匹配 → 客户可见报价)
协议Dify Workflow 官方 Service API(无会话)
应用名Aijia Service Quote Parent Orchestrator (main-ssot)
应用模式workflow
Studio 地址http://43.139.35.140/app/4062f4d9-ef1a-4e09-ac65-0726b873baa9/workflow
主接口POST /v1/workflows/run
鉴权Authorization: Bearer <App API Key>
推荐模式blocking(对接简单)或 streaming(需要进度)
不在本契约内:门户 UI / 企微发送 / 商品库原始接口 / 上游工商税务直连 / 其它 Dify 应用或 Chatflow。 价格与办理周期仅供参考,最终以客服确认及实际办理条件为准。

Key 与 Workflow 应用绑定,无需在 body 中传 workflow_id 或 app id。

2. 鉴权

Authorization: Bearer app-xxxxxxxx
Content-Type: application/json
规则说明
Key 绑定专用 App Key 绑定本 Parent Workflow;创建后即可调用
保管仅允许合作方服务端持有;禁止写入 App / 小程序 / 浏览器 / 公开文档
泄露立即通知爱嘉轮换;旧 Key 作废后旧调用全部失败
user调用方标识,用于日志区分;不是第二把密码

建议 user 格式:

partner-<合作方简称>:<业务单号或内部用户ID>
# 例:partner-acme:order-20260805-001
本页故意不写真实 API Key。请使用爱嘉单独交付的 Key,放在服务端环境变量中。

连通性自检:

curl -sS -H "Authorization: Bearer $API_KEY" \
  "http://43.139.35.140/v1/info"

curl -sS -H "Authorization: Bearer $API_KEY" \
  "http://43.139.35.140/v1/parameters"

期望:name 为 Parent main-ssot,modeworkflow;parameters 含 subject_locator / query_text 等。

3. 主接口:执行报价

POST http://43.139.35.140/v1/workflows/run
Authorization: Bearer {API_KEY}
Content-Type: application/json
{
  "inputs": {
    "subject_locator": "郯城县帅众花卉园艺场",
    "query_text": "郯城县帅众花卉园艺场",
    "quote_fact_package_json": "",
    "intent": "cancellation_quote",
    "effect_mode": "no_send"
  },
  "response_mode": "blocking",
  "user": "partner-acme:order-20260805-001"
}

4. 输入字段

字段类型必填说明
inputs.subject_locatorstring条件公司名、信用代码,或多主体(一行一个)。最长约 4096
inputs.query_textstring条件客户原文;通常与 subject_locator 相同
inputs.quote_fact_package_jsonstring结构化事实 JSON;一般传 ""
inputs.output_profile_jsonstring输出样式;合作方默认不传
inputs.intentstringcancellation_quoteabnormal_repair
inputs.effect_modestring固定 no_send:只核价、不触发企微外发
inputs.imagesarray已上传图片描述符(见图片章节)
response_modestringblockingstreaming
userstring合作方侧稳定调用标识

条件必填:subject_locator / query_text 至少一个非空,提供有效 images

多主体

{
  "inputs": {
    "subject_locator": "甲乙百货商行\n丙丁百货商行",
    "query_text": "甲乙百货商行\n丙丁百货商行",
    "intent": "cancellation_quote",
    "effect_mode": "no_send"
  },
  "response_mode": "blocking",
  "user": "partner-acme:batch-001"
}

5. 输出字段与展示规则

blocking 成功时 HTTP 200,结构示意:

{
  "workflow_run_id": "……",
  "task_id": "……",
  "data": {
    "id": "……",
    "status": "succeeded",
    "outputs": {
      "customer_visible_text": "……客户可见报价全文……",
      "customer_answer": "……",
      "send_intent": "send",
      "route": "……",
      "quote_records_json": "[……]",
      "subject_count": "1"
    },
    "elapsed_time": 3.1,
    "total_steps": 10
  }
}
字段用途
data.status必须为 succeeded 才可继续解析
data.outputs.customer_visible_text首选客户可见报价正文
data.outputs.customer_answer兼容字段;前者为空时可用
data.outputs.send_intent是否可直接给终端客户
data.outputs.subject_count识别主体数
data.outputs.quote_records_json结构化明细(可选落库)
workflow_run_id排障引用,请记入合作方日志
必须遵守:
1) 仅 status === "succeeded" 时采用结果;
2) 展示文本优先 customer_visible_text
3) 仅当 send_intent 为可发送语义(如 send)且文本非空时,才可作为最终报价给终端客户;
4) 需人工 / 不可发送 / 空文本 → 走人工或失败提示;
5) 不要用节点日志、中间 SSE、调试字段拼价格。

6. 营业执照图片

6.1 上传

POST http://43.139.35.140/v1/files/upload
Authorization: Bearer {API_KEY}
Content-Type: multipart/form-data

# 表单:file=图片;user=与后续 workflows/run 保持一致
# 类型:JPEG / PNG / WebP;单次 workflow 最多约 3 张
curl -sS -X POST "http://43.139.35.140/v1/files/upload" \
  -H "Authorization: Bearer $API_KEY" \
  -F "user=partner-acme:order-img-001" \
  -F "[email protected];type=image/jpeg"

响应中的 idupload_file_id

6.2 带图运行

{
  "inputs": {
    "subject_locator": "",
    "query_text": "",
    "intent": "cancellation_quote",
    "effect_mode": "no_send",
    "images": [
      {
        "type": "image",
        "transfer_method": "local_file",
        "upload_file_id": "<上一步返回的 id>"
      }
    ]
  },
  "response_mode": "blocking",
  "user": "partner-acme:order-img-001"
}

7. streaming(可选)

POST http://43.139.35.140/v1/workflows/run
Authorization: Bearer {API_KEY}
Content-Type: application/json
Accept: text/event-stream

{ "response_mode": "streaming", ... }
event含义
workflow_started开始
node_started / node_finished节点进度(可选 UI)
workflow_finished终态;读取 data.outputs
error / 失败态按失败处理

只在 workflow_finished 且成功时取 outputs,规则同 blocking。

8. 错误处理

情况建议
HTTP 401Key 错误或已吊销 → 联系爱嘉
HTTP 400入参非法 → 检查 inputs / user
HTTP 413 / 上传失败缩小图片后重试
HTTP 5xx / 超时指数退避;同一业务单号可复用同一 user
data.status != succeeded按失败处理,勿展示半截结果
业务需人工根据 send_intent / 可见文本提示人工,不自动成交

超时建议:纯文本 60~120s;含图 180~300s。

9. 示例

9.1 curl · 文本 blocking

export API_BASE="http://43.139.35.140/v1"
export API_KEY="app-xxxxxxxx"   # 仅服务端环境变量

curl -sS -X POST "$API_BASE/workflows/run" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "inputs": {
      "subject_locator": "郯城县帅众花卉园艺场",
      "query_text": "郯城县帅众花卉园艺场",
      "quote_fact_package_json": "",
      "intent": "cancellation_quote",
      "effect_mode": "no_send"
    },
    "response_mode": "blocking",
    "user": "partner-acme:demo-001"
  }'

9.2 Node.js · blocking

async function quoteCancellation(companyText, businessId) {
  const res = await fetch(`${process.env.API_BASE}/workflows/run`, {
    method: 'POST',
    headers: {
      authorization: `Bearer ${process.env.API_KEY}`,
      'content-type': 'application/json',
    },
    body: JSON.stringify({
      inputs: {
        subject_locator: companyText,
        query_text: companyText,
        quote_fact_package_json: '',
        intent: 'cancellation_quote',
        effect_mode: 'no_send',
      },
      response_mode: 'blocking',
      user: `partner-acme:${businessId}`,
    }),
  });

  if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
  const body = await res.json();
  if (body?.data?.status !== 'succeeded') {
    throw new Error(`workflow status=${body?.data?.status}`);
  }
  const out = body.data.outputs || {};
  const text = out.customer_visible_text || out.customer_answer || '';
  return {
    text,
    sendIntent: out.send_intent,
    subjectCount: out.subject_count,
    workflowRunId: body.workflow_run_id,
    canShowToCustomer: out.send_intent === 'send' && Boolean(text),
  };
}

10. 联调检查清单

支持与变更

约定
契约版本cancellation-quote.partner-dify.v1
不兼容变更爱嘉提前通知;尽量保持 inputs / 主输出字段稳定
排障请提供userworkflow_run_id、大致时间、主体原文(可脱敏)
Key 轮换爱嘉签发新 Key → 合作方切换 → 旧 Key 作废