Pika fundore e modelit gemini-robotics-er-2-streaming-preview ekspozon një pikë fundore të dedikuar transmetimi që integrohet me Live API , duke mundësuar ndërveprim në kohë reale, dypalësh midis aplikacionit tuaj dhe robotit. Kjo e bën atë të përshtatshëm për agjentët që kanë nevojë për sythe të shpejta reagimi dhe përgjigje reaktive ndaj mjedisit.
Rastet e përdorimit
- Koordinimi i shumë robotëve : Robotë të shumtë që komunikojnë gjendjen e detyrës dhe delegojnë nëndetyra përmes një sesioni të përbashkët.
- Monitorim i vazhdueshëm : Robotë që vëzhgojnë një skenë dhe aktivizojnë veprime kur ndodhin ngjarje specifike, siç është një enë që arrin një nivel mbushjeje.
- Magazina dhe logjistika : Agjentë të marrjes dhe paketimit që verifikojnë artikujt vizualisht, ndjekin progresin e paketimit dhe rikuperohen nga gabimet.
Specifikimet teknike
Tabela e mëposhtme përshkruan specifikimet teknike për Live API:
| Kategoria | Detajet |
|---|---|
| Modalitetet e të dhënave | Audio (audio PCM 16-bit i papërpunuar, 16kHz, little-endian), imazhe (JPEG <= 1FPS), tekst |
| Modalitetet e prodhimit | Tekst |
| Protokolli | Lidhje me Stateful WebSocket (WSS) |
Ndërtoni një strukturë agjentësh
Çdo agjent robotik i ndërtuar në Live API ndjek tre hapa:
- Deklaroni aftësitë e robotit si mjete. Çdo veprim që roboti mund të kryejë — të lundrojë, të kapë, të flasë — bëhet një deklaratë funksioni me një emër, përshkrim dhe skemë parametrash. Veprimet fizike duhet të përdorin
"behavior": "BLOCKING"në mënyrë që modeli të presë që roboti të përfundojë përpara se të zgjedhë hapin tjetër. - Transmetoni të dhëna multimodale në një seancë të përhershme. Hapni një seancë
live.connectdhe mbajeni të hapur për gjithë kohëzgjatjen e detyrës. Dërgoni korniza video, audio ose tekst ndërsa ato mbërrijnë nga sensorët e robotit tuaj. - Trajtoni thirrjet e mjeteve në një cikël pranimi. Sa herë që modeli zgjedh një veprim, ai dërgon një mesazh
tool_call. Cikli juaj i pranimit ekzekuton funksionin kundër SDK-së së robotit tuaj dhe dërgon mbrapsht njëtool_response. Sesioni mbetet i hapur dhe modeli zgjedh veprimin tjetër bazuar në rezultat.
Seksionet e mëposhtme tregojnë se si t'i zbatoni këto hapa në tre modele të zakonshme: një lak agjenti bazë, monitorim proaktiv i skenës me një rrahje zemre dhe drejtim i të folurit përmes TTS si mjet.
Orkestro një robot përmes thirrjes së funksioneve
Shembulli i mëposhtëm tregon të tre hapat e lidhur së bashku në një skript të vetëm Python.
Hapi 1 — përkufizimet e mjeteve — deklaron aftësitë e robotit si deklarata funksioni. Funksioni navigate përdor "behavior": "BLOCKING" në mënyrë që modeli të presë që roboti të arrijë në pikën e referencës përpara se të thërrasë një mjet tjetër. Shtoni më shumë deklarata funksioni në të njëjtën listë për të ekspozuar aftësi shtesë të robotit.
Hapi 2 — ndihmësit e të dhënave hyrëse — tregon tre funksione që transmetojnë të dhëna hyrëse të modaliteteve të ndryshme në sesion: send_text për komandat, send_image për kornizat e kamerave me një kërkesë teksti opsionale dhe send_audio për audio PCM të papërpunuar nga një mikrofon.
Hapi 3 — cikli i marrjes — ekzekutohet njëkohësisht dhe trajton dy lloje mesazhesh: mesazhet server_content (dalja e tekstit të modelit) dhe mesazhet tool_call (modeli që kërkon një veprim të robotit). Kur mbërrin një thirrje mjeti, cikli thërret execute_tool — një cung që e zëvendësoni me SDK-në tuaj të vërtetë të robotit — pastaj dërgon mbrapsht një tool_response në mënyrë që modeli të mund të zgjedhë veprimin tjetër.
import asyncio
from google import genai
from google.genai import types
MODEL = "gemini-robotics-er-2-streaming-preview"
# ── Tool definitions ─────────────────────────────────────────────────────────
tools = [
{
"function_declarations": [
{
"name": "navigate",
"description": "Navigate the robot to a named waypoint.",
"behavior": "BLOCKING",
"parameters": {
"type": "OBJECT",
"properties": {"name": {"type": "STRING"}},
"required": ["name"],
},
},
# Add more function definitions here
]
}
]
# ── Stub tool executor (replace with real robot SDK calls) ───────────────────
def execute_tool(name: str, args: dict) -> dict:
print(f" [Tool] {name}({args})")
return {"status": "success"}
# ── Input helpers ────────────────────────────────────────────────────────────
def send_text(session, text: str):
"""Send a text turn."""
return session.send_client_content(
turns=types.Content(role="user", parts=[types.Part(text=text)]),
turn_complete=True,
)
def send_image(session, image_bytes: bytes, prompt: str = ""):
"""Send a JPEG image with an optional text prompt."""
parts = [
types.Part(
inline_data=types.Blob(data=image_bytes, mime_type="image/jpeg")
)
]
if prompt:
parts.append(types.Part(text=prompt))
return session.send_client_content(
turns=types.Content(role="user", parts=parts),
turn_complete=True,
)
def send_audio(session, audio_chunk: bytes):
"""Stream a chunk of raw PCM audio (16-bit, 16 kHz, mono)."""
return session.send_realtime_input(
media=types.Blob(data=audio_chunk, mime_type="audio/pcm;rate=16000")
)
# ── Receive loop ─────────────────────────────────────────────────────────────
async def receive_loop(session):
"""Print model text and handle tool calls until the session ends."""
async for message in session.