使用 Vertex AI 的 Gemini API 生成內容

使用 generateContentstreamGenerateContent 透過 Gemini 生成內容。

Gemini 模型系列包含可處理多模態提示要求的多模態模型。「多模態」一詞表示您可以在提示中使用多種模態或輸入類型。非多模態模型只接受文字提示。包括文字、音訊、影片等。

建立 Google Cloud 帳戶即可開始使用

如要開始使用 Vertex AI 的 Gemini API,請建立帳戶 Google Cloud

建立帳戶後,請參閱這份文件,瞭解 Gemini 模型要求主體模型參數回應主體,以及一些要求範例。

準備就緒後,請參閱 Vertex AI 中的 Gemini API 快速入門導覽課程,瞭解如何使用程式設計語言 SDK 或 REST API,將要求傳送至 Vertex AI 中的 Gemini API。

支援的模型

所有 Gemini 模型都支援生成內容。

參數清單

如需實作詳情,請參閱範例

要求主體

{
  "cachedContent": string,
  "contents": [
    {
      "role": string,
      "parts": [
        {
          // Union field data can be only one of the following:
          "text": string,
          "inlineData": {
            "mimeType": string,
            "data": string
          },
          "fileData": {
            "mimeType": string,
            "fileUri": string
          },
          // End of list of possible types for union field data.

          "videoMetadata": {
            "startOffset": {
              "seconds": integer,
              "nanos": integer
            },
            "endOffset": {
              "seconds": integer,
              "nanos": integer
            },
            "fps": double
          }
        }
      ]
    }
  ],
  "systemInstruction": {
    "role": string,
    "parts": [
      {
        "text": string
      }
    ]
  },
  "tools": [
    {
      "functionDeclarations": [
        {
          "name": string,
          "description": string,
          "parameters": {
            object (OpenAPI Object Schema)
          }
        }
      ]
    }
  ],
  "safetySettings": [
    {
      "category": enum (HarmCategory),
      "threshold": enum (HarmBlockThreshold)
    }
  ],
  "generationConfig": {
    "temperature": number,
    "topP": number,
    "topK": number,
    "candidateCount": integer,
    "maxOutputTokens": integer,
    "presencePenalty": float,
    "frequencyPenalty": float,
    "stopSequences": [
      string
    ],
    "responseMimeType": string,
    "responseSchema": schema,
    "seed": integer,
    "responseLogprobs": boolean,
    "logprobs": integer,
    "audioTimestamp": boolean
  },
  "labels": {
    string: string
  }
}

要求主體包含下列參數的資料:

參數

cachedContent

選用: string

用來做為脈絡的快取內容名稱,可提供預測結果。格式: projects/{project}/locations/{location}/cachedContents/{cachedContent}

contents

必要條件:Content

目前與模型對話的內容。

如果是單輪查詢,則為單一執行個體。如果是多輪查詢,這個重複欄位會包含對話記錄和最新要求。

systemInstruction

自由參加:Content

適用於 gemini-2.0-flashgemini-2.0-flash-lite

指示模型,引導模型提升成效。例如:「請盡可能簡潔地回答」或「請勿在回覆中使用技術用語」。

text 字串會計入權杖限制。

系統會忽略 systemInstructionrole 欄位,不會影響模型效能。

tools

(選用步驟) 這段程式碼可讓系統與外部系統互動,在模型知識和範圍以外執行動作或一系列動作。請參閱函式呼叫

toolConfig

(選用步驟) 請參閱函式呼叫

safetySettings

自由參加:SafetySetting

根據要求封鎖不安全內容的設定。

違規處置日期:GenerateContentResponse.candidates

generationConfig

自由參加:GenerationConfig

生成設定。

labels

自由參加:string

您可以鍵/值組合的形式,將中繼資料新增至 API 呼叫。

contents

包含郵件多部分內容的基本結構化資料類型。

這個類別包含兩個主要屬性:rolepartsrole 屬性表示內容的製作人,而 parts 屬性包含多個元素,每個元素代表訊息中的資料區隔。

參數

role

string

