go/files.go (313 lines of code) (raw):
package examples
import (
"context"
"fmt"
"log"
"os"
"path/filepath"
"time"
"google.golang.org/genai"
)
func FilesCreateText() (*genai.GenerateContentResponse, error) {
// [START files_create_text]
ctx := context.Background()
client, err := genai.NewClient(ctx, &genai.ClientConfig{
APIKey: os.Getenv("GEMINI_API_KEY"),
Backend: genai.BackendGeminiAPI,
})
if err != nil {
log.Fatal(err)
}
myfile, err := client.Files.UploadFromPath(
ctx,
filepath.Join(getMedia(), "poem.txt"),
&genai.UploadFileConfig{
MIMEType : "text/plain",
},
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("myfile=%+v\n", myfile)
parts := []*genai.Part{
genai.NewPartFromURI(myfile.URI, myfile.MIMEType),
genai.NewPartFromText("\n\n"),
genai.NewPartFromText("Can you add a few more lines to this poem?"),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
response, err := client.Models.GenerateContent(ctx, "gemini-2.0-flash", contents, nil)
if err != nil {
log.Fatal(err)
}
text := response.Text()
fmt.Printf("result.text=%s\n", text)
// [END files_create_text]
return response, err
}
func FilesCreateImage() (*genai.GenerateContentResponse, error) {
// [START files_create_image]
ctx := context.Background()
client, err := genai.NewClient(ctx, &genai.ClientConfig{
APIKey: os.Getenv("GEMINI_API_KEY"),
Backend: genai.BackendGeminiAPI,
})
if err != nil {
log.Fatal(err)
}
myfile, err := client.Files.UploadFromPath(
ctx,
filepath.Join(getMedia(), "Cajun_instruments.jpg"),
&genai.UploadFileConfig{
MIMEType : "image/jpeg",
},
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("myfile=%+v\n", myfile)
parts := []*genai.Part{
genai.NewPartFromURI(myfile.URI, myfile.MIMEType),
genai.NewPartFromText("\n\n"),
genai.NewPartFromText("Can you tell me about the instruments in this photo?"),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
response, err := client.Models.GenerateContent(ctx, "gemini-2.0-flash", contents, nil)
if err != nil {
log.Fatal(err)
}
text := response.Text()
fmt.Printf("result.text=%s\n", text)
// [END files_create_image]
return response, err
}
func FilesCreateAudio() (*genai.GenerateContentResponse, error) {
// [START files_create_audio]
ctx := context.Background()
client, err := genai.NewClient(ctx, &genai.ClientConfig{
APIKey: os.Getenv("GEMINI_API_KEY"),
Backend: genai.BackendGeminiAPI,
})
if err != nil {
log.Fatal(err)
}
myfile, err := client.Files.UploadFromPath(
ctx,
filepath.Join(getMedia(), "sample.mp3"),
&genai.UploadFileConfig{
MIMEType : "audio/mpeg",
},
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("myfile=%+v\n", myfile)
parts := []*genai.Part{
genai.NewPartFromURI(myfile.URI, myfile.MIMEType),
genai.NewPartFromText("Describe this audio clip"),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
response, err := client.Models.GenerateContent(ctx, "gemini-2.0-flash", contents, nil)
if err != nil {
log.Fatal(err)
}
text := response.Text()
fmt.Printf("result.text=%s\n", text)
// [END files_create_audio]
return response, err
}
func FilesCreateVideo() (*genai.GenerateContentResponse, error) {
// [START files_create_video]
ctx := context.Background()
client, err := genai.NewClient(ctx, &genai.ClientConfig{
APIKey: os.Getenv("GEMINI_API_KEY"),
Backend: genai.BackendGeminiAPI,
})
if err != nil {
log.Fatal(err)
}
myfile, err := client.Files.UploadFromPath(
ctx,
filepath.Join(getMedia(), "Big_Buck_Bunny.mp4"),
&genai.UploadFileConfig{
MIMEType : "video/mp4",
},
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("myfile=%+v\n", myfile)
// Poll until the video file is completely processed (state becomes ACTIVE).
for myfile.State == genai.FileStateUnspecified || myfile.State != genai.FileStateActive {
fmt.Println("Processing video...")
fmt.Println("File state:", myfile.State)
time.Sleep(5 * time.Second)
myfile, err = client.Files.Get(ctx, myfile.Name, nil)
if err != nil {
log.Fatal(err)
}
}
parts := []*genai.Part{
genai.NewPartFromURI(myfile.URI, myfile.MIMEType),
genai.NewPartFromText("Describe this video clip"),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
response, err := client.Models.GenerateContent(ctx, "gemini-2.0-flash", contents, nil)
if err != nil {
log.Fatal(err)
}
text := response.Text()
fmt.Printf("result.text=%s\n", text)
// [END files_create_video]
return response, err
}
func FilesCreatePdf() (*genai.GenerateContentResponse, error) {
// [START files_create_pdf]
ctx := context.Background()
client, err := genai.NewClient(ctx, &genai.ClientConfig{
APIKey: os.Getenv("GEMINI_API_KEY"),
Backend: genai.BackendGeminiAPI,
})
if err != nil {
log.Fatal(err)
}
samplePdf, err := client.Files.UploadFromPath(
ctx,
filepath.Join(getMedia(), "test.pdf"),
&genai.UploadFileConfig{
MIMEType: "application/pdf",
},
)
if err != nil {
log.Fatal(err)
}
parts := []*genai.Part{
genai.NewPartFromText("Give me a summary of this pdf file."),
genai.NewPartFromURI(samplePdf.URI, samplePdf.MIMEType),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
response, err := client.Models.GenerateContent(ctx, "gemini-2.0-flash", contents, nil)
if err != nil {
log.Fatal(err)
}
text := response.Text()
fmt.Println(text)
// [END files_create_pdf]
return response, err
}
func FilesCreateFromIO() (*genai.GenerateContentResponse, error) {
// [START files_create_io]
ctx := context.Background()
client, err := genai.NewClient(ctx, &genai.ClientConfig{
APIKey: os.Getenv("GEMINI_API_KEY"),
Backend: genai.BackendGeminiAPI,
})
if err != nil {
log.Fatal(err)
}
f, err := os.Open(filepath.Join(getMedia(), "test.pdf"))
if err != nil {
log.Fatal(err)
}
defer f.Close()
samplePdf, err := client.Files.Upload(ctx, f, &genai.UploadFileConfig{
MIMEType : "application/pdf",
})
if err != nil {
log.Fatal(err)
}
parts := []*genai.Part{
genai.NewPartFromText("Give me a summary of this pdf file."),
genai.NewPartFromURI(samplePdf.URI, samplePdf.MIMEType),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
response, err := client.Models.GenerateContent(ctx, "gemini-2.0-flash", contents, nil)
if err != nil {
log.Fatal(err)
}
text := response.Text()
fmt.Println(text)
// [END files_create_io]
return response, err
}
func FilesList() error {
// [START files_list]
ctx := context.Background()
client, err := genai.NewClient(ctx, &genai.ClientConfig{
APIKey: os.Getenv("GEMINI_API_KEY"),
Backend: genai.BackendGeminiAPI,
})
if err != nil {
log.Fatal(err)
}
fmt.Println("My files:")
page, err := client.Files.List(ctx, nil)
if err != nil {
log.Fatal(err)
}
for _, f := range page.Items {
fmt.Println(" ", f.Name)
}
// [END files_list]
return nil
}
func FilesGet() (*genai.File, error) {
// [START files_get]
ctx := context.Background()
client, err := genai.NewClient(ctx, &genai.ClientConfig{
APIKey: os.Getenv("GEMINI_API_KEY"),
Backend: genai.BackendGeminiAPI,
})
if err != nil {
log.Fatal(err)
}
myfile, err := client.Files.UploadFromPath(
ctx,
filepath.Join(getMedia(), "poem.txt"),
&genai.UploadFileConfig{
MIMEType: "text/plain",
},
)
if err != nil {
log.Fatal(err)
}
fileName := myfile.Name
fmt.Println(fileName)
file, err := client.Files.Get(ctx, fileName, nil)
if err != nil {
log.Fatal(err)
}
fmt.Println(file)
// [END files_get]
return file, err
}
func FilesDelete() error {
// [START files_delete]
ctx := context.Background()
client, err := genai.NewClient(ctx, &genai.ClientConfig{
APIKey: os.Getenv("GEMINI_API_KEY"),
Backend: genai.BackendGeminiAPI,
})
if err != nil {
log.Fatal(err)
}
myfile, err := client.Files.UploadFromPath(
ctx,
filepath.Join(getMedia(), "poem.txt"),
&genai.UploadFileConfig{
MIMEType: "text/plain",
},
)
if err != nil {
log.Fatal(err)
}
// Delete the file.
_, err = client.Files.Delete(ctx, myfile.Name, nil)
if err != nil {
log.Fatal(err)
}
// Attempt to use the deleted file.
parts := []*genai.Part{
genai.NewPartFromURI(myfile.URI, myfile.MIMEType,),
genai.NewPartFromText("Describe this file."),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
_, err = client.Models.GenerateContent(ctx, "gemini-2.0-flash", contents, nil)
// Expect an error when using a deleted file.
if err != nil {
return nil
}
return fmt.Errorf("expected an error when using deleted file")
// [END files_delete]
}