1. Introducción
¡Te damos la bienvenida al Petverse! ¡Se admiten todas las mascotas! 🐈🐶🐍🐟🦄
Requisitos previos
- Conocimientos básicos de la consola de Google Cloud
- Conocimientos básicos de las sentencias de SQL
Qué aprenderás
- Crea conjuntos de datos y tablas en BigQuery
- Crea columnas ObjectRef para hacer referencia a contenido multimedia en un bucket de almacenamiento en BigQuery
- Usa funciones basadas en IA en BigQuery para mejorar tu conjunto de datos a partir del contenido de datos no estructurados
- Crea embeddings multimedia para buscar contenido multimedia similar
- Crea incorporaciones de texto para realizar una búsqueda semántica con VECTOR_SEARCH
- Usa Gemini CLI para crear una aplicación web
Requisitos
- Una cuenta de Google Cloud y un proyecto de Google Cloud con una cuenta de facturación
- Un navegador web, como Chrome
2. Configuración y requisitos
Configuración del entorno de autoaprendizaje
- Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.



- El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla cuando quieras.
- El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. Por lo general, no importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID de tu proyecto (suele identificarse como
PROJECT_ID). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se usa el mismo durante todo el proyecto. - Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
- A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no costará mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.
3. Abre Cloud Shell
Navega a https://shell.cloud.google.com/?show=ide%2Cterminal . Cuando se te solicite, haz clic en Autorizar.

Asegúrate de que el editor y la consola estén visibles:

4. Crea una secuencia de comandos auxiliar
Para que esta experiencia sea más fluida, crearás una secuencia de comandos auxiliar que establezca variables de entorno relevantes.
Reemplaza <<ID del proyecto>> por el ID de tu proyecto a continuación.
Copia el siguiente comando en la terminal de Cloud Shell y presiona Intro para ejecutarlo**.**
gcloud config set project <<PROJECT_ID>>
Copia el siguiente comando en la terminal de Cloud Shell y presiona Intro para ejecutarlo**.** Esto habilitará los servicios necesarios, creará el archivo y lo editará en Cloud Shell.
gcloud services enable compute.googleapis.com \
cloudresourcemanager.googleapis.com \
aiplatform.googleapis.com \
storage-component.googleapis.com \
bigqueryconnection.googleapis.com \
run.googleapis.com \
secretmanager.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
iap.googleapis.com
edit ~/petverse-setup.sh
Deberías ver una pestaña nueva con el nombre del archivo. Pega la siguiente secuencia de comandos en el archivo nuevo:
#!/bin/bash
# -----------------------------------------------------------------------------
# 1. Global Variables: Set your desired project ID and region here.
# -----------------------------------------------------------------------------
# 🦄 🦄 Set your project ID here ⬇️.
# Example: PROJECT_ID="your-project-id"
PROJECT_ID=""
# Set your desired region here. Default is 'us-central1'.
# Example: REGION="us-east1"
REGION="us-central1"
# -----------------------------------------------------------------------------
# 2. Check and Authenticate
# -----------------------------------------------------------------------------
echo " ➡️ Checking for active Google Cloud authentication..."
# Check if the user is authenticated; if not, prompt for authentication.
if ! gcloud auth list --format="value(account)" | grep -q @; then
echo "⚠️ Not authenticated. Please authenticate now."
gcloud auth login
fi
echo " ✅ Authentication check passed."
# -----------------------------------------------------------------------------
# 3. Get Project ID from User if not set
# -----------------------------------------------------------------------------
# If PROJECT_ID is not set in the script or as an environment variable,
# prompt the user to choose one.
if [[ -z "$PROJECT_ID" ]] && [[ -n "$DEVSHELL_PROJECT_ID" ]]; then
PROJECT_ID=$DEVSHELL_PROJECT_ID
fi
if [[ -z "$PROJECT_ID" ]]; then
echo " ⚠️ Project ID is not set. Listing available projects:"
# List projects and store them in an array.
projects_array=($(gcloud projects list --format="value(projectId)"))
# Check if projects were found.
if [[ ${#projects_array[@]} -eq 0 ]]; then
echo " ❌ No projects found. Please ensure your account has access to projects."
exit 1
fi
# Display the projects and prompt for input.
echo " "
echo "Available Projects:"
for project in "${projects_array[@]}"; do
echo "$project"
done
echo " "
read -p "Please enter your desired project ID from the list above: " PROJECT_ID
# Validate the user's input by checking if it's in the array.
if [[ ! " ${projects_array[@]} " =~ " ${PROJECT_ID} " ]]; then
echo " ❌ Invalid project ID. Please run the script again and select a valid ID."
exit 1
fi
fi
echo " ✅ Project ID set to: $PROJECT_ID"
# -----------------------------------------------------------------------------
# 4. Set Environment Variables
# -----------------------------------------------------------------------------
# Set the project and region for the current session.
echo " 🔄 Setting Google Cloud configuration for this session..."
gcloud config set project "$PROJECT_ID"
gcloud config set compute/region "$REGION"
echo " ✅ Google Cloud configuration updated."
echo "Project ID: $PROJECT_ID"
echo "Region: $REGION"
echo " "
echo " 🎉 🦄 🦄 Script execution complete. You can now use Google Cloud commands in this shell session."
Reemplaza el marcador de posición de PROJECT_ID por el nombre de tu proyecto:

Copia el siguiente comando y ejecútalo en la terminal:
chmod +x petverse-setup.sh
~/petverse-setup.sh
Resultado esperado:

5. Crea un bucket de almacenamiento
Crea un bucket de Cloud Storage y copia el contenido multimedia disponible en tu propio bucket. Lo usarás para almacenar el contenido multimedia disponible para nuestras maravillosas mascotas. También crearás una conexión para acceder al bucket a través de BigQuery.
Pega y ejecuta lo siguiente en la terminal:
~/petverse-setup.sh
cd ~/
gcloud storage buckets create gs://$DEVSHELL_PROJECT_ID-petverse --uniform-bucket-level-access --location=us-central1
gcloud storage cp -r gs://sample-data-and-media/petverse/* gs://$DEVSHELL_PROJECT_ID-petverse/
bq mk --dataset --location=us-central1 --project_id=$DEVSHELL_PROJECT_ID petverse
bq mk --connection --location=us-central1 --project_id=$DEVSHELL_PROJECT_ID \
--connection_type=CLOUD_RESOURCE pet-connection
echo "your bucket is gs://$DEVSHELL_PROJECT_ID-petverse "

6. Crea la tabla de mascotas
Ahora crearás una tabla en BigQuery para almacenar información sobre tus mascotas.
Abre una pestaña nueva en el navegador. Navega a https://console.cloud.google.com/bigquery .
Asegúrate de que esté seleccionado el mismo proyecto que has estado usando en la consola:

Ahora puedes crear una tabla con los datos del archivo pets.csv. Este archivo contiene los nombres, las comidas favoritas, los juguetes y otra información interesante sobre nuestras mascotas.
Copia el siguiente código en una nueva consulta de SQL para crear una tabla física y cargar los datos.
LOAD DATA INTO petverse.pets
OPTIONS(
description="Table for furry friend data"
)
FROM FILES (
skip_leading_rows=1,
uris = ['gs://<<your_bucket_name>>/pets.csv'],
format = 'CSV'
);
Reemplaza el marcador de posición del bucket en el código por el bucket que creaste en el paso anterior.
Puedes consultar todos tus buckets de almacenamiento en una pestaña del navegador independiente que apunte a esta URL: https://console.cloud.google.com/storage/browser .

Usa el botón Ejecutar para ejecutar la consulta.
Una vez que los datos se carguen correctamente, haz clic en Ir a la tabla.

Haz clic en Vista previa para ver el contenido de la tabla. 
7. Conecta BigQuery al bucket de almacenamiento
Si buscas en el bucket que creaste antes, encontrarás un conjunto de archivos multimedia relacionados con cada mascota.

BigQuery puede leer estos buckets y usar los archivos junto con los datos de las tablas. Este tipo de valor se llama ObjectRef.
Haz clic en la conexión que creaste antes en Conexiones externas para obtener su ID de cuenta de servicio.

Copia el ID de la cuenta de servicio.
Ve a la consola de IAM Admin en una pestaña nueva del navegador ( https://console.cloud.google.com/iam-admin/ ).
Otorga a la cuenta de servicio los roles de Visualizador de objetos de Storage y Usuario de Vertex AI (usarás este permiso más adelante).

Haz clic en Guardar y 🕰️ espera un par de minutos.
Vuelve a la pestaña de BigQuery y usa la siguiente consulta en BigQuery Studio para probar la conexión entre BigQuery y el bucket de almacenamiento.
Reemplaza <<PROJECT_ID>> por el ID de tu proyecto.
SET @@location='us-central1';
SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/yoda_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))
Haz clic en Ver resultados. Deberías obtener los metadatos en los resultados:

8. Agrega el medio de almacenamiento a tus datos estructurados
Puedes mejorar la tabla pets para agregar una columna con la foto de perfil de cada mascota cuando esté disponible. También agregarás otra columna con un array de referencias de medios para almacenar todos los demás archivos relacionados con cada mascota.
El acceso al contenido multimedia requiere una conexión, que creaste al principio de este codelab después de crear tu bucket.
Pega los siguientes comandos en una consola de SQL de BigQuery y ejecútalos para agregar dos columnas a tu tabla pets.
SET @@location='us-central1';
ALTER TABLE petverse.pets
ADD COLUMN IF NOT EXISTS profile_picture STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>,
ADD COLUMN IF NOT EXISTS additional_media ARRAY<STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>>;
Copia las siguientes instrucciones y reemplaza el marcador de posición de PROJECT_ID por tu ID del proyecto.
SET @@location='us-central1';
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/yoda_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Yoda_asks_for_cuddles.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 1;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/madonna_profile_picture.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Madonna_description.wav', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 2;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/pixel_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/pixel_thug_life.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/pixel_description.wav', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 3;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/sql_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/SQL_description.wav', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/SQL_favorite_toy.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 4;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/buddy_golden_retriever.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = NULL
WHERE Id = 5;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/daisy_french_bulldog.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = NULL
WHERE Id = 6;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/max_german_shepherd.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/max_description_tells_jokes.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 7;
UPDATE petverse.pets SET profile_picture = NULL, additional_media = NULL WHERE Id = 8;
UPDATE petverse.pets SET profile_picture = NULL, additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/rocky_description.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))] WHERE Id = 9;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/pip_hamster.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/pip_Hamster_Wheel_Video_Generated.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 10;
UPDATE petverse.pets SET profile_picture = NULL, additional_media = NULL WHERE Id = 11;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/scales_snake.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = NULL
WHERE Id = 12;
UPDATE petverse.pets SET profile_picture = NULL, additional_media = NULL WHERE Id = 13;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/Joel_Profile_Picture.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Joel_Catwalk.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Joel_Flowers.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Joel_Plays.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 14;
Ejecuta la instrucción. Deberías ver ejecuciones exitosas después de unos minutos:

Verifica los resultados con la vista previa de la tabla. Deberías ver los metadatos de las fotos de perfil existentes y el contenido multimedia adicional del gato llamado Pixel.
SELECT *
FROM `petverse.pets`
WHERE name = 'Pixel'

9. Genera descripciones de mascotas
Si obtienes una vista previa de la tabla pets, notarás que a algunas mascotas, como Yoda, Pixel o Rocky, les falta su comida o juguete favoritos.
Las respuestas a estas preguntas pueden estar en los videos y audios relacionados con estas mascotas. Usarás funciones de IA integradas para verificarlo.
Prueba esto con la siguiente afirmación:
SELECT name,
AI.GENERATE(
prompt=> ('What are this pet\'s favorite toy and favorite foods', additional_media ),
connection_id => 'us-central1.pet-connection',
endpoint => 'gemini-2.5-flash',
output_schema => 'food STRING, toy STRING')
FROM petverse.pets
WHERE name = 'Rocky'
Puedes ver el video de Rocky en tu bucket de almacenamiento.
Usa la siguiente instrucción para actualizar las descripciones faltantes:
UPDATE petverse.pets AS p
SET FavoriteFood = aigen.food
FROM
(
SELECT Id, name,
AI.GENERATE(
prompt=> ('What are this pet\'s favorite toy and favorite foods', additional_media ),
connection_id => 'us-central1.pet-connection',
endpoint => 'gemini-2.5-flash',
output_schema => 'food STRING').food
FROM petverse.pets ) AS aigen
WHERE p.Id = aigen.Id
AND p.FavoriteFood IS NULL
AND p.additional_media IS NOT NULL
Usa la siguiente instrucción para crear una descripción de las mascotas basada en su contenido multimedia en una columna nueva:
ALTER TABLE petverse.pets ADD COLUMN MediaDescription STRING;
UPDATE petverse.pets AS p
SET MediaDescription = aigen.description
FROM
(
SELECT Id, name,
AI.GENERATE(
prompt=> ('Create a description in an epic tone for this pet based on these media: ', additional_media ),
connection_id => 'us-central1.pet-connection',
endpoint => 'gemini-2.5-flash',
output_schema => 'description STRING').description
FROM petverse.pets ) AS aigen
WHERE p.Id = aigen.Id
AND p.MediaDescription IS NULL
AND p.additional_media IS NOT NULL
Después de unos minutos, deberías ver algunas descripciones de creatividades:

10. Crear incorporaciones
Crea una tabla para almacenar las incorporaciones de las fotos de perfil y las descripciones y los pasatiempos para usarlos en una búsqueda semántica. Encontraremos similitudes entre las mascotas con búsquedas de vectores.
SET @@location='us-central1';
CREATE OR REPLACE MODEL petverse.multimodalembedding
REMOTE WITH CONNECTION `us-central1.pet-connection`
OPTIONS(ENDPOINT = 'multimodalembedding@001');
CREATE TABLE IF NOT EXISTS petverse.profile_embeddings
AS
SELECT *
FROM ML.GENERATE_EMBEDDING(
MODEL petverse.multimodalembedding,
(
SELECT profile_picture as content,
Id
FROM petverse.pets)
);
CREATE OR REPLACE MODEL petverse.textembedding
REMOTE WITH CONNECTION `us-central1.pet-connection`
OPTIONS (ENDPOINT = 'text-embedding-005');
CREATE OR REPLACE TABLE petverse.text_embeddings AS
SELECT * FROM ML.GENERATE_EMBEDDING(
MODEL petverse.textembedding,
(
SELECT CONCAT(AdoptionStory, ' . This pet\'s hobby is: ', Hobby, ' and their nickname(s) is: ', COALESCE(Nicknames, Name)) AS content,
Id, Name
FROM petverse.pets
WHERE LENGTH(AdoptionStory) > 0 AND LENGTH(Hobby) > 0
)
)
WHERE LENGTH(ml_generate_embedding_status) = 0;
Consulta la tabla nueva en la pestaña de resultados.

Usa la siguiente instrucción para verificar el estado de todas las incorporaciones:
SELECT DISTINCT(ml_generate_embedding_status),
COUNT(content.uri) AS num_rows
FROM petverse.profile_embeddings
GROUP BY 1;
Si hay errores, los verás en un estado no vacío. Este es el resultado correcto: No hay registros con errores**.**

A continuación, se muestra un ejemplo de registros con errores. Estos errores no son esperados, pero deben corregirse antes de continuar con los siguientes pasos:

Cómo buscar mascotas similares
El conjunto de datos predeterminado contiene mascotas similares. Estos son dos ejemplos: Pixel (ID: 3) y SQL (ID: 4):