建立訊息的實體身分。支援的值如下:

  • user:表示訊息是由真人傳送,通常是使用者產生的訊息。
  • model:表示訊息是由模型生成。

在多輪對話中,系統會使用 model 值將模型訊息插入對話。

parts

Part

組成單一郵件的排序部分清單。不同部分可能會有不同的 IANA MIME 類型

如要瞭解輸入內容的限制 (例如詞元或圖片數量上限),請參閱「Google 模型」頁面的模型規格。

如要計算要求中的權杖數量,請參閱「取得權杖數量」。

parts

包含媒體的資料類型,是多部分 Content 訊息的一部分。

參數

text

自由參加:string

文字提示或程式碼片段。

inlineData

自由參加:Blob

以原始位元組形式內嵌資料。

如果是 gemini-2.0-flash-litegemini-2.0-flash,最多可使用 inlineData 指定 3, 000 張圖片。

fileData

自由參加:fileData

儲存在檔案中的資料。

functionCall

選用:FunctionCall

其中包含代表 FunctionDeclaration.name 欄位的字串,以及結構化 JSON 物件,內含模型預測的函式呼叫參數。

請參閱函式呼叫

functionResponse

選用:FunctionResponse

FunctionCall 的結果輸出內容,其中包含代表 FunctionDeclaration.name 欄位的字串,以及包含函式呼叫任何輸出內容的結構化 JSON 物件。做為模型的脈絡資訊。

請參閱函式呼叫

videoMetadata

自由參加:VideoMetadata

如果是影片輸入內容,則為影片的開始和結束偏移量 (Duration 格式),以及影片的影格速率。舉例來說,如要指定從 1:00 開始的 10 秒片段,且影格速率為每秒 10 個影格,請設定下列項目:

  • "startOffset": { "seconds": 60 }
  • "endOffset": { "seconds": 70 }
  • "fps": 10.0

只有在影片資料以 inlineDatafileData 呈現時,才應指定中繼資料。

blob

內容 Blob。請盡可能以文字而非原始位元組的形式傳送。

參數

mimeType

string

datafileUri 欄位中指定檔案的媒體類型。可接受的值包括:

按一下即可展開 MIME 類型

  • application/pdf
  • audio/mpeg
  • audio/mp3
  • audio/wav
  • image/png
  • image/jpeg
  • image/webp
  • text/plain
  • video/mov
  • video/mpeg
  • video/mp4
  • video/mpg
  • video/avi
  • video/wmv
  • video/mpegps
  • video/flv

如果是 gemini-2.0-flash-litegemini-2.0-flash,音訊檔案長度上限為 8.4 小時,影片檔案長度上限為 1 小時 (不含音訊)。詳情請參閱 Gemini 音訊影片需求條件。

文字檔案必須採用 UTF-8 編碼。文字檔內容會計入權杖限制。

圖片解析度沒有限制。

data

bytes

圖片、PDF 或影片的 Base64 編碼,可內嵌在提示中。內嵌媒體時,您也必須指定資料的媒體類型 (mimeType)。

大小限制:20 MB

FileData

URI 或網址資料。

參數

mimeType

string

資料的 IANA MIME 類型

fileUri

string

要加入提示的檔案 URI 或網址。可接受的值包括:

  • Cloud Storage 值區 URI:物件必須可公開讀取,或位於傳送要求的 Google Cloud 專案中。對於 gemini-2.0-flashgemini-2.0-flash-lite,大小上限為 2 GB。
  • HTTP 網址:檔案網址必須可公開讀取。每項要求可指定一個影片檔案、一個音訊檔案,以及最多 10 個圖片檔案。音訊檔案、影片檔案和文件不得超過 15 MB。
  • YouTube 影片網址:YouTube 影片必須由您用來登入 Google Cloud 控制台的帳戶擁有,或是設為公開。每個要求僅支援一個 YouTube 影片網址。

指定 fileURI 時,您也必須指定檔案的媒體類型 (mimeType)。如果啟用 VPC Service Controls,系統不支援為 fileURI 指定媒體檔案網址。

functionCall

模型傳回的預測 functionCall,其中包含代表 functionDeclaration.name 的字串,以及包含參數及其值的結構化 JSON 物件。

