Engineering Notes

孟斌的小站

技术博客与学习记录

共 663 篇文章 标签与分类索引已启用

浏览器里直接调模型:怎么让 API Key 不落到任何地方

摘要

做一个在浏览器里调模型的 Playground,聊天界面本身没什么难的。真正花时间的是一个安全问题:用户要粘贴 API Key 进来,我怎么保证它不落到任何地方——不进 URL、不进浏览器历史、不进 localStorage、不进 Query cache、不进日志。这篇讲这个设计,以及做的时候踩到的两个 SSE 解析的坑。

继续阅读

先量再改:一次有审计底稿的 UI 重设计

摘要

这次重设计的起点不是"界面不好看",而是一件更实际的事:前端用的 Geist 字体不完整覆盖简体中文,而 logo 的 SVG 里声明了根本没打包的 Inter。字体是可分发资产,牵涉许可证的随附义务,所以我把它当成第一优先级。这篇讲动手前的那份量化基线,以及过程中哪些东西我说服自己放弃了。

继续阅读

订阅额度:为什么我要同时维护两套完全不同的账

摘要

我最初以为"额度"只有一个概念:用户买了套餐,每月能用多少,超了就停。写下去才发现上游也在算额度,而且它算的跟我不一样——它报百分比,我记美元;它按自己的 5h/7d 窗口,我按用户的日/周/月。这篇讲我最后怎么同时维护这两套账,以及它们各自最容易出错的地方。

继续阅读

一个适配器怎么覆盖二十家 provider:上游接入的三种形态和两条边界

摘要

接上游 provider 这件事,我一开始以为是"一家一个适配器"。写到第十家才发现,真正需要单独写协议转换逻辑的只有四家,其余二十多家全是同一个适配器的不同配置。这篇讲这个拆分怎么形成的,以及我在接外部地址时踩到的两条边界——SSRF 防护和流式超时,两条我都做错过。

继续阅读

熔断、超时和降级:跨服务调用的那些保护,以及我接错了的地方

摘要

有一批请求要的模型在所有渠道上都没配置,channel-service 全部返回"没有可用渠道"。这个错误跨 gRPC 回来是 codes.Unknown,而我的熔断器把它算作失败——于是用户传错一个模型名,整个网关的流量都被熔断器拒了。这篇讲这次之后我怎么重排错误分类,以及跨服务降级的其他几处取舍。

继续阅读