Zum Inhalt springen

Gemini CLI und Google GenAI

Gemini CLI und die Programme, die auf Googles GenAI-SDKs aufbauen, nutzen den Gateway-Modus: Der lokale Daemon maskiert die Anfragen und stellt die Antworten wieder her. Er deckt die Gemini API mit einem API-Schlüssel ab, und Gemini auf Vertex AI, mit einem Google-Cloud-Projekt oder im Express-Modus mit einem API-Schlüssel.

Dienst Statt Verwenden Sie Variable
Gemini API https://generativelanguage.googleapis.com http://127.0.0.1:5283/gemini GOOGLE_GEMINI_BASE_URL
Vertex AI https://<location>-aiplatform.googleapis.com http://127.0.0.1:5283/vertex GOOGLE_VERTEX_BASE_URL

Ihr API-Schlüssel oder Ihre Google-Cloud-Anmeldung bleiben, wo sie sind. Das Gateway leitet sie unverändert weiter (einen Schlüssel im Header x-goog-api-key oder im Parameter key der Adresse, ein Vertex-Token in Authorization) und schreibt ihren Wert nie in Logs, ins Dashboard oder in einen Mitschnitt. Auf Vertex geht jede Anfrage an die Adresse der Location, die sie nennt.

Leiten Sie Gemini CLI mit dem Wrapper über Latet. Er startet bei Bedarf den Daemon, setzt beide Basis-URLs nur für diesen Lauf und gibt jedes Argument an gemini weiter:

Terminal-Fenster
latet gemini
latet gemini -p "write the release notes for the payments module"

latet gemini gibt Gemini CLI außerdem einen Startschlüssel in GEMINI_CLI_CUSTOM_HEADERS, zusätzlich zu den Headern, die Sie dort setzen, damit Latet dem Projekt der Sitzung vertraut; wo es nicht prüfen kann, ob Gemini CLI ihn senden wird, gibt es keinen mit, sagt das, und das Projekt, das Gemini CLI nennt, ist nur behauptet (Projekte). Eigene Header in GEMINI_CLI_CUSTOM_HEADERS werden abgelehnt, jeder beim Namen genannt, bis eine genaue Ausnahme ihn durchlässt.

Gemini CLI liest GEMINI_CLI_CUSTOM_HEADERS ab Version 0.19.0, und Latet hat geprüft, wie es sie von 0.19.0 bis 0.66.0 sendet. Ein älteres Gemini CLI ignoriert die Variable: Seine Sitzung ist nur behauptet, und latet doctor nennt seine Version. Im ACP-Modus (--acp oder --experimental-acp, wie ein Editor Gemini CLI startet) kann der Editor Gemini CLI eine eigene Adresse und eigene Header geben, darum gibt latet gemini dort keinen Startschlüssel mit und sagt das beim Start.

latet run gemini tut dasselbe. Gemini CLI übernimmt seine Adresse nur aus der Umgebung, darum ist es im globalen Modus nicht verfügbar: latet global-install richtet es nicht ein, und es gibt kein latet agents apply gemini. Eine dauerhafte Änderung würde ein Projekt mit einer eigenen .env-Datei nicht erreichen, und dort spräche Gemini CLI direkt mit Google, ohne es zu sagen.

In Gemini CLI wählt /auth, wie es sein Modell erreicht, und die Wahl bleibt in ~/.gemini/settings.json:

~/.gemini/settings.json
{ "security": { "auth": { "selectedType": "gemini-api-key" } } }
  • Ein API-Schlüssel (gemini-api-key): GEMINI_API_KEY enthält ihn.
  • Vertex AI (vertex-ai): GOOGLE_GENAI_USE_VERTEXAI=true, mit GOOGLE_CLOUD_PROJECT und GOOGLE_CLOUD_LOCATION und Ihrer Google-Cloud-Anmeldung, oder nur GOOGLE_API_KEY im Express-Modus.

Ist noch nichts gewählt, bietet latet gemini im Dialog von Gemini CLI den API-Schlüssel an, oder Vertex AI, wenn GOOGLE_GENAI_USE_VERTEXAI=true gesetzt ist. Ein Lauf mit -p braucht die Wahl vorher: Setzen Sie selectedType wie oben.