參數

name

string

要呼叫的函式名稱。

args

Struct

JSON 物件格式的函式參數和值。

如需參數詳細資料,請參閱「函式呼叫」。

functionResponse

FunctionCall 的輸出結果會包含代表 FunctionDeclaration.name 的字串。也包含結構化 JSON 物件,內含函式的輸出內容 (並將其做為模型的背景資訊)。其中應包含根據模型預測結果建立的 FunctionCall

參數

name

string

要呼叫的函式名稱。

response

Struct

JSON 物件格式的函式回應。

videoMetadata

說明輸入影片內容的中繼資料。

參數

startOffset

自由參加:google.protobuf.Duration

影片的開始偏移。

endOffset

自由參加:google.protobuf.Duration

影片的結束時間偏移。

fps

自由參加:double

傳送至模型的影片畫面更新率。如果未指定,預設值為 1.0。可接受的最低價值為 0.0 (不含)。輸入值的上限為 24.0

safetySetting

安全性設定。

參數

category

自由參加:HarmCategory

要設定門檻的安全類別。可接受的值包括:

按一下即可展開安全類別

  • HARM_CATEGORY_SEXUALLY_EXPLICIT
  • HARM_CATEGORY_HATE_SPEECH
  • HARM_CATEGORY_HARASSMENT
  • HARM_CATEGORY_DANGEROUS_CONTENT

threshold

自由參加:HarmBlockThreshold

根據機率封鎖可能屬於指定安全類別的回應時,所使用的門檻。

  • OFF
  • BLOCK_NONE
  • BLOCK_LOW_AND_ABOVE
  • BLOCK_MEDIUM_AND_ABOVE
  • BLOCK_ONLY_HIGH

method

自由參加:HarmBlockMethod

指定門檻是用於機率還是嚴重程度分數。如未指定,系統會使用機率分數的門檻。

harmCategory

會封鎖內容的危害類別。

參數

HARM_CATEGORY_UNSPECIFIED

未指定危害類別。

HARM_CATEGORY_HATE_SPEECH

有害類別為仇恨言論。

HARM_CATEGORY_DANGEROUS_CONTENT

危害類別為危險內容。

HARM_CATEGORY_HARASSMENT

有害類別為騷擾。

HARM_CATEGORY_SEXUALLY_EXPLICIT

危害類別為情色露骨內容。

harmBlockThreshold

用來封鎖回應的機率門檻層級。

參數

HARM_BLOCK_THRESHOLD_UNSPECIFIED

未指定危害封鎖門檻。

BLOCK_LOW_AND_ABOVE

封鎖有害機率低等以上的內容 (即封鎖更多內容)。

BLOCK_MEDIUM_AND_ABOVE

封鎖有害機率中等以上的內容。

BLOCK_ONLY_HIGH

僅封鎖有害機率高的內容 (即減少封鎖)。

BLOCK_NONE

不封鎖任何內容。

OFF

如果所有類別都關閉,系統就會關閉安全模式

harmBlockMethod

系統會根據機率和嚴重程度的組合,封鎖超過機率門檻的回覆。

參數

HARM_BLOCK_METHOD_UNSPECIFIED

未指定危害封鎖方法。

SEVERITY

損害封鎖方法會同時使用機率和嚴重性分數。

PROBABILITY

危害封鎖方法會使用機率分數。

generationConfig

生成提示時使用的設定。

參數

temperature

自由參加:float

系統會在生成回覆時使用溫度進行取樣,也就是套用 topPtopK 時。溫度參數會決定選取詞元時的隨機程度。 如果希望提示生成較不具開放性和創意性的回覆,建議調低溫度參數。另一方面,如果溫度參數較高,則可能產生較多元或有創意的結果。如果溫度參數為 0,模型一律會選取可能性最高的詞元。在這種情況下,特定提示的回覆大多是確定性的,但仍可能出現少量差異。

如果模型的回覆太普通、太短或提供了備用回覆,再試試看調高 Temperature。

  • gemini-2.0-flash-lite 的範圍:0.0 - 2.0 (預設值:1.0)
  • gemini-2.0-flash 的範圍:0.0 - 2.0 (預設值:1.0)

詳情請參閱內容生成參數

topP

自由參加:float

如果指定,系統會使用核心取樣。

Top-P 會影響模型選取輸出符記的方式。模型會按照機率最高 (請見「Top-K」) 到最低的順序選取符記,直到所選符記的機率總和等於「Top-P」值。舉例來說,假設詞元 A、B 和 C 的可能性分別為 0.3、0.2 和 0.1,而「Top-P」值為 0.5,模型會依據 temperature 選擇 A 或 B 做為下一個詞元,並排除 C。

如要取得較不隨機的回覆,請指定較低的值;如要取得較隨機的回覆,請調高此值。

  • 範圍:0.0 - 1.0
  • gemini-2.0-flash-lite」的預設值:0.95
  • gemini-2.0-flash」的預設值:0.95

candidateCount

自由參加:int

要傳回的回應變體數量。每次提出要求時,系統會針對所有候選答案的輸出權杖收費,但只會針對輸入權杖收費一次。

指定多個候選人是預先發布功能,適用於 generateContent (不支援 streamGenerateContent)。支援的機型如下:

  • gemini-2.0-flash-lite1-8,預設值:1
  • gemini-2.0-flash1-8,預設值:1

maxOutputTokens

選用:int

回覆內可以生成的權杖數量上限。一個詞元約為四個字元。100 個符記約等於 60 到 80 個字。

如要取得較短的回覆,請指定較低的值;如要取得可能較長的回覆,請調高此值。

詳情請參閱內容生成參數

stopSequences

自由參加:List[string]

指定字串清單,如果模型在回覆中遇到其中一個字串,就會停止生成文字。如果字串在回應中出現多次,系統會在第一次遇到該字串時截斷回應。字串須區分大小寫。

舉例來說,如果未指定 stopSequences 時傳回的回應如下:

public static string reverse(string myString)

則將 stopSequences 設為 ["Str", "reverse"] 時傳回的回應如下:

public static string

清單最多可有 5 個項目。

詳情請參閱內容生成參數

presencePenalty

自由參加:float

正向處置。

正值會懲罰已出現在生成文字中的符記,提高生成更多元內容的機率。

presencePenalty 的最大值為 2.0,但不包括 2.0。最小值為 -2.0

frequencyPenalty

自由參加:float

正值會懲罰在生成的文字中重複出現的符記,降低重複內容的機率。

frequencyPenalty 的最大值為 2.0,但不含 2.0。最小值為 -2.0

responseMimeType

自由參加:string (enum)

生成候選文字的輸出回應 MIME 類型。

支援的 MIME 類型如下:

  • application/json:候選人中的 JSON 回應。
  • text/plain (預設):輸出純文字。
  • text/x.enum:如為分類工作,請輸出回應結構定義中定義的列舉值。

請指定適當的回覆類型,避免發生非預期的行為。舉例來說,如果您需要 JSON 格式的回應,請指定 application/json,而非 text/plain

text/plain 不支援與 responseSchema 搭配使用。

responseSchema

選用:結構定義

生成候選文字時必須遵循的結構定義。詳情請參閱「控管生成的輸出內容」。

如要使用這個參數,您必須為 responseMimeType 參數指定支援的 MIME 類型,但不能是 text/plain

seed

自由參加:int

如果將種子固定為特定值,模型會盡可能為重複要求提供相同的回覆。我們不保證輸出內容具有確定性。 此外,即使使用相同的種子值,如果變更模型或參數設定 (例如溫度),回覆還是有可能不同。根據預設,系統會使用隨機種子值。

responseLogprobs

自由參加:boolean

如果為 true,則傳回模型在每個步驟中選擇的權杖對數機率。這項參數預設為 false

logprobs

自由參加:int

在每個生成步驟中,傳回最有可能的候選符記的記錄機率。模型選取的符記可能與每個步驟中的最佳候選符記不同。請使用 120 範圍內的整數值,指定要傳回的候選人數。

您必須啟用 responseLogprobs,才能使用這項參數。

audioTimestamp

自由參加:boolean

適用於下列機型:

  • Gemini 2.0 Flash-Lite
  • Gemini 2.0 Flash

可瞭解純音訊檔案的時間戳記。

這是預先發布版功能。

回應主體

{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": string
          }
        ]
      },
      "finishReason": enum (FinishReason),
      "safetyRatings": [
        {
          "category": enum (HarmCategory),
          "probability": enum (HarmProbability),
          "blocked": boolean
        }
      ],
      "citationMetadata": {
        "citations": [
          {
            "startIndex": integer,
            "endIndex": integer,
            "uri": string,
            "title": string,
            "license": string,
            "publicationDate": {
              "year": integer,
              "month": integer,
              "day": integer
            }
          }
        ]
      },
      "avgLogprobs": double,
      "logprobsResult": {
        "topCandidates": [
          {
            "candidates": [
              {
                "token": string,
                "logProbability": float
              }
            ]
          }
        ],
        "chosenCandidates": [
          {
            "token": string,
            "logProbability": float
          }
        ]
      }
    }
  ],
  "usageMetadata": {
    "promptTokenCount": integer,
    "candidatesTokenCount": integer,
    "totalTokenCount": integer
  },
  "modelVersion": string
}
回應元素 說明
modelVersion 用於生成內容的模型和版本。例如: gemini-2.0-flash-lite-001
text 生成的文字。
finishReason 模型停止生成權杖的原因。如果為空白,表示模型尚未停止產生權杖。由於回覆會使用提示做為脈絡,因此無法變更模型停止生成符記的行為。
  • FINISH_REASON_STOP:模型自然停止點或提供的停止序列。
  • FINISH_REASON_MAX_TOKENS:已達到要求中指定的權杖數量上限。
  • FINISH_REASON_SAFETY:由於回覆內容涉及安全疑慮,系統已停止生成權杖。請注意,如果內容篩選器封鎖輸出內容,Candidate.content 會是空白。
  • FINISH_REASON_RECITATION:由於系統將回覆標示為未經授權的引用內容,因此停止生成權杖。
  • FINISH_REASON_BLOCKLIST:由於回覆含有封鎖字詞,因此系統停止生成權杖。
  • FINISH_REASON_PROHIBITED_CONTENT:由於回應遭檢舉含有違禁內容 (例如兒少性虐待內容),因此系統已停止產生權杖。
  • FINISH_REASON_SPII:由於系統在回覆中偵測到具敏感性的個人識別資訊 (SPII),因此停止產生權杖。
  • FINISH_REASON_MALFORMED_FUNCTION_CALL:候選人因函式呼叫格式錯誤且無法剖析而遭到封鎖。
  • FINISH_REASON_OTHER:導致權杖停止的所有其他原因
  • FINISH_REASON_UNSPECIFIED:未指定完成原因。
category 要設定門檻的安全類別。可接受的值包括:

按一下即可展開安全類別

  • HARM_CATEGORY_SEXUALLY_EXPLICIT
  • HARM_CATEGORY_HATE_SPEECH
  • HARM_CATEGORY_HARASSMENT
  • HARM_CATEGORY_DANGEROUS_CONTENT
probability 內容中的危害機率等級。
  • HARM_PROBABILITY_UNSPECIFIED
  • NEGLIGIBLE
  • LOW
  • MEDIUM
  • HIGH
blocked 與安全屬性相關聯的布林值標記,指出模型的輸入或輸出內容是否遭到封鎖。
startIndex 整數,指定 content 中引文的起始位置。startIndex 以位元組為單位,是根據以 UTF-8 編碼的回應計算而得。
endIndex 整數,指定 content 中引文的結尾位置。endIndex 以位元組為單位,是根據以 UTF-8 編碼的回應計算而得。
url 引用來源的網址。網址來源的例子包括新聞網站或 GitHub 存放區。
title 引用來源的標題。例如新聞報導或書籍的標題。
license 與引文相關聯的授權。
publicationDate 引用內容的發布日期。有效格式為 YYYYYYYY-MMYYYY-MM-DD
avgLogprobs 候選人的平均記錄機率。
logprobsResult 在每個步驟中,傳回候選符記 (topCandidates) 和實際選取的符記 (chosenCandidates)。
token 生成式 AI 模型會將文字資料拆解成詞元,以便處理,詞元可以是字元、字詞或詞句。
logProbability 對數機率值,表示模型對特定權杖的信心。
promptTokenCount 要求中的權杖數量。
candidatesTokenCount 回應中的權杖數量。
totalTokenCount 要求和回覆中的權杖數量。

範例

文字生成

根據文字輸入生成文字回覆。

Python 適用的 Gen AI SDK

from google import genai
from google.genai.types import HttpOptions

client = genai.Client(http_options=HttpOptions(api_version="v1"))
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents="How does AI work?",
)
print(response.text)
# Example response:
# Okay, let's break down how AI works. It's a broad field, so I'll focus on the ...
#
# Here's a simplified overview:
# ...

Python (OpenAI)

您可以使用 OpenAI 程式庫呼叫 Inference API。詳情請參閱「 使用 OpenAI 程式庫呼叫 Vertex AI 模型」。

from google.auth import default
import google.auth.transport.requests

import openai

# TODO(developer): Update and un-comment below lines
# project_id = "PROJECT_ID"
# location = "us-central1"

# Programmatically get an access token
credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
credentials.refresh(google.auth.transport.requests.Request())

# OpenAI Client
client = openai.OpenAI(
    base_url=f"https://{location}-aiplatform.googleapis.com/v1/projects/{project_id}/locations/{location}/endpoints/openapi",
    api_key=credentials.token,
)

response = client.chat.completions.create(
    model="google/gemini-2.0-flash-001",
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
)

print(response)

Go

import (
	"context"
	"fmt"
	"io"

	"google.golang.org/genai"
)

// generateWithText shows how to generate text using a text prompt.
func generateWithText(w io.Writer) error {
	ctx := context.Background()

	client, err := genai.NewClient(ctx, &genai.ClientConfig{
		HTTPOptions: genai.HTTPOptions{APIVersion: "v1"},
	})
	if err != nil {
		return fmt.Errorf("failed to create genai client: %w", err)
	}

	resp, err := client.Models.GenerateContent(ctx,
		"gemini-2.5-flash",
		genai.Text("How does AI work?"),
		nil,
	)
	if err != nil {
		return fmt.Errorf("failed to generate content: %w", err)
	}

	respText := resp.Text()

	fmt.Fprintln(w, respText)
	// Example response:
	// That's a great question! Understanding how AI works can feel like ...
	// ...
	// **1. The Foundation: Data and Algorithms**
	// ...

	return nil
}

使用多模態提示

從多模態輸入內容 (例如文字和圖片) 生成文字回覆。

Python 適用的 Gen AI SDK

from google import genai
from google.genai.types import HttpOptions, Part

client = genai.Client(http_options=HttpOptions(api_version="v1"))
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=[
        "What is shown in this image?",
        Part.from_uri(
            file_uri="gs://cloud-samples-data/generative-ai/image/scones.jpg",
            mime_type="image/jpeg",
        ),
    ],
)
print(response.text)
# Example response:
# The image shows a flat lay of blueberry scones arranged on parchment paper. There are ...

Python (OpenAI)

您可以使用 OpenAI 程式庫呼叫 Inference API。詳情請參閱「 使用 OpenAI 程式庫呼叫 Vertex AI 模型」。


from google.auth import default
import google.auth.transport.requests

import openai

# TODO(developer): Update and un-comment below lines
# project_id = "PROJECT_ID"
# location = "us-central1"

# Programmatically get an access token
credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
credentials.refresh(google.auth.transport.requests.Request())

# OpenAI Client
client = openai.OpenAI(
    base_url=f"https://{location}-aiplatform.googleapis.com/v1/projects/{project_id}/locations/{location}/endpoints/openapi",
    api_key=credentials.token,
)

response = client.chat.completions.create(
    model="google/gemini-2.0-flash-001",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Describe the following image:"},
                {
                    "type": "image_url",
                    "image_url": "gs://cloud-samples-data/generative-ai/image/scones.jpg",
                },
            ],
        }
    ],
)

