Wenn Sie Gemini Code Assist-Aktivitäten in Cloud Logging erfassen, können Sie Entwickler-Prompts, Modellantworten und Metadatenlogs wie Telemetriedaten und akzeptierte Codezeilen prüfen. Sie können diese Logeinträge abfragen, um die Interaktionen mit dem Assistenten in Ihrer Organisation zu bewerten. Wenn Sie aggregierte Trends anstelle von Rohlogs verfolgen möchten, lesen Sie den Hilfeartikel Nutzung von Gemini Code Assist überwachen.
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.
In Gemini Code Assist-Logs wird für jede Chat- und Agentenanfrage (
CompleteTask) eine kombinierte Tokenanzahl (totalTokenCount) aufgezeichnet. Sie können sie mit dem Labellabels.user_ideinem Nutzer zuordnen. Diese Anzahl wird in den FeldernRequestLog.metadata.totalTokenCount,ResponseLog.metadata.totalTokenCountundMetadataLog.apiRequest.totalTokenCountangezeigt. Logs für Codevervollständigungs- und Codegenerierungsanfragen (CompleteCodeundGenerateCode) sowie Metadatenlogs, die Telemetrieereignisse wiecodeExposure-,codeAcceptance-,chatExposure- undchatAcceptance-Ereignisse aufzeichnen, enthalten keine Tokenanzahl. In Logs und Cloud Monitoring-Messwerten werden keine separaten Prompt- und Antwort-Token-Zählungen aufgezeichnet. Informationen zum Aufrufen der aggregierten Tokennutzung für Ihr Projekt finden Sie unter Token- und Kontingentmesswerte.
Hinweis
-
Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle Loganzeige (
roles/logging.viewer) für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Aufrufen von Gemini Code Assist-Logs benötigen. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.
Sehen Sie sich die Preise für Cloud Logging und die Preise für Gemini Code Assist an.
Nutzer- und Metadatenlogs für Gemini Code Assist ansehen
So rufen Sie Gemini Code Assist-Nutzerlogs und Metadatenlogs auf:
Console
-
Rufen Sie in der Google Cloud Console das und die Seite Log-Explorer auf:
Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis aus, dessen Zwischenüberschrift Logging ist.
- Wählen Sie in der Symbolleiste ein Google Cloud Console-Projekt aus.
- 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
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_IDdurch die ID des Projekts, dessen Gemini Code Assist-Logs Sie aufrufen möchten.Rufen Sie einen Authentifizierungstoken ab:
TOKEN=$(gcloud auth print-access-token)Verwenden Sie
cURL, um die Methodeentries.listaufzurufen: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_NAMEdurch 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 |
Ressourcentyp von Gemini Code Assist: 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 nachdem, was logEntry aufgerufen hat, einer der folgenden Werte sein:CompleteTask: z. B. eine Chatanfrage von Gemini Code Assist.GenerateCode: z. B. eine Anfrage zum Generieren von Code, z. B. mit einer Codetransformationsanfrage in Gemini Code Assist.CompleteCode: z. B. eine Anfrage zum Vervollständigen von Code bei der Arbeit in der IDE, z. B. mit Inline-Vorschlägen in Gemini Code Assist. |
LogEntry.labels.product |
Name des Dienstes, für den das Log gilt. Für Gemini Code Assist relevante Logs 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 Beispiel-RequestLog-Eintrag für automatische Vorschläge für Inline-Code-Prompts und Prompts für Gemini Code Assist in einer Codedatei.
Für Prompt-Daten für Inline-Codevorschläge wird das codeCompletionRequest-Objekt 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_fileoderreplaceaufruft, 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 |
Ressourcentyp von Gemini Code Assist: 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 nachdem, was logEntry aufgerufen hat, einer der folgenden Werte sein:CompleteTask: z. B. eine Chatanfrage von Gemini Code Assist.GenerateCode: z. B. eine Anfrage zum Generieren von Code, z. B. mit einer Codetransformationsanfrage in Gemini Code Assist.CompleteCode: z. B. eine Anfrage zum Vervollständigen von Code bei der Arbeit in der IDE, z. B. mit Inline-Vorschlägen in Gemini Code Assist. |
LogEntry.labels.product |
Name des Dienstes, für den das Log gilt. Für Gemini Code Assist relevante Logs 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. Metadatenlogs enthalten die folgenden Arten von Einträgen:
- Anfragemetadaten: Gemini Code Assist schreibt für jede Chat- und Agenten-, Codegenerierungs- und Codevervollständigungsanfrage einen Metadaten-Logeintrag. Diese Einträge haben den
labels.method-WertCompleteTask,GenerateCodeoderCompleteCode. Bei Chat- und KI-Agentenanfragen (CompleteTask) enthält der Eintrag eine kombinierte Tokenanzahl inapiRequest.totalTokenCount. Bei Anfragen zur Codegenerierung und Codevervollständigung istapiRequestleer. - Telemetrieereignisse: Die IDE sendet Telemetrieereignisse wie
codeExposure-,codeAcceptance-,chatExposure- undchatAcceptance-Ereignisse sowie die Anzahl der akzeptierten Zeilen. Diese Einträge haben denlabels.method-WertExport.Metricsund enthalten keine Tokenanzahl.
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 |
Ressourcentyp für Gemini Code Assist-Metadaten: type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog. |
LogEntry.labels.method |
Kann je nach Typ des Metadaten-Logeintrags einer der folgenden Werte sein:Export.Metrics: Telemetrieereignisse, die von der IDE gesendet werden, z. B. codeExposure, codeAcceptance, chatExposure und chatAcceptance.CompleteTask, GenerateCode oder CompleteCode: Anfragemetadaten für Chat- und Agenten-, Codegenerierungs- bzw. Codevervollständigungsanfragen. |
LogEntry.labels.product |
Name des Dienstes, für den das Log gilt. Für Gemini Code Assist relevante Logs 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 |
Die Nutzlast des Metadaten-Logeintrags. Bei Anfragemetadateneinträgen enthält die Nutzlast ein apiRequest-Objekt. Bei Telemetrieeinträgen enthält die Nutzlast eines der folgenden Telemetrieereignisse: codeExposure, codeAcceptance, chatExposure oder chatAcceptance. Die einzelnen Telemetrieereignisse werden in den folgenden Zeilen beschrieben. |
LogEntry.jsonPayload.clientName |
Der Name der IDE, z. B. CloudCodeVscode. |
LogEntry.jsonPayload.clientVersion |
Die IDE-Versionsnummer. |
LogEntry.jsonPayload.apiRequest |
In den Metadateneinträgen der Anfrage (CompleteTask, GenerateCode und CompleteCode) vorhanden. Bei Chat- und Agentenanfragen (CompleteTask) ist totalTokenCount enthalten: die kombinierte Tokenanzahl für die Anfrage. Bei Anfragen zur Codegenerierung und Codevervollständigung (GenerateCode und CompleteCode) ist dieses Objekt leer ({}). |
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:
|
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:
|
LogEntry.jsonPayload.chatExposure |
Gibt an, dass einem Nutzer eine Chatantwort präsentiert wurde. Enthält auch die folgenden Felder:
|
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:
|
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.originalRequestIdplus die Gesamtzahl der eindeutigen IDs aus Ereignissen mitchatAcceptance.originalRequestId. - Gesamtzahl der Exposure-Ereignisse: Die Gesamtzahl der eindeutigen IDs aus Ereignissen mit
codeExposure.originalRequestIdplus die Gesamtzahl der eindeutigen IDs aus Ereignissen mitchatExposure.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.