צפייה ביומנים של Gemini Code Assist

איסוף הפעילות של Gemini Code Assist ב-Cloud Logging מאפשר לכם לבדוק את ההנחיות של המפתחים, את התשובות של המודל ואת יומני המטא-נתונים, כמו נתוני טלמטריה ושורות קוד שהתקבלו. אתם יכולים לשלוח שאילתות לגבי הרשומות האלה ביומן כדי להעריך את האינטראקציות עם Assistant בארגון. כדי לעקוב אחרי מגמות מצטברות במקום אחרי יומנים גולמיים, קראו את המאמר מעקב אחרי השימוש ב-Gemini Code Assist.

‫Gemini Code Assist לא אוסף או שולח ל-Cloud Logging אינטראקציות אחרות של המשתמש עם Gemini Code Assist, כולל משוב בכתב. הנתונים שנאספים נשלחים לאחסון ב-Cloud Logging. כדי לבדוק את הנתונים האלה, אתם יכולים לחפש רשומות ביומן עם סוג המשאב cloudaicompanion.googleapis.com/Instance.

התכונה הזו לא מתעדת הנחיות או תשובות ב-Gemini ב-Vertex AI. כדי להפעיל יומנים ל-Gemini ב-Vertex AI, קראו את המאמר הפעלת יומני ביקורת של גישה לנתונים.

תפקידי ניהול הזהויות והרשאות הגישה (IAM) קובעים את היכולת של חשבון משתמש לגשת ליומנים. אתם יכולים להקצות לחשבונות הראשיים תפקידים מוגדרים מראש, או ליצור תפקידים בהתאמה אישית. מידע נוסף על ההרשאות הנדרשות זמין במאמר בקרת גישה.

כברירת מחדל, ב-Cloud Logging תוכן הלקוחות שמאוחסן במצב מנוחה מוצפן. הנתונים שמאוחסנים בקטגוריות של יומנים באמצעות Logging מוצפנים באמצעות מפתחות להצפנת מפתחות הצפנה (KEK), בתהליך שנקרא הצפנת מעטפת. כדי לגשת לנתוני הרישום ביומן, צריך גישה למפתחות ההצפנה האלה, ש-Google מנהלת בשבילכם בלי שתצטרכו לעשות שום דבר.

יכול להיות שבארגון שלכם יש דרישות רגולטוריות, דרישות שקשורות לתאימות או דרישות הצפנה מתקדמות שההצפנה במנוחה שמוגדרת כברירת מחדל לא מספקת. כדי לעמוד בדרישות של הארגון, אתם יכולים לנהל את מפתחות ההצפנה שמגנים על הנתונים שלכם, במקום ש-Google תנהל אותם.

במאמר מפתחות הצפנה בניהול הלקוח מוסבר איך משתמשים במפתחות הצפנה בניהול הלקוח (CMEK), כולל היתרונות והמגבלות שלהם.

מגבלות

  • תיעוד נתוני היומן של Gemini Code Assist מוגבל לאינטראקציות של המשתמשים עם Gemini Code Assist בתוך IDE.

  • כברירת מחדל, היומנים של Gemini Code Assist נאספים לכל פרויקט בנפרד. במאמר הגדרת רישום ביומן של כמה פרויקטים מוסבר איך להגדיר פרויקט מרכזי לאיסוף יומנים מכמה פרויקטים.

  • ביומנים של Gemini Code Assist מתועד מספר משולב של טוקנים (totalTokenCount) לכל בקשה לצ'אט ולסוכן (CompleteTask), ואפשר לשייך אותו למשתמש באמצעות התווית labels.user_id. המספר הזה מופיע בשדות RequestLog.metadata.totalTokenCount,‏ ResponseLog.metadata.totalTokenCount ו-MetadataLog.apiRequest.totalTokenCount. יומנים של בקשות להשלמת קוד ובקשות ליצירת קוד (CompleteCode ו-GenerateCode) ויומני מטא-נתונים שמתעדים אירועי טלמטריה, כמו אירועי codeExposure,‏ codeAcceptance,‏ chatExposure ו-chatAcceptance, לא כוללים ספירות של טוקנים. ביומנים ובמדדים של Cloud Monitoring לא מתועדים בנפרד מספר הטוקנים של ההנחיה ומספר הטוקנים של התשובה. כדי לראות את השימוש המצטבר בטוקנים בפרויקט, עיינו במאמר מדדי טוקנים ומכסות.

