Gemini Code Assist-Protokolle ansehen

In diesem Dokument wird beschrieben, wie Sie die Erfassung und Speicherung von Gemini Code Assist-Aktivitäten aktivieren können. Dazu gehören die Folgenden:

  • Gemini Code Assist-Logs für Prompts und Antworten, z. B. Nutzereingaben, Kontextinformationen und Antworten.
  • Gemini Code Assist-Metadatenlogs, z. B. Telemetriemetadaten und vom Nutzer akzeptierte Codezeilen.

Wenn Sie Gemini Code Assist-Messwerte generieren müssen, lesen Sie den Abschnitt Nutzung von Gemini Code Assist im Blick behalten.

Gemini Code Assist erfasst oder sendet keine anderen Nutzerinteraktionen, die der Nutzer möglicherweise mit Gemini Code Assist hatte, einschließlich schriftlichen Feedbacks, an Cloud Logging. Die erhobenen Daten werden zur Speicherung an Cloud Logging gesendet. Sie können diese Daten aufrufen, indem Sie nach Logeinträgen mit dem Ressourcentyp cloudaicompanion.googleapis.com/Instance suchen.

Bei dieser Funktion werden keine Prompts oder Antworten in Gemini in Vertex AI protokolliert. Informationen zum Aktivieren von Logs für Gemini in Vertex AI finden Sie unter Audit-Logs zum Datenzugriff aktivieren.

IAM-Rollen (Identity and Access Management, Identitäts- und Zugriffsverwaltung) steuern, ob ein Hauptkonto auf Logs zugreifen kann. Sie können Hauptkonten vordefinierte Rollen zuweisen oder benutzerdefinierte Rollen erstellen. Weitere Informationen zu erforderlichen Berechtigungen finden Sie unter Zugriffssteuerung.

In Cloud Logging werden inaktive Kundendaten standardmäßig verschlüsselt. In Log-Buckets von Logging gespeicherte Daten werden mit Schlüsselverschlüsselungsschlüsseln verschlüsselt. Dieser Vorgang wird als Envelope-Verschlüsselung bezeichnet. Der Zugriff auf Ihre Logging-Daten erfordert den Zugriff auf diese Schlüsselverschlüsselungsschlüssel, die Google für Sie verwaltet, ohne dass Sie etwas tun müssen.

Ihr Unternehmen hat möglicherweise rechtliche, Compliance-bezogene oder erweiterte Verschlüsselungsanforderungen, die unsere Standardverschlüsselung ruhender Daten nicht erfüllt. Anstatt die Verschlüsselungsschlüssel, die Ihre Daten schützen, von Google verwalten zu lassen, können Sie Ihre Schlüssel selbst verwalten.

Weitere Informationen zur Verwendung von kundenverwalteten Verschlüsselungsschlüsseln (Customer-Managed Encryption Keys, CMEK) einschließlich der Vorteile und Einschränkungen finden Sie unter Kundenverwaltete Verschlüsselungsschlüssel.

Beschränkungen

  • Die Aufzeichnung von Logdaten für Gemini Code Assist ist auf Nutzerinteraktionen mit Gemini Code Assist in einer IDE beschränkt.

  • Standardmäßig werden Gemini Code Assist-Logs pro Projekt erfasst. Eine Anleitung zum Konfigurieren eines zentralen Projekts zum Erfassen von Logs aus mehreren Projekten finden Sie unter Logging für mehrere Projekte einrichten.

Hinweis

Gemini Code Assist-Nutzerlogs und Metadatenlogs aufrufen

So rufen Sie Gemini Code Assist-Nutzerlogs und Metadatenlogs auf:

Console

  1. Rufen Sie in der Google Cloud Console das Log-Explorer auf:

    Log-Explorer aufrufen

    Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis aus, dessen Zwischenüberschrift Logging ist.

  2. Wählen Sie in der Symbolleiste ein Google Cloud Console-Projekt aus.
  3. Maximieren Sie in der Symbolleiste das Menü Alle Ressourcen und wählen Sie die Ressource Cloud AI Companion-Instanz aus.

gcloud

Führen Sie dazu diesen Befehl aus:

gcloud logging read "resource.type=cloudaicompanion.googleapis.com/Instance" --project PROJECT_ID  --limit 3

Ersetzen Sie PROJECT_ID durch die ID des Projekts, dessen Gemini Code Assist-Logs Sie aufrufen möchten.

