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),仅供参考

相关新闻

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

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

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

2026/10/12 9:36:14 阅读更多 →
Spring Cloud Gateway Hoxton版升级避坑指南:响应式重构与动态路由实战

Spring Cloud Gateway Hoxton版升级避坑指南:响应式重构与动态路由实战

1. 为什么Hoxton版Gateway不是“升级”而是“重构级演进”Spring Cloud Gateway在Hoxton版本(2019年10月发布,对应Spring Boot 2.2.x)的定位,常被误读为一次常规功能迭代。我参与过三个基于Greenwich.SRx的老项目迁移,…

2026/10/12 9:36:14 阅读更多 →
PS5全场景使用指南:从选型、初始化到故障排查的实战经验

PS5全场景使用指南:从选型、初始化到故障排查的实战经验

那台机器在我家电视柜上待了快两年,从第一天开箱到后来给朋友讲解设置,几乎每个环节都被人问过一遍。这次干脆把关于 PS5 的完整使用经验整理出来,项目名就叫“AnyPS5”——意思是无论你是第一次摸主机的新手,还是从旧平台迁过来的…

2026/10/12 9:36:14 阅读更多 →

最新新闻

Git+Repo+Gerrit代码评审服务器搭建实战:多仓库协作与权限管理

Git+Repo+Gerrit代码评审服务器搭建实战:多仓库协作与权限管理

简介:本资源是一份面向运维工程师、后端开发及代码管理初学者的代码评审服务器搭建文档,围绕 Git、Repo 与 Gerrit 三大工具,讲解如何从零构建一套功能完整的代码服务器,解决团队代码托管、多仓库统一管理与代码评审流程落地的问题…

2026/10/12 10:21:08 阅读更多 →
零侵入监控:node_exporter、mtail 与 Prometheus、Grafana 组合实战

零侵入监控:node_exporter、mtail 与 Prometheus、Grafana 组合实战

1. 先统一认知:node_exporter、mtail、Prometheus、Grafana 各管哪一段我见过很多团队做监控,第一反应是“先装一套 Prometheus Grafana”,装上之后发现只有 CPU、内存、磁盘这些机器指标,业务到底跑得好不好完全看不见。后来有人…

2026/10/12 10:21:08 阅读更多 →
Wi-FiTestSuite Control API v10.12.0规范解析:面向Wi-Fi 6E自动化测试的会话化控制

Wi-FiTestSuite Control API v10.12.0规范解析:面向Wi-Fi 6E自动化测试的会话化控制

简介:本资源是Wi-Fi联盟官方发布的《Wi-Fi Test Suite Control API Specification Version 10.12.0》PDF规范文档,面向Wi-Fi设备认证工程师、无线协议开发者及测试工具集成人员,用于指导Wi-Fi认证测试套件的开发、调试与合规性验证。文档系统…

2026/10/12 10:21:08 阅读更多 →
安卓17 Beta版修复待机耗电:原理、实测与开发者适配指南

安卓17 Beta版修复待机耗电:原理、实测与开发者适配指南

安卓17最新Beta版的推送消息出来后,论坛上不少刷过测试版的人开始讨论同一个话题:这次官方终于对“待机耗电”动手了。说实话,“Beta版更新修复耗电”并不是新闻,每代大版本更新都会经历类似的阶段,但这次修复的幅度和…

2026/10/12 10:21:08 阅读更多 →
Spring事务失效陷阱:Closing non transactional SqlSession排查与修复

Spring事务失效陷阱:Closing non transactional SqlSession排查与修复

1. 从一个诡异的线上故障说起"Closing non transactional SqlSession"——这行日志第一次出现在我视野里的时候,是一个再普通不过的周三下午。某个业务系统在批量处理数据时,偶发地出现部分数据写入成功、部分数据回滚的诡异现象。日志里没有明…

2026/10/12 10:21:08 阅读更多 →
Nginx基于IP的虚拟主机配置:多IP绑定、listen指令与踩坑实战

Nginx基于IP的虚拟主机配置:多IP绑定、listen指令与踩坑实战

做运维这些年,配置虚拟主机绝大多数时候都在跟域名打交道,但有一类需求绕不开基于IP的场景:客户拿着独立IP的SSL证书要求绑定;内网有多套环境要用不同IP做物理隔离;服务器上买了多个公网IP想分别承载不同业务。今天把基…

2026/10/12 10:20:06 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →