Using files

API-ja e Gemini mbështet ngarkimin e skedarëve të medias veçmas nga hyrja e kërkesës, duke bërë të mundur që media jote të mund të përdoret përsëri në disa kërkesa. Për më shumë detaje, shiko udhëzuesin Prompting with media.

Burimi REST: skedarët

Burimi: Skedar

Një skedar i ngarkuar në API.

Fushat
name string

I pandryshueshëm. Identifikuesi. Emri i burimit të File. ID-ja (emri duke përjashtuar prefiksin "files/") mund të përmbajë deri në 40 karaktere që janë alfanumerike me shkronja të vogla ose viza (-). ID-ja nuk mund të fillojë ose të përfundojë me një vizë. Nëse emri është bosh gjatë krijimit, do të gjenerohet një emër unik. Shembull: files/123-456

displayName string

Opsionale. Emri prezantues i lexueshëm nga njeriu për File. Emri prezantues nuk duhet të jetë më shumë se 512 karaktere në gjatësi, duke përfshirë hapësirat. Shembull: "Imazhi i mirëseardhjes"

mimeType string

Vetëm dalje. Lloji i MIME-s së skedarit.

sizeBytes string (int64 format)

Vetëm dalje. Madhësia e skedarit në bajt.

createTime string (Timestamp format)

Vetëm dalje. Vula kohore e momentit kur është krijuar File.

Përdor RFC 3339, ku rezultati i gjeneruar do të jetë gjithmonë i normalizuar me Z dhe do të përdorë 0, 3, 6 ose 9 shifra dhjetore. Pranohen gjithashtu zhvendosje të tjera përveç "Z". Shembuj: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" ose "2014-10-02T15:01:23+05:30".

updateTime string (Timestamp format)

Vetëm dalje. Vula kohore e momentit kur File është përditësuar për herë të fundit.

Përdor RFC 3339, ku rezultati i gjeneruar do të jetë gjithmonë i normalizuar me Z dhe do të përdorë 0, 3, 6 ose 9 shifra dhjetore. Pranohen gjithashtu zhvendosje të tjera përveç "Z". Shembuj: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" ose "2014-10-02T15:01:23+05:30".

expirationTime string (Timestamp format)

Vetëm dalje. Vula kohore se kur do të fshihet File. Caktoje vetëm nëse File është planifikuar të skadojë.

Përdor RFC 3339, ku rezultati i gjeneruar do të jetë gjithmonë i normalizuar me Z dhe do të përdorë 0, 3, 6 ose 9 shifra dhjetore. Pranohen gjithashtu zhvendosje të tjera përveç "Z". Shembuj: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" ose "2014-10-02T15:01:23+05:30".

sha256Hash string (bytes format)

Vetëm dalje. Vlera hash SHA-256 e bajteve të ngarkuara.

Një varg i koduar me base64.

uri string

Vetëm dalje. URI i File.

downloadUri string

Vetëm dalje. URI i shkarkimit të File.

state enum (State)

Vetëm dalje. Gjendja e përpunimit të skedarit.

source enum (Source)

Burimi i skedarit.

error object (Status)

Vetëm dalje. Statusi i gabimit nëse përpunimi i skedarit dështoi.

metadata Union type
Metadatat për skedarin. Më poshtë është një listë e fushave që përjashtojnë njëra-tjetrën. Maksimumi një nga fushat do të caktohet në një përgjigje:
videoMetadata object (VideoFileMetadata)

Vetëm dalje. Metadatat për një video.

Fundi i fushave që përjashtojnë njëra-tjetrën.
Përfaqësim JSON
{
  "name": string,
  "displayName": string,
  "mimeType": string,
  "sizeBytes": string,
  "createTime": string,
  "updateTime": string,
  "expirationTime": string,
  "sha256Hash": string,
  "uri": string,
  "downloadUri": string,
  "state": enum (State),
  "source": enum (Source),
  "error": {
    object (Status)
  },

  // metadata
  "videoMetadata": {
    object (VideoFileMetadata)
  }
  // Union type
}

VideoFileMetadata

Metadatat për një video File.

Fushat
videoDuration string (Duration format)

Kohëzgjatja e videos.

Një kohëzgjatje në sekonda me deri në nëntë shifra dhjetore, që mbaron me "s". Shembull: "3.5s".

Përfaqësim JSON
{
  "videoDuration": string
}

Shteti

Gjendjet për ciklin e jetës së një skedari.

Enumeracionet
STATE_UNSPECIFIED Vlera e parazgjedhur. Kjo vlerë përdoret nëse gjendja hiqet.
PROCESSING Skedari po përpunohet dhe nuk mund të përdoret ende për nxjerrjen e konkluzioneve.
ACTIVE Skedari është përpunuar dhe ofrohet për nxjerrjen e konkluzioneve.
FAILED Përpunimi i skedarit dështoi.

Burimi

Enumeracionet
SOURCE_UNSPECIFIED Përdoret nëse nuk specifikohet burimi.
UPLOADED Tregon që skedari është ngarkuar nga përdoruesi.
GENERATED Tregon që skedari është gjeneruar nga Google.
REGISTERED Tregon që skedari është i regjistruar, d.m.th. një skedar i Google Cloud Storage.

Metoda: files.get

Merr metadatat për File të dhënë.

Pika e përfundimit

merr https://generativelanguage.googleapis.com/v1beta/{name=files/*}

Parametrat e shtegut

name string

Kërkohet. Emri i File që do të merret. Shembull: files/abc-123 Ka formën files/{file}.

Trupi i kërkesës

Trupi i kërkesës duhet të jetë bosh.

Kërkesë shembull

Python

from google import genai

client = genai.Client()
myfile = client.files.upload(file=media / "poem.txt")
file_name = myfile.name
print(file_name)  # "files/*"

myfile = client.files.get(name=file_name)
print(myfile)

Node.js

// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({apiKey: process.env.GEMINI_API_KEY});
const myfile = await ai.files.upload({
  file: path.join(media, 'poem.txt'),
});
const fileName = myfile.name;
console.log(fileName);

const fetchedFile = await ai.files.get({name: fileName});
console.log(fetchedFile);

Go

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)

Guaskë

name=$(jq ".file.name" file_info.json)
# Get the file of interest to check state
curl https://generativelanguage.googleapis.com/v1beta/files/$name > file_info.json
# Print some information about the file you got
name=$(jq ".file.name" file_info.json)
echo name=$name
file_uri=$(jq ".file.uri" file_info.json)
echo file_uri=$file_uripan>.sh

Metoda: files.list

Lists the metadata for Files owned by the requesting project.

Pika e përfundimit

merr https://generativelanguage.googleapis.com/v1beta/files

Parametrat e kërkesës

pageSize integer

Opsionale. Numri maksimal i Fileve që do të kthehen për faqe. Nëse nuk është e specifikuar, kalon si parazgjedhje te 10. pageSize maksimale është 100.

pageToken string

Opsionale. Një token i faqes nga një telefonatë e mëparshme e files.list.

Trupi i kërkesës

Trupi i kërkesës duhet të jetë bosh.

Kërkesë shembull

Python

from google import genai

client = genai.Client()
print("My files:")
for f in client.files.list():
  print("  ", f.name)

Node.js

// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({apiKey: process.env.GEMINI_API_KEY});
console.log('My files:');
// Using the pager style to list files
const pager = await ai.files.list({config: {pageSize: 10}});
let page = pager.page;
const names = [];
while (true) {
  for (const f of page) {
    console.log('  ', f.name);
    names.push(f.name);
  }
  if (!pager.hasNextPage()) break;
  page = await pager.nextPage();
}

Go

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)
}

Guaskë

echo "My files: "

curl "https://generativelanguage.googleapis.com/v1beta/files?key=$GEMINI_API_KEY"

Trupi i përgjigjes

Përgjigje për files.list.

Nëse është i suksesshëm, trupi i përgjigjes përmban të dhëna me strukturën e mëposhtme:

Fushat
files[] object (File)

Lista e File.

nextPageToken string

Një element i sigurisë që mund të dërgohet si një pageToken në një telefonatë vijuese files.list.

Përfaqësim JSON
{
  "files": [
    {
      object (File)
    }
  ],
  "nextPageToken": string
}

Metoda: files.delete

Fshin File.

Pika përfundimtare

fshi https://generativelanguage.googleapis.com/v1beta/{name=files/*}

Parametrat e shtegut

name string