API

  1. Erstellen Sie eine JSON-Datei, die folgende Informationen enthält:

      {
        "resourceNames": [
          "projects/PROJECT_ID"
        ],
        "pageSize": 5,
        "filter": "resource.type: cloudaicompanion.googleapis.com/Instance"
      }
    

    Ersetzen Sie PROJECT_ID durch die ID des Projekts, dessen Gemini Code Assist-Logs Sie aufrufen möchten.

  2. Rufen Sie einen Authentifizierungstoken ab:

    TOKEN=$(gcloud auth print-access-token)
    
  3. Verwenden Sie cURL, um die Methode entries.list aufzurufen:

    curl -X POST --data-binary @JSON_FILE_NAME \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      "https://logging.googleapis.com/v2/entries:list"

    Ersetzen Sie JSON_FILE_NAME durch den Pfad zur JSON-Datei, die Sie im vorherigen Schritt erstellt haben.

    Weitere Informationen zur Authentifizierung finden Sie unter Für die Verwendung von REST authentifizieren.

    Die Antwort gibt eine Reihe von Logeinträgen zurück.

Gemini Code Assist-Logs

Ein LogEntry ist die Grundeinheit für Daten in Cloud Logging. In den folgenden Abschnitten finden Sie Listen der Felder, die im LogEntry für ein Gemini Code Assist-Plattformereignis enthalten sind, z. B. Nutzeranfragen und Gemini Code Assist-Antworten.

Nutzeranforderungen

In der folgenden Tabelle finden Sie eine Liste der Felder, die in einem Logeintrag für Nutzeranfragen enthalten sind:

Feld Werte und Hinweise
LogEntry.resource.type Gemini Code Assist Ressourcentyp: cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container Eindeutige ID des Ressourcencontainers, in dem Gemini Code Assist verwendet wurde.
LogEntry.resource.labels.location Standort, an dem Gemini Code Assist verwendet wurde.
LogEntry.resource.labels.instance_id Eindeutige ID der Ressource, in der Gemini Code Assist verwendet wurde.
LogEntry.labels.method Kann je nach Aufruf von logEntry:

CompleteTask: z. B. eine Chatanfrage von Gemini Code Assist.

GenerateCode: z. B. eine Anfrage zum Generieren von Code, etwa mit einer Code-Transformation in Gemini Code Assist.

CompleteCode: z. B. eine Anfrage zum Vervollständigen von Code bei der Arbeit in der IDE, etwa mit Inline-Vorschlägen in Gemini Code Assist.
LogEntry.labels.product Name des Dienstes, auf den sich das Log bezieht. Logs, die für die Verwendung von Gemini Code Assist relevant sind, verwenden den Produktwert code_assist. Wenn das Log für Gemini Cloud Assist relevant ist, lautet dieser Wert cloud_assist. Andernfalls ist dieser Wert unknown.
LogEntry.labels.request_id Eine eindeutige Kennung, um eine Anfrage mit einem Antwortlogeintrag zu korrelieren.
LogEntry.labels.user_id Die Kennung des Nutzers, der diese Anfrage initiiert hat.
LogEntry.jsonPayload Die Nutzlast des Logeintrags.
LogEntry.logName Identifiziert das Log.

Das folgende Beispiel zeigt einen Logeintrag für ein Chat-Prompt-Ereignis:

{
  "insertId": "654581e30003b19e340bbd96",
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
        instance_id: "default"
        location: "global"
        resource_container: "my-project-id"
     }
  },
  "timestamp": "2023-11-03T23:27:31.242078Z",
  "labels": {
    "product": "code_assist",
    "request_id": "4ea1e265-ea5d-4d11-b3c8-39bad9c96326"
    "user_id": "user@company.com"
  },
  "jsonPayload" : {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.RequestLog"
    "taskCompletionRequest":
      input: {
        messages: [{
          author: "USER"
          content: "What are some best practices to save cost on my Google Cloud bill?"
        }]
        preamble: ""
      }
  }
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Frequest",
  "receiveTimestamp": "2023-11-03T23:27:31.255648319Z"
  "severity": "INFO"
}

Das folgende Beispiel zeigt einen RequestLog Eintrag für automatische Vorschläge für Inline-Code Prompts und erstellt einen Prompt für Gemini Code Assist in einer Codedatei.

Für Prompt-Daten für Inline-Codevorschläge wird das Objekt codeCompletionRequest verwendet (siehe folgendes Beispiel), während für die manuell ausgelöste Generierung codeGenerationRequest verwendet wird.

{
  "insertId": "654581e30003b19e340bbd96",
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
        instance_id: "default"
        location: "global"
        resource_container: "my-project-id"
     }
  },
  "timestamp": "2023-11-03T23:27:31.242078Z",
  "labels": {
    "product": "code_assist",
    "request_id": "4ea1e265-ea5d-4d11-b3c8-39bad9c96326"
    "user_id": "user@company.com"
  },
  "jsonPayload" : {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.RequestLog"
    "codeCompletionRequest": {
      "input_data_context": {
        "additional_context": {
          "files": [
            {
              "language": "go",
              "path": "{/path/to/../current-file.go",
              "segments": [
                {
                  "content": "...Prefix Text..."
                },
                {
                  "content": "...Suffix Text..."
                }
              ],
              "state": ["EDITED"]
            },
            {
              "language": "go",
              "path": "/path/to/../recent-file.go",
              "segments": [
                {
                  "content": "...File Text..."
                }
              ],
              "state": ["RECENTLY_OPENED"]
            }
          ]
        }
      }
    }
  }
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Frequest",
  "receiveTimestamp": "2023-11-03T23:27:31.255648319Z"
  "severity": "INFO"
}

