BFE AI 网关 Audio 模型流式计费实战:SC03 RMB 配额扣减下的音频 Token 拆分定价与 Redis 原子扣减(TC-10)

发布时间:2026/10/12 9:35:36

BFE AI 网关 Audio 模型流式计费实战:SC03 RMB 配额扣减下的音频 Token 拆分定价与 Redis 原子扣减(TC-10) 后端网络/通信云原生【免费下载链接】bfeA modern layer 7 load balancer from baidu项目地址https://gitcode.com/gh_mirrors/bf/bfe点击查看免费下载BFE 作为百度开源的现代七层负载均衡与 AI 网关在mod_ai_token_auth模块中实现了基于 RMB 的配额扣减能力。本文围绕测试设计文档 TC-10-Audio模型流式计费完整讲解当模型价格表配置了音频单价时BFE 如何对 SSE 流式响应按音频 input/output 拆分公式计费并通过嵌入式 Redis 原子扣减余额。读完本文你将掌握音频 Token 计费的公式推导、ModelTable价格配置、SSE 流式 usage 解析链路以及集成测试中完整的验证口径。一、用例速览项目内容用例编号TC-10用例名称Audio 模型流式计费所属场景SC03 RMB 配额扣减场景说明bfe版本当前源码版本bfe-access-pb版本v0.3.3运行模式单组件模式仅启动真实bfe进程与嵌入式 Redis测试目的验证当模型价格表中配置了音频相关单价时BFE 对 SSE 流式响应按音频 input/output 拆分公式计费。与之配套的非流式版本见 TC-09-Audio模型非流式计费二者共用同一套价格配置与扣减期望区别仅在于响应传输形态SSE 流式 vs 完整 JSON body。二、测试目的音频拆分计费公式音频模型如 OpenAI 系的gpt-audio-1.5的 usage 中会额外携带audio_input_tokens与audio_output_tokens且这两个字段已分别包含在prompt_tokens与completion_tokens之中。若直接用文本单价乘以全部 token音频 token 就会被按文本价格重复/错误计费因此必须先从总数中剥离出来单独计价。核心拆分公式与 设计变更文档 第 7.1 节一致normal_input prompt_tokens - cache_read_tokens - audio_input_tokens normal_output completion_tokens - audio_output_tokens cost normal_input × input_cost_per_token cache_read_tokens × cache_read_input_token_cost cache_write_tokens × cache_creation_input_token_cost audio_input_tokens × input_cost_per_audio_token normal_output × output_cost_per_token audio_output_tokens × output_cost_per_audio_token注意两点音频 input 从普通 input 中剥离audio_input_tokens已计入prompt_tokens需减去音频 output 从普通 output 中剥离audio_output_tokens已计入completion_tokens需减去若同时存在 cache usage则按prompt - cache_read - audio_input的顺序依次剥离前提是后端各字段语义互不重叠即 disjoint。三、前置条件与测试环境搭建按 TC-10 文档共 5 条前置条件已编译bfe可执行文件运行集成测试前需完成源码编译。嵌入式 Redis 已启动并预置余额quota:plan_rmb 10000000000。测试使用github.com/alicebob/miniredis/v2启动嵌入式 Redis不依赖外部 Redis 服务见 场景说明 第 2 节。mock 后端cluster_rmb已启动返回 SSE 流且最终 chunk 携带 audio usagedata: {choices:[{delta:{role:assistant}}]} data: {choices:[{delta:{content:hello}}]} data: {usage:{prompt_tokens:4000,completion_tokens:500,total_tokens:4500,audio_input_tokens:1000,audio_output_tokens:200}}关键点流式场景下音频 usage 通常只在最后一个 SSE 事件中出现因此 BFE 必须以最终事件覆盖之前的值详见第六节源码链路。临时 BFE 配置已加载cluster_rmb的ModelTable包含模型gpt-audio-1.5价格见下节。ak_user_a绑定 RMB 配额计划plan_rmbQuota 10000000000即 100 元1e-8 元/单位。四、配置构造ModelTable 音频单价与定点整数在cluster_rmb的AIConf.ModelTable.Models中增加模型gpt-audio-1.5完整 AIConf 示例见 场景说明 第 4.2 节{ Provider: mock-provider, Model: gpt-audio-1.5, BaseModel: gpt-audio-1.5, Mode: chat, Capabilities: [chat, audio_input], SupportedParameters: [temperature, max_tokens], Limits: { context_window: 128000 }, Prices: { input_cost_per_token: 0.00000178, output_cost_per_token: 0.00000715, input_cost_per_audio_token: 0.00002288, output_cost_per_audio_token: 0.00004576 } }四个价格字段的定点整数换算RMB 定点精度为 1e-8 元/单位即RmbToFixedPoint(yuan) round(yuan × 1e8)价格字段元/Token定点整数input_cost_per_token0.00000178178output_cost_per_token0.00000715715input_cost_per_audio_token0.000022882288output_cost_per_audio_token0.000045764576配置加载层面的实现事实音频单价常量定义在 cluster_conf_load.goPriceInputCostPerAudioToken input_cost_per_audio_token、PriceOutputCostPerAudioToken等ModelTableCheck在加载时校验各价格非负含音频单价负值直接报错negative price for model ...见 cluster_conf_load.go从源码结构看音频单价为可选配置未配置时该方向音频 token 保留在普通 input/output 中按文本价格计费避免漏计详见 design-changes.md 第 6.2 节。五、BFE 请求构造按文档发送1 次POST 请求字段值Hostrmb.example.orgPath/v1/chat/completionsAuthorizationBearer ak_user_aBody{model:gpt-audio-1.5,stream:true}rmb.example.org命中apikey_ak_user_a路由表中user_a-rmb规则条件req_host_in(rmb.example.org)targets 指向cluster_rmb见 场景说明 第 4.4 节。六、预期结果与扣减明细校验按 TC-10 文档预期结果共 4 条响应状态码200cluster_rmb收到 1 次命中200Redis 中quota:plan_rmb余额按音频拆分公式扣减。具体扣减明细normal_input prompt_tokens - audio_input_tokens 4000 - 1000 3000 normal_output completion_tokens - audio_output_tokens 500 - 200 300 扣减金额 3000 × 178 1000 × 2288 300 × 715 200 × 4576 534000 2288000 214500 915200 3951700单位1e-8 元即 0.039517 元 剩余 10000000000 - 3951700 99996048300剩余余额99996048300是集成测试断言的核心期望值。七、源码链路SSE 流式 usage 解析与费用计算TC-10 的验证点横跨mod_body_process流式事件解析与mod_ai_token_authRMB 费用计算与扣减两个模块下面按调用链逐层展开。7.1 usage 字段的协议无关解析usage_parse.go 定义了协议无关的UsageFields其中AudioInputTokens int64 AudioOutputTokens int64parseOpenAIUsageFieldsWithPrefix通过gjson从响应 JSON 中提取usage.audio_input_tokens与usage.audio_output_tokens见 usage_parse.go。TC-10 的 mock SSE 最终 chunk 即属于 OpenAI chat 主链形态prompt_tokens/completion_tokens顶层字段。7.2 流式事件收集QuotaUsage 与 QuotaUsageProcessorllm_util.go 中的QuotaUsage结构体增加了AudioInputTokens/AudioOutputTokens字段SSEEvent.GetQuotaUsage负责从单个 SSE 事件解析 usagellm_util.gocontent_quota_usage.go 的QuotaUsageProcessor.Process遍历事件流在非 guess 事件覆盖tctxTokenUsage时同步写入音频字段见 content_quota_usage.go。流式语义音频 usage 通常只在最后一个 SSE 事件中出现最后一个有效事件会覆盖之前的值保证最终计费以最终 usage 为准。这也是 TC-10 mock 把usage放在最终 chunk的原因。7.3 费用计算calcChatCost 的音频双向拆分bfe_basic.TokenUsage结构体已声明音频字段request_ai_basic.goAudioInputTokens int64 // usage.audio_input_tokens, already included in PromptTokens AudioOutputTokens int64 // usage.audio_output_tokens, already included in CompletionTokens UsedQuota int64 // unittotal_token UsedCost int64 // unitRMB, 1 unit 1e-8 yuanRMB 费用计算入口为 calcChatCost其音频拆分逻辑边界保护sanitize负值按 0 处理audioInputTokens promptTokens - cacheReadTokens - cacheWriteTokens时截断防止普通 input 为负audioOutputTokens completionTokens时截断mod_ai_token_auth.goaudio input 拆分仅当audioInputPrice 0时从normalInput中剥离audioInputTokens并单独计价未配置音频 input 单价时audioInputTokens 0即按文本价格计费mod_ai_token_auth.goaudio output 拆分同理从completionTokens中剥离mod_ai_token_auth.go逐项定点换算求和每个计费项独立经quota.CalcCostUnits(usage, priceYuan)换算为定点整数后相加浮点只参与单次乘法避免精度累积mod_ai_token_auth.gocost : quota.CalcCostUnits(normalInput, inputPrice) cost quota.CalcCostUnits(cacheReadTokens, cacheReadPrice) cost quota.CalcCostUnits(cacheWriteTokens, cacheWritePrice) cost quota.CalcCostUnits(cacheWriteTokens1h, cacheWritePrice1h) cost quota.CalcCostUnits(audioInputTokens, audioInputPrice) cost quota.CalcCostUnits(imageInputTokens, imageInputPrice) cost quota.CalcCostUnits(normalOutput, outputPrice) cost quota.CalcCostUnits(audioOutputTokens, audioOutputPrice)7.4 请求结束时的异步原子扣减tokenRequestFinishHandler 在请求结束回调中仅对StatusCode 200的请求计费且通过ctx.deducted防止重复扣减tokenUsage.UsedCost 0 hasRMBPlan(...)时调用calcCostUnits计算 RMB 成本mod_ai_token_auth.go对Unit RMB的配额计划调用plan.Deduct(m.redisClient, costUnits)执行扣减。RMB 定点数与扣减语义1 单位 1e-8 元由共享库go-lib/quota统一约定RmbToFixedPoint四舍五入换算、CalcCostUnits按用量 × 单价逐项定点化后求和并通过 Lua 脚本从 Redis 原子扣减避免数据面与管理面解释不一致见 rmb_quota.md 第 5 节。异步性注意Redis 扣减在响应发送之后异步执行因此测试在请求完成后需要等待集成实现中 sleep 500ms再轮询 Redis 余额断言见 场景说明 第 8 节风险表。八、边界保护与向后兼容音频计费需要处理以下边界依据 design-changes.md 第 8 节场景处理策略后端未返回音频字段字段值为 0按不含音频计费audio_input_tokens prompt_tokens截断为prompt_tokens - cache_read_tokens避免普通 input 为负audio_output_tokens completion_tokens截断为completion_tokens音频字段为负按 0 处理价格表只配置了部分音频单价仅当对应方向音频单价 0 时才剥离单独计价否则该方向音频 token 保留在普通 input/output 中按文本价格计费流式响应中音频 usage 出现在中间事件非 guess 事件覆盖最终事件为准UsedQuotatotal_token 维度继续为prompt_tokens completion_tokens音频 token 不累加与 cache 同时存在按prompt - cache_read - audio_input顺序剥离兼容性保障未配置音频单价的模型行为完全不变Token 配额、Cache 计费、Redis key 结构均不改变design-changes.md 第 12 节。九、集成测试实现对照sc03_rmb_quota_test.go 中实现了音频计费的端到端集成测试TestTC10_RMBQuotaDeduction_Audio_NonStreaming后端返回含音频 usage 的完整 JSON bodyaudioUsageResponse断言want 10000000000 - 3951700TestTC11_RMBQuotaDeduction_Audio_Streaming后端以text/event-stream返回 SSE 流audioStreamUsageResponse最终 chunk 携带音频 usage断言同样的扣减结果。编号说明测试设计文档将音频非流式编号为 TC-09、音频流式编号为 TC-10集成测试实现文件中的函数名存在一位偏移TestTC10 对应非流式、TestTC11 对应流式验证内容与本文所述设计文档 TC-10 完全一致。测试基础设施包括common/bfe_config_builder.go动态写入 Redis 地址与生成token_rule.data、common/redis_server.go提供SetQuota/GetQuota辅助方法miniredis 实现、common/mock_backend.go支持返回带 usage 的响应体见 场景说明 第 7 节。十、清理步骤测试结束后按文档执行清理停止bfe进程停止 mock 后端cluster_rmb与嵌入式 Redis删除临时 BFE 配置目录。延伸阅读SC03 场景说明RMB 配额扣减全景、AIConf 完整示例、Token/QuotaPlan 设计TC-09 非流式对照用例同一公式在非流式响应下的验证音频 Token 计费设计变更音频计费端到端改造的完整设计数据结构、价格配置、解析、计费、日志、测试计划RMB 配额系统设计定点数语义RmbPrecision 1e8、QuotaPlan与扣减流程源码usage_parse.go、llm_util.go、content_quota_usage.go、mod_ai_token_auth.go、cluster_conf_load.go赞分享后端网络/通信云原生【免费下载链接】bfeA modern layer 7 load balancer from baidu项目地址https://gitcode.com/gh_mirrors/bf/bfe点击查看免费下载相关推荐BFE 分时段计费Tiered Pricing支持设计解析从 ModelTable 时段定义到 RMB 配额扣减BFE 分时段计费Tiered Pricing支持设计解析从 ModelTable 时段定义到 RMB 配额扣减 本篇技术指南围绕 BFEBaidu F后端网络/通信云原生BFE AI 网关修复实践SSE 流式响应下 RMB 配额不扣费问题的根因分析与变更方案BFE AI 网关修复实践SSE 流式响应下 RMB 配额不扣费问题的根因分析与变更方案 BFE 在 AI 网关场景中提供 Token 配额与 RMB 配额两后端网络/通信云原生BFE mod_ai_token_auth 模块基础配置详解API Key 鉴权与配额扣减的 Redis 联动BFE mod_ai_token_auth 模块基础配置详解API Key 鉴权与配额扣减的 Redis 联动 导读 mod_ai_token_auth 是后端网络/通信云原生创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/12 9:35:36

REA企业本体模型:用资源、事件、主体重构业务数据架构

这个标题只有三个字母,没有正文、没有关键词、没有任何背景交代。乍一看像随手敲出来的占位符,但既然丢到我面前,我就按一个最能产出的方向来啃:把“rea”理解成被很多开发者念叨了很多年、却少有人真正讲透的东西——REA&#xf…

2026/10/12 9:30:35

低空经济智能制造基地建设方案:产线规划与落地避坑指南

低空经济这四个字,最近不管是同行群里还是行业会议里,出现的频率都高得吓人。但聊得越热,越容易把概念炒空。真正落地的抓手在哪?我的看法是:低空经济的核心承载,一定是“造得出来、飞得起来、用得出去”&a…

2026/10/12 10:56:23

智能体记忆系统设计:分层存储、混合检索与遗忘机制实战

1. 记忆系统到底在解决什么问题智能体做任务的时候,最让人头疼的一件事就是“聊完就忘”。你上一轮告诉它用户偏好、任务背景、已经排除的方案,下一轮它就像第一次见面一样,重新问一遍。这不是模型不够聪明,而是它压根没有一套像样…

2026/10/12 10:56:23

AI日报的诞生逻辑:从信息筛选到决策参考的完整实操

1. 一份AI日报的诞生逻辑:为什么信息筛选比信息获取更难 每天早上七点,我的信息采集脚本准时跑完最后一轮抓取。屏幕上滚过几百条更新:某个开源社区凌晨合并了一个新分支,某篇预印本论文在六小时内被引用了四十次,某个…

