后端网络/通信云原生【免费下载链接】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),仅供参考