firestore-multimodal-genai/extension.yaml (344 lines of code) (raw):
name: firestore-multimodal-genai
version: 1.0.2
specVersion: v1beta
icon: icon.png
displayName: Multimodal Tasks with the Gemini API
description: >-
Performs multimodel generative tasks on text and images, customizable with
prompt engineering, using Gemini models and Firestore.
tags:
[
ai,
generative-ai,
text-ai,
generative-ai,
vertex-ai,
generative-models,
llm,
nlp,
google-ai,
]
license: Apache-2.0 # https://spdx.org/licenses/
sourceUrl: https://github.com/GoogleCloudPlatform/firebase-extensions/tree/main/firestore-multimodal-genai
releaseNotesUrl: https://github.com/GoogleCloudPlatform/firebase-extensions/tree/main/firestore-multimodal-genai/CHANGELOG.md
author:
authorName: Google Cloud
url: https://cloud.google.com
contributors:
- authorName: Invertase
email: oss@invertase.io
url: https://github.com/invertase
- authorName: Jacob Cable
email: jacob@invertase.io
url: https://github.com/cabljac
- authorName: Mais Alheraki
email: mais@invertase.io
url: https://github.com/pr-Mais
billingRequired: true
apis:
- apiName: aiplatform.googleapis.com
reason: For access to the Vertex AI Gemini API if this provider is chosen.
roles:
- role: datastore.user
reason:
Allows this extension to access Cloud Firestore to read and process added
messages.
- role: storage.objectAdmin
reason: Allows the extension to read from your Cloud Storage.
- role: aiplatform.user
reason:
Allows this extension to access the Gemini family of genai models via
Vertex AI if this provider is chosen.
resources:
- name: generateOnCall
type: firebaseextensions.v1beta.function
description: >-
A callable function to perform generative AI tasks.
properties:
location: ${LOCATION}
httpsTrigger: {}
runtime: nodejs20
- name: generateText
type: firebaseextensions.v1beta.function
description: >-
Listens to Firestore data writes to perform generative AI tasks.
properties:
availableMemoryMb: 2048
timeout: 540s
location: ${LOCATION}
eventTrigger:
eventType: providers/cloud.firestore/eventTypes/document.write
resource: projects/${PROJECT_ID}/databases/(default)/documents/${COLLECTION_NAME}/{summaryId}
runtime: nodejs20
params:
- param: GENERATIVE_AI_PROVIDER
label: Gemini API Provider
description: >-
This extension makes use of the Gemini family of large language models.
Currently the extension supports the Google AI Gemini API (for developers)
and the Vertex AI Gemini API. Learn more about the differences between the
Google AI and Vertex AI Gemini APIs here.
type: select
options:
- label: Google AI
value: google-ai
- label: Vertex AI
value: vertex-ai
required: true
default: google-ai
immutable: false
- param: MODEL
label: Gemini model
description: >-
Input the name of the Gemini model you would like to use. To view
available models for each provider, see: [Vertex AI Gemini
models](https://cloud.google.com/vertex-ai/docs/generative-ai/learn/models),
[Google AI Gemini models](https://ai.google.dev/models/gemini)
type: string
required: true
default: gemini-2.0-flash
immutable: false
- param: API_KEY
label: Google AI API Key
description: >-
If you have selected Google AI as your provider, then this parameteris
required. If you have instead selected Vertex AI, then this parameter is
not required, and application default credentials will be used.
type: secret
required: false
immutable: false
- param: COLLECTION_NAME
label: Firestore Collection Path
description: >-
Used to store conversation history represented as documents. This
extension will listen to the specified collection(s) for new message
documents.
type: string
validationRegex: '^[^/]+(/[^/]+/[^/]+)*$'
validationErrorMessage: Must be a valid Cloud Firestore Collection
default: generate
required: true
immutable: false
- param: PROMPT
label: Prompt
description: >-
This is the text that you want the Gemini API to generate a response for.
It can be free-form text or it can use handlebars variables to substitute
values from the Firestore document. For example if you set this parameter
as "What is the capital of {{ country }}?"
type: string
required: true
immutable: false
- param: IMAGE_FIELD
label: Image field (Gemini Vision Models ONLY)
description: >-
A document field containing a cloud storage URL of an image, or a base64
string of an image. Note that this field is only supported by Gemini, and
only with the Gemini Pro Vision models. If you are using a text-only
model, you should leave this field blank.
type: string
required: false
immutable: false
validationRegex: ^[a-zA-Z0-9_]+(,[a-zA-Z0-9_]+)*$
validationErrorMessage: >-
Field names may only use upper and lowercase letters from A to Z,
underscores, or numbers, and may only be separated by commas. Trailing
commas and empty variable names are not allowed.
- param: RESPONSE_FIELD
label: Response Field
description: >-
The field in the message document into which to put the response.
type: string
default: output
required: true
immutable: false
- param: LOCATION
label: Cloud Functions location
description: >-
Where do you want to deploy the functions created for this extension? For
help selecting a location, refer to the [location selection
guide](https://firebase.google.com/docs/functions/locations). Note that
Generative AI on Vertex AI is only available in the regions listed
[here](https://cloud.google.com/vertex-ai/docs/generative-ai/learn/locations-genai).
A list of languages and regions supported by the Gemini API on Google AI
is [here](https://ai.google.dev/available_regions).
type: select
options:
- label: Iowa (us-central1)
value: us-central1
- label: South Carolina (us-east1)
value: us-east1
- label: Northern Virginia (us-east4)
value: us-east4
- label: Los Angeles (us-west2)
value: us-west2
- label: Salt Lake City (us-west3)
value: us-west3
- label: Las Vegas (us-west4)
value: us-west4
- label: Warsaw (europe-central2)
value: europe-central2
- label: Belgium (europe-west1)
value: europe-west1
- label: London (europe-west2)
value: europe-west2
- label: Frankfurt (europe-west3)
value: europe-west3
- label: Zurich (europe-west6)
value: europe-west6
- label: Hong Kong (asia-east2)
value: asia-east2
- label: Tokyo (asia-northeast1)
value: asia-northeast1
- label: Osaka (asia-northeast2)
value: asia-northeast2
- label: Seoul (asia-northeast3)
value: asia-northeast3
- label: Mumbai (asia-south1)
value: asia-south1
- label: Jakarta (asia-southeast2)
value: asia-southeast2
- label: Montreal (northamerica-northeast1)
value: northamerica-northeast1
- label: Sao Paulo (southamerica-east1)
value: southamerica-east1
- label: Sydney (australia-southeast1)
value: australia-southeast1
required: true
immutable: true
- param: TEMPERATURE
label: Temperature
description: >-
Controls the randomness of the output. Values can range over [0,1],
inclusive. A value closer to 1 will produce responses that are more
varied, while a value closer to 0 will typically result in less surprising
responses from the model.
type: string
validationRegex: ^(?:0*(?:\.\d+)?|1(\.0*)?)$
validationErrorMessage:
Please specify a decimal representation of a number between 0 and 1.
required: false
immutable: false
- param: TOP_P
label: Nucleus sampling probability
description: >-
If specified, nucleus sampling will be used as the decoding strategy.
Nucleus sampling considers the smallest set of tokens whose probability
sum is at least a fixed value. Enter a value between 0 and 1.
type: string
validationRegex: ^(?:0*(?:\.\d+)?|1(\.0*)?)$
validationErrorMessage:
Please specify a decimal representation of a number between 0 and 1.
required: false
immutable: false
- param: TOP_K
label: Sampling strategy parameter
description: >-
If specified, top-k sampling will be used as the decoding strategy. Top-k
sampling considers the set of topK most probable tokens.
type: string
validationRegex: ^[1-9][0-9]*
validationErrorMessage: Please specify a positive integer.
required: false
immutable: false
- param: CANDIDATE_COUNT
label: Candidate count
description: >-
When set to an integer higher than one, additional candidate responses, up
to the specified number, will be stored in Firestore under the
'candidates' field.
type: string
validationRegex: ^[1-9][0-9]*
validationErrorMessage: Please specify a positive integer.
default: 1
required: false
immutable: false
- param: CANDIDATES_FIELD
label: Candidates field
description: >-
The field in the message document into which to put the other candidate
responses if the candidate count parameter is greater than one.
type: string
default: candidates
required: false
immutable: false
# - param: RAG_HOOK_URL
# label: Custom RAG Hook URL
# description: >-
# If provided, this extension will attempt to fetch data from this URL. The
# endpoint provided must return a json body. The extension will extract any
# string properties from this body and attempt to substitute them as
# handlebar variables into the extension prompt. The extension will pass in
# the Custom Hook API Key parameter into the headers object as x-api-key.
# type: string
# validationErrorMessage: Must be a valid Cloud Firestore Collection
# required: false
# immutable: false
# - param: RAG_HOOK_INPUT_FIELDS
# label: RAG Hook Input Variable Fields
# description: >-
# A comma separated list of fields to pass in the body of the RAG request,
# if the RAG Hook URL is specified.
# type: string
# required: false
# immutable: false
# validationRegex: ^[a-zA-Z0-9_]+(,[a-zA-Z0-9_]+)*$
# validationErrorMessage: >-
# Field names may only use upper and lowercase letters from A to Z,
# underscores, or numbers, and may only be separated by commas. Trailing
# commas and empty variable names are not allowed.
# - param: RAG_HOOK_OUTPUT_FIELDS
# label: RAG hook output variable fields
# description: >-
# A comma separated list of fields to be extracted from the RAG response
# body, if the RAG Hook URL is specified.
# type: string
# required: false
# immutable: false
# validationRegex: ^[a-zA-Z0-9_]+(,[a-zA-Z0-9_]+)*$
# validationErrorMessage: >-
# Field names may only use upper and lowercase letters from A to Z,
# underscores, or numbers, and may only be separated by commas. Trailing
# commas and empty variable names are not allowed.
# - param: RAG_HOOK_API_KEY
# label: Custom RAG Hook API Key
# description: >-
# If you have provided a Custom Hook URL which needs authentication, provide
# an API key secret here. It will be passed into custom hook request headers
# under x-api-key.
# type: secret
# required: false
# immutable: false
- param: HARM_CATEGORY_HATE_SPEECH
label: Hate Speech Threshold
description: >-
Threshold for hate speech content. Specify what probability level of hate
speech content is blocked by the Gemini provider.
type: select
options:
- label: Default
value: HARM_BLOCK_THRESHOLD_UNSPECIFIED
- label: Block low and above
value: BLOCK_LOW_AND_ABOVE
- label: Block medium and above
value: BLOCK_MEDIUM_AND_ABOVE
- label: Block only high
value: BLOCK_ONLY_HIGH
- label: Block none
value: BLOCK_NONE
required: false
default: HARM_BLOCK_THRESHOLD_UNSPECIFIED
immutable: false
- param: HARM_CATEGORY_DANGEROUS_CONTENT
label: Dangerous Content Threshold
description: >-
Threshold for dangerous content. Specify what probability level of
dangerous content is blocked by the Gemini provider.
type: select
options:
- label: Default
value: HARM_BLOCK_THRESHOLD_UNSPECIFIED
- label: Block low and above
value: BLOCK_LOW_AND_ABOVE
- label: Block medium and above
value: BLOCK_MEDIUM_AND_ABOVE
- label: Block only high
value: BLOCK_ONLY_HIGH
- label: Block none
value: BLOCK_NONE
required: false
default: HARM_BLOCK_THRESHOLD_UNSPECIFIED
immutable: false
- param: HARM_CATEGORY_HARASSMENT
label: Harassment Content Threshold
description: >-
Threshold for harassment content. Specify what probability level of
harassment content is blocked by the Gemini provider.
type: select
options:
- label: Default
value: HARM_BLOCK_THRESHOLD_UNSPECIFIED
- label: Block low and above
value: BLOCK_LOW_AND_ABOVE
- label: Block medium and above
value: BLOCK_MEDIUM_AND_ABOVE
- label: Block only high
value: BLOCK_ONLY_HIGH
- label: Block none
value: BLOCK_NONE
required: false
default: HARM_BLOCK_THRESHOLD_UNSPECIFIED
immutable: false
- param: HARM_CATEGORY_SEXUALLY_EXPLICIT
label: Sexual Content Threshold
description: >-
Threshold for sexually explicit content. Specify what probability level of
sexual content is blocked by the Gemini provider.
type: select
options:
- label: Default
value: HARM_BLOCK_THRESHOLD_UNSPECIFIED
- label: Block low and above
value: BLOCK_LOW_AND_ABOVE
- label: Block medium and above
value: BLOCK_MEDIUM_AND_ABOVE
- label: Block only high
value: BLOCK_ONLY_HIGH
- label: Block none
value: BLOCK_NONE
required: false
default: HARM_BLOCK_THRESHOLD_UNSPECIFIED
immutable: false