Interaktionsprotokolle von KI-Agenten

Bei einigen Interaktionen mit Gemini können für eine einzelne Nutzeraktion mehrere Logeinträge (Anfrage, Antwort und Metadaten) generiert werden. Beispiele für solche Interaktionen:

  • Ein KI-Agent führt eine Aufgabe aus, bei der Tools verwendet werden (z. B. wenn das Modell interne Funktionen wie read_file oder replace aufruft, wie in den Logbeispielen gezeigt).
  • Ein KI-Agent interagiert mit anderen KI-Agenten.
Anfrage-Logeintrag

Das folgende Beispiel zeigt einen Logeintrag für eine Anfrage, die eine Interaktion mit einem KI-Agenten initiiert:

{
  "insertId": "qe9xxub2r",
  "jsonPayload": {
    "taskCompletionRequest": {
      "input": {
        "messages": [
          {
            "author": "USER",
            "content": "hi can you add one test here\nCurrent File Path:\n```cpp\n/usr/local/google/home/pdec/test.cpp\n```\n\n"
          }
        ],
        "preamble": ""
      }
    },
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.RequestLog"
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "resource_container": "my-project-id",
      "instance_id": "default",
      "location": "global"
    }
  },
  "timestamp": "2025-10-08T10:09:52.225165428Z",
  "severity": "INFO",
  "labels": {
    "request_id": "e60facb1485b17b7",
    "client_version": "unknown",
    "product": "code_assist",
    "method": "CompleteTask",
    "user_id": "user@company.com",
    "client_name": "cloudcode_cli"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Frequest",
  "receiveTimestamp": "2025-10-08T10:09:52.581787548Z"
}
Antwort-Logeintrag

Das folgende Beispiel zeigt einen Logeintrag für eine Antwort aus einer Interaktion mit einem KI-Agenten mit mehreren Nachrichten:

{
  "insertId": "qe9xxub2t",
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.ResponseLog",
    "taskCompletionResponse": {
      "output": {
        "messages": [
          {
            "content": "**Reading File Contents**\n\nI'm currently focused on reading the contents of `/usr/local/google/home/pdec/test.cpp`. This will inform what kind of test needs to be written and how it should be structured.\n\n\n",
            "author": "MODEL"
          },
          {
            "author": "MODEL",
            "content": "**File Inspection Begins**\n\nI've initiated the process of reading the test file. My immediate goal is to grasp its existing structure and identify the testing framework, if one exists. This will directly influence the design of the new test case I'll be adding.\n\n\n"
          },
          {
            "author": "MODEL",
            "content": "Of course. What is the test about? I'll read the file to understand the context."
          },
          {
            "content": "read_file({\"absolute_path\":\"/usr/local/google/home/pdec/test.cpp\"})",
            "author": "MODEL"
          }
        ]
      }
    }
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "resource_container": "my-project-id",
      "instance_id": "default",
      "location": "global"
    }
  },
  "timestamp": "2025-10-08T10:09:52.227354297Z",
  "severity": "INFO",
  "labels": {
    "product": "code_assist",
    "request_id": "e60facb1485b17b7",
    "user_id": "user@company.com",
    "client_version": "unknown",
    "method": "CompleteTask",
    "client_name": "cloudcode_cli"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fresponse",
  "receiveTimestamp": "2025-10-08T10:09:52.581787548Z"
}
Metadaten-Logeintrag

Das folgende Beispiel zeigt einen Logeintrag mit Metadaten aus der Interaktion mit einem KI-Agenten:

{
  "insertId": "qe9xxub2s",
  "jsonPayload": {
    "apiRequest": {},
    "clientName": "cloudcode_cli",
    "requestId": "e60facb1485b17b7",
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog",
    "clientVersion": "unknown"
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "location": "global",
      "instance_id": "default",
      "resource_container": "my-project-id"
    }
  },
  "timestamp": "2025-10-08T10:09:52.226420727Z",
  "severity": "INFO",
  "labels": {
    "method": "CompleteTask",
    "product": "code_assist",
    "user_id": "user@company.com"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata",
  "receiveTimestamp": "2025-10-08T10:09:52.581787548Z"
}

Die folgenden Beispiele zeigen weitere Logeinträge für eine Interaktion mit einem KI-Agenten mit der Anfrage-ID 4b66a582bad9cf2c:

Anfrage-Logeintrag