לפני שמתחילים

איך צופים ביומני המשתמשים וביומני המטא-נתונים של Gemini Code Assist

כדי לראות את יומני המשתמשים ויומני המטא-נתונים של Gemini Code Assist, מבצעים אחת מהפעולות הבאות:

המסוף

  1. נכנסים לדף Logs Explorer ב- במסוף Google Cloud :

    נכנסים לדף Logs Explorer.

    אם אתם משתמשים בשורת החיפוש כדי למצוא את הדף הזה, בחרו בתוצאה עם כותרת המשנה Logging.

  2. בסרגל הכלים, בוחרים פרויקט במסוף Google Cloud .
  3. בסרגל הכלים, מרחיבים את התפריט All resources ובוחרים במשאב Cloud AI Companion Instance.

gcloud

מריצים את הפקודה הבאה:

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

מחליפים את PROJECT_ID במזהה הפרויקט שרוצים לראות את היומנים שלו ב-Gemini Code Assist.

API

  1. יוצרים קובץ JSON שמכיל את הפרטים הבאים:

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

    מחליפים את PROJECT_ID במזהה הפרויקט שאתם רוצים לראות את היומנים שלו ב-Gemini Code Assist.

  2. מקבלים אסימון אימות:

    TOKEN=$(gcloud auth print-access-token)
    
  3. משתמשים ב-cURL כדי לשלוח קריאה ל-method entries.list:

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

    מחליפים את JSON_FILE_NAME בנתיב לקובץ ה-JSON שיצרתם בשלב הקודם.

    מידע נוסף על אימות זמין במאמר אימות לשימוש ב-REST.

    התשובה מחזירה קבוצה של רשומות ביומן.

יומני Gemini Code Assist

LogEntry היא יחידת הנתונים הבסיסית ב-Cloud Logging. בקטעים הבאים מפורטים השדות שמופיעים ב-LogEntry לאירוע בפלטפורמה של Gemini Code Assist, כמו בקשות של משתמשים ותשובות של Gemini Code Assist.

בקשות ממשתמשים

בטבלה הבאה מופיעה רשימה של שדות שנמצאים ברשומה ביומן של בקשות משתמשים:

שדה ערכים והערות
LogEntry.resource.type סוג המשאב של Gemini Code Assist:‏ cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container המזהה הייחודי של מאגר המשאבים שבו השתמשו ב-Gemini Code Assist.
LogEntry.resource.labels.location המיקום שבו השתמשו ב-Gemini Code Assist.
LogEntry.resource.labels.instance_id המזהה הייחודי של המשאב שבו השתמשו ב-Gemini Code Assist.
LogEntry.labels.method יכול להיות אחד מהערכים הבאים, בהתאם למה שהפעיל את logEntry:

CompleteTask: לדוגמה, בקשת צ'אט מ-Gemini Code Assist.

GenerateCode: לדוגמה, בקשה ליצור קוד, כמו בקשת טרנספורמציה של קוד ב-Gemini Code Assist.

CompleteCode: לדוגמה, בקשה להשלמת קוד כשעובדים ב-IDE, כמו הצעות מוטמעות ב-Gemini Code Assist.
LogEntry.labels.product שם השירות שהיומן חל עליו. ביומנים שרלוונטיים ל-Gemini Code Assist, ערך המוצר הוא code_assist. אם היומן רלוונטי ל-Gemini Cloud Assist, הערך הוא cloud_assist. אחרת, הערך הוא unknown.
LogEntry.labels.request_id מזהה ייחודי שמאפשר לקשר בין בקשה לבין רשומת יומן של תגובה.
LogEntry.labels.user_id המזהה של המשתמש שיזם את הבקשה.
LogEntry.jsonPayload המטען הייעודי (payload) של הרשומה ביומן.
LogEntry.logName מזהה את היומן.

בדוגמה הבאה מוצגת רשומה ביומן לאירוע של הנחיה בצ'אט:

{
  "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"
}

בדוגמה הבאה מוצגת רשומה של RequestLog להנחיות אוטומטיות של הצעות קוד בתוך השורה והנחיות ל-Gemini Code Assist בקובץ קוד.

נתוני ההנחיות להצעות קוד בתוך השורה משתמשים באובייקט codeCompletionRequest (כמו בדוגמה הבאה), ואילו יצירה שמופעלת באופן ידני משתמשת ב-codeGenerationRequest.

{
  "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"
}

יומני אינטראקציות עם סוכנים

אינטראקציות מסוימות עם Gemini יכולות ליצור כמה רשומות ביומן (בקשה, תשובה ומטא-נתונים) לפעולה אחת של משתמש. דוגמאות לאינטראקציות כאלה:

  • סוכן שמבצע משימה שכוללת שימוש בכלים (לדוגמה, המודל מפעיל פונקציות פנימיות כמו read_file או replace, כפי שמוצג בדוגמאות של היומנים).
  • סוכן שמקיים אינטראקציה עם סוכנים אחרים.
רשומה ביומן הבקשות

בדוגמה הבאה מוצגת רשומה ביומן לבקשה שמתחילה אינטראקציה עם נציג:

{
  "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"
}
רשומה ביומן התגובות

בדוגמה הבאה מוצגת רשומת יומן של תגובה לדוגמה מאינטראקציה של נציג שכוללת כמה הודעות:

{
  "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"
}
רשומה ביומן של מטא-נתונים

בדוגמה הבאה מוצגת רשומה ביומן של מטא-נתונים מאינטראקציה עם נציג:

{
  "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"
}

הדוגמאות הבאות מציגות רשומות ביומן של אינטראקציה עם נציג, עם מזהה הבקשה 4b66a582bad9cf2c:

רשומה ביומן הבקשות

{
  "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"
}

רשומה ביומן התגובות

{
  "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"
}

רשומת יומן של מטא-נתונים

