2024 年 10 月,我们讨论了使用 AI Gateway 存储来自 AI 应用程序的数十亿条日志,以及我们如何使用 Cloudflare 的开发者平台来实现此目的。
2024 年 10 月,我们介绍了如何使用 AI Gateway 存储来自 AI 应用程序的数十亿条日志,以及如何使用 Cloudflare 的开发者平台来执行此操作。
AI Gateway 已处理超过 30 亿条日志,且增长迅速,平台连接数持续稳定增长。为了帮助开发人员更有效地管理这种规模,我们希望提供一种替代方案来实现 HTTP/2 keep-alive 来维持持久的 HTTP(S) 连接,从而避免与 AI Gateway 的每个新 HTTP 连接重复握手和 TLS 协商的开销。我们知道实现 HTTP/2 可能会带来挑战,特别是当许多库和工具默认情况下可能不支持它并且大多数现代编程语言都有完善的 WebSocket 库可用时。
考虑到这一点,我们使用 Cloudflare 的开发者平台和 Durable Objects(是的,再次!)来构建 WebSockets API,该 API 建立单个持久连接,从而实现持续通信。
通过此 API,AI 网关支持的所有 AI 提供程序都可以通过 WebSocket 进行访问,从而允许您在客户端或服务器应用程序与 AI 网关之间维护单个 TCP 连接。最好的部分?即使您选择的提供商不支持 WebSockets,我们也会为您处理,管理对您首选 AI 提供商的请求。
通过 WebSocket 连接到 AI Gateway,我们使用提供商支持的协议(HTTPS、WebSocket 等)为您向推理服务发出请求,您可以保持连接打开以执行尽可能多的推理请求想要。
为了让您与AI网关的连接更加安全,我们还引入了AI网关的身份验证。新的 WebSockets API 将需要身份验证。您所需要做的就是创建一个具有“AI Gateway: Run”权限的 Cloudflare API 令牌,并将其发送到 cf-aig-authorization 标头中。
在上面的流程图中:
1.当启用身份验证网关并包含有效令牌时,请求将成功通过。
2.如果启用了身份验证网关,但请求不包含具有有效令牌的所需 cf-aig-authorization 标头,则请求将失败。这确保只有经过验证的请求才能通过网关。
3.禁用经过身份验证的网关时,将完全绕过 cf-aig-authorization 标头,并且任何令牌(无论有效还是无效)都会被忽略。
我们如何构建它
我们最近使用持久对象 (DO) 来扩展 AI 网关的日志记录解决方案,因此在同一 DO 中使用 WebSocket 是很自然的选择。
当我们的 Cloudflare Workers 收到新的 WebSocket 连接时,我们以两种方式实施身份验证,以支持 WebSocket 客户端的不同功能。主要方法涉及通过 cf-aig-authorization 标头验证 Cloudflare API 令牌,确保令牌对于连接帐户和网关有效。
但是,由于浏览器 WebSocket 实现的限制,我们还支持通过“sec-websocket-protocol”标头进行身份验证。浏览器 WebSocket 客户端不允许在其标准 API 中使用自定义标头,这使得在请求中添加身份验证令牌变得复杂。虽然我们不建议您在浏览器中存储 API 密钥,但我们决定添加此方法,以便为所有 WebSocket 客户端增加更多灵活性。
在这个初始验证步骤之后,我们将连接升级到持久对象,这意味着它现在将处理该连接的所有消息。在新连接被完全接受之前,我们会生成一个随机的 UUID,因此该连接在持久对象接收到的所有消息中都是可识别的。在开放连接期间,通过标头传递的任何 AI 网关设置(例如 cf-aig-skip-cache(设置为 true 时绕过缓存))都会被存储并应用于会话中的所有请求。但是,这些标头仍然可以根据每个请求进行覆盖,就像今天的通用端点一样。
如何运作
连接建立后,持久对象开始侦听传入消息。从现在起,用户可以通过 WebSocket 以 AI Gateway 通用格式发送消息,从而简化应用程序从现有 HTTP 设置到基于 WebSockets 通信的转换。
当新消息到达持久对象时,它会使用支持 HTTP 通用端点的相同代码进行处理,从而实现跨 Workers 和持久对象的无缝代码重用 - 这是在 Cloudflare 上构建的主要优势之一。
对于非流式请求,响应会封装在 JSON 信封中,使我们能够包含 AI 推理本身之外的其他信息,例如该请求的 AI 网关日志 ID。
以下是上述请求的响应示例:
对于流请求,AI Gateway 会发送一条带有请求元数据的初始消息,告诉开发人员流正在开始。
在此初始消息之后,所有流块在从推理提供者到达时都会实时中继到 WebSocket 连接。请注意,这些流块的元数据中仅包含 eventId 字段(有关此新字段的更多信息如下)。
这种方法有两个目的:
以上是使用 WebSocket 和耐用对象进行大规模实时 AI 推理的详细内容。更多信息请关注PHP中文网其他相关文章!