Mit der Google-Anmeldung, ob Ihre Einstellungen sie wählen, die des Projekts (.gemini/settings.json im Ordner, in dem Sie es starten) oder die des Rechners, schickt Gemini CLI seine Anfragen an einen Endpunkt, den Latet nicht liest, es würde also nichts maskiert. Dann startet latet gemini es nicht und sagt, wo die Wahl getroffen ist und was stattdessen zu wählen ist.

Gemini CLI schickt seine Nutzungsstatistiken direkt an Google, nicht über Latet. Um sie abzuschalten:

~/.gemini/settings.json
{ "privacy": { "usageStatisticsEnabled": false } }

latet run setzt GOOGLE_GEMINI_BASE_URL und GOOGLE_VERTEX_BASE_URL neben den Variablen für OpenAI und Anthropic, und latet env gibt sie für eine ganze Shell aus. Googles SDKs für Python (google-genai) und JavaScript (@google/genai) lesen sie:

welcome.py
from google import genai
client = genai.Client() # reads GEMINI_API_KEY and GOOGLE_GEMINI_BASE_URL
reply = client.models.generate_content(
model="gemini-3-pro",
contents="Write a short welcome email to emily.carter@northwind-legal.com",
)
print(reply.text)

Starten Sie es mit latet run python welcome.py: Google liest eine falsche Adresse derselben Form, und das Skript gibt die E-Mail mit der echten aus. Gestreamte Antworten funktionieren genauso, Stück für Stück.

Auch Googles OpenAI-kompatibler Endpunkt läuft über Latet: Geben Sie einem OpenAI-Client die Basis-URL http://127.0.0.1:5283/gemini/v1beta/openai.

  • Generieren, gestreamt oder nicht (generateContent, streamGenerateContent), Token zählen (countTokens), Embeddings (embedContent, batchEmbedContents) und einen Cache anlegen (cachedContents): Die Systemanweisung, jede Nachricht, Funktionsaufrufe und ihre Ergebnisse, die Deklarationen der Funktionen und das Schema der Antwort werden maskiert, und die Antworten wiederhergestellt.
  • Bilder in der Anfrage werden mit der optionalen Texterkennung gelesen und maskiert; ohne sie wird eine Anfrage mit einem Bild nicht gesendet. Andere Dateien, und Dateien, die über ihre Adresse angegeben sind, werden abgelehnt.
  • Das Nachdenken des Modells bleibt, wie das Modell es geschrieben hat. Der Code, den Google für es ausführt, und was dieser Code ausgegeben hat, sowie die Eingaben und Ausgaben von Googles eigenen Tools (Google Search, URL-Kontext, Maps, File Search) werden maskiert, wie der Aufruf einer Funktion und ihr Ergebnis.
  • Jede andere Anfrage mit einem Body auf diesen Routen wird abgelehnt, mit einem Fehler, der es sagt, und ein WebSocket der Live API wird geschlossen, bevor etwas durchgeht: Die Interactions API, die Live API, die Batch API, das Hochladen von Dateien und :predict von Vertex (seine eigenen Embeddings und Bildmodelle) tragen eine Unterhaltung in Formen, die Latet nicht liest (sie stehen auf der Roadmap). Die Liste der Modelle und das Lesen eines Modells gehen durch; jeder andere Aufruf ohne Body wird ebenfalls abgelehnt.
  • Der Header der Google-Clientbibliothek x-goog-api-client wird entfernt; Ihr API-Schlüssel, im Parameter key oder in x-goog-api-key, wird gesendet, wie er kam, und nie protokolliert.
  • Gemini CLI mit der Google-Anmeldung ist nicht abgedeckt (siehe oben).
  • Antigravity CLI nimmt mit einem API-Schlüssel eine Basis-URL an (GOOGLE_GEMINI_BASE_URL), aber seine Dokumentation sagt nicht, welches Protokoll von Google es dann spricht, und es ist mit Latet nicht geprüft. Nutzt es die Interactions API, lehnt Latet seine Anfragen ab, statt sie unmaskiert zu senden.
  • Eine Antwort, die einen expliziten Cache nutzt, bekommt die Originale der Werte zurück, die ihre eigene Unterhaltung trägt.