将 Genkit 与 Cloud Run 搭配使用

您可以使用 Cloud Run 将 Genkit flow 部署为 Web 服务。作为示例,本页面将引导您完成部署默认示例 flow 的过程。

  1. 安装 Google Cloud CLI(如果尚未安装)。

  2. 使用 Cloud 控制台创建新的 Google Cloud 项目,或选择现有 Google Cloud 项目。项目必须与结算账号相关联。

    创建或选择项目后,请将 Google Cloud CLI 配置为使用该项目:

    gcloud auth login
    gcloud init
  3. 为 Genkit 示例项目创建一个目录:

    mkdir -p ~/tmp/genkit-cloud-project
    cd ~/tmp/genkit-cloud-project

    如果您要使用 IDE,请用其打开此目录。

  4. 在项目目录中初始化 Go 模块:

    go mod init example/cloudrun
    go mod get github.com/firebase/genkit/go
  5. 使用 Genkit 创建示例应用:

    package main
    
    import (
        "context"
        "fmt"
        "log"
        "net/http"
        "os"
    
        "github.com/firebase/genkit/go/ai"
        "github.com/firebase/genkit/go/genkit"
        "github.com/firebase/genkit/go/plugins/googlegenai"
        "github.com/firebase/genkit/go/plugins/server"
    )
    
    func main() {
        ctx := context.Background()
    
        // Initialize Genkit with the Google AI plugin and Gemini 2.0 Flash.
        // Alternatively, use &googlegenai.VertexAI{} and "vertexai/gemini-2.0-flash"
        // to use Vertex AI as the provider instead.
        g, err := genkit.Init(ctx,
            genkit.WithPlugins(&googlegenai.GoogleAI{}),
            genkit.WithDefaultModel("googleai/gemini-2.0-flash"),
        )
        if err != nil {
            log.Fatalf("failed to initialize Genkit: %w", err)
        }
    
        flow := genkit.DefineFlow(g, "jokesFlow", func(ctx context.Context, topic string) (string, error) {
            resp, err := genkit.Generate(ctx, g,
                ai.WithPrompt(`Tell a short joke about %s. Be creative!`, topic),
            )
            if err != nil {
                return "", fmt.Errorf("failed to generate joke: %w", err)
            }
    
            return resp.Text(), nil
        })
    
        mux := http.NewServeMux()
        mux.HandleFunc("POST /jokesFlow", genkit.Handler(flow))
        log.Fatal(server.Start(ctx, "127.0.0.1:"+os.Getenv("PORT"), mux))
    }
    
  6. 向已部署的函数提供 API 凭据。根据您在上面的示例中所做的选择,选择您需要的凭据:

    Gemini (Google AI)

    1. 确保您所在的区域提供 Google AI

    2. 使用 Google AI Studio 为 Gemini API 生成 API 密钥

    3. 在 Cloud Run 环境中提供 API 密钥:

      1. 在 Cloud 控制台中,启用 Secret Manager API
      2. Secret Manager 页面上,创建一个包含 API 密钥的新 Secret。
      3. 创建 Secret 后,在同一页面上,通过 Secret Manager Secret Accessor 角色为默认计算服务账号授予对 Secret 的访问权限。(您可以在 IAM 页面上查找默认计算服务账号的名称。)

      在后面的步骤中,当您部署服务时,需要引用此 Secret 的名称。

    Gemini (Vertex AI)

    1. 在 Cloud 控制台中,为您的项目启用 Vertex AI API

    2. IAM 页面上,确保为默认计算服务账号授予 Vertex AI User 角色。

    在本教程中,您只需要为模型提供方设置 Secret,但通常,您还需要对 flow 所使用的每项服务执行类似的配置操作。

  7. 可选:在开发者界面中试用 flow:

    1. 为您选择的模型提供方设置本地环境:

      Gemini (Google AI)

      export GEMINI_API_KEY=<your API key>

      Gemini (Vertex AI)

      export GOOGLE_CLOUD_PROJECT=<your project ID>
      export GOOGLE_CLOUD_LOCATION=us-central1
      gcloud auth application-default login
    2. 启动界面:

      genkit start -- go run .
    3. 在开发者界面 (http://localhost:4000/) 中,运行 flow:

      1. 点击 jokesFlow

      2. 输入 JSON 标签页上,为模型提供一个主题:

        "bananas"
        
      3. 点击运行

  8. 如果到目前为止一切正常,您便可以构建和部署 flow:

    Gemini (Google AI)

    gcloud run deploy --port 3400 \
      --update-secrets=GEMINI_API_KEY=<your-secret-name>:latest

    Gemini (Vertex AI)

    gcloud run deploy --port 3400 \
      --set-env-vars GOOGLE_CLOUD_PROJECT=<your-gcloud-project> \
      --set-env-vars GOOGLE_CLOUD_LOCATION=us-central1

    GOOGLE_CLOUD_LOCATION 可配置您要使用的 Vertex API 区域。)

    当系统询问您是否要允许进行未经身份验证的调用时,请选择 N。回答 N 会将您的服务配置为需要 IAM 凭据。如需了解如何提供这些凭据,请参阅 Cloud Run 文档中的身份验证部分。

部署完成后,该工具会输出服务网址。您可以使用 curl 进行测试:

curl -X POST https://<service-url>/menuSuggestionFlow \
  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json" -d '"bananas"'