{
  "insertId": "4qvt8nb2k",
  "jsonPayload": {
    "taskCompletionRequest": {
      "input": {
        "messages": [
          {
            "author": "USER",
            "content": "FunctionResponse{name: read_file, response: {\"output\":\"#include <iostream>\\n\\n// Function to calculate the greatest common divisor (GCD) of two numbers.\\nint gcd(int a, int b) {\\n    if (b == 0) {\\n        return a;\\n    }\\n    return gcd(b, a % b);\\n}\\n\\n// Function to calculate the least common multiple (LCM) of two numbers.\\nint lcm(int a, int b) {\\n    return (a * b) / gcd(a, b);\\n}\\n\\n// Function to check if a number is prime.\\nint is_prime(int a) {\\n    if (a < 2) {\\n        return 0;\\n    }\\n    for (int i = 2; i * i <= a; ++i) {\\n        if (a % i == 0) {\\n            return 0;\\n        }\\n    }\\n    return 1;\\n}\\n\\n// Function for extended Euclidean algorithm.\\nint extended_gcd(int a, int b, int &x, int &y) {\\n    if (b == 0) {\\n        x = 1;\\n        y = 0;\\n        return a;\\n    }\\n    int x1, y1;\\n    int d = extended_gcd(b, a % b, x1, y1);\\n    x = y1;\\n    y = x1 - (a / b) * y1;\\n    return d;\\n}\\n\\n// Test function\\nvoid run_tests() {\\n    // Test gcd\\n    if (gcd(10, 15) == 5) {\\n        std::cout << \\\"gcd(10, 15) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(10, 15) failed\\\" << std::endl;\\n    }\\n\\n    // Test lcm\\n    if (lcm(10, 15) == 30) {\\n        std::cout << \\\"lcm(10, 15) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"lcm(10, 15) failed\\\" << std::endl;\\n    }\\n\\n    // Test is_prime\\n    if (is_prime(7) == 1) {\\n        std::cout << \\\"is_prime(7) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"is_prime(7) failed\\\" << std::endl;\\n    }\\n    if (is_prime(10) == 0) {\\n        std::cout << \\\"is_prime(10) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"is_prime(10) failed\\\" << std::endl;\\n    }\\n\\n    // Test extended_gcd\\n    int x, y;\\n    int g = extended_gcd(35, 15, x, y);\\n    if (g == 5 && 35 * x + 15 * y == g) {\\n        std::cout << \\\"extended_gcd(35, 15) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"extended_gcd(35, 15) failed\\\" << std::endl;\\n    }\\n\\n    // Test is_prime with 1\\n    if (is_prime(1) == 0) {\\n        std::cout << \\\"is_prime(1) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"is_prime(1) failed\\\" << std::endl;\\n    }\\n\\n    // Test is_prime with 9\\n    if (is_prime(9) == 0) {\\n        std::cout << \\\"is_prime(9) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"is_prime(9) failed\\\" << std::endl;\\n    }\\n\\n    // Test is_prime with 13\\n    if (is_prime(13) == 1) {\\n        std::cout << \\\"is_prime(13) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"is_prime(13) failed\\\" << std::endl;\\n    }\\n\\n    // Test lcm with 7 and 9\\n    if (lcm(7, 9) == 63) {\\n        std::cout << \\\"lcm(7, 9) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"lcm(7, 9) failed\\\" << std::endl;\\n    }\\n\\n    // Test gcd with 12 and 18\\n    if (gcd(12, 18) == 6) {\\n        std::cout << \\\"gcd(12, 18) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(12, 18) failed\\\" << std::endl;\\n    }\\n\\n    // Test gcd with two primes\\n    if (gcd(7, 13) == 1) {\\n        std::cout << \\\"gcd(7, 13) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(7, 13) failed\\\" << std::endl;\\n    }\\n\\n    // Test is_prime with 97\\n    if (is_prime(97) == 1) {\\n        std::cout << \\\"is_prime(97) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"is_prime(97) failed\\\" << std::endl;\\n    }\\n\\n    // Test extended_gcd with 48 and 18\\n    int x2, y2;\\n    int g2 = extended_gcd(48, 18, x2, y2);\\n    if (g2 == 6 && 48 * x2 + 18 * y2 == g2) {\\n        std::cout << \\\"extended_gcd(48, 18) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"extended_gcd(48, 18) failed\\\" << std::endl;\\n    }\\n\\n    // Test gcd with 27 and 18\\n    if (gcd(27, 18) == 9) {\\n        std::cout << \\\"gcd(27, 18) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(27, 18) failed\\\" << std::endl;\\n    }\\n    // test 999 and 123\\n    if (gcd(999, 123) == 3) {\\n        std::cout << \\\"gcd(999, 123) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(999, 123) failed\\\" << std::endl;\\n    }\\n    \\n    \\n}\\n\\nint main() {\\n    run_tests();\\n    return 0;\\n}\"}}"
          }
        ],
        "preamble": ""
      }
    },
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.RequestLog"
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "resource_container": "my-project-id",
      "instance_id": "default",
      "location": "global"
    }
  },
  "timestamp": "2025-10-08T10:10:03.457717366Z",
  "severity": "INFO",
  "labels": {
    "request_id": "4b66a582bad9cf2c",
    "method": "CompleteTask",
    "client_version": "unknown",
    "product": "code_assist",
    "client_name": "cloudcode_cli",
    "user_id": "user@company.com"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Frequest",
  "receiveTimestamp": "2025-10-08T10:10:03.606059154Z"
}

