The AI.GENERATE function
This document describes the AI.GENERATE function, which lets you
analyze any combination of text and unstructured data
from BigQuery
standard tables. For each row
in the table, the function generates a STRUCT that contains a STRING value.
The function works by sending requests to a Vertex AI Gemini model, and then returning that model's response.
You can use the AI.GENERATE function to perform tasks such as
classification and sentiment analysis.
Prompt design can strongly affect the responses returned by the model. For more information, see Introduction to prompting.
Input
Using the AI.GENERATE function, you can use the following types
of input:
- Text data from standard tables.
- ObjectRefRuntimevalues that are generated by the- OBJ.GET_ACCESS_URLfunction. You can use- ObjectRefvalues from standard tables as input to the- OBJ.GET_ACCESS_URLfunction. (Preview)
When you analyze unstructured data, that data must meet the following requirements:
- Content must be in one of the supported formats that are
described in the Gemini API model
mimeTypeparameter.
- If you are analyzing a video, the maximum supported length is two minutes.
If the video is longer than two minutes, AI.GENERATEonly returns results based on the first two minutes.
To minimize Vertex AI charges when you use AI.GENERATE in a
query, use a table rather than a subquery in the FROM clause. For example,
the first of the following examples is preferable to the second one:
SELECT city, AI.GENERATE( ('Give a short, one sentence description of ', city), connection_id => 'us.test_connection', endpoint => 'gemini-2.0-flash').result FROM mydataset.cities;
SELECT city, AI.GENERATE( ('Give a short, one sentence description of ', city), connection_id => 'us.test_connection', endpoint => 'gemini-2.0-flash').result FROM (SELECT city_name from mydataset.customers WHERE...);
Writing the query results to a table beforehand helps you to ensure that you are sending as few rows as possible to the model.
Syntax
AI.GENERATE( [ prompt => ] 'PROMPT', connection_id => 'CONNECTION' [, endpoint => 'ENDPOINT'] [, request_type => 'REQUEST_TYPE'] [, model_params => MODEL_PARAMS] [, output_schema => 'OUTPUT_SCHEMA'] )
Arguments
AI.GENERATE takes the following arguments:
- PROMPT: a- STRINGor- STRUCTvalue that specifies the- PROMPTvalue to send to the model. The prompt must be the first argument that you specify. You can provide the prompt value in the following ways:- Specify a STRINGvalue. For example,('Write a poem about birds').
- Specify a - STRUCTvalue that contains one or more fields. You can use the following types of fields within the- STRUCTvalue:- Field type - Description - Examples - STRING- A string literal, or the name of a - STRINGcolumn.- String literal: - 'Describe the city of Seattle in 15 words'
 String column name:- my_string_column- ARRAY<STRING>- You can only use string literals in the array. - Array of string literals: - ['Describe the city of ', 'Seattle', ' in 15 words']- ObjectRefRuntime- An - ObjectRefRuntimevalue returned by the- OBJ.GET_ACCESS_URLfunction. The- OBJ.GET_ACCESS_URLfunction takes an- ObjectRefvalue as input, which you can provide by either specifying the name of a column that contains- ObjectRefvalues, or by constructing an- ObjectRefvalue.- ObjectRefRuntimevalues must have the- access_url.read_urland- details.gcs_metadata.content_typeelements of the JSON value populated.- Function call with - ObjectRefcolumn:- OBJ.GET_ACCESS_URL(my_objectref_column, 'r')
 Function call with constructed- ObjectRefvalue:- OBJ.GET_ACCESS_URL(OBJ.MAKE_REF('gs://image.jpg', 'myconnection'), 'r')- ARRAY<ObjectRefRuntime>- ObjectRefRuntimevalues returned from multiple calls to the- OBJ.GET_ACCESS_URLfunction. The- OBJ.GET_ACCESS_URLfunction takes an- ObjectRefvalue as input, which you can provide by either specifying the name of a column that contains- ObjectRefvalues, or by constructing an- ObjectRefvalue.- ObjectRefRuntimevalues must have the- access_url.read_urland- details.gcs_metadata.content_typeelements of the JSON value populated.- Function calls with - ObjectRefcolumns:- [OBJ.GET_ACCESS_URL(my_objectref_column1, 'r'), OBJ.GET_ACCESS_URL(my_objectref_column2, 'r')]
 Function calls with constructed- ObjectRefvalues:- [OBJ.GET_ACCESS_URL(OBJ.MAKE_REF('gs://image1.jpg', 'myconnection'), 'r'), OBJ.GET_ACCESS_URL(OBJ.MAKE_REF('gs://image2.jpg', 'myconnection'), 'r')]- The function combines - STRUCTfields similarly to a- CONCAToperation and concatenates the fields in their specified order. The same is true for the elements of any arrays used within the struct. The following table shows some examples of- STRUCTprompt values and how they are interpreted:- Struct field types - Struct value - Semantic equivalent - STRUCT<STRING>- ('Describe the city of Seattle')- 'Describe the city of Seattle' - STRUCT<STRING, STRING, STRING>- ('Describe the city of ', my_city_column, ' in 15 words')- 'Describe the city of my_city_column_value in 15 words' - STRUCT<STRING, ARRAY<STRING>>- ('Describe ', ['the city of', ' Seattle'])- 'Describe the city of Seattle' - STRUCT<STRING, ObjectRefRuntime>- ('Describe the following city', OBJ.GET_ACCESS_URL(image_objectref_column, 'r'))- 'Describe the following city' image - STRUCT<STRING, ObjectRefRuntime, ObjectRefRuntime>- ('If the city in the first image is within the country of the second image, provide a ten word description of the city',
 OBJ.GET_ACCESS_URL(city_image_objectref_column, 'r'),
 OBJ.GET_ACCESS_URL(country_image_objectref_column, 'r'))- 'If the city in the first image is within the country of the second image, provide a ten word description of the city' city_image country_image 
 
- Specify a 
- CONNECTION: a- STRINGvalue specifying the connection to use to communicate with the model, in the format- [PROJECT_ID].[LOCATION].[CONNECTION_ID]. For example,- myproject.us.myconnection.- Replace the following: - PROJECT_ID: the project ID of the project that contains the connection.
- LOCATION: the location used by the connection. The connection must be in the same location as the dataset that contains the model.
- CONNECTION_ID: the connection ID—for example,- myconnection.- You can get this value by viewing the connection details in the Google Cloud console and copying the value in the last section of the fully qualified connection ID that is shown in Connection ID. For example, - projects/myproject/locations/connection_location/connections/myconnection.
 
- ENDPOINT: a- STRINGvalue that specifies the Vertex AI endpoint to use for the model. You can specify any generally available or preview Gemini model. If you specify the model name, BigQuery ML automatically identifies and uses the full endpoint of the model. If you don't specify an- ENDPOINTvalue, BigQuery ML selects a recent stable version of Gemini to use.
- REQUEST_TYPE: a- STRINGvalue that specifies the type of inference request to send to the Gemini model. The request type determines what quota the request uses. Valid values are as follows:- DEDICATED: The- AI.GENERATEfunction only uses Provisioned Throughput quota. The- AI.GENERATEfunction returns the error- Provisioned throughput is not purchased or is not activeif Provisioned Throughput quota isn't available.
- SHARED: The- AI.GENERATEfunction only uses dynamic shared quota (DSQ), even if you have purchased Provisioned Throughput quota.
- UNSPECIFIED: The- AI.GENERATEfunction uses quota as follows:- If you haven't purchased Provisioned Throughput quota,
the AI.GENERATEfunction uses DSQ quota.
- If you have purchased Provisioned Throughput quota,
the AI.GENERATEfunction uses the Provisioned Throughput quota first. If requests exceed the Provisioned Throughput quota, the overflow traffic uses DSQ quota.
 
- If you haven't purchased Provisioned Throughput quota,
the 
 - The default value is - UNSPECIFIED.
- MODEL_PARAMS: a- JSONliteral that provides additional parameters to the model. The- MODEL_PARAMSvalue must conform to the- generateContentrequest body format. You can provide a value for any field in the request body except for the- contentsfield; the- contentsfield is populated with the- PROMPTargument value.
- OUTPUT_SCHEMA: a- STRINGvalue that specifies the schema of the output, in the form- field_name1 data_type1, field_name2 data_type2, .... Supported data types include- STRING,- INT64,- FLOAT64,- BOOL,- ARRAY, and- STRUCT.
Output
AI.GENERATE returns a STRUCT value for each row in the table. The struct
contains the following fields:
- result: a- STRINGvalue containing the model's response to the prompt. The result is- NULLif the request fails or is filtered by responsible AI. If you specify an output schema then- resultis replaced by your custom schema.
- full_response: a JSON value containing the response from the- projects.locations.endpoints.generateContentcall to the model. The generated text is in the- textelement.
- status: a- STRINGvalue that contains the API response status for the corresponding row. This value is empty if the operation was successful.
Examples
The following examples assume that your connection and input tables are in your default project.
Describe cities
Suppose you have the following table called mydataset.cities with a single
city column:
+---------+ | city | +---------+ | Seattle | | Beijing | | Paris | | London | +---------+
To generate a short description of each city, you can call the
AI.GENERATE function and select the result field in the output
by running the following query:
SELECT city, AI.GENERATE( ('Give a short, one sentence description of ', city), connection_id => 'us.test_connection', endpoint => 'gemini-2.0-flash').result FROM mydataset.cities;
The result is similar to the following:
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | city | result | +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Seattle | Seattle is a vibrant city nestled between mountains and water, renowned for its coffee culture, tech industry, and rainy weather. | | Beijing | Beijing is a vibrant metropolis where ancient history meets modern innovation, offering a captivating blend of cultural treasures and bustling urban life. | | Paris | Paris is a romantic city renowned for its iconic landmarks, elegant architecture, and vibrant culture. | | London | London, a vibrant global metropolis brimming with history, culture, and innovation. | +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
Use structured output
Suppose you have the following table called mydataset.states with a single
state column of US states:
+------------+ | state | +------------+ | Washington | | Oregon | | California | | Hawaii | +------------+
The following query generates state capitals for a list of states.
The query uses the output_schema argument to set two custom fields in the
output struct: state and capital.
SELECT state, AI.GENERATE( ('What is the capital of ', state, '?'), connection_id => 'us.example_connection', endpoint => 'gemini-2.0-flash', output_schema => 'state STRING, capital STRING').capital FROM mydataset.states;
The result is similar to the following:
+------------+------------+ | state | capital | +------------+------------+ | Washington | Olympia | | Oregon | Salem | | California | Sacramento | | Hawaii | Honolulu | +------------+------------+
The following query shows how to set the model_params argument to
specify a label for the request:
SELECT state, AI.GENERATE( ('What is the capital of ', state, '?'), connection_id => 'us.example_connection', endpoint => 'gemini-2.0-flash', model_params => JSON '{"labels":{"key": "my_key", "value": "useful_value"}}', output_schema => 'state STRING, capital STRING').capital FROM mydataset.states;
Use ObjectRefRuntime input
Suppose you have the following table called mydataset.animals with a single
STRUCT column that uses the ObjectRef format and contains images of
animals:
+----------------------------+-----------------+--------------------+----------------------------------------------------------+
| animals.uri                | animals.version | animals.authorizer | animals.details                                          |
+----------------------------+-----------------+--------------------+----------------------------------------------------------+
| gs://mybucket/snake.jpeg   | 12345678        | us.conn            | {"gcs_metadata":{"content_type":"image/jpeg","md5_hash"… |
+----------------------------+-----------------+--------------------+----------------------------------------------------------+
| gs://mybucket/horse.bmp    | 23456789        | us.conn            | {"gcs_metadata":{"content_type":"image/bmp","md5_hash"…  |
+----------------------------+-----------------+--------------------+----------------------------------------------------------+
| gs://mybucket/spider.jpeg  | 234567890       | us.conn            | {"gcs_metadata":{"content_type":"image/jpeg","md5_hash"… |
+----------------------------+-----------------+--------------------+----------------------------------------------------------+To generate a description of each animal, call the
AI.GENERATE function and select the result field in the output
by running the following query:
SELECT AI.GENERATE(('Describe ', OBJ.GET_ACCESS_URL(animals, 'r'), ' in ten words or less'), connection_id => 'us.test_connection', endpoint => 'gemini-2.0-flash').result FROM mydataset.animals;
The result is similar to the following:
+---------------------------------------------------+ | result | +---------------------------------------------------+ | A green snake coiled on a tree branch | | A black horse standing near a fence | | A small yellow spider hiding under a flower petal | +---------------------------------------------------+
Use grounding with Google Search
The following query shows how to set the model_params argument to use
Google Search grounding for the request. You can only use
Google Search grounding with Gemini 2.0 or later models.
SELECT name, AI.GENERATE( ('Please check the weather of ', name, ' for today.'), connection_id => 'us.test_connection', endpoint => 'gemini-2.0-flash-001', model_params => JSON '{"tools": [{"googleSearch": {}}]}' ) FROM UNNEST(['Seattle', 'NYC', 'Austin']) AS name;
Set the thinking budget for a Gemini 2.5 Flash model
The following query shows how to set the model_params argument to set the
model's thinking budget to 0 for the request:
SELECT AI.GENERATE( ('What is the capital of Monaco?'), connection_id => 'us.test_connection', endpoint => 'gemini-2.5-flash', model_params => JSON '{"generation_config":{"thinking_config": {"thinking_budget": 0}}}');
Use Vertex AI Provisioned Throughput
You can use
Vertex AI Provisioned Throughput
with the AI.GENERATE function to provide consistent high throughput for
requests. The remote model that you reference in the AI.GENERATE function
must use a
supported Gemini model
in order for you to use Provisioned Throughput.
To use Provisioned Throughput,
calculate your Provisioned Throughput requirements
and then
purchase Provisioned Throughput
quota before running the AI.GENERATE function. When you purchase
Provisioned Throughput, do the following:
- For Model, select the same Gemini model as the one used
by the remote model that you reference in the AI.GENERATEfunction.
- For Region, select the same region as the dataset that contains the remote model that you reference in the - AI.GENERATEfunction, with the following exceptions:- If the dataset is in the USmulti-region, select theus-central1region.
- If the dataset is in the EUmulti-region, select theeurope-west4region.
 
- If the dataset is in the 
After you submit the order, wait for the order to be approved and appear on the Orders page.
After you have purchased Provisioned Throughput quota, use the
REQUEST_TYPE argument to determine how the AI.GENERATE function uses
the quota.
Locations
You can run AI.GENERATE in all of the
regions
that support Gemini models, and also in the US and EU
multi-regions.
Quotas
See Vertex AI and Cloud AI service functions quotas and limits.
What's next
- For more information about using Vertex AI models to generate text and embeddings, see Generative AI overview.
- For more information about using Cloud AI APIs to perform AI tasks, see AI application overview.
- For more information about supported SQL statements and functions for generative AI models, see End-to-end user journeys for generative AI models.