Genkit có Chức năng đám mây Firebase

Firebase Genkit bao gồm một trình bổ trợ giúp bạn triển khai các quy trình của mình đến Firebase Cloud Functions. Ví dụ: trang này hướng dẫn bạn thực hiện quy trình triển khai luồng mẫu mặc định cho Firebase.

Triển khai luồng ở dạng Hàm đám mây

  1. Cài đặt các công cụ cần thiết:

    1. Đảm bảo bạn đang sử dụng Node.js phiên bản 20 trở lên (chạy node --version để kiểm tra).

    2. Cài đặt Firebase CLI.

  2. Tạo một dự án Firebase mới bằng bảng điều khiển của Firebase hoặc chọn một dự án hiện có.

    Nâng cấp dự án lên Gói linh hoạt. Đây là gói bắt buộc để triển khai các Chức năng đám mây.

  3. Đăng nhập bằng Giao diện dòng lệnh (CLI) của Firebase:

    firebase login
    firebase login --reauth # alternative, if necessary
    firebase login --no-localhost # if running in a remote shell
    
  4. Tạo thư mục dự án mới:

    export PROJECT_ROOT=~/tmp/genkit-firebase-project1
    mkdir -p $PROJECT_ROOT
    
  5. Khởi chạy dự án Firebase bằng Genkit trong thư mục:

    cd $PROJECT_ROOT
    firebase init genkit
    
    • Chọn dự án mà bạn đã tạo trước đó.
    • Chọn nhà cung cấp mô hình bạn muốn sử dụng.

    Chấp nhận chế độ mặc định cho các câu lệnh còn lại. Công cụ genkit sẽ tạo một số tệp nguồn mẫu để giúp bạn bắt đầu phát triển các flow AI của riêng mình. Tuy nhiên, trong phần còn lại của hướng dẫn này, bạn sẽ chỉ triển khai luồng mẫu.

  6. Cung cấp thông tin đăng nhập API cho Hàm đám mây của bạn. Hãy thực hiện một trong các thao tác sau, tuỳ thuộc vào nhà cung cấp mô hình mà bạn đã chọn:

    Gemini (AI của Google)

    1. Đảm bảo AI của Google được cung cấp ở khu vực của bạn.

    2. Tạo khoá API cho Gemini API bằng Google AI Studio.

    3. Đặt biến môi trường GOOGLE_GENAI_API_KEY thành khoá của bạn:

      export GOOGLE_GENAI_API_KEY=<your API key>
      
    4. Chỉnh sửa src/index.ts và thêm nội dung sau đây sau các lệnh nhập hiện có:

    import {defineSecret} from "firebase-functions/params";
    defineSecret("GOOGLE_GENAI_API_KEY");
    

    Giờ đây, khi bạn triển khai hàm này, khoá API của bạn sẽ được lưu trữ trong Cloud Secret Manager và có sẵn trong môi trường Cloud Functions.

    Gemini (AI Vertex)

    1. Trong bảng điều khiển Cloud, hãy Bật Vertex AI API cho dự án Firebase của bạn.

    2. Trên trang IAM, hãy đảm bảo rằng Tài khoản dịch vụ điện toán mặc định được cấp vai trò Người dùng Vertex AI.

    3. Không bắt buộc: Nếu bạn muốn chạy quy trình của mình một cách cục bộ, như trong bước tiếp theo, hãy thiết lập thêm một số biến môi trường và sử dụng công cụ gcloud để thiết lập thông tin xác thực mặc định của ứng dụng:

      export GCLOUD_PROJECT=<your project ID>
      export GCLOUD_LOCATION=us-central1
      gcloud auth application-default login
      

    Bí quyết duy nhất bạn cần thiết lập cho hướng dẫn này là cho trình cung cấp mô hình, nhưng nhìn chung, bạn phải làm điều tương tự cho từng dịch vụ mà flow của bạn sử dụng.

  7. Nếu bạn truy cập vào flow của mình trên một ứng dụng web (bạn sẽ thực hiện việc này trong phần tiếp theo), thì trong tham số httpsOptions, hãy đặt một chính sách CORS:

    export const menuSuggestionFlow = onFlow(
      {
        name: "menuSuggestionFlow",
        // ...
        httpsOptions: {cors: true}, // Add this line.
      },
      async (subject) => {
        // ...
      }
    );
    

    Có thể bạn sẽ muốn có một chính sách hạn chế hơn cho các ứng dụng chính thức, nhưng đây là lựa chọn phù hợp cho hướng dẫn này.

  8. Không bắt buộc: Hãy thử quy trình của bạn trong giao diện người dùng dành cho nhà phát triển:

    1. Khởi động giao diện người dùng:

      cd $PROJECT_ROOT/functions
      genkit start
      
    2. Trong giao diện người dùng dành cho nhà phát triển (http://localhost:4000/), hãy chạy flow:

      1. Nhấp vào menusuggestedionFlow.

      2. Trên thẻ Input JSON, hãy cung cấp một chủ thể cho mô hình:

        "AI app developers"
        
      3. Trên thẻ Xác thực JSON, hãy cung cấp một đối tượng xác thực được mô phỏng:

        {
          "uid": 0,
          "email_verified": true
        }
        
      4. Nhấp vào Run (Chạy).

  9. Nếu tính đến thời điểm hiện tại mọi thứ hoạt động như mong đợi, bạn có thể triển khai luồng:

    cd $PROJECT_ROOT
    firebase deploy --only functions
    

Bạn hiện đã triển khai luồng dưới dạng một Hàm đám mây! Tuy nhiên, bạn sẽ không thể truy cập vào điểm cuối đã triển khai bằng curl hoặc các công cụ tương tự, do chính sách uỷ quyền của luồng. Tiếp tục chuyển đến phần tiếp theo để tìm hiểu cách truy cập an toàn vào flow.

Thử quy trình đã triển khai

Điều quan trọng là mỗi quy trình bạn triển khai đều phải đặt chính sách uỷ quyền. Nếu không có quy trình này, bất kỳ ai cũng có thể gọi các luồng AI tạo sinh có khả năng tốn kém của bạn.

Luồng mẫu mặc định có chính sách uỷ quyền như sau:

firebaseAuth((user) => {
  if (!user.email_verified) {
    throw new Error('Verified email required to run flow');
  }
});

Chính sách này sử dụng trình trợ giúp firebaseAuth() để chỉ cấp quyền truy cập cho những người dùng đã đăng ký ứng dụng và có địa chỉ email đã xác minh. Ở phía máy khách, bạn cần đặt tiêu đề Authorization: Bearer thành mã thông báo mã nhận dạng Firebase đáp ứng chính sách của mình. SDK ứng dụng Cloud Functions cung cấp các phương thức hàm có thể gọi nhằm tự động hoá việc này.

Để dùng thử điểm cuối luồng, bạn có thể triển khai ứng dụng web mẫu tối thiểu sau:

  1. Trong phần Project settings (Cài đặt dự án) của bảng điều khiển của Firebase, hãy thêm một ứng dụng web mới, chọn tuỳ chọn để thiết lập tính năng Lưu trữ.

  2. Trong mục Xác thực của bảng điều khiển của Firebase, hãy bật trình cung cấp Google mà bạn sẽ sử dụng trong ví dụ này.

  3. Trong thư mục dự án, hãy thiết lập tính năng Lưu trữ Firebase, nơi bạn sẽ triển khai ứng dụng mẫu:

    cd $PROJECT_ROOT
    firebase init hosting
    

    Chấp nhận các chế độ mặc định cho tất cả lời nhắc.

  4. Thay thế public/index.html bằng mã sau:

    <!doctype html>
    <html>
      <head>
        <title>Genkit demo</title>
      </head>
      <body>
        <div id="signin" hidden>
          <button id="signinBtn">Sign in with Google</button>
        </div>
        <div id="callGenkit" hidden>
          Subject: <input type="text" id="subject" />
          <button id="suggestMenuItem">Suggest a menu theme</button>
          <p id="menuItem"></p>
        </div>
        <script type="module">
          import { initializeApp } from 'https://www.gstatic.com/firebasejs/10.10.0/firebase-app.js';
          import {
            getAuth,
            onAuthStateChanged,
            GoogleAuthProvider,
            signInWithPopup,
          } from 'https://www.gstatic.com/firebasejs/10.10.0/firebase-auth.js';
          import {
            getFunctions,
            httpsCallable,
          } from 'https://www.gstatic.com/firebasejs/10.10.0/firebase-functions.js';
    
          const firebaseConfig = await fetch('/__/firebase/init.json');
          initializeApp(await firebaseConfig.json());
    
          async function generateMenuItem() {
            const menuSuggestionFlow = httpsCallable(
              getFunctions(),
              'menuSuggestionFlow'
            );
            const subject = document.querySelector('#subject').value;
            const response = await menuSuggestionFlow(subject);
            document.querySelector('#menuItem').innerText = response.data;
          }
    
          function signIn() {
            signInWithPopup(getAuth(), new GoogleAuthProvider());
          }
    
          document
            .querySelector('#signinBtn')
            .addEventListener('click', signIn);
          document
            .querySelector('#suggestMenuItem')
            .addEventListener('click', generateMenuItem);
    
          const signinEl = document.querySelector('#signin');
          const genkitEl = document.querySelector('#callGenkit');
    
          onAuthStateChanged(getAuth(), (user) => {
            if (!user) {
              signinEl.hidden = false;
              genkitEl.hidden = true;
            } else {
              signinEl.hidden = true;
              genkitEl.hidden = false;
            }
          });
        </script>
      </body>
    </html>
    
  5. Triển khai ứng dụng web và Chức năng đám mây:

    cd $PROJECT_ROOT
    firebase deploy
    

Mở ứng dụng web bằng cách truy cập URL do lệnh deploy in. Ứng dụng yêu cầu bạn đăng nhập bằng một Tài khoản Google, sau đó bạn có thể bắt đầu các yêu cầu điểm cuối.

Phát triển bằng Bộ mô phỏng cục bộ của Firebase

Firebase cung cấp một bộ trình mô phỏng để phát triển cục bộ mà bạn có thể sử dụng với Genkit.

Để sử dụng Genkit với Bộ mô phỏng Firebase, hãy khởi động trình mô phỏng Firebase như sau:

GENKIT_ENV=dev firebase emulators:start --inspect-functions

Thao tác này sẽ chạy mã của bạn trong trình mô phỏng và chạy khung Genkit ở chế độ phát triển. Khung này sẽ khởi chạy và hiển thị API phản chiếu Genkit (chứ không phải Giao diện người dùng Dev).

Sau đó, hãy khởi chạy giao diện người dùng Genkit Dev với tuỳ chọn --attach để kết nối giao diện đó với mã của bạn chạy bên trong Trình mô phỏng Firebase:

genkit start --attach http://localhost:3100 --port 4001

Để xem dấu vết từ Firestore trong Dev UI, bạn có thể chuyển đến thẻ Inspect (Kiểm tra) rồi bật/tắt nút chuyển "Dev/Products". Khi được chuyển thành "prod", chế độ này sẽ tải dấu vết từ Firestore.