边缘函数

使用 Amazon Bedrock 生成图像


Amazon Bedrock 是一项全托管服务,提供来自领先AI公司(如AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI和亚马逊)的高性能基础模型(FMs)。每个模型都通过通用API访问,该API实现了广泛的功能集,旨在帮助构建具有安全性、隐私性和负责任AI考量的生成式AI应用。

本指南将带您通过一个示例,在Supabase边缘函数中使用Amazon Bedrock JavaScript SDK,利用Amazon Titan Image Generator G1模型生成图像。

设置

  • 在AWS控制台中,导航至Amazon Bedrock,在"请求模型访问"下选择Amazon Titan Image Generator G1模型
  • 在您的Supabase项目中,于supabase目录下创建.env文件,内容如下:
1
2
3
4
5
6
7
8
9
AWS_DEFAULT_REGION="<您的区域>"AWS_ACCESS_KEY_ID="<替换为您的凭证>"AWS_SECRET_ACCESS_KEY="<替换为您的凭证>"AWS_SESSION_TOKEN="<替换为您的凭证>"# 模拟配置文件AWS_SHARED_CREDENTIALS_FILE="./aws/credentials"AWS_CONFIG_FILE="./aws/config"

配置存储

  • [本地] 运行 supabase start
  • 打开Studio URL: 本地 | 托管
  • 导航至存储
  • 点击"新建存储桶"
  • 创建一个名为"images"的公开存储桶

代码实现

在您的项目中创建一个新函数:

1
supabase functions new amazon-bedrock

并将以下代码添加到 index.ts 文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// 需要模拟文件系统以使 AWS SDK 正常工作import { prepareVirtualFile } from 'https://deno.land/x/mock_file@v1.1.2/mod.ts'import { BedrockRuntimeClient, InvokeModelCommand } from 'npm:@aws-sdk/client-bedrock-runtime'import { createClient } from 'npm:@supabase/supabase-js'import { decode } from 'npm:base64-arraybuffer'console.log('来自 Amazon Bedrock 的问候!')Deno.serve(async (req) => { prepareVirtualFile('./aws/config') prepareVirtualFile('./aws/credentials') const client = new BedrockRuntimeClient({ region: Deno.env.get('AWS_DEFAULT_REGION') ?? 'us-west-2', credentials: { accessKeyId: Deno.env.get('AWS_ACCESS_KEY_ID') ?? '', secretAccessKey: Deno.env.get('AWS_SECRET_ACCESS_KEY') ?? '', sessionToken: Deno.env.get('AWS_SESSION_TOKEN') ?? '', }, }) const { prompt, seed } = await req.json() console.log(prompt) const input = { contentType: 'application/json', accept: '*/*', modelId: 'amazon.titan-image-generator-v1', body: JSON.stringify({ taskType: 'TEXT_IMAGE', textToImageParams: { text: prompt }, imageGenerationConfig: { numberOfImages: 1, quality: 'standard', cfgScale: 8.0, height: 512, width: 512, seed: seed ?? 0, }, }), } const command = new InvokeModelCommand(input) const response = await client.send(command) console.log(response) if (response.$metadata.httpStatusCode === 200) { const { body, $metadata } = response const textDecoder = new TextDecoder('utf-8') const jsonString = textDecoder.decode(body.buffer) const parsedData = JSON.parse(jsonString) console.log(parsedData) const image = parsedData.images[0] const supabaseClient = createClient( // Supabase API URL - 默认导出的环境变量 Deno.env.get('SUPABASE_URL')!, // Supabase API 匿名密钥 - 默认导出的环境变量 Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')! ) const { data: upload, error: uploadError } = await supabaseClient.storage .from('images') .upload(`${$metadata.requestId ?? ''}.png`, decode(image), { contentType: 'image/png', cacheControl: '3600', upsert: false, }) if (!upload) { return Response.json(uploadError) } const { data } = supabaseClient.storage.from('images').getPublicUrl(upload.path!) return Response.json(data) } return Response.json(response)})

本地运行函数

  1. 运行 supabase start (参见: https://supabase.com/docs/reference/cli/supabase-start)
  2. 带环境变量启动: supabase functions serve --env-file supabase/.env
  3. 发起HTTP请求:
1
2
3
4
curl -i --location --request POST 'http://127.0.0.1:54321/functions/v1/amazon-bedrock' \ --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0' \ --header 'Content-Type: application/json' \ --data '{"prompt":"A beautiful picture of a bird"}'
  1. 返回查看存储桶。可能需要点击刷新按钮才能看到上传的图片。

部署到托管项目

1
2
3
supabase linksupabase functions deploy amazon-bedrocksupabase secrets set --env-file supabase/.env

现在您已经部署了一个无服务器函数,该函数使用AI生成图片并上传到Supabase存储桶。