Kërkohet. Emri i File për t'u fshirë. Shembull: files/abc-123 Ka formën files/{file}.

Trupi i kërkesës

Trupi i kërkesës duhet të jetë bosh.

Kërkesë shembull

Python

from google import genai

client = genai.Client()
myfile = client.files.upload(file=media / "poem.txt")

client.files.delete(name=myfile.name)

try:
  result = client.models.generate_content(
      model="gemini-3.8-flash", contents=[myfile, "Describe this file."]
  )
  print(result)
except genai.errors.ClientError:
  pass

Node.js

// The Gen AI SDK for TypeScript and JavaScript is in preview.
// Some features have not been implemented.

Go

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-3.8-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")

Guaskë

curl --request "DELETE" https://generativelanguage.googleapis.com/v1beta/files/$name?key=$GEMINI_API_KEYpan>.sh

Trupi i përgjigjes

Nëse është i suksesshëm, trupi i përgjigjes është një objekt bosh JSON.

Metoda: files.register

Regjistron skedarët e Google Cloud Storage me FileService. Përdoruesi pritet të ofrojë URI-të e Google Cloud Storage dhe do të marrë një burim skedari për çdo URI në këmbim. Ki parasysh se skedarët nuk kopjohen, por thjesht regjistrohen me File API. Nëse një skedar dështon të regjistrohet, dështon e gjithë kërkesa.

Pika përfundimtare

postim https://generativelanguage.googleapis.com/v1beta/files:register

Trupi i kërkesës

Trupi i kërkesës përmban të dhëna me strukturën e mëposhtme:

Fushat
uris[] string

Kërkohet. URI-të e Google Cloud Storage për t'u regjistruar. Shembull: gs://bucket/object.

Trupi i përgjigjes

Përgjigje për files.register.

Nëse është i suksesshëm, trupi i përgjigjes përmban të dhëna me strukturën e mëposhtme:

Fushat
files[] object (File)

Skedarët e regjistruar që do të përdoren kur të telefonosh GenerateContent.

Përfaqësim JSON
{
  "files": [
    {
      object (File)
    }
  ]
}

Metoda: media.upload

Krijon një File.

Pika e përfundimit

  • Ngarko URI-në, për kërkesat për ngarkimin e medias:
postim https://generativelanguage.googleapis.com/upload/v1beta/files
  • URI i metadatave, për kërkesat vetëm për metadata:
postim https://generativelanguage.googleapis.com/v1beta/files

Trupi i kërkesës

Trupi i kërkesës përmban të dhëna me strukturën e mëposhtme:

Fushat
file object (File)

Opsionale. Metadatat për skedarin që do të krijohet.

Kërkesë shembull

Imazh

Python

from google import genai

client = genai.Client()
myfile = client.files.upload(file=media / "Cajun_instruments.jpg")
print(f"{myfile=}")

result = client.models.generate_content(
    model="gemini-3.8-flash",
    contents=[
        myfile,
        "\n\n",
        "Can you tell me about the instruments in this photo?",
    ],
)
print(f"{result.text=}")

Node.js

// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({apiKey: process.env.GEMINI_API_KEY});
const myfile = await ai.files.upload({
  file: path.join(media, 'Cajun_instruments.jpg'),
  config: {mimeType: 'image/jpeg'},
});
console.log('Uploaded file:', myfile);

const result = await ai.models.generateContent({
  model: 'gemini-3.8-flash',
  contents: createUserContent([
    createPartFromUri(myfile.uri, myfile.mimeType),
    '\n\n',
    'Can you tell me about the instruments in this photo?',
  ]),
});
console.log('result.text=', result.text);

Go

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-3.8-flash", contents, nil)
if err != nil {
	log.Fatal(err)
}
text := response.Text()
fmt.Printf("result.text=%s\n", text)

Guaskë

MIME_TYPE=$(file -b --mime-type "${IMG_PATH_2}")
NUM_BYTES=$(wc -c < "${IMG_PATH_2}")
DISPLAY_NAME=TEXT

tmp_header_file=upload-header.tmp

# Initial resumable request defining metadata.
# The upload url is in the response headers dump them to a file.
curl "${BASE_URL}/upload/v1beta/files?key=${GEMINI_API_KEY}" \
  -D upload-header.tmp \
  -H "X-Goog-Upload-Protocol: resumable" \
  -H "X-Goog-Upload-Command: start" \
  -H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPE}" \
  -H "Content-Type: application/json" \
  -d "{'file': {'display_name': '${DISPLAY_NAME}'}}" 2> /dev/null

upload_url=$(grep -i "x-goog-upload-url: " "${tmp_header_file}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file}"

# Upload the actual bytes.
curl "${upload_url}" \
  -H "Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Offset: 0" \
  -H "X-Goog-Upload-Command: upload, finalize" \
  --data-binary "@${IMG_PATH_2}" 2> /dev/null > file_info.json

file_uri=$(jq ".file.uri" file_info.json)
echo file_uri=$file_uri

# Now generate content using that file
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=$GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [{
        "parts":[
          {"text": "Can you tell me about the instruments in this photo?"},
          {"file_data":
            {"mime_type": "image/jpeg", 
            "file_uri": '$file_uri'}
        }]
        }]
       }' 2> /dev/null > response.json

cat response.json
echo

jq ".candidates[].content.parts[].text" response.json

Audio

Python

from google import genai

client = genai.Client()
myfile = client.files.upload(file=media / "sample.mp3")
print(f"{myfile=}")

result = client.models.generate_content(
    model="gemini-3.8-flash", contents=[myfile, "Describe this audio clip"]
)
print(f"{result.text=}")

Node.js

// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({apiKey: process.env.GEMINI_API_KEY});
const myfile = await ai.files.upload({
  file: path.join(media, 'sample.mp3'),
  config: {mimeType: 'audio/mpeg'},
});
console.log('Uploaded file:', myfile);

const result = await ai.models.generateContent({
  model: 'gemini-3.8-flash',
  contents: createUserContent([
    createPartFromUri(myfile.uri, myfile.mimeType),
    'Describe this audio clip',
  ]),
});
console.log('result.text=', result.text);

Go

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-3.8-flash", contents, nil)
if err != nil {
	log.Fatal(err)
}
text := response.Text()
fmt.Printf("result.text=%s\n", text)

Guaskë

MIME_TYPE=$(file -b --mime-type "${AUDIO_PATH}")
NUM_BYTES=$(wc -c < "${AUDIO_PATH}")
DISPLAY_NAME=AUDIO

tmp_header_file=upload-header.tmp

# Initial resumable request defining metadata.
# The upload url is in the response headers dump them to a file.
curl "${BASE_URL}/upload/v1beta/files?key=${GEMINI_API_KEY}" \
  -D upload-header.tmp \
  -H "X-Goog-Upload-Protocol: resumable" \
  -H "X-Goog-Upload-Command: start" \
  -H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPE}" \
  -H "Content-Type: application/json" \
  -d "{'file': {'display_name': '${DISPLAY_NAME}'}}" 2> /dev/null

upload_url=$(grep -i "x-goog-upload-url: " "${tmp_header_file}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file}"

# Upload the actual bytes.
curl "${upload_url}" \
  -H "Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Offset: 0" \
  -H "X-Goog-Upload-Command: upload, finalize" \
  --data-binary "@${AUDIO_PATH}" 2> /dev/null > file_info.json

file_uri=$(jq ".file.uri" file_info.json)
echo file_uri=$file_uri

# Now generate content using that file
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=$GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [{
        "parts":[
          {"text": "Describe this audio clip"},
          {"file_data":{"mime_type": "audio/mp3", "file_uri": '$file_uri'}}]
        }]
       }' 2> /dev/null > response.json

cat response.json
echo

jq ".candidates[].content.parts[].text" response.json

Teksti

Python

from google import genai

client = genai.Client()
myfile = client.files.upload(file=media / "poem.txt")
print(f"{myfile=}")

result = client.models.generate_content(
    model="gemini-3.8-flash",
    contents=[myfile, "\n\n", "Can you add a few more lines to this poem?"],
)
print(f"{result.text=}")

Node.js

// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({apiKey: process.env.GEMINI_API_KEY});
const myfile = await ai.files.upload({
  file: path.join(media, 'poem.txt'),
});
console.log('Uploaded file:', myfile);

const result = await ai.models.generateContent({
  model: 'gemini-3.8-flash',
  contents: createUserContent([
    createPartFromUri(myfile.uri, myfile.mimeType),
    '\n\n',
    'Can you add a few more lines to this poem?',
  ]),
});
console.log('result.text=', result.text);

Go

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-3.8-flash", contents, nil)
if err != nil {
	log.Fatal(err)
}
text := response.Text()
fmt.Printf("result.text=%s\n", text)

Guaskë

MIME_TYPE=$(file -b --mime-type "${TEXT_PATH}")
NUM_BYTES=$(wc -c < "${TEXT_PATH}")
DISPLAY_NAME=TEXT

tmp_header_file=upload-header.tmp

# Initial resumable request defining metadata.
# The upload url is in the response headers dump them to a file.
curl "${BASE_URL}/upload/v1beta/files?key=${GEMINI_API_KEY}" \
  -D upload-header.tmp \
  -H "X-Goog-Upload-Protocol: resumable" \
  -H "X-Goog-Upload-Command: start" \
  -H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPE}" \
  -H "Content-Type: application/json" \
  -d "{'file': {'display_name': '${DISPLAY_NAME}'}}" 2> /dev/null

upload_url=$(grep -i "x-goog-upload-url: " "${tmp_header_file}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file}"

# Upload the actual bytes.
curl "${upload_url}" \
  -H "Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Offset: 0" \
  -H "X-Goog-Upload-Command: upload, finalize" \
  --data-binary "@${TEXT_PATH}" 2> /dev/null > file_info.json

file_uri=$(jq ".file.uri" file_info.json)
echo file_uri=$file_uri

# Now generate content using that file
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=$GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [{
        "parts":[
          {"text": "Can you add a few more lines to this poem?"},
          {"file_data":{"mime_type": "text/plain", "file_uri": '$file_uri'}}]
        }]
       }' 2> /dev/null > response.json

cat response.json
echo

jq ".candidates[].content.parts[].text" response.json

name=$(jq ".file.name" file_info.json)
# Get the file of interest to check state
curl https://generativelanguage.googleapis.com/v1beta/files/$name > file_info.json
# Print some information about the file you got
name=$(jq ".file.name" file_info.json)
echo name=$name
file_uri=$(jq ".file.uri" file_info.json)
echo file_uri=$file_uri

curl --request "DELETE" https://generativelanguage.googleapis.com/v1beta/files/$name?key=$GEMINI_API_KEY

Video

Python

from google import genai
import time

client = genai.Client()
# Video clip (CC BY 3.0) from https://peach.blender.org/download/
myfile = client.files.upload(file=media / "Big_Buck_Bunny.mp4")
print(f"{myfile=}")

# Poll until the video file is completely processed (state becomes ACTIVE).
while not myfile.state or myfile.state.name != "ACTIVE":
  if myfile.state and myfile.state.name == "FAILED":
    raise ValueError(f"Video file processing failed: {getattr(myfile, 'error', None) or 'state is FAILED'}")
  print("Processing video...")
  print("File state:", myfile.state)
  time.sleep(5)
  myfile = client.files.get(name=myfile.name)

result = client.models.generate_content(
    model="gemini-3.8-flash", contents=[myfile, "Describe this video clip"]
)
print(f"{result.text=}")

Node.js

// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({apiKey: process.env.GEMINI_API_KEY});
let myfile = await ai.files.upload({
  file: path.join(media, 'Big_Buck_Bunny.mp4'),
  config: {mimeType: 'video/mp4'},
});
console.log('Uploaded video file:', myfile);

// Poll until the video file is completely processed (state becomes ACTIVE).
while (!myfile.state || myfile.state.toString() !== 'ACTIVE') {
  if (myfile.state && myfile.state.toString() === 'FAILED') {
    throw new Error(
      `Video file processing failed: ${myfile.error?.message || 'state is FAILED'}`,
    );
  }
  console.log('Processing video...');
  console.log('File state: ', myfile.state);
  await sleep(5000);
  myfile = await ai.files.get({name: myfile.name});
}

const result = await ai.models.generateContent({
  model: 'gemini-3.8-flash',
  contents: createUserContent([
    createPartFromUri(myfile.uri, myfile.mimeType),
    'Describe this video clip',
  ]),
});
console.log('result.text=', result.text);

Go

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.FileStateActive {
	if myfile.State == genai.FileStateFailed {
		return nil, fmt.Errorf("video file processing failed: %v", myfile.State)
	}
	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-3.8-flash", contents, nil)
if err != nil {
	log.Fatal(err)
}
text := response.Text()
fmt.Printf("result.text=%s\n", text)

Guaskë

MIME_TYPE=$(file -b --mime-type "${VIDEO_PATH}")
NUM_BYTES=$(wc -c < "${VIDEO_PATH}")
DISPLAY_NAME=VIDEO_PATH

# Initial resumable request defining metadata.
# The upload url is in the response headers dump them to a file.
curl "${BASE_URL}/upload/v1beta/files?key=${GEMINI_API_KEY}" \
  -D upload-header.tmp \
  -H "X-Goog-Upload-Protocol: resumable" \
  -H "X-Goog-Upload-Command: start" \
  -H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPE}" \
  -H "Content-Type: application/json" \
  -d "{'file': {'display_name': '${DISPLAY_NAME}'}}" 2> /dev/null

upload_url=$(grep -i "x-goog-upload-url: " "${tmp_header_file}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file}"

# Upload the actual bytes.
curl "${upload_url}" \
  -H "Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Offset: 0" \
  -H "X-Goog-Upload-Command: upload, finalize" \
  --data-binary "@${VIDEO_PATH}" 2> /dev/null > file_info.json

file_uri=$(jq ".file.uri" file_info.json)
echo file_uri=$file_uri

state=$(jq ".file.state" file_info.json)
echo state=$state

# Ensure the state of the video is 'ACTIVE'
while [[ "($state)" = *"PROCESSING"* ]];
do
  echo "Processing video..."
  sleep 5
  # Get the file of interest to check state
  curl https://generativelanguage.googleapis.com/v1beta/files/$name > file_info.json
  state=$(jq ".file.state" file_info.json)
done

# Now generate content using that file
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=$GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [{
        "parts":[
          {"text": "Describe this video clip"},
          {"file_data":{"mime_type": "video/mp4", "file_uri": '$file_uri'}}]
        }]
       }' 2> /dev/null > response.json

cat response.json
echo

jq ".candidates[].content.parts[].text" response.json

PDF

Python

from google import genai

client = genai.Client()
sample_pdf = client.files.upload(file=media / "test.pdf")
response = client.models.generate_content(
    model="gemini-3.8-flash",
    contents=["Give me a summary of this pdf file.", sample_pdf],
)
print(response.text)

Go

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-3.8-flash", contents, nil)
if err != nil {
	log.Fatal(err)
}
text := response.Text()
fmt.Println(text)

Trupi i përgjigjes

Përgjigje për media.upload.

Nëse është i suksesshëm, trupi i përgjigjes përmban të dhëna me strukturën e mëposhtme:

Fushat
file object (File)

Metadatat për skedarin e krijuar.

Përfaqësim JSON
{
  "file": {
    object (File)
  }
}

Statusi

Lloji Status përcakton një model gabimi logjik që është i përshtatshëm për mjedise të ndryshme programimi, duke përfshirë API-të REST dhe API-të RPC. Ai përdoret nga gRPC. Çdo mesazh i Status përmban tri të dhëna: kodin e gabimit, mesazhin e gabimit dhe detajet e gabimit.

Mund të mësosh më shumë rreth këtij modeli gabimi dhe se si të punosh me të tek Udhëzuesi i dizajnit të API-së.

Fushat
code integer

Kodi i statusit, i cili duhet të jetë një vlerë numërimi e google.rpc.Code.

message string

Një mesazh gabimi për zhvilluesin, i cili duhet të jetë në anglisht. Çdo mesazh gabimi që i shfaqet përdoruesit duhet të lokalizohet dhe të dërgohet në fushën google.rpc.Status.details ose të lokalizohet nga klienti.

details[] object

Një listë mesazhesh që mbajnë detajet e gabimit. Ka një grup të zakonshëm të llojeve të mesazheve që mund të përdorin API-të.

Një objekt që përmban fusha të një lloji arbitrar. Një fushë shtesë "@type" përmban një URI që identifikon llojin. Shembull: { "id": 1234, "@type": "types.example.com/standard/id" }.

Përfaqësim JSON
{
  "code": integer,
  "message": string,
  "details": [
    {
      "@type": string,
      field1: ...,
      ...
    }
  ]
}