跳到正文
持续迭代主线 · 工程研二下:研究与工程并行

BigBigAPI

把模型接入、客户端配置与日常实验连起来的 API 服务。

阅读提纲 6 个章节

接上模型只是开始。更难的是请求中途出了问题,系统仍知道该不该重试、怎样结束、如何记账。

BigBigAPI 从自己的模型实验需求出发,后来用于商用。与只展示 API 地址相比,这份案例更关心网关背后的工作:让不同客户端接入,处理长时间生成,以及在断流、失败和异步结算之间保留清晰的边界。

本文依据 2026-09-15 源机 agent 的源码复审摘要整理,展示设计与实现线索,不是本会话的独立代码审计或线上性能评测。旧截图在文末另作存档。

AnthropicOpenAIGemini
  1. 接住请求协议入口
    模型与兼容接口
  2. 选择通路主池与备用
    错误分类与状态
  3. 处理长流响应头边界
    空闲探测与收尾
  4. 结算与恢复用量记录
    对账与补偿任务
按复审材料整理的职责概览,不是一次请求的实测轨迹;不同协议和错误分支有各自路径。

把兼容做到错误提示里

复审材料描述了 Anthropic、OpenAI 与 Gemini 格式的入口,以及模型列表、用量和客户端兼容端点。工程范围也从早期静态官网延伸到 Vue 3 / TypeScript 客户台,包含密钥管理、用量、订单与工单等入口。

兼容不只看正常请求。材料记录了一个容易忽略的入口问题:客户端已自动补上 /v1,用户配置又带 /v1,最终请求落到 /v1/v1/*。项目识别重复前缀并返回结构化的修正提示,而不是只给一个难以排查的 404。

复审定位:server.go 路由表与 NoRoute;compat_endpoints.gofront-end/spa/。客户端实际兼容范围仍需逐项运行验证。

重试,要先划清提交边界

网络失败不总能说明上游有没有开始处理。网关如果为了“再试一次”重复发送生成请求,就可能同时增加成本和重复内容。这里的选择不是无限重试,而是限制可重试的位置。

分界点:收到上游响应头

响应头之前

符合条件的连接级失败有限重试。材料记录最多两次尝试,包含第一次请求。

响应头之后

视为已提交,不再重发生成请求。断流转入终止、用量记录与错误收尾。

展示复审摘要中的重试策略,不表示已验证所有协议、备用通路与异常分支。

这是一项有代价的选择:已提交后宁可明确结束一次失败,也不为了挽回成功率再启动生成。它降低了重发风险,但不能单独证明端到端只处理、只扣费一次。

响应头前的传输失败仍可能发生在上游已接收请求之后。因此,“最多重试一次”不等于“上游未计费”,也不是零重复扣费保证。

复审定位:proxy_handlers.go:1548–1552maxUpstreamAttempts。当前未进行故障注入或上游计费核对。

长流不设总时长墙,但要能收尾

生成尚未结束时,客户端可能关掉页面,上游也可能暂时没有输出。把这些情况一律当作“请求超时”,容易把仍在工作的流提前切断;完全不设边界,又会留下悬挂任务。

总时长与空闲分开
上游读取不使用覆盖整个响应体的总超时。拨号、握手、等待响应头分别设限;首字节等待与后续字节空闲使用不同判定。
断开后继续收尾
使用 context.WithoutCancel 将上游读取与客户端取消分离,配合空闲看门狗继续获取用量和结束信息。代价是客户端离开后仍可能占用连接与产生上游成本。
连接健康单独判断
TCP 探活和流式写的滚动截止处理不同层的问题。代码注释还记录了关闭出站 HTTP/2 的故障背景与重新启用条件。

这里值得留下的不是某个超时数字,而是把“用户取消”“上游还在生成”“连接异常”和“下游写不动”分开处理。HTTP/2 的取舍来自材料转述的历史注释,不代表 HTTP/1.1 在所有业务里更好。

空闲看门狗不是总时长上限,持续有字节的请求仍可能长时间运行。当前材料不足以证明所有读取都会及时退出,也未提供连接资源消耗实测。

复审定位:proxy_handlers.go:57–100,1556–1597,2521–2530backup_route.go 的上下文说明。

失败之后,系统还有哪些工作

请求返回只是前台结束。后台还要判断渠道是否持续劣化、处理未终结的预扣、确认支付状态,以及为失败记录进入补偿流程创造条件。

别让一次成功抹掉劣化
主池与两级备用配合加权计数,材料中的基础规则是失败 +2、成功 −1,而非成功就清零。交替成功和失败仍能留下压力信号。
给异步工作补一道兜底
预扣对账、订单主动查单、退款清扫分别处理不同遗留状态;后台任务配置 panic 隔离与重新启动,避免只依赖正常请求收尾。
让故障可以串起来看
trace_id 连接用量与错误记录;错误分类区分换上游可能有用和换上游仍会失败的情况。已有相关回归测试文件,但本次未执行。

补偿任务的存在不等于每笔资金都能自动正确结算;退款入队的唯一约束,也只支持“不重复入队”这一局部性质,不是全链路的一次性结算证明。

复审定位:backup_route.gobalance_hold.gogoguard.goepay_query.goauto_refund.goprovider_invariant_400_test.go

做运营,先把数字的含义写清楚

工程不止发生在代理请求里。复审摘要还提到一次统计口径修正:原始消费字段已经包含卡消耗,再把卡消耗加一次,会重复计算。项目把口径和修正缘由留在代码说明里,而不是只改最后显示的数字。

现金口径 = 用户消费 − 卡消耗 + 卡对应现金对应摘要中的 cost_user − cost_card + cost_card_cash;用于说明字段关系,不是本站测得的收入或利润。

除此之外,材料记录了内部自测账号与客户统计的区分、日汇总与近期明细的分段读取,以及允许负毛利如实呈现。这些工作强调的是:报表不仅要有数,还要知道数从哪里来、不能怎样相加。

复审定位:admin_user_analytics.go:12–34usage_retention.go。本文不披露实际经营数字,也未复核线上账目。

这份工作体现在哪里

作者此前明确选择自建 Go 后端,而不是直接使用现成面板。新材料补充了更具体的工程面:兼容错误如何被解释、重试在哪里停止、流与连接怎样分层处理、异步任务如何补偿、账目口径怎样留痕。

源机复审还找到标注用户决策的代码注释,以及备份、迁移和改后回读的工作记录。这些是人与 AI 协作的线索,不足以据此认定所有实现由谁独立完成,或给出贡献百分比。

这篇案例想留下的,是这些能被讨论和追问的工程判断,而不是一张技术栈清单。

材料范围:2026-09-15 获准交接的工程优势稿;源码位置由源机复审提供,本站尚未读取对应原文件。暂无独立运行数据、可用性或吞吐量评测,也不据此作安全保证或同行优劣比较。下方截图来自更早的官网与教程,不是本次复审描述的客户台。

这一节还没有经过站主过目。

约 6,255 行代码;128 个文件;主要是 html、go、js;来源:本地目录 bigbigapi,在线 https://bigbigapi.com/