Antwort-Logeintrag

{
  "insertId": "4qvt8nb2m",
  "jsonPayload": {
    "taskCompletionResponse": {
      "output": {
        "messages": [
          {
            "author": "MODEL",
            "content": "**Testing the functions**\\n\\nI'm focusing on adding a new test case to `test.cpp`.  The existing `run_tests` function is a great starting point. I'm considering which function to test further – maybe `extended_gcd`? I'll review the current tests for that function and then devise a new test scenario to add.\\n\\n\\n"
          },
          {
            "author": "MODEL",
            "content": "**Evaluating LCM Test**\\n\\nI've finalized the new test case for the `lcm` function within the `test.cpp` file.  I'm adding a test for `lcm(12, 18)` to confirm the result is 36. I plan to use the `replace` command to inject this new test directly before the closing brace of the `run_tests` function.  I've identified a unique line in `test.cpp` as the anchor for replacement.\\n\\n\\n"
          },
          {
            "author": "MODEL",
            "content": "**Inserting the new test**\\n\\nI've created a test case for `lcm(12, 18)`, confirming the expected result of 36. To implement this, I'm targeting the `run_tests` function.  I'll use the `replace` command and will search the end of the `run_tests` function to inject the new test, right before the closing brace.  I'm ready to implement this and confirm that it passes.\\n\\n\\n"
          },
          {
            "author": "MODEL",
            "content": "I've reviewed the file. I'll add a test case for the `lcm` function with inputs 12 and 18."
          },
          {
            "content": "replace({\"file_path\":\"/usr/local/google/home/pdec/test.cpp\",\"instruction\":\"add a test for the lcm function with 12 and 18\",\"new_string\":\"    // test 999 and 123\\n    if (gcd(999, 123) == 3) {\\n        std::cout << \\\"gcd(999, 123) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(999, 123) failed\\\" << std::endl;\\n    }\\n    \\n    // Test lcm with 12 and 18\\n    if (lcm(12, 18) == 36) {\\n        std::cout << \\\"lcm(12, 18) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"lcm(12, 18) failed\\\" << std::endl;\\n    }\\n    \\n}\",\"old_string\":\"    // test 999 and 123\\n    if (gcd(999, 123) == 3) {\\n        std::cout << \\\"gcd(999, 123) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(999, 123) failed\\\" << std::endl;\\n    }\\n    \\n    \\n}\"})",
            "author": "MODEL"
          }
        ]
      }
    },
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.ResponseLog"
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "location": "global",
      "resource_container": "my-project-id",
      "instance_id": "default"
    }
  },
  "timestamp": "2025-10-08T10:10:03.461137399Z",
  "severity": "INFO",
  "labels": {
    "client_name": "cloudcode_cli",
    "client_version": "unknown",
    "method": "CompleteTask",
    "request_id": "4b66a582bad9cf2c",
    "product": "code_assist",
    "user_id": "user@company.com"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fresponse",
  "receiveTimestamp": "2025-10-08T10:10:03.606059154Z"
}

Metadaten-Logeintrag

{
  "insertId": "4qvt8nb2l",
  "jsonPayload": {
    "clientVersion": "unknown",
    "apiRequest": {},
    "clientName": "cloudcode_cli",
    "requestId": "4b66a582bad9cf2c",
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog"
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "resource_container": "my-project-id",
      "location": "global",
      "instance_id": "default"
    }
  },
  "timestamp": "2025-10-08T10:10:03.459902984Z",
  "severity": "INFO",
  "labels": {
    "product": "code_assist",
    "user_id": "user@company.com",
    "method": "CompleteTask"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata",
  "receiveTimestamp": "2025-10-08T10:10:03.606059154Z"
}

Gemini Code Assist-Antworten

In der folgenden Tabelle finden Sie die Antwortfelder und Beschreibungen für Gemini Code Assist:

Feld Werte und Hinweise
LogEntry.resource.type Gemini Code Assist Ressourcentyp: cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container Eindeutige ID des Ressourcencontainers, in dem Gemini Code Assist verwendet wurde.
LogEntry.resource.labels.location Standort, an dem Gemini Code Assist verwendet wurde.
LogEntry.resource.labels.instance_id Eindeutige ID der Ressource, in der Gemini Code Assist verwendet wurde.
LogEntry.labels.method Kann je nach Aufruf von logEntry:

CompleteTask: z. B. eine Chatanfrage von Gemini Code Assist.

GenerateCode: z. B. eine Anfrage zum Generieren von Code, etwa mit einer Code-Transformation in Gemini Code Assist.

CompleteCode: z. B. eine Anfrage zum Vervollständigen von Code bei der Arbeit in der IDE, etwa mit Inline-Vorschlägen in Gemini Code Assist.
LogEntry.labels.product Name des Dienstes, auf den sich das Log bezieht. Logs, die für die Verwendung von Gemini Code Assist relevant sind, verwenden den Produktwert code_assist. Wenn das Log für Gemini Cloud Assist relevant ist, lautet dieser Wert cloud_assist. Andernfalls ist dieser Wert unknown.
LogEntry.labels.request_id Eine eindeutige Kennung, um eine Anfrage mit einem Antwortlogeintrag zu korrelieren.
LogEntry.labels.user_id Die Kennung des Nutzers, der diese Anfrage initiiert hat.
LogEntry.jsonPayload Die Nutzlast des Logeintrags. Alle Quellenangaben, die zum Generieren der Antwort verwendet wurden, sind in diesem Objekt als attribution_context enthalten.
LogEntry.logName Identifiziert das Log.

Gemini Code Assist-Metadatenlogs

Damit die Metadatenlogs generiert werden, muss die Telemetrieeinstellung der Gemini Code Assist-Erweiterung sowohl für VS Code- als auch für IntelliJ-Erweiterungen aktiviert sein.

Gemini Code Assist-Metadatenlogs haben dieselbe Struktur wie Gemini Code Assist-Logs, aber es werden unterschiedliche Felder angegeben. In der folgenden Tabelle finden Sie eine Liste der Felder, die in einem Logeintrag für Nutzeranfragen enthalten sind:

Feld Werte und Hinweise
LogEntry.@type Gemini Code Assist-Metadaten Ressourcentyp: type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog.
LogEntry.labels.method Bei Metadatenlogs ist dieser Labelwert Export.Metrics.
LogEntry.labels.product Name des Dienstes, auf den sich das Log bezieht. Logs, die für die Verwendung von Gemini Code Assist relevant sind, verwenden den Produktwert code_assist. Wenn das Log für Gemini Cloud Assist relevant ist, lautet dieser Wert cloud_assist. Andernfalls ist dieser Wert unknown.
LogEntry.labels.user_id Die Kennung des Nutzers, der diese Anfrage initiiert hat.
LogEntry.jsonPayload Gibt entweder ein codeExposure- oder ein code.Acceptance-Ereignis an. Ein codeExposure-Ereignis gibt an, dass einem Nutzer ein Codevorschlag präsentiert wurde. Ein code.Acceptance-Ereignis gibt an, dass der Nutzer eine Aktion zur Annahme ausgeführt hat, z. B. durch Eingabe, Tabulator oder vollständige Annahme.
LogEntry.jsonPayload.clientName Der Name der IDE, z. B. CloudCodeVscode.
LogEntry.jsonPayload.clientVersion Die IDE-Versionsnummer.
LogEntry.jsonPayload.codeAcceptance Gilt nur für VS Code- und IntelliJ-IDEs. Gibt an, dass der Nutzer ein Ereignis zur Übernahme ausgelöst hat, z. B. durch Überschreiben, Tabulator oder vollständige Übernahme. Enthält auch die folgenden Felder:
  • linesCount: Die Gesamtzahl der vom Nutzer akzeptierten Codezeilen.
  • commentLinesCount: die Anzahl der Kommentarzeilen im vom Nutzer akzeptierten Code. Dieses Attribut wird nur angezeigt, wenn Gemini Code Assist ermitteln kann, wie viele der akzeptierten Zeilen Kommentarzeilen sind.
  • originalRequestId: Eine Kennung, die ein codeExposure-Ereignis mit null oder mehr codeAcceptance-Ereignissen verknüpft. Damit können die Akzeptanzrate und die Anzahl der akzeptierten Codezeilen berechnet werden.
  • programmingLanguage: Programmiersprache des akzeptierten Codes, z. B. python.
LogEntry.jsonPayload.codeExposure Gilt nur für VS Code- und IntelliJ-IDEs. Gibt an, dass einem Nutzer eine Codevorschlag angezeigt wurde. Enthält auch die folgenden Felder:
  • programmingLanguage: Programmiersprache der Einblendung, z. B. python.
  • originalRequestId: Eine Kennung, die ein codeExposure-Ereignis mit null oder mehr codeAcceptance-Ereignissen verknüpft. Damit können die Akzeptanzrate und die Anzahl der akzeptierten Codezeilen berechnet werden.