Puedes usar la distancia entre las incorporaciones para calcular mascotas similares:
SELECT
t2.id AS similar_pet_id,
COSINE_DISTANCE(t1.ml_generate_embedding_result, t2.ml_generate_embedding_result) AS distance
FROM
petverse.profile_embeddings AS t1,
petverse.profile_embeddings AS t2
WHERE
t1.Id = 3 -- The pet you want to find similar ones to
AND t1.Id != t2.Id -- Exclude the pet itself from the results
AND t1.content.uri IS NOT NULL
AND t2.content.uri IS NOT NULL
ORDER BY
distance
LIMIT 5;
Deberías obtener resultados con los IDs de las imágenes que son similares entre sí. Se incluirá todo lo que aparezca en la imagen. En este ejemplo, Pixel y SQL son similares, y la siguiente mascota más similar es Joel (ID: 14).

Aquí tienes una foto de Joel como referencia:

Prueba la búsqueda semántica
Puedes usar la función VECTOR_SEARCH para realizar búsquedas semánticas en embeddings de texto. Si esta tabla fuera más grande, deberías crear un índice para las incorporaciones.
SELECT query.query, base.content, base.Name
FROM VECTOR_SEARCH(
TABLE `petverse.text_embeddings`, 'ml_generate_embedding_result',
(
SELECT ml_generate_embedding_result, content AS query
FROM ML.GENERATE_EMBEDDING(
MODEL `petverse.textembedding`,
(SELECT 'Pets who like to relax' AS content))
),
top_k => 5, options => '{"fraction_lists_to_search": 0.50}')
ORDER BY distance DESC
Intenta cambiar el término de búsqueda semántica (Pets who like to relax), así como el parámetro fraction_lists_to_search, y observa qué sucede. Puedes obtener más información sobre estas funciones aquí.
11. Crea una página de perfil con vibe coding
Usarás Gemini CLI en Cloud Shell para iniciar rápidamente una aplicación web de demostración simple. Esta aplicación web se simplificó en su instrucción para demostrar cómo podría cobrar vida el Petverso.
Regresa a Cloud Shell. Tendrás una mejor experiencia si solo usas la consola en pantalla completa:

Ejecuta la secuencia de comandos de inicialización para asegurarte de que se hayan establecido las variables de entorno, crea un directorio para que contenga este proyecto y ejecuta Gemini CLI:
~/petverse-setup.sh
mkdir petverse-profiles
cd petverse-profiles
gemini
Deberías ver la CLI de Gemini:

Reemplaza el nombre del bucket en la siguiente instrucción.
Pega la instrucción en la línea de comandos de Gemini.
You are a fullstack engineer creating an application to display the profiles of cats, dogs and other pets stored in BigQuery. The table where these are stored is called pets, in the dataset petverse.
1.Application Requirements: Display the pets with their profile picture, all the other information in the Pets table, and other media that may be available. The pictures are in a GCS bucket, the field in the table pets profile_picture.uri contains the URI for the storage bucket of that profile picture. The field additional_media is an array of objectref that contains multiple URI to different media stored in a GCS bucket.
Important: In the code, in the values for the URIs retrieved from BigQuery, replace gs://<<YOUR_PROJECT_ID>>-petverse/ with https://storage.mtls.cloud.google.com/<<YOUR_PROJECT_ID>>-petverse/ as follows: replace('gs://', 'https://storage.mtls.cloud.google.com/'). Use the python library. Media can be pictures, videos and audio. Consider these formats in the code. Some pets may not have profile pictures or additional media.
2.Hosting: Create a web application hosted in a single container and service in Cloud Run, use the following syntax to deploy it using IAP. IMPORTANT: DO NOT ADD IAM AUTHENTICATION AND DO NOT ALLOW UNAUTHENTICATED: gcloud beta run deploy SERVICE_NAME --region=REGION --image=IMAGE_URL --no-allow-unauthenticated --iap
3.Database access: Display similar pets based on a similarity between embeddings in table petverse.profile_embeddings.
Here's the schema for the pets table in CSV format (Field name, type, mode):
Id,INTEGER,NULLABLE
Name,STRING,NULLABLE
Species,STRING,NULLABLE
Breed,STRING,NULLABLE
Nationality,STRING,NULLABLE
Nicknames,STRING,NULLABLE
Hobby,STRING,NULLABLE
AdoptionStory,STRING,NULLABLE
FavoriteFood,STRING,NULLABLE
FavoriteToy,STRING,NULLABLE
profile_picture,RECORD,NULLABLE
additional_media,RECORD,REPEATED
profile_embeddings,FLOAT,REPEATED
Here's a sample query to check for similarity:
SELECT
t2.id AS similar_pet_id,
COSINE_DISTANCE(t1.ml_generate_embedding_result, t2.ml_generate_embedding_result) AS distance
FROM
petverse.profile_embeddings AS t1,
petverse.profile_embeddings AS t2
WHERE
t1.Id = 3 -- The pet you want to find similar ones to
AND t1.Id != t2.Id -- Exclude the pet itself from the results
AND t1.content.uri IS NOT NULL
AND t2.content.uri IS NOT NULL
ORDER BY
distance
LIMIT 5;
Complement the profile of each pet with a description. Here's an example of the access to such table:
SELECT Name, MediaDescription from petverse.pets;
4.For each access to BigQuery, show the SQL statement that is used in the console logs.
5.Search functionality: Add a search bar for a semantic search for pets. There's a text embedding for the Adoption story, the pet's past-time or hobby and their nicknames in the table: petverse.text_embeddings . This is a sample of semantic search:
SELECT query.query, base.content, base.Name FROM VECTOR_SEARCH(TABLE `petverse.text_embeddings`, 'ml_generate_embedding_result', ( SELECT ml_generate_embedding_result, content AS query FROM ML.GENERATE_EMBEDDING(MODEL `petverse.textembedding`,(SELECT 'Pets who like to relax' AS content))), top_k => 5, options => '{"fraction_lists_to_search": 0.50}') ORDER BY distance DESC
6.Use Python for the backend. Generate the deployment scripts for an authenticated service using IAP with the flags --no-allow-unauthenticated --iap
7. Make the UI look like a modern art museum.
8. Use the gunicorn library. Validate version dependencies.
Ahora esta es tu aventura. Se te mostrará un plan y se te pedirá que lo confirmes durante el proceso.
Es muy poco probable que el código y la implementación producidos funcionen en el primer intento. Deberás iterar con la CLI de Gemini hasta que lo haga bien.
Si ves que el proceso se atasca en un bucle, deténlo con CTRL/Comando + C, investiga el problema y vuelve a solicitarlo.

Te recomendamos que leas cada una de las confirmaciones con atención, una por una, para comprender lo que hará la CLI:

Después de unos minutos, la aplicación debería estar lista para ejecutarse. Es posible que parezca que la consola se bloqueó:

Puedes probar la aplicación manualmente en una pestaña nueva de Cloud Shell con gunicorn. Asegúrate de que el proyecto esté configurado:

Deberías ver tu sitio nuevo (es posible que se vea diferente a este). Si algo no funciona, deberías poder ver los registros de errores y depuración en la línea de comandos de Cloud Shell que se ejecuta de forma local.

Si todo parece estar bien, puedes implementar la aplicación en Cloud Run de forma opcional.
Si tu proyecto pertenece a una organización, asegúrate de configurar IAP siguiendo estas instrucciones. Si tu proyecto no forma parte de una organización, puedes seguir estas instrucciones para proteger el acceso a tu aplicación. Especialmente para la configuración de producción, recomendamos NO permitir el acceso sin autenticar.

Si la implementación funciona, deberías ver la aplicación de Cloud Run ejecutándose en la consola de Cloud Run.
Asegúrate de que el acceso sea solo a través del IAP. Usa Edit Policy para agregar tu usuario a la vinculación y Save.
Espera unos minutos a que se propaguen las vinculaciones de la IAP y haz clic en la URL que se encuentra en la parte superior. Debería aparecer el sitio.

12. Limpia
En este paso, se te guiará para borrar los recursos que creaste en este codelab.
Borra el servicio de Cloud Run (adapta el nombre de los servicios y la región según sea necesario):
gcloud run services delete petverse-profiles --region us-central1
Borra todos los recursos de BigQuery:
bq rm -f petverse
gcloud bigquery connections delete pet-connection --location=us-central1