{
  "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

בטבלה הבאה מפורטים שדות התגובה של Gemini Code Assist והתיאורים שלהם:

שדה ערכים והערות
LogEntry.resource.type סוג המשאב של Gemini Code Assist:‏ cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container המזהה הייחודי של מאגר המשאבים שבו השתמשו ב-Gemini Code Assist.
LogEntry.resource.labels.location המיקום שבו השתמשו ב-Gemini Code Assist.
LogEntry.resource.labels.instance_id המזהה הייחודי של המשאב שבו השתמשו ב-Gemini Code Assist.
LogEntry.labels.method יכול להיות אחד מהערכים הבאים, בהתאם למה שהפעיל את logEntry:

CompleteTask: לדוגמה, בקשת צ'אט מ-Gemini Code Assist.

GenerateCode: לדוגמה, בקשה ליצור קוד, כמו בקשת טרנספורמציה של קוד ב-Gemini Code Assist.

CompleteCode: לדוגמה, בקשה להשלמת קוד כשעובדים ב-IDE, כמו הצעות מוטמעות ב-Gemini Code Assist.
LogEntry.labels.product שם השירות שהיומן חל עליו. ביומנים שרלוונטיים ל-Gemini Code Assist, ערך המוצר הוא code_assist. אם היומן רלוונטי ל-Gemini Cloud Assist, הערך הוא cloud_assist. אחרת, הערך הוא unknown.
LogEntry.labels.request_id מזהה ייחודי שמאפשר לקשר בין בקשה לבין רשומת יומן של תגובה.
LogEntry.labels.user_id המזהה של המשתמש שיזם את הבקשה.
LogEntry.jsonPayload המטען הייעודי (payload) של הרשומה ביומן. כל הציטוטים מהמקורות ששימשו ליצירת התשובה נכללים באובייקט הזה בתור attribution_context.
LogEntry.logName מזהה את היומן.

יומני מטא-נתונים של Gemini Code Assist

כדי ליצור את יומני המטא-נתונים, צריך להפעיל את הגדרת הטלמטריה של תוסף Gemini Code Assist גם בתוסף של VS Code וגם בתוסף של IntelliJ.

המבנה של יומני המטא-נתונים של Gemini Code Assist זהה לזה של יומני Gemini Code Assist, אבל השדות שונים. יומני המטא-נתונים כוללים את סוגי הרשומות הבאים:

  • ‫מטא-נתונים של בקשות: Gemini Code Assist כותב רשומת יומן של מטא-נתונים לכל בקשה לצ'אט, לסוכן, ליצירת קוד ולהשלמת קוד. לרשומות האלה יש ערך labels.method של CompleteTask,‏ GenerateCode או CompleteCode. בבקשות לצ'אט ולסוכן (CompleteTask), הרשומה כוללת ספירת טוקנים משולבת ב-apiRequest.totalTokenCount. בבקשות ליצירת קוד ולהשלמת קוד, הערך של apiRequest ריק.
  • אירועי טלמטריה: סביבת הפיתוח המשולבת שולחת אירועי טלמטריה, כמו אירועי codeExposure,‏ codeAcceptance,‏ chatExposure ו-chatAcceptance, ומספרי שורות שהתקבלו. ברשומות האלה הערך של labels.method הוא Export.Metrics והן לא כוללות ספירת טוקנים.

בטבלה הבאה מופיעה רשימה של שדות שנמצאים ברשומה ביומן של בקשות משתמשים:

שדה ערכים והערות
LogEntry.@type סוג המשאב של המטא-נתונים של Gemini Code Assist: ‏type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog.
LogEntry.labels.method יכול להיות אחד מהערכים הבאים, בהתאם לסוג של רשומת היומן של המטא-נתונים:

Export.Metrics: אירועי טלמטריה שנשלחים על ידי ה-IDE, כמו codeExposure,‏ codeAcceptance,‏ chatExposure ו-chatAcceptance.

CompleteTask,‏ GenerateCode או CompleteCode: מטא-נתונים של בקשות לצ'אט ולסוכן, ליצירת קוד ולהשלמת קוד, בהתאמה.
LogEntry.labels.product שם השירות שהיומן חל עליו. ביומנים שרלוונטיים ל-Gemini Code Assist, ערך המוצר הוא code_assist. אם היומן רלוונטי ל-Gemini Cloud Assist, הערך הוא cloud_assist. אחרת, הערך הוא unknown.
LogEntry.labels.user_id המזהה של המשתמש שיזם את הבקשה.
LogEntry.jsonPayload המטען הייעודי (payload) של רשומת היומן של המטא-נתונים. ברשומות של מטא-נתונים של בקשות, המטען הייעודי (payload) כולל אובייקט apiRequest. ברשומות טלמטריה, המטען הייעודי (payload) כולל אחד מאירועי הטלמטריה הבאים: codeExposure,‏ codeAcceptance,‏ chatExposure או chatAcceptance. כל אירוע טלמטריה מתואר בשורות הבאות.
LogEntry.jsonPayload.clientName שם ה-IDE, למשל CloudCodeVscode.
LogEntry.jsonPayload.clientVersion מספר הגרסה של ה-IDE.
LogEntry.jsonPayload.apiRequest מופיע ברשומות של מטא-נתונים של בקשות (CompleteTask,‏ GenerateCode ו-CompleteCode). בבקשות של צ'אט ונציג (CompleteTask), כולל את totalTokenCount: מספר הטוקנים המשולב של הבקשה. בבקשות ליצירת קוד ולהשלמת קוד (GenerateCode ו-CompleteCode), האובייקט הזה ריק ({}).
LogEntry.jsonPayload.codeAcceptance רק בסביבות הפיתוח המשולבות VS Code ו-IntelliJ, מציין שהמשתמש ביצע פעולת אישור כלשהי, כמו הקלדה על טקסט קיים, לחיצה על Tab או אישור מלא. כולל גם את השדות הבאים:
  • linesCount: מספר שורות הקוד הכולל שהמשתמש אישר.
  • ‫commentLinesCount: מספר שורות ההערות בקוד שהמשתמש אישר. המאפיין הזה מופיע רק אם Gemini Code Assist יכול לקבוע כמה מהשורות שאושרו הן שורות של הערות.
  • ‫originalRequestId: מזהה שמקשר בין אירוע codeExposure לאפס אירועי codeAcceptance או יותר. אפשר להשתמש בזה כדי לחשב את שיעור קבלת ההצעות ואת שורות הקוד שהתקבלו.
  • ‫programmingLanguage: שפת התכנות של הקוד שאושר, למשל python.
LogEntry.jsonPayload.codeExposure רק בסביבות הפיתוח המשולבות VS Code ו-IntelliJ, מציין שהמשתמש נחשף להצעה לכתיבת קוד. כולל גם את השדות הבאים:
LogEntry.jsonPayload.chatExposure מציין שהתשובה בצ'אט הוצגה למשתמש. כולל גם את השדות הבאים:
  • ‫originalRequestId: מזהה שמקשר בין אירוע chatExposure לאפס אירועי chatAcceptance או יותר. אפשר להשתמש בזה כדי לחשב את שיעור קבלת הצ'אטים ואת שורות הצ'אט שהתקבלו.
  • ‫is_agentic: מזהה שמציין אם chatExposure מגיע ממצב סוכן. אפשר להשתמש בזה כדי להבחין בין שיעור קבלת ההצעות ומדדי שורות הקוד שהתקבלו במצב Agent ובמצב רגיל.
LogEntry.jsonPayload.chatAcceptance מציין שהמשתמש אישר אירוע מסוים בבלוקים של הקוד בתשובה בצ'אט. כולל גם את השדות הבאים:
  • ‫interactionType: סוג האינטראקציה של המשתמש עם בלוק הקוד, למשל ACCEPT_CODE_BLOCK.
  • ‫programmingLanguage: שפת התכנות של הקוד שאושר, למשל python.
  • linesCount: מספר שורות הקוד הכולל שהמשתמש אישר.
  • ‫originalRequestId: מזהה שמקשר בין אירוע chatExposure לאפס אירועי chatAcceptance או יותר.
  • ‫is_agentic: מזהה שמציין אם chatAcceptance מגיע מ-Agent Mode. אפשר להשתמש בזה כדי להבחין בין שיעור קבלת ההצעות ומדדי שורות הקוד שהתקבלו במצב Agent ובמצב רגיל.

הדוגמה הבאה מציגה רשומת יומן לדוגמה של codeExposure:

{
  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"
}

הדוגמה הבאה מציגה רשומת יומן לדוגמה של codeAcceptance:

{
  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"
} 

הדוגמה הבאה מציגה רשומת יומן לדוגמה של chatAcceptance:

{
  "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"
}

הדוגמה הבאה מציגה רשומת יומן לדוגמה של chatExposure:

{
  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"
}

חישוב שיעור האישורים

בקטעים הבאים מוסבר איך לחשב את שיעור קבלת ההצעות לקוד, את שיעור קבלת התשובות בצ'אט ואת שיעור הקבלה הכולל, באמצעות יומני המטא-נתונים של Gemini Code Assist.

חישוב שיעור קבלת הקוד

כדי לחשב את שיעור קבלת הקוד באמצעות יומני המטא-נתונים של Gemini Code Assist, מחפשים את המספר הכולל של המזהים הייחודיים מאירועים עם codeAcceptance.originalRequestId ומחלקים אותו במספר הכולל של המזהים הייחודיים מאירועים עם codeExposure.originalRequestId.

אפשר גם לצמצם את החישוב הזה לפי שפת תכנות ולפי משתמש, באמצעות שדות המטא-נתונים המתאימים של אירועי היומן.

חישוב שיעור האישורים של בקשות הצ'אט

כדי לחשב את שיעור קבלת הצ'אט באמצעות יומני המטא-נתונים של Gemini Code Assist, מוצאים את המספר הכולל של המזהים הייחודיים מאירועים עם chatAcceptance.originalRequestId ומחלקים אותו במספר הכולל של המזהים הייחודיים מאירועים עם chatExposure.originalRequestId.

אפשר לשפר את החישוב הזה לפי שפת תכנות ולפי משתמש באמצעות שדות המטא-נתונים המתאימים של אירועי היומן.

חישוב שיעור האישורים הכולל

כדי לחשב את שיעור האישור הכולל באמצעות יומני המטא-נתונים של Gemini Code Assist, מחפשים את המספר הכולל של אירועי האישור ומחלקים אותו במספר הכולל של אירועי החשיפה:

שיעור האישורים הכולל = סך כל האירועים שאושרו ÷ סך כל אירועי החשיפה

  • סה"כ אירועים שאושרו: המספר הכולל של מזהים ייחודיים מאירועים עם codeAcceptance.originalRequestId, בתוספת המספר הכולל של מזהים ייחודיים מאירועים עם chatAcceptance.originalRequestId.
  • סה"כ אירועי חשיפה: המספר הכולל של מזהים ייחודיים מאירועים עם codeExposure.originalRequestId, בתוספת המספר הכולל של מזהים ייחודיים מאירועים עם chatExposure.originalRequestId.

הנוסחה הזו מספקת שיעור קבלה שמשקף את ההסתברות הכוללת שכל הצעה תתקבל בכל התכונות של Gemini Code Assist.

חישוב שורות הקוד שאושרו

בקטעים הבאים מוסבר איך לחשב את מספר שורות הקוד שהתקבלו מהצעות קוד, את מספר שורות הקוד שהתקבלו מהצ'אט ואת מספר שורות הקוד הכולל שהתקבלו באמצעות יומני המטא-נתונים של Gemini Code Assist.

חישוב שורות הקוד שאושרו

כדי לחשב את שורות הקוד שהתקבלו, מוצאים את הערך המקסימלי של codeAcceptance.linesCount לכל codeAcceptance.originalRequestId ייחודי. לאחר מכן, סכמו את הערכים המקסימליים האלה כדי לחשב את מספר שורות הקוד הכולל שהתקבלו.

אפשר לשפר את החישוב הזה לפי שפת תכנות ולפי משתמש באמצעות שדות המטא-נתונים המתאימים של אירועי היומן.

חישוב שורות הקוד שהתקבלו מהצ'אט

כדי לחשב את שורות הקוד שהתקבלו מהצ'אט, צריך למצוא את הערך של השדה chatAcceptance.linesCount לכל chatAcceptance.originalRequestId ייחודי. לאחר מכן, סכמו את הערכים המקסימליים האלה כדי לחשב את מספר שורות הצ'אט הכולל שהתקבלו.

חישוב מספר שורות הקוד הכולל שאושרו

כדי לחשב את מספר השורות הכולל שהתקבלו באמצעות יומני המטא-נתונים של Gemini Code Assist, מוסיפים את שורות הקוד שהתקבלו ואת שורות הקוד שהתקבלו מהצ'אט.

המאמרים הבאים