Source: https://ailoot.ai/docs/uz/api/gemini/
Canonical: https://ailoot.ai/docs/uz/api/gemini/
Language: uz

[API](https://ailoot.ai/docs/uz/) 

# Gemini generateContent

[Markdown](https://ailoot.ai/docs/uz/api/gemini/index.md)

Google Gemini’ning o‘z formati: Gemini CLI, Google GenAI SDK va REST mijoz dasturlari uchun.

POST`https://api.ailoot.ai/v1beta/models/{model}:generateContent`

Gemini generateContent

```bash
curl "https://api.ailoot.ai/v1beta/models/gemini-3.8-flash:generateContent" \
  -H "x-goog-api-key: $AILOOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [
      {"role": "user", "parts": [{"text": "Qahvaxona uchun uchta nom o‘ylab toping."}]}
    ]
  }' 
```

```python
from google import genai
from google.genai import types
import os

client = genai.Client(
    api_key=os.environ["AILOOT_API_KEY"],
    http_options=types.HttpOptions(base_url="https://api.ailoot.ai"),  # /v1beta’siz
)

resp = client.models.generate_content(
    model="gemini-3.8-flash",
    contents="Qahvaxona uchun uchta nom o‘ylab toping.",
)
print(resp.text)
```

```js
import { GoogleGenAI } from "@google/genai";

const ai = new GoogleGenAI({
  apiKey: process.env.AILOOT_API_KEY,
  httpOptions: { baseUrl: "https://api.ailoot.ai" }, // /v1beta’siz
});

const resp = await ai.models.generateContent({
  model: "gemini-3.8-flash",
  contents: "Qahvaxona uchun uchta nom o‘ylab toping.",
});
console.log(resp.text);
```

200 OK

```json
{
  "candidates": [
    {
      "content": {
        "role": "model",
        "parts": [{ "text": "1. «Don va bug‘» 2. «Tonggi qahva maydalash» 3. «Burchakdagi qahvaxona»" }]
      },
      "finishReason": "STOP"
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 9,
    "candidatesTokenCount": 27,
    "totalTokenCount": 36
  },
  "modelVersion": "gemini-3.8-flash"
}
```

## Avtorizatsiya

| Parametr | Tur | Majburiy | Tavsif |
| --- | --- | --- | --- |
| `x-goog-api-key` | header | majburiy | Kalit `sk-…`. Quyidagilar ham mos keladi: `Authorization: Bearer` yoki `x-api-key`. Google bilan moslik uchun quyidagisi ham qabul qilinadi: `?key=` manzilda — eng past ustuvorlik bilan; `?api_key=` 400 bilan rad etiladi. Sarlavhani tavsiya qilamiz: shunda kalit loglarga tushmaydi. |

## Yo‘l

| Parametr | Tur | Majburiy | Tavsif |
| --- | --- | --- | --- |
| `model` | string | majburiy | Gemini formatidagi model ID’si, masalan `gemini-3.8-flash` yoki `gemini-3.1-pro`. Jami 27 ta. |

POST`https://api.ailoot.ai/v1beta/models/{model}:streamGenerateContent?alt=sse`

GET`https://api.ailoot.ai/v1beta/models`

## So‘rov tanasi

| Parametr | Tur | Majburiy | Tavsif |
| --- | --- | --- | --- |
| `contents` | array | majburiy | Quyidagi maydonga ega xabarlar: `role` (`user`/`model`) va `parts`: text, inlineData/fileData, functionCall/functionResponse. Ilovalar — model kirishda qabul qiladigan turlar. |
| `systemInstruction` | object | ixtiyoriy | Matnli tizim ko‘rsatmasi: `{"parts": [{"text": "…"}]}`. |
| `generationConfig` | object | ixtiyoriy | `generationConfig` qabul qiladi: `temperature`, `topP`, `topK`, `maxOutputTokens`, `thinkingConfig`, `responseMimeType` (`text/plain` yoki `application/json`), `responseSchema` yoki `responseJsonSchema` (JSON obyekt), `stopSequences` (satrlar massivi), `candidateCount: 1`, butun sonli `seed`, sonli `presencePenalty` va `frequencyPenalty`. Ruxsat etilgan oraliqlar va imkoniyatlar aniq modelga bog‘liq; JSON javob uchun qo‘llab-quvvatlanadigan sxema shakllaridan bittasini va quyidagini tanlang: `application/json`. Matn modellarida `responseModalities` — faqat `["TEXT"]`. |
| `safetySettings` | array | ixtiyoriy | Quyidagi majburiy maydonlarga ega obyektlar: `category` va `threshold`, ixtiyoriy maydon: `method`. Qiymatlar aniq model tomonidan qo‘llab-quvvatlanishi kerak. |
| `tools` | array | ixtiyoriy | Mijoz tomonidagi `functionDeclarations` ni ilovangiz bajaradi. Matn modellarida quyidagilar ham qabul qilinadi: `{"googleSearch": {}}` va `{"urlContext": {}}`: alohida yoki birga quyidagi massivda: `tools`. Google Search ham, URL context ham quyidagisi bilan birga ishlatilmaydi: `functionDeclarations` bitta so‘rovda. Chiqishda rasmlar uchun faqat mijoz funksiyalari mavjud. Boshqa ichki vositalar va explicit cache qo‘llab-quvvatlanmaydi. Search/URL context to‘liq kirish limiti uchun zaxira talab qilishi mumkin; haqiqiy `toolUsePromptTokenCount` kirish tokenlari sifatida hisobga olinadi. |
| `toolConfig` | object | ixtiyoriy | `functionCallingConfig`: mode (AUTO/ANY/NONE/VALIDATED/MODE\_UNSPECIFIED), allowedFunctionNames. |

Model maydonni, ilovani yoki vositalar birikmasini qo‘llab-quvvatlamasa, so‘rov zaxiradan oldin rad etiladi — hech narsa yechib olinmaydi. HTTP kodi quyidagicha bo‘ladi: `400` quyidagi qiymat bilan: `status` `INVALID_ARGUMENT` va quyidagi sinf bilan: `invalid_request` (quyidagi maydonda: `ErrorInfo.reason` — `INVALID_REQUEST`). Noto‘g‘ri JSON, yo‘l parametrlari xatolari va boshqa tekshiruvlar ham quyidagi kodni qaytaradi: `400`; xato matni va Request ID’ni o‘qing. Imkoniyatlar modelga bog‘liq: uning formatlari va kirishlarini katalogda tekshiring.

## PDF, audio, video va havolalar

Tegishli kirish turini qo‘llab-quvvatlaydigan Gemini modellarida `parts[].inlineData` quyidagini o‘z ichiga oladi: `mimeType` va bo‘sh bo‘lmagan base64 ma’lumotlar; PDF haqiqiy PDF bo‘lishi kerak. `fileData` quyidagilarni o‘z ichiga oladi: ochiq `https`-manzilni quyidagi maydonda: `fileUri` va fayl turining MIME qiymatini. YouTube uchun MIME’ni ko‘rsatmaslik mumkin. `http`, yopiq manzillar, `gs://` va Google Files API obyektlari qo‘llab-quvvatlanmaydi; Google Files API orqali yuklash ham qo‘llab-quvvatlanmaydi. Video uchun quyidagini qo‘shish mumkin: `videoMetadata`: `startOffset`/`endOffset` soniyalardagi satr ko‘rinishida (masalan, `1.5s`) va `fps` 0 dan katta va 24 dan katta emas. Tana hajmi, kontekst, ruxsat etilgan kirish va javob limiti model hamda format bo‘yicha tekshiriladi.

| Kirish | Qo‘llab-quvvatlanadigan MIME |
| --- | --- |
| Inline rasmlar | image/png, image/jpeg, image/webp |
| Hujjatlar | application/pdf; text/plain, text/html, text/css, text/csv, text/xml, text/rtf, text/markdown, text/javascript, application/x-javascript, text/x-python, application/x-python |
| Audio | audio/wav, audio/mp3, audio/mpeg, audio/aiff, audio/aac, audio/ogg, audio/flac |
| Video | video/mp4, video/mpeg, video/mov, video/quicktime, video/avi, video/x-flv, video/mpg, video/webm, video/wmv, video/3gpp |

```python
import json, os, urllib.request

def generate(model, payload):
    req = urllib.request.Request(
        "https://api.ailoot.ai/v1beta/models/" + model + ":generateContent",
        data=json.dumps(payload).encode(),
        headers={"x-goog-api-key": os.environ["AILOOT_API_KEY"],
                 "Content-Type": "application/json"},
    )
    # Bir marta yuboring. Kutish vaqti tugasa, qayta urinishdan oldin foydalanish tarixidagi Request ID ni tekshiring.
    with urllib.request.urlopen(req, timeout=300) as response:
        print("Request ID:", response.headers.get("X-Request-ID"))
        return json.load(response)

import base64, pathlib, sys

# Haqiqiy mahalliy PDF, audio yoki video faylini va unga mos MIME turini ko‘rsating.
path, mime = pathlib.Path(sys.argv[1]), sys.argv[2]
payload = {"contents": [{"role": "user", "parts": [
    {"text": "Fayl mazmunini qisqacha bayon qiling."},
    {"inlineData": {"mimeType": mime,
                    "data": base64.b64encode(path.read_bytes()).decode()}},
]}]}
print(generate("gemini-3.8-flash", payload))
# Muqobil biriktirma: {"fileData": {"mimeType": mime, "fileUri": public_https_url}}
# Haqiqiy YouTube URL uchun: {"fileData": {"fileUri": youtube_url}}
```

## Search va URL context

Mijoz tomonidagi `functionDeclarations` ni ilovangiz bajaradi. Matn modellarida quyidagilar ham qabul qilinadi: `{"googleSearch": {}}` va `{"urlContext": {}}`: alohida yoki birga quyidagi massivda: `tools`. Google Search ham, URL context ham quyidagisi bilan birga ishlatilmaydi: `functionDeclarations` bitta so‘rovda. Chiqishda rasmlar uchun faqat mijoz funksiyalari mavjud. Boshqa ichki vositalar va explicit cache qo‘llab-quvvatlanmaydi. Search/URL context to‘liq kirish limiti uchun zaxira talab qilishi mumkin; haqiqiy `toolUsePromptTokenCount` kirish tokenlari sifatida hisobga olinadi.

```json
{"tools": [{"googleSearch": {}}, {"urlContext": {}}]}
```

## Chiqishdagi rasmlar

Gemini formatidagi javobda rasmlarni faqat quyidagi model bera oladi: `gemini-3.1-flash-image`. Bu quyidagi endpointdan alohida imkoniyat: `/v1/images/generations`: boshqa rasm modellari bu yerda ishlamaydi. Bu modelning kirishi 131072 tokengacha, javobi 32768 tagacha; eng uzun javobning to‘liq narxi oldindan zaxiralanadi.

`responseModalities` — takrorlanishsiz, bo‘sh bo‘lmagan TEXT/IMAGE to‘plami. `imageConfig.imageSize`: 1K/2K/4K; `aspectRatio`: 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, 1:4, 4:1, 1:8, 8:1. Bu modelning kirishi — matn va inline PNG/JPEG/WebP; PDF/audio/video/fileData hamda ichki Search/URL context bu yerda qabul qilinmaydi. Kalitingiz uchun mavjudlik va narxlar — katalogda va quyidagi so‘rovda: `GET /v1/models`.

```python
import json, os, urllib.request

def generate(model, payload):
    req = urllib.request.Request(
        "https://api.ailoot.ai/v1beta/models/" + model + ":generateContent",
        data=json.dumps(payload).encode(),
        headers={"x-goog-api-key": os.environ["AILOOT_API_KEY"],
                 "Content-Type": "application/json"},
    )
    # Bir marta yuboring. Kutish vaqti tugasa, qayta urinishdan oldin foydalanish tarixidagi Request ID ni tekshiring.
    with urllib.request.urlopen(req, timeout=300) as response:
        print("Request ID:", response.headers.get("X-Request-ID"))
        return json.load(response)

import base64, pathlib

reply = generate("gemini-3.1-flash-image", {
    "contents": [{"role": "user", "parts": [{"text": "Akvarel: tongdagi mayoq"}]}],
    "generationConfig": {
        "responseModalities": ["TEXT", "IMAGE"],
        "imageConfig": {"aspectRatio": "1:1", "imageSize": "1K"},
    },
})
index = 0
for candidate in reply.get("candidates", []):
    for part in candidate.get("content", {}).get("parts", []):
        if "text" in part:
            print(part["text"])
        blob = part.get("inlineData", {})
        if blob.get("mimeType", "").startswith("image/") and blob.get("data"):
            index += 1
            extension = {"image/png": "png", "image/jpeg": "jpg",
                         "image/webp": "webp"}.get(blob["mimeType"], "bin")
            pathlib.Path(f"gemini-image-v{index}.{extension}").write_bytes(
                base64.b64decode(blob["data"]))
print("All returned images:", index)
```

## Function calling’ning to‘liq sikli

Funksiyalarni mijoz dasturi bajaradi. Modelning butun asl content qiymatini thoughtSignature bilan o‘zgartirmay qaytaring, keyin name va agar functionCall ichida bo‘lgan bo‘lsa, id qiymati bir xil bo‘lgan functionResponse yuboring.

```python
import json, os, urllib.request

def generate(model, payload):
    req = urllib.request.Request(
        "https://api.ailoot.ai/v1beta/models/" + model + ":generateContent",
        data=json.dumps(payload).encode(),
        headers={"x-goog-api-key": os.environ["AILOOT_API_KEY"],
                 "Content-Type": "application/json"},
    )
    # Bir marta yuboring. Kutish vaqti tugasa, qayta urinishdan oldin foydalanish tarixidagi Request ID ni tekshiring.
    with urllib.request.urlopen(req, timeout=300) as response:
        print("Request ID:", response.headers.get("X-Request-ID"))
        return json.load(response)

tools = [{"functionDeclarations": [{
    "name": "multiply", "description": "Ikki sonni ko‘paytirish",
    "parameters": {"type": "object", "properties": {
        "a": {"type": "number"}, "b": {"type": "number"}},
        "required": ["a", "b"]},
}]}]
contents = [{"role": "user", "parts": [{"text": "Funksiya yordamida 7 ni 8 ga ko‘paytiring"}]}]
for turn in range(4):  # Vosita siklini cheklang; natijasi noaniq so‘rovni qayta yubormang.
    reply = generate("gemini-3.8-flash", {"contents": contents, "tools": tools})
    content = reply["candidates"][0]["content"]
    contents.append(content)  # BARCHA asl parts va thoughtSignature qiymatlarini o‘zgartirmasdan saqlang.
    results = []
    for part in content.get("parts", []):
        call = part.get("functionCall")
        if not call:
            continue
        if call["name"] != "multiply":
            raise ValueError("Unexpected function")
        args = call["args"]
        result = {"name": call["name"], "response": {"value": args["a"] * args["b"]}}
        if "id" in call:
            result["id"] = call["id"]
        results.append({"functionResponse": result})
    if not results:
        print(content)
        break
    contents.append({"role": "user", "parts": results})
else:
    raise RuntimeError("Tool loop limit reached")
```

## Javob

| Parametr | Tur | Majburiy | Tavsif |
| --- | --- | --- | --- |
| `candidates[].content.parts` | array |  | Model javobi. |
| `usageMetadata` | object |  | `promptTokenCount`, `candidatesTokenCount`, `totalTokenCount`. |

Pullik Gemini javobi narx hisoblangach so‘zma-so‘z emas, to‘liq keladi. Gemini oqimida xizmat satrlari yo‘q — mijozning kutish muddatini zaxira bilan belgilang.

Savollaringiz qoldimi? Request ID va tavsifni yuboring — tushunishga yordam beramiz.[Yordam xizmatiga yozish](mailto:support@ailoot.ai)

## Ailoot · Kompaniya va uning loyihalar portfeli





Ailoot to‘plangan faoliyat tajribasi, keng mijozlar bazasi, barqaror xizmat va doimiy KPI nazoratiga tayanadi.





Kompaniya va uning loyihalar portfeli: millionlab mijozlar; oylik sotuvlar hajmi milliardlarda.





Ailoot bu faoliyat tajribasini mijozlar mahsulotlari, agentlar, ilovalar va avtomatlashtirishlarda AI imkoniyatlariga API orqali kirishni ta’minlashda qo‘llaydi.
