技术博客
易源合一调用失败扣不扣费:ret_code 与 showapi_fee_num 实测对照表

易源合一调用失败扣不扣费:ret_code 与 showapi_fee_num 实测对照表

作者: 万维易源
2026-09-15
易源合一计费规则ret_codefee_num成本控制
# 易源合一调用失败扣不扣费:ret_code 与 showapi_fee_num 实测对照表 > 接入点:3054-1 / 3054-2 / 3054-3 | 请求方式:POST | 返回格式:JSON | 计费:5.5 厘/次,失败不扣费 | 最后实测核对:2026-09-15 ## 核心要点 - 官方价格页的规则「调用成功才计费,失败不扣费」经实测成立。24 次重复调用中,`ret_code: 0` 的全部 `showapi_fee_num: 1`,`ret_code: -1` 的全部为 `0`。 - **「失败不扣费」不等于「不成功就不花钱」**:命中了一个你不需要的意图也算成功,照样扣费。 - `showapi_res_code`、`ret_code`、`result[i].ret_code` 是三层不同的码位,只有第二层决定计费。 ## 三层码位与计费的关系 先把三个码位摆清楚,不然日志里的「成功」会是假的。 | 字段 | 层级 | 实测取值 | 与计费的关系 | |------|------|---------|-------------| | `showapi_res_code` | 通道层 | `0` | 与计费无关,通道异常时通常没有业务数据 | | `showapi_res_body.ret_code` | 业务层 | `0` 或 `-1` | **决定扣费**。`0` 扣 1 次,`-1` 扣 0 次 | | `result[i].ret_code` | 子业务层 | 快递实测出现过 `2` | 与计费无关,此时业务层仍是 `0`,已经扣费 | 第三层容易被误读。快递查询「查不到物流信息」时,`result[0].ret_code` 是 `2`,`data` 是空数组,但这笔调用**已经扣费了**。因为业务层认为「意图识别 + 调用执行」都成功了,只是底层没查到数据。 ## 实测扣费对照表 2026-09-15,3054-1 逐条调用,共 24 次有效样本: | 输入 | `ret_code` | `ret_msg` | `showapi_fee_num` | |------|-----------|-----------|------------------| | 帮我查找一下昆明今天的天气 | 0 | 无 | 1 | | 讲个笑话(重复 6 次) | 0 | `查询成功!` | 1(每次都是) | | 帮我查快递 7788990011223 | 0 | `调用成功` | 1 | | 今天有什么新闻 | 0 | 无 | 1 | | 你好(命中笑话) | 0 | `查询成功!` | 1 | | 你好(命中新闻) | 0 | 空字符串 | 1 | | 你好(没听懂) | -1 | `must input content field` | 0 | | 你好(推理异常) | -1 | `调用失败:推理失败3` | 0 | | 北京限行尾号是多少(重复 6 次) | -1 | `抱歉,您的问题我还没有学会,请等待我的更新和完善1` | 0(每次都是) | | 把这句话翻译成英文:今天天气不错 | -1 | `摘要失败了,可以换个文本试试哦!` | 0 | 规律很干净:业务层 `ret_code` 为 `0` 就扣 1 次,为 `-1` 就扣 0 次。24 次样本没有例外。 3054-2 的规则一样:意图识别成功(`ret_code: 0`)扣 1 次,识别失败(`ret_code: -1`)不扣费。 ## 「成功」也可能是无效花费 对照表里有一行值得单独说: ``` 输入:你好 ret_code: 0 ret_msg: "" intent: query_news showapi_fee_num: 1 ``` 这次调用被判定为成功,扣了费,但返回的是一批和「你好」毫无关系的新闻。用户看到的是答非所问。 这就是把成本控制寄托在「失败不扣费」上的问题。真正烧钱的是这类**成功了但没用**的调用。同一个「你好」在 6 次重复里,2 次命中 `joke`、1 次命中 `query_news`,都算成功都扣费。 能不能压住这部分开销,取决于你在调 3054-1 之前有没有做意图判断。用 3054-2 先看 `confidence`,低分档直接走追问、不调 3054-1,一次能省 5.5 厘。相关写法见 [易源合一只返回 55 分置信度时:阈值设定、兜底路径与二次追问](https://www.showapi.com/guides/united-api-low-confidence-3054)。 ## 计费参数与成本换算 | 项目 | 实测/文档值 | |------|-----------| | 单次费用 | 5.5 厘/次(三个接入点同价) | | 50 元专用资源包 | 只用本接口可调 9090 次 | | 并发量 | 10 次/秒 | | 有效期 | 一年(全站统一) | | 购买限制 | 不限购买次数,资源包自动递延串联 | | 计费规则 | 调用成功才计费,失败不扣费 | | 通用资源包 | 按各接入点单价扣费,可调用全站付费接口 | 按 5.5 厘/次换算:1000 次约 5.5 元,10000 次约 55 元。走两段式(3054-2 + 3054-1)时,请求数翻倍,成本也翻倍。 专用资源包的可调用次数是产品价格页给出的口径(50 元对应 9090 次)。其他档位与对应次数的关系以官方产品价格页显示为准。 ## 一份把花费记清楚的日志中间件 ```python import logging, requests APP_KEY = "YOUR_APPKEY" log = logging.getLogger("showapi") FEE_PER_CALL = 0.0055 # 元/次,来源:产品价格页 5.5 厘/次 def call(point, text, timeout=20): r = requests.post(f"https://route.showapi.com/{point}?appKey={APP_KEY}", data={"text": text}, timeout=timeout) d = r.json() body = d.get("showapi_res_body", {}) or {} fee_num = d.get("showapi_fee_num", 0) # 通道层 if d.get("showapi_res_code") != 0: log.error("channel_error point=%s err=%s", point, d.get("showapi_res_error")) return None, 0.0 # 业务层:决定计费 if body.get("ret_code") != 0: log.info("biz_fail point=%s msg=%s fee_num=%s", point, body.get("ret_msg"), fee_num) assert fee_num == 0, "协议变化:失败却扣费了,需要核对计费规则" return None, 0.0 # 成功:扣费 cost = fee_num * FEE_PER_CALL log.info("ok point=%s intent=%s fee_num=%s cost=%.4f元 text=%r", point, (body.get("intent") or {}).get("name") if isinstance(body.get("intent"), dict) else body.get("intent"), fee_num, cost, text) return body, cost def handle(text): """两段式:意图先判,再决定要不要花钱调对话。""" b2, c2 = call("3054-2", text) if b2 is None: return {"reply": "没听懂", "cost": c2} conf = b2.get("confidence") if conf is not None and conf < 90: return {"reply": "能说得再具体一点吗", "cost": c2} # 省下 3054-1 的 5.5 厘 b1, c1 = call("3054-1", text) if b1 is None: return {"reply": "查询失败", "cost": c2 + c1} return {"reply": b1["reply_msg"]["text"], "cost": c2 + c1} ``` 代码里那句 `assert fee_num == 0` 是故意的。计费规则的假设一旦变了,这条断言会让你在测试阶段就发现,而不是月底对账时才发现。 ## FAQ **Q1:`ret_code: -1` 会扣费吗?** 不会。实测 24 次样本中,业务层 `ret_code` 为 `-1` 的调用 `showapi_fee_num` 全部为 `0`。 **Q2:`result[0].ret_code` 是 2,为什么还扣费了?** 因为计费看的是业务层 `ret_code`。快递意图识别成功、底层接口正常返回了「查不到物流信息」这个结果,流程算走通,扣 1 次。子业务层的 `2` 只是底层业务码。 **Q3:同一个问题问两次会扣两次吗?** 会。接口是无状态的单句识别,没有会话缓存。相同输入重复调用按次计费。要压成本就在自己那侧做缓存。 **Q4:失败不扣费,那是不是可以随便试错?** 试错的直接成本是零,但要留意「成功了但没用」的调用照样扣费。实测「你好」这类短句会在 6 次里命中笑话、新闻等不同意图,每次都算成功。低信息量输入建议先走意图判断。 **Q5:怎么知道每次调用花了多少钱?** 每次成功调用的响应里带 `showapi_fee_num`,实测值为 1,乘单价 5.5 厘就是这次的成本。3054-3 是透传模式,不返回这个字段,走流式只能从账单侧统计。 **Q6:通用资源包和专用资源包怎么选?** 专用资源包只适用于本接口,通用资源包按各接入点单价扣费、可调用全站付费接口。只做易源合一个接口的话,专用资源包的换算关系更直观(50 元对应 9090 次)。档位与次数的对应以官方产品价格页为准。 ## 下一步阅读 - [易源合一返回三层结构:reply_msg / intent / result 逐层拆解](https://www.showapi.com/guides/united-api-response-structure-3054) - [易源合一只返回 55 分置信度时:阈值设定、兜底路径与二次追问](https://www.showapi.com/guides/united-api-low-confidence-3054) - [易源合一、直连单接口、自建意图识别:三条路线怎么选](https://www.showapi.com/guides/united-api-vs-direct-integration-3054) - **本系列共 12 篇**:查看[易源合一指南总目录](https://www.showapi.com/guides/united-api-guides-3054)