LogEntry.jsonPayload.chatExposure Gibt an, dass einem Nutzer eine Chatantwort präsentiert wurde. Enthält auch die folgenden Felder:
  • originalRequestId: Eine Kennung, die ein chatExposure-Ereignis mit null oder mehr chatAcceptance-Ereignissen verknüpft. Damit können die Chat-Akzeptanzrate und die Anzahl der akzeptierten Chatzeilen berechnet werden.
  • is_agentic: Eine Kennung, die angibt, ob „chatExposure“ aus dem KI-Agentenmodus stammt. Damit können die Akzeptanzrate für den KI-Agentenmodus und den Nicht-KI-Agentenmodus sowie die Anzahl der akzeptierten Codezeilen unterschieden werden.
LogEntry.jsonPayload.chatAcceptance Gibt an, dass der Nutzer ein Ereignis zur Übernahme für die Codeblöcke in der Chatantwort ausgelöst hat. Enthält auch die folgenden Felder:
  • interactionType: die Art der Interaktion des Nutzers mit dem Codeblock, z. B. ACCEPT_CODE_BLOCK.
  • programmingLanguage: Programmiersprache des akzeptierten Codes, z. B. python.
  • linesCount: Die Gesamtzahl der vom Nutzer akzeptierten Codezeilen.
  • originalRequestId: Eine Kennung, die ein chatExposure-Ereignis mit null oder mehr chatAcceptance-Ereignissen verknüpft.
  • is_agentic: Eine Kennung, die angibt, ob die Chat-Annahme aus dem KI-Agentenmodus stammt. Damit können die Akzeptanzrate für den KI-Agentenmodus und den Nicht-KI-Agentenmodus sowie die Anzahl der akzeptierten Codezeilen unterschieden werden.

Das folgende Beispiel zeigt einen codeExposure-Logeintrag:

{
  insertId: "whfrqgc1gj"
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog"
    clientName: "CloudCodeVscode"
    clientVersion: "1.93.1"
    codeExposure: {
      originalRequestId: "cac019824a0b25ba"
      programmingLanguage: "python"
    }
  requestId: "0c5178fe-446f-4ab6-b996-520dec100cf8"
  }
  labels: {
    method: "Export.Metrics"
    product: "code_assist"
    user_id: "user@company.com"
  }
  logName: "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata"
  receiveTimestamp: "2025-02-03T23:34:35.662837985Z"
  resource: {
    labels: {
      instance_id: "default"
      location: "global"
      resource_container: "my-project-id"
    }
  type: "cloudaicompanion.googleapis.com/Instance"
  }
  severity: "INFO"
  timestamp: "2025-02-03T23:34:35.021564463Z"
}

Das folgende Beispiel zeigt einen codeAcceptance-Logeintrag:

{
  insertId: "whfrqgc1gk"
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog"
    clientName: "CloudCodeVscode"
    clientVersion: "1.93.1"
    codeAcceptance: {
      linesCount: 2
      originalRequestId: "cac019824a0b25ba"
      programmingLanguage: "python"
    }
    requestId: "ddf11040-c315-452e-b7cd-928c3f97984e"
  }
  labels: {
    method: "Export.Metrics"
    product: "code_assist"
    user_id: "user@company.com"
  }
  logName: "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata"
  receiveTimestamp: "2025-02-03T23:34:37.632662272Z"
  resource: {
    labels: {
      instance_id: "default"
      location: "global"
      resource_container: "my-project-id"
    }
    type: "cloudaicompanion.googleapis.com/Instance"
  }
  severity: "INFO"
  timestamp: "2025-02-03T23:34:36.778692483Z"
} 

Das folgende Beispiel zeigt einen chatAcceptance-Logeintrag:

{
  "insertId": "1oru1grbow",
  "jsonPayload": {
    "clientVersion": "1.103.2",
    "requestId": "32a0b0b8c967d8e8",
    "clientName": "CloudCodeVscode",
    "chatAcceptance": {
      "interactionType": "ACCEPT_CODE_BLOCK",
      "programmingLanguage": "go",
      "linesCount": "15",
      "originalRequestId": "75f7c41e63162567"
    },
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog"
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "resource_container": "my-project-id",
      "instance_id": "default",
      "location": "global"
    }
  },
  "timestamp": "2025-08-25T09:34:01.240377123Z",
  "severity": "INFO",
  "labels": {
    "product": "code_assist",
    "method": "Export.Metrics",
    "user_id": "user@company.com"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata",
  "receiveTimestamp": "2025-08-25T09:34:01.704925625Z"
}

Das folgende Beispiel zeigt einen chatExposure-Logeintrag:

{
  insertId: "3diaj2c208"
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog"
    clientName: "CloudCodeVscode"
    clientVersion: "1.93.1"
    chatExposure: {
      originalRequestId: "cac019824a0b25ba"
    }
  requestId: "0c5178fe-446f-4ab6-b996-520dec100cf8"
  }
  labels: {
    method: "Export.Metrics"
    product: "code_assist"
    user_id: "user@company.com"
  }
  logName: "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata"
  receiveTimestamp: "2025-02-03T23:34:35.662837985Z"
  resource: {
    labels: {
      instance_id: "default"
      location: "global"
      resource_container: "my-project-id"
    }
  type: "cloudaicompanion.googleapis.com/Instance"
  }
  severity: "INFO"
  timestamp: "2025-02-03T23:34:35.021564463Z"
}

Akzeptanzrate berechnen

In den folgenden Abschnitten wird beschrieben, wie Sie mithilfe von Metadatenlogs von Gemini Code Assist die Akzeptanzrate für Codevorschläge, die Akzeptanzrate für Chatantworten und die kombinierte Gesamtakzeptanzrate berechnen.

Code-Akzeptanzrate berechnen

Zur Berechnung der Code-Akzeptanzrate anhand von Metadatenlogs von Gemini Code Assist ermitteln Sie die Gesamtzahl der eindeutigen IDs aus Ereignissen mit codeAcceptance.originalRequestId und teilen sie durch die Gesamtzahl der eindeutigen IDs aus Ereignissen mit codeExposure.originalRequestId.

Sie können diese Berechnung weiter verfeinern, indem Sie die entsprechenden Metadatenlog-Ereignisfelder nach Programmiersprache und Nutzer filtern.

Chat-Akzeptanzrate berechnen

Zur Berechnung der Chat-Akzeptanzrate auf Grundlage der Metadatenlogs von Gemini Code Assist ermitteln Sie die Gesamtzahl der eindeutigen IDs aus Ereignissen mit chatAcceptance.originalRequestId und teilen sie durch die Gesamtzahl der eindeutigen IDs aus Ereignissen mit chatExposure.originalRequestId.

Sie können diese Berechnung weiter verfeinern, indem Sie die entsprechenden Metadatenlog-Ereignisfelder nach Programmiersprache und Nutzer filtern.

Gesamtakzeptanzrate berechnen

Zur Berechnung der Gesamtakzeptanzrate auf Grundlage der Metadatenlogs von Gemini Code Assist ermitteln Sie die Gesamtzahl der akzeptierten Ereignisse und teilen sie durch die Gesamtzahl der Exposure-Ereignisse:

Gesamtakzeptanzrate = Gesamtzahl der akzeptierten Ereignisse ÷ Gesamtzahl der Exposure-Ereignisse

  • Insgesamt akzeptierte Ereignisse: Die Gesamtzahl der eindeutigen IDs aus Ereignissen mit codeAcceptance.originalRequestId plus die Gesamtzahl der eindeutigen IDs aus Ereignissen mit chatAcceptance.originalRequestId.
  • Gesamtzahl der Exposure-Ereignisse: Die Gesamtzahl der eindeutigen IDs aus Ereignissen mit codeExposure.originalRequestId plus die Gesamtzahl der eindeutigen IDs aus Ereignissen mit chatExposure.originalRequestId.

Diese Formel liefert eine Akzeptanzrate, die die Gesamtwahrscheinlichkeit widerspiegelt, mit der ein Vorschlag für alle Gemini Code Assist-Funktionen akzeptiert wird.

Anzahl der akzeptierten Codezeilen berechnen

In den folgenden Abschnitten wird beschrieben, wie Sie die Anzahl der Codezeilen berechnen, die aus Codevorschlägen und aus dem Chat akzeptiert wurden, sowie die Gesamtzahl der Codezeilen, die mit Gemini Code Assist-Metadatenlogs akzeptiert wurden.

Anzahl der akzeptierten Codezeilen berechnen

Zur Berechnung der Anzahl der akzeptierten Codezeilen suchen Sie den Maximalwert für codeAcceptance.linesCount für eine eindeutige codeAcceptance.originalRequestId. Addieren Sie dann diese Maximalwerte, um die Gesamtzahl der akzeptierten Codezeilen zu berechnen.

Sie können diese Berechnung weiter verfeinern, indem Sie die entsprechenden Metadatenlog-Ereignisfelder nach Programmiersprache und Nutzer filtern.

Anzahl der akzeptierten Codezeilen aus einem Chat berechnen

Zur Berechnung der Anzahl der akzeptierten Codezeilen aus einem Chat suchen Sie den Wert des Felds chatAcceptance.linesCount für jede eindeutige chatAcceptance.originalRequestId. Addieren Sie dann diese Höchstwerte, um die Gesamtzahl der akzeptierten Chatzeilen zu berechnen.

Gesamtzahl der akzeptierten Codezeilen berechnen

Zur Berechnung der Gesamtzahl der akzeptierten Zeilen auf Grundlage der Metadatenlogs von Gemini Code Assist addieren Sie die Anzahl der akzeptierten Codezeilen und die Anzahl der akzeptierten Codezeilen aus dem Chat.

Weitere Informationen