genai-kit

module
v1.0.1 Latest Latest
Warning

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

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

README ¶

✹ Gen Ai Kit

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


🚀 抂芁 (About) - genai SDK を公開 API に出さない Vertex AI クラむアント

Gen Ai Kit は、Google Cloud Vertex AI 向けの Go ラむブラリです。テキスト生成に加えお、GCS URI を䜿ったマルチモヌダル入力、画像・音声レスポンス、参照画像付きの画像生成、Lyria による音楜生成、Veo による動画生成を扱えたす。


💎 蚭蚈の芁点

  • genai SDK を公開 API に出したせん。 生成・構造化出力・安党蚭定・思考量・動画生成のいずれも SDK を import せずに曞けたす。利甚偎のモックも 1 メ゜ッドで枈みたす。
  • Vertex AI 専甚です。 バック゚ンドは Vertex AI に固定で、認蚌は Application Default Credentials に埓いたす。API キヌを扱わないので、キヌの配垃・ロヌテヌションや「どちらのバック゚ンドか」で分岐する条件が䞀切ありたせん。
  • 倱敗の皮類を型で区別したす。 蚭定䞍備・入力䞍備・安党フィルタによるブロックはすべおセンチネル゚ラヌで、errors.Is で分類できたす。リトラむしおも盎らない倱敗は再詊行したせん。
  • 長時間実行ず重耇呌び出しを匕き受けたす。 veo が動画生成のポヌリングず䞀時的倱敗の蚱容を、callguard が発射間隔・䞊限時間・同䞀内容の重耇排陀を持ちたす。

📂 パッケヌゞ構成

genai SDK を import するのは gemini だけです。 䞊䜍のパッケヌゞはいずれも gemini の 1〜2 メ゜ッドのむンタヌフェヌスだけを受け取るため、テストでは SDK も GCP 認蚌も芁りたせん。

パッケヌゞ 圹割 詳现
gemini Vertex AI クラむアント。生成・リトラむ・レスポンス抜出ず、Veo の 1 埀埩StartVideo / PollVideo。 生成の入口
imagegen 参照画像gs://付きの画像生成。プロンプト組み立お・シヌド採番・画像抜出。 画像生成
music 楜曲構成のデヌタ型Recipe / Section / LyricsDraft / AIModels。䟝存を持たない葉パッケヌゞ。 音楜生成
lyria 歌詞生成 → 䜜曲レシピ生成 → Lyria 音声生成の 3 段。 音楜生成
veo Veo 動画生成の投凜ず完了埅ち。 動画生成
callguard AI 呌び出しぞの発射間隔・1 回あたりの䞊限時間・重耇排陀singleflight。 呌び出しガヌド

むンポヌトパスはいずれも github.com/shouni/genai-kit/ を前眮したす。


🚀 クむックスタヌト

むンストヌル
go get github.com/shouni/genai-kit
䜿いはじめ
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/shouni/genai-kit/gemini"
)

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

	client, err := gemini.New(ctx, gemini.Config{
		ProjectID:  "your-google-cloud-project-id",
		LocationID: "asia-northeast1",
	})
	if err != nil {
		log.Fatal(err)
	}

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

	fmt.Println(resp.Text)
}

ProjectID ず LocationID は必須です。認蚌は Application Default Credentials に埓うため、Cloud Run などの環境では API キヌをアプリケヌションに持たせずに運甚できたす。ロヌカルでは gcloud auth application-default login で認蚌情報を甚意しおください。


🧩 生成の入口 (gemini)

生成の入口は 2 ぀だけです。

メ゜ッド 甹途
GenerateText(ctx, model, prompt) テキストのみ・オプション無しの最短経路
Generate(ctx, model, prompt, attachments, opts) それ以倖すべお添付・構造化出力・安党蚭定・思考量・画像生成

gemini.Attachment はバむト列ず URI 参照のどちらも衚珟できたす。

resp, err := client.Generate(ctx, "gemini-3.7-flash",
	"この画像の内容を日本語で芁玄しおください",
	[]gemini.Attachment{
		// Vertex AI では GCS の gs:// URI を盎接参照できたす。
		{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 を参照する堎合は任意省略するずサヌバヌ偎の刀定に委ねたす
  • どちらも空の芁玠は読み飛ばされたす。参照画像を「あれば枡す」圢で組み立おる呌び出し偎が、空芁玠の陀去を毎回曞かずに枈みたす
  • プロンプトが空でも添付があれば送信できたす音声だけを枡しお解析させる甚途。䞡方が空の堎合は ErrEmptyParts です
  • 添付が無いテキスト生成でも䜿えたす。attachments に nil を枡せば「プロンプト + GenerateOptions」の入口になりたす

プロンプトは添付より前に眮かれたす。genai.Part を盎接受け取る公開 API は意図的にありたせん。 SDK の型を公開面ぞ挏らすず、利甚偎が genai を import する理由が埩掻しおしたうためです。


🖌 画像・音声レスポンス (gemini)

ResponseMIMEType に image/* たたは audio/* を指定するず、レスポンスモダリティが自動蚭定されたす。ここは生の応答の受け取り方です。参照画像付きの画像生成には、プロンプト結合ずシヌド採番たで面倒を芋る imagegen がありたす。

seed := int64(1234)

resp, err := client.Generate(ctx, "gemini-3.1-flash-image",
	"青い招き猫のステッカヌ画像を生成しお", nil,
	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 の決定に䜿えたす
}
gemini.Response の䞭身
フィヌルド 内容
Text 本文。思考パヌトを陀く党テキストパヌトの連結です。
Images / Audios むンラむンデヌタのバむト列を MIME type で振り分けたものです。
Attachments むンラむンデヌタを MIME type 付きで返华順に保持したすImages / Audios の䞊䜍集合。バむト列だけでは保存時の拡匵子や Content-Type を決められないため、型を保ったたた取り出せる圢を甚意しおいたす。
Thoughts 思考サマリ。IncludeThoughts が true でモデルが返した堎合のみ蚭定され、Text には含たれたせん。
Usage トヌクン䜿甚量*gemini.TokenUsage。PromptTokenCount / CandidatesTokenCount / TotalTokenCount に加え、課金察象の ThoughtsTokenCount を持ちたす。

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

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

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

蚭定倀の定数はすべお再゚クスポヌトしおあるため、倀を遞ぶためだけに genai SDK を import する必芁はありたせん。

皮別 遞べる倀
安党フィルタ閟倀SafetyThreshold SafetyBlockNone / SafetyBlockLowAndAbove / SafetyBlockMediumAndAbove / SafetyBlockOnlyHighVertex AI が受け付けない OFF は公開しおいたせん
思考量ThinkingLevel ThinkingMinimal / ThinkingLow / ThinkingMedium / ThinkingHighThinkingUnspecified でモデル既定
人物生成PersonGeneration PersonGenerationAllowAll / PersonGenerationAllowAdult / PersonGenerationDontAllow未指定は API 既定
スキヌマ型SchemaType TypeString / TypeNumber / TypeInteger / TypeBoolean / TypeArray / TypeObject
動画参照の皮別VideoReferenceType VideoReferenceAsset / VideoReferenceStyle

暙準的な 4 ぀のハヌムカテゎリ暎力・ヘむト・性的衚珟・危険行為すべおに同䞀の閟倀を適甚する堎合は NewSafetySettings を䜿いたす。

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

構造化出力のスキヌマは gemini.Schemagenai.Schema の別名で曞けたす。ResponseJSONSchema の map[string]any ず違い、フィヌルド名がコンパむル時に怜査されたす"propertise" のような綎り間違いが黙っお無芖されたせん。

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"},
    },
}
構造化出力の埌凊理

ResponseSchema + ResponseMIMEType: "application/json" による構造化出力constrained decodingを䜿っおも、モデルは次の圢で JSON を厩すこずがありたす。どれも応答を返しきったあずの話なので、API の再詊行では盎りたせん。 json.Unmarshal の前段で gemini.CleanJSONResponse(raw) を通しおください。

  • Markdown のフェンス```json 
 ```で包む
  • 完結した JSON の埌ろに説明文や䜙分な閉じ括匧を継ぎ足す
  • } の代わりに ) などで閉じる
  • 文字列の䞭でバックスラッシュを゚スケヌプし忘れる正芏衚珟やパスを匕甚したずき
  • 文字列の䞭に改行やタブを生のたた入れる耇数行の本文を匕甚したずき

埌ろの 2 ぀は、台本の抜粋・歌詞・台詞のように耇数行の本文を JSON に茉せる甚途で特に起きたす。 トップレベルが配列[...]のスキヌマにも察応しおいたす。

既に解釈できる入力は 1 バむトも倉えたせん。 補修しおも劥圓な JSON にならなければ入力をそのたた返すので、呌び出し偎の゚ラヌメッセヌゞは元の壊れ方を指したたたになりたす。

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

⚙ 詳现蚭定 (gemini.Config)

蚭定項目 圹割 デフォルト倀
ProjectID Google Cloud プロゞェクト ID必須 -
LocationID Vertex AI のリヌゞョン必須。䟋: asia-northeast1, us-central1 -
MaxRetries 最倧リトラむ回数初回実行を含みたせん。0 は未蚭定ずしお既定倀を䜿いたす 1
DisableRetry リトラむを無効にし、1 回だけ実行したす false
InitialDelay リトラむ開始時の埅機時間 30s
MaxDelay リトラむ埅機時間の䞊限 120s
RequestTimeout 生成呌び出し 1 回リトラむ含むの䞊限時間。動画生成の完了埅ちには適甚されたせんveo 偎が受け持ちたす なし無制限
HTTPClient genai SDK が䜿う HTTP クラむアント。タむムアりトやプロキシ、SSRF 察策枈みクラむアントsecurenet.NewSafeHTTPClient 等の泚入に䜿いたす SDK 既定

ProjectID ず LocationID は䞡方必須です。片方だけ蚭定した堎合は ErrIncompleteVertexConfig、どちらも空の堎合は ErrConfigRequired になりたす。

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


🖌 画像生成 (imagegen)

imagegen は参照画像付きの画像生成をたずめたす。gemini.Generate を盎接呌ぶのずの違いは、プロンプトずネガティブプロンプトの結合、シヌドの自動採番、安党蚭定ず人物生成の既定倀、レスポンスからの画像抜出を匕き受ける点です。

client, err := gemini.New(ctx, gemini.Config{ProjectID: "my-project", LocationID: "asia-northeast1"})
if err != nil {
	return err
}

images, err := imagegen.New(client)
if err != nil {
	return err
}

resp, err := images.Generate(ctx, imagegen.Request{
	Model:          "gemini-3.1-flash-image",
	Prompt:         "波打ち際に立぀少女、朝の逆光",
	NegativePrompt: "テキスト, 透かし",
	Images: []string{
		"gs://my-bucket/characters/aoi-front.png",
		"gs://my-bucket/characters/aoi-side.png",
	},
	GenerateOptions: gemini.GenerateOptions{AspectRatio: "16:9", ImageSize: "2K"},
})
if err != nil {
	return err
}

name := "cover" + imagegen.ExtensionByMIMEType(resp.MIMEType)
_ = os.WriteFile(name, resp.Data, 0o600)

imagegen.New は gemini.GeneratorGenerate の 1 メ゜ッドだけを受け取るので、テストでは genai SDK も GCP 認蚌も無しで組み立おを怜蚌できたす。

参照画像は gs:// のみ

Vertex AI は gs:// をモデル偎で解決するため、参照画像の取埗もアップロヌドもバむト列の転送も起きたせん。gs:// 以倖の URI は ErrUnsupportedReference で匟きたす。参照画像を HTTP から取埗しおむンラむンで送る経路や、Gemini File API を経由する経路はありたせん。 それらが必芁な堎合は、取埗・サむズ䞊限・再圧瞮・アップロヌドのキャッシュを備えた gemini-image-kit を䜿っおください。

  • 空文字列の芁玠ぱラヌではなく、送信察象から黙っお倖れたす。「このキャラクタヌには参照画像が無い」を、呌び出し偎が芁玠の欠萜ずしお衚珟できたす
  • 䞊び順は保持されたす。参照画像の順序はモデルの解釈に圱響したす
  • MIME type は URI の拡匵子から掚枬したす。刀別できない堎合は申告せず、サヌバヌ偎のコンテンツ刀定に委ねたす眲名付き URL のク゚リ文字列は陀いお拡匵子を芋たす
既定倀ずシヌド
項目 未指定時の既定 理由
Seed ランダムに採番WithoutAutoSeed() で無効化 API 偎にシヌド遞択を委ねるずその倀が応答に含たれず、Response.UsedSeed が 0 のたた蚘録されお同条件の再生成ができなくなるため
SafetySettings NewSafetySettings(SafetyBlockNone) 明瀺した倀は䞊曞きしたせん。無条件に䞊曞きするず、利甚偎が安党フィルタを厳しくする手段が無くなるため
PersonGeneration PersonGenerationAllowAll キャラクタヌ生成が䞻甚途のため。明瀺した倀は䞊曞きしたせん

NegativePrompt は API のフィヌルドではなく、[Negative Prompt] 芋出しを区切りずしお Prompt ぞ連結しお送りたす。この芋た目は䞋流のプロンプト実装が䟝存しおいる互換性の契玄です。

imagegen は発射間隔や重耇排陀を持ちたせん。呌び出しガヌド の項のずおりクォヌタはプロゞェクト単䜍なので、imagegen.Generator を callguard でデコレヌトし、テキスト生成ず 1 ぀の Guard を共有する圢でワヌクフロヌ局に眮いおください。


🎵 音楜生成 (lyria) ず楜曲型 (music)

music.Recipe は楜曲の構成セクション・歌詞・䜿甚モデル・seedを衚す、この゚コシステムで最も広く共有される型です。JSON タグは snake_case で、保存枈みレシピ JSON ずの互換性を保っおいたす。

import "github.com/shouni/genai-kit/music"

var r music.Recipe
r.Sections = []music.Section{{Name: "Verse", Duration: 30}}
clone := r.Clone() // スラむスやポむンタも耇補する深いコピヌ

型だけを別パッケヌゞぞ切り出しおいるのは、レシピを読み曞きするだけの䞋流サヌビスが、レヌト制限や singleflight を䌎うワヌクフロヌ本䜓たで茞入せずに枈むようにするためです。lyria.MusicRecipe / MusicSection / LyricsDraft / AIModels は music の型の別名なので、既存の衚蚘もそのたた䜿えたす。

ワヌクフロヌlyria.Workflowは GenerateLyrics → Compose → GenerateAudio の 3 段を個別のメ゜ッドずしお公開したす。段の間に構造怜蚌などの品質ゲヌトを挟めるようにするためで、䞀括実行の入口は意図的にありたせん品質ゲヌトは補品ごずに違うため、束ねおも呌び出し偎で分解し盎すこずになりたす。


🎬 動画生成 (veo)

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

client, err := gemini.New(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にはリトラむが効きたす。レヌト制限や䞀時的なサヌバヌ゚ラヌで 1 本分の生成が萜ちるのを防ぐためです。

Wait は最初の問い合わせを間隔埅ちなしで盎ちに行いたす。別実行からの再開ではオペレヌションが既に完了しおいるこずが倚く、確認前に 1 interval 分既定 10 秒埅぀のは玔粋な死に時間になるためです。

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

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

// 実行 2: 保存した名前で埅ちを再開する
result, err := videoClient.Wait(ctx, name)

veo.Client のオプションは WithPollInterval既定 10 秒/ WithPollTimeout既定 15 分/ WithMaxPollErrors既定 10 回/ WithLogger既定 slog.Default()です。

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 に無い堎合Interactions API などは救えたせん。


🛡 呌び出しガヌド (callguard)

高䟡な AI 呌び出しに、発射間隔クォヌタ保護・1 回あたりの䞊限時間・同䞀内容の同時実行の重耇排陀をたずめお掛けたす。lyria が内郚で䜿っおいるほか、go-comic-kit / go-veo-orchestrator のようにこのクラむアントの䞊でワヌクフロヌを組むキットが、同じ機構を曞き写さずに枈むよう公開しおいたす。

guard := callguard.New(
    callguard.WithRateInterval(6*time.Second), // 毎分 10 回たで
    callguard.WithExecTimeout(5*time.Minute),
)

var group callguard.Group // れロ倀で䜿えたす

key := callguard.Key("image", model, prompt, callguard.SeedKey(seed))
resp, err := callguard.Do(ctx, &group, guard, key, func(execCtx context.Context) (*Response, error) {
    return inner.Generate(execCtx, req)
})

蚭蚈䞊の芁点は 3 ぀です。

  • クォヌタはプロゞェクト単䜍で、操䜜の皮類ごずではありたせん。 テキスト生成ず画像生成で別々に絞っおも意味がないため、ワヌクフロヌ党䜓で Guard を 1 ぀共有し、重耇排陀の単䜍Groupだけを呌び出しの皮類ごずに分けたす。
  • 発射間隔の埅機は䞊限時間の倖偎です。 埅たされた時間を 1 回あたりの䞊限時間に数えるず、混雑しおいるだけでタむムアりトしたす。
  • 䞊限時間に「無制限」はありたせん。 共有実行は呌び出し元の context から切り離されるためリヌダヌの離脱が盞乗り偎を巻き添えにしないため、これが唯䞀の打ち切り手段です。無制限にするず、応答の返らない 1 回が同じキヌの埌続を氞久に埅たせたす。

戻り倀は盞乗りした党員で共有されたす。呌び出し偎が曞き換える可胜性があるものは耇補しおから返しおください。


🔌 むンタヌフェヌス

いずれも genai SDK の型をシグネチャに含みたせん。 利甚偎は必芁な範囲だけに䟝存するず、モックが小さくなりたす。

このラむブラリが実装するもの利甚偎は䟝存するだけ
むンタヌフェヌス メ゜ッド 実装
gemini.Generator Generate *gemini.Client
gemini.VideoGenerator StartVideo / PollVideo *gemini.Client
imagegen.Generator Generate *imagegen.Client
lyria.LyricsGenerator / Composer / AudioGenerator GenerateLyrics / Compose / GenerateAudio *lyria.Workflow

生成だけが必芁なら 1 メ゜ッドの gemini.Generator に䟝存しおください。veo.New / imagegen.New / lyria.New はいずれもこれらのむンタヌフェヌスを受け取るので、テストでは genai SDK も GCP 認蚌も無しで組み立おられたす。

利甚偎が実装するものlyria に泚入する

lyria はプロンプト本文を䞀切持ちたせん。プロンプトの組み立おず読み仮名倉換は補品ごずに違うため、実装を泚入したす。

むンタヌフェヌス メ゜ッド 圹割
lyria.TextPromptBuilder LyricsPrompt / RecipePrompt 歌詞・レシピ生成のプロンプト文字列を組み立おたす
lyria.AudioPromptBuilder FullSongPrompt Lyria ぞ枡す曲党䜓のプロンプトを組み立おたす
lyria.ReadingConverter ToReading 日本語楜曲でプロンプトを読み䞊げ向け衚蚘ぞ倉換したす未泚入なら玠通し

このパッケヌゞでは Generator が AI を呌ぶ偎、Builder が AI を呌ばない組み立お圹を指したす。


🚚 ゚ラヌハンドリング

センチネルの文蚀は英語 + パッケヌゞ名プレフィックスgemini: / veo: / lyria:で統䞀しおいたす。深いラップの䞭に埋たっおもどのパッケヌゞ由来か刀別でき、人間向けの文脈はラップする偎が日本語で補う方針です。

生成倱敗の分類

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

resp, err := client.GenerateText(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 件も返らなかった
}

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

センチネル䞀芧

gemini — 蚭定䞍備:

  • ErrConfigRequired: ProjectID ず LocationID のいずれも蚭定されおいない堎合。
  • ErrIncompleteVertexConfig: ProjectID たたは LocationID の片方だけが蚭定されおいる堎合。

gemini — 入力怜蚌:

  • ErrEmptyPrompt: プロンプトが空の堎合GenerateText。
  • ErrEmptyModelName: モデル名が空の堎合。
  • ErrEmptyParts: プロンプトず添付の䞡方が空で、送るものが䜕も無い堎合。
  • ErrInvalidAttachment: 添付の指定が䞍正な堎合Data ず URI の䜵甚、Data に MIME type が無い堎合。
  • ErrInvalidSeed: Seed が int32 の範囲倖の堎合。
  • ErrInvalidPart: 生成パヌツに nil が含たれおいる堎合。パヌツは内郚でのみ組み立おるため、公開 API 経由では発生しない内郚ガヌドです。

gemini — レスポンス / 動画:

  • ErrBlocked: 安党フィルタ等により生成がブロックされた堎合。
  • ErrEmptyResponse: 候補が 1 件も含たれないレスポンスが返された堎合。
  • ErrEmptyOperationName: オペレヌション名が空の堎合。
  • ErrInvalidVideoInput: 動画生成の入力の組み合わせが API の受け付けないものだった堎合。
  • ErrVideoGenerationFailed: 動画生成のオペレヌションが倱敗ずしお完了した堎合VideoOperation.Failure に茉りたす。

imagegen:

  • ErrGeneratorRequired: imagegen.New に nil の生成クラむアントを枡した堎合。
  • ErrModelRequired: リク゚ストにモデル名が無い堎合。
  • ErrEmptyPrompt: Prompt ず NegativePrompt の䞡方が空の堎合。
  • ErrUnsupportedReference: 参照画像が gs:// 以倖を指しおいる堎合。
  • ErrNoImageData: 応答に画像デヌタが含たれおいなかった堎合。安党フィルタによるブロックは gemini 偎が ErrBlocked で返すため、これずは区別されたす。

veo:

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

lyria:

  • ErrWorkflowConfig: lyria.New に必芁な䟝存やモデル名が欠けおいる堎合。
  • ErrNilInput: 生成に必芁な入力収集コンテンツ・歌詞・レシピが nil の堎合。
  • ErrEmptyLyrics: 生成された歌詞ドラフトの本文が空だった堎合。
  • ErrNoAudio: Lyria の呌び出しは成功したのに音声デヌタが返らなかった堎合。
  • ErrInvalidResponse: モデル出力が期埅する JSON ずしお解釈できなかった堎合。再生成で解決するこずがありたす。

🀝 䟝存関係 (Dependencies)


📜 ラむセンス (License)

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

Directories ¶

Path Synopsis
Package callguard は、倖郚 AI API の呌び出しに「発射間隔」「1 回あたりの䞊限時間」 「同䞀内容の同時実行の重耇排陀」をたずめお掛けるためのプリミティブです。
Package callguard は、倖郚 AI API の呌び出しに「発射間隔」「1 回あたりの䞊限時間」 「同䞀内容の同時実行の重耇排陀」をたずめお掛けるためのプリミティブです。
Package gemini は、Vertex AI 向けの genai SDK をラップし、 リトラむ蚭定ずレスポンス抜出を備えたクラむアントを提䟛したす。
Package gemini は、Vertex AI 向けの genai SDK をラップし、 リトラむ蚭定ずレスポンス抜出を備えたクラむアントを提䟛したす。
Package imagegen は、Vertex AI の画像モデルによる画像生成を実行したす。
Package imagegen は、Vertex AI の画像モデルによる画像生成を実行したす。
internal
poll
Package poll は、状態が倉わるたで䞀定間隔で問い合わせ続ける埅ち方をたずめたす。
Package poll は、状態が倉わるたで䞀定間隔で問い合わせ続ける埅ち方をたずめたす。
Package lyria は、歌詞生成・楜曲蚭蚈・Lyria による音声生成を束ねる 音楜生成ワヌクフロヌを提䟛したす。
Package lyria は、歌詞生成・楜曲蚭蚈・Lyria による音声生成を束ねる 音楜生成ワヌクフロヌを提䟛したす。
Package music は、楜曲構成を衚すデヌタ型Recipe ずその呚蟺を提䟛したす。
Package music は、楜曲構成を衚すデヌタ型Recipe ずその呚蟺を提䟛したす。
Package veo は、Veo による動画生成を扱うクラむアントを提䟛したす。
Package veo は、Veo による動画生成を扱うクラむアントを提䟛したす。

Jump to

Keyboard shortcuts

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