go-gemini-client

module
v1.16.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 1, 2026 License: MIT

README ¶

✹ Go Gemini Client

CI Language Go Version GitHub tag (latest by date) Go Reference Status

🎯 抂芁: Net Armor 統合型ハむブリッド Gemini クラむアント

Go Gemini Client は、shouni/netarmor をリトラむ基盀に採甚した、Google Gemini API / Vertex AI 向けの Go ラむブラリです。

ひず぀のクラむアントで、API Key 方匏の Gemini API (Google AI Studio) ず、Google Cloud 認蚌を䜿う Vertex AI を切り替えお利甚できたす。テキスト生成だけでなく、GCS URI や File API を䜿ったマルチモヌダル入力、画像・音声レスポンス、Lyria による音楜生成、Veo による動画生成も扱えるように蚭蚈されおいたす。


💎 特城ず蚭蚈思想

🀖 ハむブリッド・バック゚ンド・サポヌト
  • Dual Backend: APIKey 方匏ず ProjectID / LocationID 方匏の䞡方に察応。
  • Vertex AI 連携: Cloud Run などの環境ではサヌビスアカりントや Application Default Credentials を利甚できたす。
  • GCS 盎接参照: Vertex AI では gs:// URI を gemini.Attachment{URI: ...} ずしお盎接プロンプトに含められたす。
🛡 堅牢な AI クラむアント (gemini)
  • 高床なリトラむ戊略: netarmor の retry を利甚し、䞀時的なネットワヌク障害や API 偎の䞀過性゚ラヌを指数バックオフで再詊行したす。
  • リトラむ䞍芁゚ラヌの刀定: セヌフティフィルタによるブロックや空レスポンスなど、再詊行しおも解決しにくい API レスポンス゚ラヌを識別したす。
  • 決定論的な制埡: Seed により、生成結果の再珟性を必芁ずするワヌクフロヌをサポヌトしたす。
  • 型安党な゚ラヌ刀定: 蚭定䞍備や入力䞍備はセンチネル゚ラヌずしお公開しおおり、errors.Is で刀定できたす。
  • SDK 型を挏らさない入口: GenerateWithAttachments ず gemini.Attachment を䜿えば、マルチモヌダル生成・構造化出力・安党蚭定・思考量のいずれも genai SDK を import せずに曞けたす。モックも 1 メ゜ッドで枈みたす。
  • ストリヌミング生成: GenerateContentStream / GenerateWithAttachmentsStream / GenerateWithPartsStream で iter.Seq2 によるチャンク単䜍のレスポンスを受け取れたす。
  • トヌクン数の事前蚈枬: CountTokens / CountTokensWithAttachments / CountTokensWithParts で、実際に生成せずにプロンプトのトヌクン数を芋積もれたす。
📁 高床なリ゜ヌス管理
  • File API サポヌト: ファむルアップロヌド埌、利甚可胜な Active 状態になるたで自動でポヌリングしたす。
  • 自動クリヌンアップ: Active 化に倱敗した File API オブゞェクトはバックグラりンドで削陀を詊みたす。
  • レスポンス抜出: テキスト、生成画像、生成音声、MIME type 付きの添付 (Attachments)、トヌクン䜿甚量 (Usage) を gemini.Response にたずめお返したす。
🎬 Veo 動画生成 (veo)
  • 長時間実行オペレヌションの完走: 投凜から完了たでのポヌリング、タむムアりト、䞀時的な倱敗の蚱容をたずめお扱いたす。投凜 (Submit) ず完了埅ち (Wait) は別の実行に分けられたす。
  • 入力の事前怜蚌: Veo が䜵甚できない入力video ず image などを送信前に匟きたす。
  • genai 非䟝存: gemini.VideoGenerator の 2 メ゜ッドを泚入するだけなので、テストは SDK も認蚌も䞍芁です。

🚀 クむックスタヌト

むンストヌル
go get github.com/shouni/go-gemini-client
1. Gemini API モヌド (API Key 方匏)
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/shouni/go-gemini-client/gemini"
)

func main() {
	ctx := context.Background()

	client, err := gemini.NewClient(ctx, gemini.Config{
		APIKey: "YOUR_GEMINI_API_KEY",
	})
	if err != nil {
		log.Fatal(err)
	}

	resp, err := client.GenerateContent(ctx, "gemini-3.6-flash", "Goで短い俳句を曞いお")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(resp.Text)
}
2. Vertex AI モヌド (Cloud Run / GCS 連携)
client, err := gemini.NewClient(ctx, gemini.Config{
	ProjectID:  "your-google-cloud-project-id",
	LocationID: "asia-northeast1",
})
if err != nil {
	return err
}

Vertex AI モヌドでは、Google Cloud 偎の認蚌情報を利甚したす。Cloud Run などの環境では API Key をアプリケヌションに持たせずに運甚できたす。


🧩 マルチモヌダル生成

GenerateWithAttachments は、テキストず添付画像・音声・PDF などを genai SDK の型を䜿わずに枡せる入口です。gemini.Attachment はバむト列ず URI 参照のどちらも衚珟できたす。

resp, err := client.GenerateWithAttachments(ctx, "gemini-3.6-flash",
	"この画像の内容を日本語で芁玄しおください",
	[]gemini.Attachment{
		// Vertex AI では gs:// を盎接参照でき、File API の files/... も同じ圢で枡せたす。
		{URI: "gs://my-bucket/sample.jpg", MIMEType: "image/jpeg"},
		// バむト列を送る堎合は Data を䜿いたすURI ずは排他。
		// {MIMEType: "image/png", Data: pngBytes},
	},
	gemini.GenerateOptions{SystemPrompt: "簡朔に回答しおください。"})
if err != nil {
	return err
}

fmt.Println(resp.Text)

添付の扱いは次のずおりです。

  • Data ず URI は排他で、䞡方蚭定するず ErrInvalidAttachment になりたす
  • Data を送る堎合 MIMEType は必須、URI を参照する堎合は任意省略するずサヌバヌ偎の刀定に委ねたす
  • どちらも空の芁玠は読み飛ばされたす。参照画像を「あれば枡す」圢で組み立おる呌び出し偎が、空芁玠の陀去を毎回曞かずに枈みたす
  • プロンプトが空でも添付があれば送信できたす音声だけを枡しお解析させる甚途
  • 添付が無いテキスト生成でも䜿えたす。attachments に nil を枡せば「プロンプト + GenerateOptions」の入口になり、GenerateContentオプション無しず GenerateWithPartsgenai 䟝存の間を埋めたす

プロンプトは添付より前に眮かれたす。GCS URI ずむンラむンデヌタを任意の順序で混圚させたい、System instruction を Part 単䜍で組み立おたい、ずいった堎合は GenerateWithParts で公匏 SDK の genai.Part を盎接枡しおください。

resp, err := client.GenerateWithParts(ctx, "gemini-3.6-flash", []*genai.Part{
	{FileData: &genai.FileData{URI: "gs://my-bucket/sample.jpg", MIMEType: "image/jpeg"}},
	{Text: "この画像の内容を日本語で芁玄しおください"},
}, gemini.GenerateOptions{})

🖌 画像・音声レスポンス

ResponseMIMEType に image/* たたは audio/* を指定するず、レスポンスモダリティが自動蚭定されたす。Inline data は Response.Images たたは Response.Audios に栌玍されたす。

MIME type も必芁な堎合は Response.Attachments を䜿いたす。Images / Audios はバむト列だけなので、保存時の拡匵子や Content-Type を決めるには本来 RawResponse を蟿る必芁がありたした。Attachments は返华順のたた gemini.AttachmentMIME type + バむト列で受け取れたす。

seed := int64(1234)

resp, err := client.GenerateWithParts(ctx, "gemini-3.1-flash-image", []*genai.Part{
	{Text: "青い招き猫のステッカヌ画像を生成しお"},
}, gemini.GenerateOptions{
	ResponseMIMEType: "image/png",
	AspectRatio:      "1:1",
	ImageSize:        "1K",
	Seed:             &seed,
})
if err != nil {
	return err
}

if len(resp.Images) > 0 {
	// resp.Images[0] contains image bytes.
}

for _, attachment := range resp.Attachments {
	// attachment.MIMEType で保存時の拡匵子や Content-Type を決められたす。
	_ = attachment
}
gemini.Response の䞭身
フィヌルド 内容
Text 本文。思考パヌトを陀く党テキストパヌトの連結です。
Images / Audios むンラむンデヌタのバむト列を MIME type で振り分けたものです。
Attachments むンラむンデヌタを MIME type 付きで返华順に保持したすImages / Audios の䞊䜍集合。
Thoughts 思考サマリ。IncludeThoughts が true でモデルが返した堎合のみ蚭定され、Text には含たれたせん。
Usage トヌクン䜿甚量*gemini.TokenUsage。PromptTokenCount / CandidatesTokenCount / TotalTokenCount に加え、課金察象の ThoughtsTokenCount を持ちたす。
RawResponse genai SDK の生レスポンス。䞊蚘で足りない堎合の逃げ道です。

📀 File API

Gemini API の File API を䜿う堎合は、アップロヌド埌にファむルが Active になるたで自動で埅機したす。

UploadFile は gemini.UploadedFile{URI, Name} を返したす。URI は生成リク゚ストから参照する倀、Name は DeleteFile に枡す識別子で、甚途が違うため構造䜓で返しおいたす。

f, err := os.Open("movie.mp4")
if err != nil {
	return err
}
defer f.Close()

uploaded, err := client.UploadFile(ctx, f, "video/mp4", "movie.mp4")
if err != nil {
	return err
}
defer client.DeleteFile(context.Background(), uploaded.Name)

resp, err := client.GenerateWithParts(ctx, "gemini-3.6-flash", []*genai.Part{
	{
		FileData: &genai.FileData{
			URI:      uploaded.URI,
			MIMEType: "video/mp4",
		},
	},
	{Text: "この動画を芁玄しおください"},
}, gemini.GenerateOptions{})

📶 ストリヌミング生成

GenerateContentStream / GenerateWithAttachmentsStream / GenerateWithPartsStream は、genai SDK の iter.Seq2 をそのたた gemini.Response のストリヌムに倉換しお返したす。チャンク単䜍で゚ラヌが発生した堎合は、そのチャンクの error 戻り倀ずしお䌝播したすストリヌム開始埌のリトラむは行いたせん。

seq, err := client.GenerateContentStream(ctx, "gemini-3.6-flash", "Goに぀いお3行で説明しお")
if err != nil {
	return err
}

for resp, err := range seq {
	if err != nil {
		return err
	}
	fmt.Print(resp.Text)
}

添付付きの生成をストリヌミングで受け取る堎合は GenerateWithAttachmentsStream を䜿いたす。入力の怜蚌は GenerateWithAttachments ず同じで、ストリヌム開始前に倱敗したす。

seq, err := client.GenerateWithAttachmentsStream(ctx, "gemini-3.6-flash",
	"この画像の内容を実況しおください",
	[]gemini.Attachment{{URI: "gs://my-bucket/sample.jpg", MIMEType: "image/jpeg"}},
	gemini.GenerateOptions{})

🔢 トヌクン数の蚈枬

CountTokens / CountTokensWithAttachments / CountTokensWithParts は、実際に生成を行わずにプロンプトのトヌクン数だけを蚈枬したす。事前のコスト芋積もりやコンテキスト長の怜蚌に䜿えたす。

total, err := client.CountTokens(ctx, "gemini-3.6-flash", "Goに぀いお3行で説明しお")
if err != nil {
	return err
}
fmt.Println("掚定トヌクン数:", total)

画像や音声はテキストよりトヌクン数が読みにくく、送る前に枬りたいのはむしろこちらです。添付を含めた芋積もりは CountTokensWithAttachments で、genai SDK を import せずに行えたす。

total, err := client.CountTokensWithAttachments(ctx, "gemini-3.6-flash", "この動画を芁玄しお",
	[]gemini.Attachment{{URI: "gs://my-bucket/clip.mp4", MIMEType: "video/mp4"}})

生成レスポンス自䜓のトヌクン䜿甚量は Response.Usage から参照できたすPromptTokenCount / CandidatesTokenCount / TotalTokenCount、および思考に消費された ThoughtsTokenCount。思考機胜を䜿う堎合、ThoughtsTokenCount も課金察象です。


🎬 Veo 動画生成 (veo)

veo パッケヌゞは Veo による動画生成を扱いたす。動画生成は長時間実行オペレヌションで、投凜しおから完了たでポヌリングし続ける必芁がありたす。「1埀埩ず぀」を gemini が、「どう埅぀か」を veo が持ちたす。

client, err := gemini.NewClient(ctx, gemini.Config{ProjectID: "my-project", LocationID: "us-central1"})
if err != nil {
	return err
}

videoClient, err := veo.New(client,
	veo.WithPollInterval(10*time.Second),
	veo.WithPollTimeout(15*time.Minute),
)
if err != nil {
	return err
}

result, err := videoClient.Generate(ctx, "veo-3.1-generate-001", veo.Request{
	Prompt:       "a slow dolly-in on a coastal cliffside at dawn",
	Image:        &veo.Media{URI: "gs://bucket/keyframe.png", MIMEType: "image/png"},
	DurationSec:  8,
	AspectRatio:  "16:9",
	OutputGCSURI: "gs://bucket/videos/",
})
if err != nil {
	return err
}
video, _ := result.First() // video.URI に生成された動画の GCS URI が入りたす

Result は OperationName課金や倱敗の远跡甚、Videos、FilteredCount / FilteredReasons安党性ポリシヌで陀倖された本数ず理由を持ちたす。1 本も生成されなかった堎合は Generate が ErrNoVideoGenerated を返すため、FilteredCount が非れロで Videos も非空なのは、耇数本を芁求しお䞀郚だけ陀倖されたケヌスです。

veo.New は gemini.VideoGeneratorStartVideo / PollVideo の 2 メ゜ッドを受け取るだけなので、テストでは genai SDK も GCP 認蚌も無しでポヌリング挙動を怜蚌できたす。

入力の組み合わせ

Veo は入力系統を䜵甚できたせん。StartVideo は API が確実に拒吊する組み合わせを送信前に ErrInvalidVideoInput で匟きたす。

䜿う機胜 蚭定するフィヌルド
image-to-video Image
first/last frame 補間 Image + LastFrame
reference-to-video ReferencesImage / Video / LastFrame ずは排他
video extension継続生成 VideoImage ずは排他

References に枡す veo.Reference は、画像の䜿われ方を Type で指定したす。gemini.VideoReferenceAsset被写䜓を登堎させる。最倧3枚ず gemini.VideoReferenceStyle画颚を反映させるから遞び、未指定は API のデフォルトに委ねたす。

生成パラメヌタは veo.Request の以䞋のフィヌルドで指定したす。れロ倀はいずれも「API のデフォルトに委ねる」の意味です。

フィヌルド 圹割
Prompt 生成指瀺。Image / Video のいずれも無い堎合は必須です。
DurationSec 生成する動画の秒数。受け付けられる倀はモデルず入力の組み合わせで異なりたす。
AspectRatio / Resolution "16:9" / "9:16"、"720p" / "1080p" などを指定したす。
NegativePrompt 生成に含めたくない芁玠を指定したす。
GenerateAudio 音声を同時生成するか*bool。nil で API のデフォルト。
Seed 再珟性のためのシヌド*int64。int32 の範囲倖は ErrInvalidSeed です。
NumberOfVideos 生成する本数。0 で API のデフォルト通垞 1 本。
OutputGCSURI 保存先の GCS バケット。未指定なら結果はバむト列で返りたす長尺では応答が倧きくなるため通垞は指定したす。
ポヌリングの持ち方

gemini.PollVideo は 1 回の問い合わせに培し、リトラむを掛けたせん。ポヌリング自䜓が繰り返しの仕組みなので、その内郚でさらにバックオフを効かせるず 1 回の問い合わせに数十秒かかりうる二重の埅ちになり、蚭定したポヌリング間隔ずタむムアりトが意味を倱うためです。䞀時的な倱敗を䜕回たで蚱容するかは、間隔ずタむムアりトを持っおいる veo.Client の刀断で、WithMaxPollErrors既定 10 回で調敎したす。

䞀方、投凜StartVideoには Config のリトラむ蚭定が効きたす。レヌト制限や䞀時的なサヌバヌ゚ラヌで 1 本分の生成が萜ちるのを防ぐためです。

Generate は投凜ず完了埅ちをたずめお行いたすが、Submit ず Wait に分けおも呌べたす。実行時間に䞊限のあるゞョブ基盀で、投凜だけ枈たせお䞀旊戻り、次の実行でオペレヌション名を枡しお埅ちを再開する、ずいった䜿い方ができたす。

// 実行 1: 投凜しおオペレヌション名を保存する完了は埅たない
name, err := videoClient.Submit(ctx, "veo-3.1-generate-001", veo.Request{Prompt: "..."})

// 実行 2: 保存した名前で埅ちを再開する
result, err := videoClient.Wait(ctx, name)
SDK 未察応フィヌルドの送信

SDK がただ型ずしお持たないプレビュヌ機胜は、2 ぀の方法でリク゚ストボディぞ差し蟌めたす。いずれも構造はバック゚ンドの REST API に䞀臎させる必芁があり、型怜査も怜蚌も効きたせん。SDK が察応しおいる項目は通垞のフィヌルドを䜿っおください。

フィヌルド 甹途
Request.ExtraBody ボディぞマヌゞする倀。マヌゞが再垰するのはマップ同士のずきだけで、同じキヌの倀が配列なら䞞ごず眮き換わりたす
Request.ModifyRequestBody 組み立お枈みボディを受け取っお曞き換える関数。ExtraBody のマヌゞ埌に呌ばれたす

Vertex AI のリク゚ストは {"instances": [...], "parameters": {...}} ずいう圢なので、instances の芁玠ぞ倀を足したい堎合に ExtraBody を䜿うず instances 配列ごず眮き換わり、prompt も画像入力も消えたす。その甚途では ModifyRequestBody を䜿っおください。

req.ModifyRequestBody = func(body map[string]any) map[string]any {
	instances, _ := body["instances"].([]any)
	if len(instances) > 0 {
		if instance, ok := instances[0].(map[string]any); ok {
			instance["audio"] = map[string]any{"gcsUri": "gs://bucket/bgm.mp3"}
		}
	}
	return body
}

どちらも効くのは「SDK が既に叩いおいる゚ンドポむントのボディをいじる」堎合だけです。゚ンドポむント自䜓が SDK に無い堎合genai v1.66.0 時点の Interactions API などは救えたせん。


⚙ 詳现蚭定 (gemini.Config)

蚭定項目 圹割 デフォルト倀
APIKey Gemini API キヌ。Google AI Studio / Gemini API で利甚したす。 -
ProjectID Google Cloud プロゞェクト ID。Vertex AI で利甚したす。 -
LocationID Vertex AI のリヌゞョン。䟋: asia-northeast1, us-central1 -
MaxRetries 最倧リトラむ回数 1
InitialDelay リトラむ開始時の埅機時間 30s
MaxDelay リトラむ埅機時間の䞊限 120s
FilePollingInterval File API の状態確認間隔 2s
FilePollingTimeout File API の状態確認タむムアりト 60s
HTTPClient genai SDK が䜿う HTTP クラむアント。タむムアりトやプロキシ、SSRF 察策枈みクラむアントsecurenet.NewSafeHTTPClient 等の泚入に䜿いたす SDK 既定
OnRetry リトラむ盎前に呌ばれる通知関数 なし

APIKey ず ProjectID / LocationID は排他的です。Vertex AI を䜿う堎合は ProjectID ず LocationID の䞡方を指定しおください。

HTTPClient を指定しおも認蚌は倱われたせん。genai SDK は HTTP クラむアントを枡されるず Application Default Credentials の怜出をスキップし、認蚌ヘッダを付けずに送信しおしたいたすがVertex AI では党リク゚ストが 401 CREDENTIALS_MISSING になりたす、本ラむブラリが認蚌情報を付け盎したす。枡したむンスタンス自䜓は倉曎せず、耇補を䜿うため、同じクラむアントを他の甚途ず共有しおも構いたせん。


🧪 生成オプション (gemini.GenerateOptions)

れロ倀が意味を持぀項目Temperature: 0 = 最も決定的、ThinkingBudget: 0 = 思考無効は、 「未蚭定」ず区別するためポむンタ型です。蚭定には gemini.Ptr ヘルパヌを䜿いたす。

蚭定項目 圹割
SystemPrompt System instruction を指定したす。
Temperature 出力のランダム性*float32。Ptr[float32](0) で最も決定的。nil で SDK デフォルト。
TopP / TopK サンプリング範囲の制埡*float32。nil で SDK デフォルト。
MaxOutputTokens 生成する最倧トヌクン数。0 で SDK デフォルト。
StopSequences 生成を打ち切る文字列のリスト。
ThinkingBudget 思考トヌクンの䞊限*int32。Ptr[int32](0) で思考を無効化しコストずレむテンシを抑えたす。nil でモデル既定。有効範囲はモデル䟝存です。
ThinkingLevel 思考量の段階指定gemini.ThinkingMinimal / ThinkingLow / ThinkingMedium / ThinkingHigh。モデル非䟝存で移怍性が高い方の指定方法です。ThinkingBudget ず䜵甚した堎合はこちらが優先されたす。
IncludeThoughts true にするず思考サマリが Response.Thoughts に入りたすText には含たれたせん。
AspectRatio 画像生成時のアスペクト比を指定したす。
ImageSize 画像生成時のサむズを指定したす。
Seed 再珟性のためのシヌド倀。int32 の範囲内である必芁がありたす。
PersonGeneration Vertex AI 画像生成での人物生成ポリシヌを指定したす。
SafetySettings 安党フィルタの蚭定。gemini.NewSafetySettings(gemini.SafetyBlockNone) で構築できたす。
ResponseMIMEType image/png や audio/wav など、期埅するレスポンス MIME type を指定したす。
ResponseSchema 構造化出力constrained decodingのスキヌマ*gemini.Schema。application/json ず䜵甚するず、出力が文法レベルでスキヌマに制玄されたす。
ResponseJSONSchema 暙準的な JSON Schema による構造化出力。$ref を含む耇雑なスキヌマで ResponseSchema がうたく機胜しない堎合の代替です。䜵甚した堎合はこちらが優先されたす。

暙準的な4぀のハヌムカテゎリ暎力・ヘむト・性的衚珟・危険行為すべおに同䞀の閟倀を適甚したい堎合は、gemini.NewSafetySettings(threshold) ヘルパヌを䜿うず SafetySettings を簡朔に構築できたす。閟倀をバック゚ンドや甚途に応じおどう遞ぶかは呌び出し偎の刀断に委ねおいたすVertex AI は SafetyOff を受け付けたせん。

opts := gemini.GenerateOptions{
    SafetySettings: gemini.NewSafetySettings(gemini.SafetyBlockNone),
}

構造化出力のスキヌマは gemini.Schema ず gemini.TypeObject などの型定数で曞けたすgenai.Schema の別名なので、genai の倀をそのたた枡すこずもできたす。

opts := gemini.GenerateOptions{
    ResponseMIMEType: "application/json",
    ResponseSchema: &gemini.Schema{
        Type: gemini.TypeObject,
        Properties: map[string]*gemini.Schema{
            "title":    {Type: gemini.TypeString},
            "keywords": {Type: gemini.TypeArray, Items: &gemini.Schema{Type: gemini.TypeString}},
        },
        Required: []string{"title"},
    },
}

ResponseJSONSchema の map[string]any ず違い、フィヌルド名がコンパむル時に怜査されたす"propertise" のような綎り間違いが黙っお無芖されたせん。$ref を含むなど、この型で衚珟しきれないスキヌマの堎合だけ ResponseJSONSchema を遞んでください。

閟倀は gemini.SafetyBlockNone / SafetyBlockLowAndAbove / SafetyBlockMediumAndAbove / SafetyBlockOnlyHigh / SafetyOff から遞べたす。同様に思考量も gemini.ThinkingMinimal / ThinkingLow / ThinkingMedium / ThinkingHigh を甚意しおおり、これらを䜿えば蚭定倀を遞ぶためだけに genai SDK を import する必芁はありたせん。

゚ラヌの分類

生成倱敗の理由は errors.Is / errors.AsType で刀別できたす。ブロックはリトラむしおも解決しないため、プロンプトの芋盎しが必芁です。

resp, err := client.GenerateContent(ctx, model, prompt)
switch {
case errors.Is(err, gemini.ErrBlocked):
    // 安党フィルタ等でブロックされた。詳现な理由は FinishReason を参照
    if apiErr, ok := errors.AsType[*gemini.APIResponseError](err); ok {
        slog.Warn("blocked", "reason", apiErr.FinishReason)
    }
case errors.Is(err, gemini.ErrEmptyResponse):
    // 候補が 1 件も返らなかった
}
構造化出力の埌凊理

ResponseSchema + ResponseMIMEType: "application/json" による構造化出力constrained decodingを䜿っおも、モデルが完結した JSON の埌に䜙分な閉じ括匧や説明テキストを継ぎ足すこずが実際にありたす。json.Unmarshal の前段で gemini.CleanJSONResponse(raw) を通すず、こうした末尟ノむズを陀去・補正できたす。トップレベルが配列[...]のスキヌマにも察応しおいたす。

resp, err := client.GenerateWithParts(ctx, model, parts, opts)
// ...
var out MyStruct
jsonStr := gemini.CleanJSONResponse(resp.Text)
if err := json.Unmarshal([]byte(jsonStr), &out); err != nil {
    // ...
}

📜 ゚ラヌハンドリング

本ラむブラリでは、以䞋のセンチネル゚ラヌを゚クスポヌトしおいたす。errors.Is を䜿っお刀定できたす。

  • ErrConfigRequired: APIKey たたは ProjectID / LocationID のいずれも蚭定されおいない堎合。
  • ErrExclusiveConfig: APIKey ず ProjectID / LocationID が同時に蚭定されおいる堎合。
  • ErrIncompleteVertexConfig: ProjectID たたは LocationID の片方だけが蚭定されおいる堎合。
  • ErrEmptyPrompt: プロンプトが空の堎合。
  • ErrEmptyModelName: モデル名が空の堎合。
  • ErrEmptyParts: 生成パヌツが空の堎合。
  • ErrInvalidPart: 生成パヌツに nil が含たれおいる堎合。
  • ErrInvalidSeed: Seed が int32 の範囲倖の堎合。
  • ErrInvalidAttachment: 添付の指定が䞍正な堎合Data ず URI の䜵甚、Data に MIME type が無い堎合。
  • ErrEmptyOperationName: オペレヌション名が空の堎合。
  • ErrInvalidVideoInput: 動画生成の入力の組み合わせが API の受け付けないものだった堎合。
  • ErrVideoGenerationFailed: 動画生成のオペレヌションが倱敗ずしお完了した堎合VideoOperation.Failure に茉りたす。
  • ErrBlocked: 安党フィルタ等により生成がブロックされた堎合。詳现は APIResponseError.FinishReason を参照したす。
  • ErrEmptyResponse: 候補が 1 件も含たれないレスポンスが返された堎合。

ErrBlocked / ErrEmptyResponse は *APIResponseError ずしお返り、Unwrap がこれらのセンチネルを返すため errors.Is で分類できたす。どちらも再詊行では解決しないため、リトラむ察象倖です。

veo パッケヌゞは以䞋を公開しおいたす。

  • veo.ErrGeneratorRequired: veo.New に nil の生成クラむアントを枡した堎合。
  • veo.ErrMissingOperationName: 完了埅ちに必芁なオペレヌション名が無い堎合。
  • veo.ErrNoVideoGenerated: 成功で完了したのに動画が 1 本も返らなかった堎合安党性ポリシヌによる陀倖が兞型。
  • veo.ErrPollFailed: 生成状況の確認が連続しお倱敗し、完了を埅おなくなった堎合。

🔌 むンタヌフェヌス

*gemini.Client はこれらをすべお満たしたす。利甚偎は必芁な範囲だけに䟝存するず、モックが小さくなりたす。

むンタヌフェヌス メ゜ッド genai 型
ContentGenerator GenerateContent 含たない
MultimodalGenerator GenerateWithAttachments 含たない
BackendInspector IsVertexAI 含たない
FileManager UploadFile / DeleteFile 含たない
MultimodalModel 䞊蚘 3 ぀生成・ファむル管理・バック゚ンド刀定の集合 含たない
MultimodalStreamGenerator GenerateContentStream / GenerateWithAttachmentsStream 含たない
MultimodalTokenCounter CountTokens / CountTokensWithAttachments 含たない
VideoGenerator StartVideo / PollVideo 含たない
Generator GenerateWithParts + IsVertexAI 含む
GenerativeModel Generator + FileManager 含む
StreamGenerator GenerateContentStream / GenerateWithPartsStream 含む
TokenCounter CountTokens / CountTokensWithParts 含む

Generator 系は genai.Part をシグネチャに持぀ため、実装・モックする偎も genai SDK を参照するこずになりたす。Part を盎接組み立おる必芁がなければ MultimodalGenerator / MultimodalModel を遞んでください。


📂 パッケヌゞ構成

パッケヌゞ 圹割
github.com/shouni/go-gemini-client/gemini Gemini / Vertex AI クラむアント、リトラむ、File API、レスポンス抜出。
github.com/shouni/go-gemini-client/lyria 歌詞生成 → 䜜曲レシピ生成 → Lyria 音声生成の 3 段。lyria.New は gemini.MultimodalGenerator を受け取りたす。段の間に品質ゲヌトを挟むのは利甚偎の刀断のため、䞀括実行の入口は甚意しおいたせん。
github.com/shouni/go-gemini-client/veo Veo 動画生成の投凜ず完了埅ち。veo.New は gemini.VideoGenerator を受け取りたす。

🀝 䟝存関係 (Dependencies)


📜 ラむセンス (License)

このプロゞェクトは MIT License の䞋で公開されおいたす。

Directories ¶

Path Synopsis
Package gemini は、Gemini API / Vertex AI 向けの genai SDK をラップし、 リトラむやFile APIアップロヌドを備えたクラむアントを提䟛したす。
Package gemini は、Gemini API / Vertex AI 向けの genai SDK をラップし、 リトラむやFile APIアップロヌドを備えたクラむアントを提䟛したす。
Package lyria は、歌詞生成・楜曲蚭蚈・Lyriaによる音声生成を束ねる 音楜生成ワヌクフロヌを提䟛したす。
Package lyria は、歌詞生成・楜曲蚭蚈・Lyriaによる音声生成を束ねる 音楜生成ワヌクフロヌを提䟛したす。
Package veo は、Veo による動画生成を扱うクラむアントを提䟛したす。
Package veo は、Veo による動画生成を扱うクラむアントを提䟛したす。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL