· 3 min čtení

Vlastní AI agent: FastAPI a Gemini na Google Cloudu

David Šimek · Nástroje

Hotové nástroje jsou super. Jenže dřív nebo později budeš chtít agenta, který dělá přesně to, co potřebuješ ty: volá tvoje funkce, sedí na tvém API a běží ve tvém cloudu. Tady ho postavíš. Python, FastAPI, Gemini přes Google Gen AI SDK a nasazení na Cloud Run.

Agent v tomhle článku umí dvě věci: říct aktuální čas v libovolném pásmu a spočítat cenu s DPH. Na tom pochopíš to hlavní: model sám rozhodne, kterou tvoji funkci zavolá. Zbytek je jen rozšiřování.

Pozn.: Google přejmenoval Vertex AI na Gemini Enterprise Agent Platform. V dokumentaci a v konzoli uvidíš oba názvy.

Co budeš potřebovat

1. Projekt a závislosti

mkdir muj-agent && cd muj-agent
mkvirtualenv muj-agent
git init

requirements.txt:

fastapi[standard]
google-genai
pip install -r requirements.txt

2. Přihlášení a API

gcloud init
gcloud services enable aiplatform.googleapis.com
gcloud auth application-default login

Poslední příkaz vytvoří lokální přihlašovací údaje (Application Default Credentials). SDK je najde samo, žádný klíč do kódu nepíšeš. Tvůj účet potřebuje roli Agent Platform User (roles/aiplatform.user).

Proměnné prostředí, podle kterých SDK pozná, že má jít přes Google Cloud. Ulož si je do .env (a .env patří do .gitignore!):

export GOOGLE_CLOUD_PROJECT=tvuj-projekt
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_ENTERPRISE=True

Starší návody používají GOOGLE_GENAI_USE_VERTEXAI=True. Aktuální SDK ji pořád zná, oficiální quickstart ale uvádí GOOGLE_GENAI_USE_ENTERPRISE.

3. Kód agenta

Celý agent je jeden soubor main.py:

import os
from datetime import datetime
from zoneinfo import ZoneInfo

from fastapi import FastAPI, Header, HTTPException
from google import genai
from google.genai import types
from pydantic import BaseModel

MODEL = os.environ.get("GEMINI_MODEL", "gemini-2.5-flash")
API_KEY = os.environ.get("AGENT_API_KEY")

client = genai.Client()  # čte GOOGLE_GENAI_USE_ENTERPRISE, GOOGLE_CLOUD_PROJECT, GOOGLE_CLOUD_LOCATION
app = FastAPI(title="Vibecoders agent")


def aktualni_cas(mesto: str) -> str:
    """Vrátí aktuální čas pro zadané časové pásmo.

    Args:
        mesto: IANA název pásma, například Europe/Prague.
    """
    return datetime.now(ZoneInfo(mesto)).strftime("%Y-%m-%d %H:%M")


def spocitej_cenu(cena_bez_dph: float, sazba_dph: float = 21.0) -> float:
    """Spočítá cenu s DPH.

    Args:
        cena_bez_dph: Cena bez DPH v Kč.
        sazba_dph: Sazba DPH v procentech.
    """
    return round(cena_bez_dph * (1 + sazba_dph / 100), 2)


class Dotaz(BaseModel):
    zprava: str


class Odpoved(BaseModel):
    odpoved: str


@app.get("/")
def zdravi():
    return {"status": "ok"}


@app.post("/chat", response_model=Odpoved)
def chat(dotaz: Dotaz, x_api_key: str | None = Header(default=None)):
    if API_KEY and x_api_key != API_KEY:
        raise HTTPException(status_code=401, detail="Neplatný klíč")
    response = client.models.generate_content(
        model=MODEL,
        contents=dotaz.zprava,
        config=types.GenerateContentConfig(
            system_instruction="Jsi stručný asistent. Odpovídej česky.",
            tools=[aktualni_cas, spocitej_cenu],
        ),
    )
    return Odpoved(odpoved=response.text or "")

Co se tu děje:

  • genai.Client() si konfiguraci vezme z proměnných prostředí.
  • tools=[aktualni_cas, spocitej_cenu]: obyčejné Python funkce předáš rovnou jako nástroje. SDK z jejich typů a docstringů vyrobí popis pro model, a když se model rozhodne funkci zavolat, SDK ji spustí a výsledek mu vrátí (automatic function calling). Proto piš pořádné docstringy: model podle nich rozhoduje.
  • X-Api-Key: jednoduchá ochrana, ať ti endpoint nevyžírá kredit kdokoli z internetu. Pro produkci zvaž Cloud Run s vyžadovaným IAM přihlášením.
  • GEMINI_MODEL: model si nastavíš proměnnou. gemini-2.5-flash je model z oficiálních příkladů function callingu. Aktuální nabídku modelů si ověř v dokumentaci, mění se rychle.

4. Spusť lokálně

fastapi dev main.py

A zkus ho:

curl -X POST http://127.0.0.1:8000/chat \
  -H "Content-Type: application/json" \
  -d '{"zprava": "Kolik je v Praze hodin a kolik stojí 1500 Kč s DPH?"}'

Model zavolá obě funkce a odpoví jednou větou. Interaktivní dokumentaci API najdeš na http://127.0.0.1:8000/docs.

Funguje? Commit.

git add main.py requirements.txt .gitignore
git commit -m "AI agent s FastAPI a Gemini"

5. Tajný klíč do Secret Manageru

Klíč AGENT_API_KEY nepatří do kódu ani do příkazové řádky v historii. Ulož ho do Secret Manageru:

gcloud secrets create agent-api-key --replication-policy="automatic"
printf "tvuj-dlouhy-nahodny-klic" | gcloud secrets versions add agent-api-key --data-file=-

Účet, pod kterým služba na Cloud Run běží, potřebuje roli Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) a pro volání Gemini taky roles/aiplatform.user.

6. Nasazení na Cloud Run

Cloud Run umí nasadit přímo ze zdrojáků, Dockerfile psát nemusíš:

gcloud run deploy muj-agent --source . \
  --set-env-vars GOOGLE_CLOUD_PROJECT=tvuj-projekt,GOOGLE_CLOUD_LOCATION=global,GOOGLE_GENAI_USE_ENTERPRISE=True \
  --set-secrets AGENT_API_KEY=agent-api-key:latest

Na konci dostaneš URL. Volání je stejné jako lokálně, jen přidáš hlavičku X-Api-Key. V cloudu se SDK přihlásí účtem služby automaticky, gcloud auth tam neřešíš.

Kam dál

  • Víc nástrojů. Každá nová funkce = nová schopnost agenta. Dotaz do databáze, volání interního API, odeslání e-mailu (tady pozor, akce s dopadem nech potvrdit člověkem).
  • Paměť. Pro konverzaci přes víc zpráv použij client.chats.create(...) a historii si ukládej.
  • Nech to stavět agenta. Celý tenhle projekt zvládneš zadat Claude Code. Jak na to, máš v Claude Code v praxi. A pokud chceš tým agentů místo jednoho, mrkni na tým AI agentů v Grok Bot.

Zdroje (ověřeno 2026-10-14)

Související články