README
¶
âš Gen Ai Kit
ð æŠèŠ (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)
- google.golang.org/genai - Google å ¬åŒ SDKïŒVertex AI ããã¯ãšã³ãã§äœ¿çšïŒ
- golang.org/x/sync -
callguardã® singleflight - golang.org/x/time -
callguardã®ã¬ãŒãå¶é
ð ã©ã€ã»ã³ã¹ (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 ã«ããåç»çæãæ±ãã¯ã©ã€ã¢ã³ããæäŸããŸãã |