使用 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
文件,内容如下:
123456789AWS_DEFAULT_REGION="<您的区域>"AWS_ACCESS_KEY_ID="<替换为您的凭证>"AWS_SECRET_ACCESS_KEY="<替换为您的凭证>"AWS_SESSION_TOKEN="<替换为您的凭证>"# 模拟配置文件AWS_SHARED_CREDENTIALS_FILE="./aws/credentials"AWS_CONFIG_FILE="./aws/config"
配置存储
代码实现
在您的项目中创建一个新函数:
1supabase functions new amazon-bedrock
并将以下代码添加到 index.ts
文件中:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778// 需要模拟文件系统以使 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)})
本地运行函数
- 运行
supabase start
(参见: https://supabase.com/docs/reference/cli/supabase-start) - 带环境变量启动:
supabase functions serve --env-file supabase/.env
- 发起HTTP请求:
1234curl -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"}'
- 返回查看存储桶。可能需要点击刷新按钮才能看到上传的图片。
部署到托管项目
123supabase linksupabase functions deploy amazon-bedrocksupabase secrets set --env-file supabase/.env
现在您已经部署了一个无服务器函数,该函数使用AI生成图片并上传到Supabase存储桶。