服务器端集成 integration

尽管端点设计为直接从客户端调用,但将 API 密钥保存在客户端代码中并不安全。大多数情况下,开发人员需要创建自己的服务器端 API,调用第三方服务 fal,然后将结果返回给客户端。这是一个简单的过程,但总是会妨碍开发人员和团队专注于自己的业务和自己的想法。

因此,我们实现了客户端库以支持代理模式,这允许您在客户端中使用客户端库,同时将 API 密钥保存在您自己的服务器端代码中。

即用型代理实现

我们为以下语言/框架提供即用型代理实现:

  • Node.js 和 Next.js:一个 Next.js API 路由处理程序,可用于任何 Next.js 应用。它支持页面和应用路由器。我们在生产中的所有应用中都使用它。
  • Node.js 和 Express:一个 Express 路由处理程序,可用于任何 Express 应用。您还可以实现自定义逻辑并与您自己的处理程序组合在一起。

目前就是这样,但我们正在关注社区的需求,并将在未来添加更多实现。如果您有任何请求,请加入我们的 Discord 服务器 社区。

代理公式

如果 fal 没有为您的语言/框架提供即插即用的代理实现,您可以使用以下公式来实现自己的代理:

  1. 提供一个将从客户端接收所有请求的单一端点(例如,/api/fal/proxy 通常用作默认路由路径)。
  2. 端点必须同时支持 GETPOST 请求。当使用不受支持的 HTTP 方法时,代理必须返回状态代码 405,即方法不允许。
  3. 代理需要调用的 URL 由 x-fal-target-url 标头提供。如果缺少标头,代理必须返回状态代码 400,即错误请求。如果它未指向有效的 URL,或者 URL 的域不是 *.fal.ai*.fal.run,代理必须返回状态代码 412,即前提条件失败。
  4. 请求主体(如果存在)始终采用 JSON 格式 - 即 content-type 标头为 application/json。任何其他类型的内容都必须以状态代码 415(不支持的媒体类型)拒绝。
  5. 代理必须将 authorization 标头(格式为 Key <your-api-key>)添加到它发送到目标 URL 的请求中。您的 API 密钥应从环境变量 FAL_KEY 中解析。
  6. 来自目标 URL 的响应将始终采用 JSON 格式,代理必须向客户端返回相同的响应。
  7. 代理必须返回与目标 URL 相同的 HTTP 状态代码。
  8. 代理必须返回与目标 URL 相同的标头,但“content-length”和“content-encoding”标头除外,这两个标头应由您自己的服务器/框架自动设置。
利用LLMs的能力

上面的公式写得应该很容易理解,包括LLMs。尝试将 ChatGPT 或 Co-pilot 与上面的公式结合使用,您应该会为自己实现一个良好的起点。如果您尝试过,请告诉我们!

配置客户端

要使用代理,您需要配置客户端以使用代理端点。您可以通过在客户端配置中设置 proxyUrl 选项来实现此目的:

js
import * as fal from '@fal-ai/serverless-client'

fal.config({
  proxyUrl: '/api/fal/proxy',
})

示例实现

您可以在 serverless-js/libs/proxy/src/index.ts 中找到使用 TypeScript 的代理公式的参考实现,它支持 Express 和 Next.js。

最后更新于 2024 年 6 月 21 日