Gemini generateContent
MarkdownGoogle Gemini’ning o‘z formati: Gemini CLI, Google GenAI SDK va REST mijoz dasturlari uchun.
To‘liq qo‘llanma
https://api.ailoot.ai/v1beta/models/{model}:generateContentcurl "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."}]}
]
}' 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)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);{
"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
- x-goog-api-keyheadermajburiy
Kalit
sk-…. Quyidagilar ham mos keladi:Authorization: Beareryokix-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
- modelstringmajburiy
Gemini formatidagi model ID’si, masalan
gemini-3.8-flashyokigemini-3.1-pro. Jami 27 ta.
https://api.ailoot.ai/v1beta/models/{model}:streamGenerateContent?alt=ssehttps://api.ailoot.ai/v1beta/modelsSo‘rov tanasi
- contentsarraymajburiy
Quyidagi maydonga ega xabarlar:
role(user/model) vaparts: text, inlineData/fileData, functionCall/functionResponse. Ilovalar — model kirishda qabul qiladigan turlar. - systemInstructionobjectixtiyoriy
Matnli tizim ko‘rsatmasi:
{"parts": [{"text": "…"}]}. - generationConfigobjectixtiyoriy
generationConfigqabul qiladi:temperature,topP,topK,maxOutputTokens,thinkingConfig,responseMimeType(text/plainyokiapplication/json),responseSchemayokiresponseJsonSchema(JSON obyekt),stopSequences(satrlar massivi),candidateCount: 1, butun sonliseed, sonlipresencePenaltyvafrequencyPenalty. Ruxsat etilgan oraliqlar va imkoniyatlar aniq modelga bog‘liq; JSON javob uchun qo‘llab-quvvatlanadigan sxema shakllaridan bittasini va quyidagini tanlang:application/json. Matn modellaridaresponseModalities— faqat["TEXT"]. - safetySettingsarrayixtiyoriy
Quyidagi majburiy maydonlarga ega obyektlar:
categoryvathreshold, ixtiyoriy maydon:method. Qiymatlar aniq model tomonidan qo‘llab-quvvatlanishi kerak. - toolsarrayixtiyoriy
Mijoz tomonidagi
functionDeclarationsni 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:functionDeclarationsbitta 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; haqiqiytoolUsePromptTokenCountkirish tokenlari sifatida hisobga olinadi. - toolConfigobjectixtiyoriy
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 |
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.
{"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.
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.
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
- candidates[].content.partsarray
Model javobi.
- usageMetadataobject
promptTokenCount,candidatesTokenCount,totalTokenCount.