print(response)

Go

import (
	"context"
	"fmt"
	"io"

	genai "google.golang.org/genai"
)

// generateWithTextImage shows how to generate text using both text and image input
func generateWithTextImage(w io.Writer) error {
	ctx := context.Background()

	client, err := genai.NewClient(ctx, &genai.ClientConfig{
		HTTPOptions: genai.HTTPOptions{APIVersion: "v1"},
	})
	if err != nil {
		return fmt.Errorf("failed to create genai client: %w", err)
	}

	modelName := "gemini-2.5-flash"
	contents := []*genai.Content{
		{Parts: []*genai.Part{
			{Text: "What is shown in this image?"},
			{FileData: &genai.FileData{
				// Image source: https://storage.googleapis.com/cloud-samples-data/generative-ai/image/scones.jpg
				FileURI:  "gs://cloud-samples-data/generative-ai/image/scones.jpg",
				MIMEType: "image/jpeg",
			}},
		},
			Role: "user"},
	}

	resp, err := client.Models.GenerateContent(ctx, modelName, contents, nil)
	if err != nil {
		return fmt.Errorf("failed to generate content: %w", err)
	}

	respText := resp.Text()

	fmt.Fprintln(w, respText)

	// Example response:
	// The image shows an overhead shot of a rustic, artistic arrangement on a surface that ...

	return nil
}

串流文字回覆

根據文字輸入內容生成串流模型回應。

Python 適用的 Gen AI SDK

from google import genai
from google.genai.types import HttpOptions

client = genai.Client(http_options=HttpOptions(api_version="v1"))

for chunk in client.models.generate_content_stream(
    model="gemini-2.5-flash",
    contents="Why is the sky blue?",
):
    print(chunk.text, end="")
# Example response:
# The
#  sky appears blue due to a phenomenon called **Rayleigh scattering**. Here's
#  a breakdown of why:
# ...

Python (OpenAI)

您可以使用 OpenAI 程式庫呼叫 Inference API。詳情請參閱「 使用 OpenAI 程式庫呼叫 Vertex AI 模型」。

from google.auth import default
import google.auth.transport.requests

import openai

# TODO(developer): Update and un-comment below lines
# project_id = "PROJECT_ID"
# location = "us-central1"

# Programmatically get an access token
credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
credentials.refresh(google.auth.transport.requests.Request())

# OpenAI Client
client = openai.OpenAI(
    base_url=f"https://{location}-aiplatform.googleapis.com/v1/projects/{project_id}/locations/{location}/endpoints/openapi",
    api_key=credentials.token,
)

response = client.chat.completions.create(
    model="google/gemini-2.0-flash-001",
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
    stream=True,
)
for chunk in response:
    print(chunk)

Go

import (
	"context"
	"fmt"
	"io"

	genai "google.golang.org/genai"
)

// generateWithTextStream shows how to generate text stream using a text prompt.
func generateWithTextStream(w io.Writer) error {
	ctx := context.Background()

	client, err := genai.NewClient(ctx, &genai.ClientConfig{
		HTTPOptions: genai.HTTPOptions{APIVersion: "v1"},
	})
	if err != nil {
		return fmt.Errorf("failed to create genai client: %w", err)
	}

	modelName := "gemini-2.5-flash"
	contents := genai.Text("Why is the sky blue?")

	for resp, err := range client.Models.GenerateContentStream(ctx, modelName, contents, nil) {
		if err != nil {
			return fmt.Errorf("failed to generate content: %w", err)
		}

		chunk := resp.Text()

		fmt.Fprintln(w, chunk)
	}

	// Example response:
	// The
	//  sky is blue
	//  because of a phenomenon called **Rayleigh scattering**. Here's the breakdown:
	// ...

	return nil
}

模型版本

如要使用自動更新版本,請指定模型名稱,但不要加上尾端的版本號碼,例如 gemini-2.0-flash 而不是 gemini-2.0-flash-001

詳情請參閱「Gemini 模型版本和生命週期」。

後續步驟