Files
2026-07-13 13:30:30 +08:00

99 lines
3.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Load env variables
source ./env.sh
# Enable APIs
echo "Enabling discovery engine API"
gcloud services enable discoveryengine.googleapis.com --project "${PROJECT_ID}"
# Call the first API with yes to enable to second necessary API (can't do this directly today)
# Create S&C Datastore (pdf + jsonl metadata)
yes | curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-H "X-Goog-User-Project: ${PROJECT_ID}" \
"https://discoveryengine.googleapis.com/v1alpha/projects/${PROJECT_ID}/locations/global/collections/default_collection/dataStores?dataStoreId=search-prospectus-${PROJECT_ID}" \
-d '{
"displayName": "search-prospectus",
"industryVertical": "GENERIC",
"solutionTypes": ["SOLUTION_TYPE_SEARCH"],
"contentConfig": "CONTENT_REQUIRED",
"documentProcessingConfig": {
"defaultParsingConfig": {
"ocrParsingConfig": {
"useNativeText": "false"
}
}
}
}'
echo "Waiting 70 seconds for data store."
sleep 70
# Upload samples to gcs
gsutil -m cp gs://github-repo/generative-ai/sample-apps/genwealth/sample-prospectus/*.pdf gs://"${DOCS_BUCKET}"
sleep 30
# Get the data store id
DATA_STORE_ID=$(curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "X-Goog-User-Project: ${PROJECT_ID}" \
"https://discoveryengine.googleapis.com/v1alpha/projects/${PROJECT_ID}/locations/global/collections/default_collection/dataStores" | jq -r '.dataStores | .[] | select(.displayName=="search-prospectus").name')
DATA_STORE_ID=${DATA_STORE_ID##*/}
sleep 10
# Import data from gcs
# Ref: https://cloud.google.com/generative-ai-app-builder/docs/create-data-store-es#cloud-storage
# Important: Specify the metadata bucket in the gcsSource config, NOT the bucket with the source pdf's. The metadata in the jsonl files will point to the associated pdf.
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://discoveryengine.googleapis.com/v1/projects/${PROJECT_ID}/locations/global/collections/default_collection/dataStores/${DATA_STORE_ID}/branches/0/documents:import" \
-d '{
"gcsSource": {
"inputUris": ["gs://'"${DOCS_METADATA_BUCKET}"'/*.jsonl"],
"dataSchema": "document",
}
}'
# Create S&C App
# Ref: https://cloud.google.com/generative-ai-app-builder/docs/create-engine-es
# Note: Faceted search for the widget has to be enabled manually in the console as of today.
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-H "X-Goog-User-Project: ${PROJECT_ID}" \
"https://discoveryengine.googleapis.com/v1/projects/${PROJECT_ID}/locations/global/collections/default_collection/engines?engineId=search-prospectus-${PROJECT_ID}" \
-d '{
"displayName": "search-prospectus",
"dataStoreIds": ["'"${DATA_STORE_ID}"'"],
"solutionType": "SOLUTION_TYPE_SEARCH",
"searchEngineConfig": {
"searchTier": "SEARCH_TIER_ENTERPRISE",
"searchAddOns": ["SEARCH_ADD_ON_LLM"]
}
}'
echo "Deploying function: update-search-index"
gcloud functions deploy update-search-index \
--gen2 \
--region="${REGION}" \
--runtime=python311 \
--source="./function-scripts/update-search-index" \
--entry-point="update_search_index" \
--set-env-vars="PROJECT_ID=${PROJECT_ID},DATASTORE_ID=${DATA_STORE_ID},DOCS_METADATA_BUCKET=${DOCS_METADATA_BUCKET}" \
--timeout=540s \
--run-service-account="${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--service-account="${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--trigger-service-account="${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--concurrency=1 \
--max-instances=100 \
--ingress-settings=all \
--memory=256Mi \
--cpu=.5 \
--trigger-bucket="${PROJECT_ID}-docs-metadata"