2026/10/12 10:56:23

JavaWeb运动与健康管理系统:从环境搭建到数据库设计全解析

简介:面向JavaWeb学习者的运动与健康管理系统完整项目,包含源代码、数据库脚本及配套资源。系统覆盖用户注册登录、运动数据录入、健康指标跟踪、趋势分析及提醒建议等核心功能,数据库设计包含用户表、运动记录表、健康指标表,配套…

2026/10/12 10:56:23

Flink运行时状态机解析:从JobGraph到Checkpoint底层机制

简介:这是一份专为大数据开发与算法工程师面试打造的Flink流处理核心知识精要,覆盖从基础概念到源码级原理的110个高频考点,解决求职者在流批一体、实时计算、状态管理等方向的知识盲区与应答短板。资源为单文件PDF,共7.19MB&…

2026/10/12 10:56:23

Python测试实战:pytest自动化与接口回归测试指南

做技术这些年,最让我头疼的不是代码写不出来,而是代码改完不知道会不会把老功能弄坏。尤其是刚接触Python那会儿,写脚本全凭感觉,今天改一个函数,明天可能就把另一个模块带崩了。后来我养成了一个习惯:任何…

2026/10/12 10:51:22

九月开源项目盘点:20个值得细说的新项目与实操踩坑经验

1. 九月开源项目盘点的整体筛选逻辑九月份是开源社区一年中比较特殊的时间节点。北半球的开发者刚从暑期节奏中回归,各大基金会和社区开始为年底的版本发布做冲刺,很多团队会选择在这个窗口期把积攒了大半年的重构成果正式开源。我每年九月都会花几个晚上…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/12 0:04:22

绝缘子缺陷检测数据集清洗与工业级训练实战指南

简介:本资源是面向电力AI研发人员、工业视觉工程师及智能巡检系统开发者的绝缘子缺陷检测专用YOLO格式数据集,解决无人机航拍场景下绝缘子破损、污闪、积雪等9类典型缺陷的精准识别与定位难题。数据集共2139张真实巡检图像(含训练/验证/测试集…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