הצגת יומני Gemini ל-Google Cloud

במאמר הזה מוסבר איך להפעיל את האיסוף והאחסון של נתוני הפעילות ב-Gemini for Google Cloud , כולל:

  • ‫Gemini for Google Cloud prompts and response logs, such as קלט של משתמשים, contextual information, and responses.
  • ‫Gemini ליומני מטא-נתונים, כמו מטא-נתוני טלמטריה ושורות קוד שהמשתמש אישר. Google Cloud

אם אתם צריכים ליצור מדדים של Gemini Code Assist, תוכלו לעיין במאמר בנושא מעקב אחר השימוש ב-Gemini for Google Cloud .

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

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

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

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

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

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

מגבלות

  • ההקלטה של נתוני יומן ב-Gemini Google Cloud מוגבלת לאינטראקציות של משתמשים עם Gemini Code Assist בתוך סביבת פיתוח משולבת (IDE).

  • כברירת מחדל, יומני Gemini for Google Cloud נאספים על בסיס כל פרויקט. הוראות להגדרת פרויקט מרכזי לאיסוף יומנים מכמה פרויקטים זמינות במאמר הגדרת רישום ביומן של כמה פרויקטים.

  • Gemini Code Assist ב-GitHub לא תומך ברישום ביומן באמצעות Cloud Logging.

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

צפייה ביומני משתמשים ובמטא-נתונים של Gemini Google Cloud

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

המסוף

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

    כניסה אל 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 for Google Cloud .

API

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

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

    מחליפים את PROJECT_ID במזהה הפרויקט שרוצים לצפות ביומני Gemini for Google Cloud שלו.

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

    TOKEN=$(gcloud auth print-access-token)
    
  3. משתמשים ב-cURL כדי לשלוח קריאה ל-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 ל- Google Cloud

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

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

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

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

CompleteTask: לדוגמה, בקשה לשיחה מ-Gemini Code Assist או משירות אחר של Gemini for Google Cloud .

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

CompleteCode: לדוגמה, בקשה להשלמת קוד כשעובדים בסביבת הפיתוח המשולבת (IDE), כמו הצעות מוטמעות ב-Gemini Code Assist.
LogEntry.labels.product ‫Gemini בשביל Google Cloud שם השירות. אם המוצר של Gemini for Google Cloud הוא Gemini Code Assist, הערך הוא code_assist. אם המוצר של Gemini הוא Gemini Cloud Assist, הערך הוא cloud_assist. Google Cloud אחרת, הערך הוא 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 Google Cloud בקובץ קוד.

נתוני ההנחיות להצעות קוד מוטבעות משתמשים באובייקט 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 ל- Google Cloud

בטבלה הבאה מוצגים שדות התגובה של Gemini ל- Google Cloud ותיאורים שלהם:

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

CompleteTask: לדוגמה, בקשה לשיחה מ-Gemini Code Assist או משירות אחר של Gemini for Google Cloud .

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

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

יומני מטא-נתונים של Gemini for Google Cloud

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

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

שדה ערכים והערות
LogEntry.@type ‫Gemini for Google Cloud metadata resource type: type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog.
LogEntry.labels.method במטא-נתונים של יומנים, ערך התווית הוא Export.Metrics.
LogEntry.labels.product ‫Gemini בשביל Google Cloud שם השירות. אם המוצר של Gemini for Google Cloud הוא Gemini Code Assist, הערך הוא code_assist. אם המוצר של Gemini הוא Gemini Cloud Assist, הערך הוא cloud_assist. Google Cloud אחרת, הערך הוא unknown.
LogEntry.labels.user_id המזהה של המשתמש שיזם את הבקשה הזו.
LogEntry.jsonPayload מציין אם מדובר באירוע codeExposure או באירוע code.Acceptance. אירוע codeExposure מציין חשיפה של הצעה לקוד למשתמש. אירוע code.Acceptance מציין שהמשתמש ביצע פעולת אישור כלשהי, כמו הקלדה, הקשה על Tab או אישור מלא.
LogEntry.jsonPayload.clientName שם ה-IDE, למשל CloudCodeVscode.
LogEntry.jsonPayload.clientVersion מספר הגרסה של ה-IDE.
LogEntry.jsonPayload.codeAcceptance בממשקי VS Code ו-IntelliJ IDE בלבד, הערך הזה מציין שהמשתמש ביצע פעולת אישור כלשהי, כמו הקלדה, הקשה על Tab או אישור מלא. הוא כולל גם את השדות הבאים:
  • linesCount: המספר הכולל של שורות הקוד שהמשתמש אישר.
  • commentLinesCount: מספר שורות ההערות בקוד שהמשתמש אישר. המאפיין הזה מופיע רק אם Gemini Code Assist יכול לקבוע כמה מהשורות שאושרו הן שורות של הערות.
  • originalRequestId: מזהה שמקשר בין אירוע codeExposure לאפס או יותר אירועים מסוג codeAcceptance. אפשר להשתמש בנתונים האלה כדי לחשב את המדדים שיעור האישור ושורות קוד שאושרו.
  • programmingLanguage: שפת התכנות של הקוד שאושר, כמו python.
LogEntry.jsonPayload.codeExposure למערכות VS Code ו-IntelliJ IDE בלבד, מציין שהייתה חשיפה של הצעה לקוד למשתמש. הוא כולל גם את השדות הבאים:
  • programmingLanguage: שפת התכנות של החשיפה, למשל python.
  • originalRequestId: מזהה שמקשר בין אירוע codeExposure לאפס או יותר אירועים מסוג codeAcceptance. אפשר להשתמש בנתונים האלה כדי לחשב את המדדים שיעור האישור ושורות קוד שאושרו.
LogEntry.jsonPayload.chatExposure מציין שהמשתמש נחשף לתשובה בצ'אט. הוא כולל גם את השדות הבאים:
  • originalRequestId: מזהה שמקשר בין אירוע chatExposure לאפס או יותר אירועים מסוג chatAcceptance. אפשר להשתמש בנתונים האלה כדי לחשב את המדדים שיעור האישור של בקשות לצ'אט ומספר השורות בצ'אט שאושרו.
  • is_agentic: מזהה שמציין אם chatExposure מגיע ממצב סוכן. אפשר להשתמש בזה כדי להבחין בין שיעור קבלת הצ'אט ומדדים של שורות קוד שהתקבלו ב-Agent Mode ובמצב רגיל.
LogEntry.jsonPayload.chatAcceptance מציין שהמשתמש ביצע פעולת אישור כלשהי בבלוקים של הקוד בתשובת הצ'אט. הוא כולל גם את השדות הבאים:
  • interactionType: סוג האינטראקציה שהייתה למשתמש עם בלוק הקוד, כמו ACCEPT_CODE_BLOCK.
  • programmingLanguage: שפת התכנות של הקוד שאושר, כמו python.
  • linesCount: המספר הכולל של שורות הקוד שהמשתמש אישר.
  • originalRequestId: מזהה שמקשר בין אירוע chatExposure לאפס או יותר אירועים מסוג chatAcceptance.
  • is_agentic: מזהה שמציין אם האישור של הצ'אט הגיע ממצב סוכן. אפשר להשתמש בזה כדי להבחין בין שיעור קבלת הצ'אט ומדדים של שורות קוד שהתקבלו ב-Agent Mode ובמצב רגיל.

בדוגמה הבאה אפשר לראות רשומה ביומן 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, מחברים את הערכים lines of code accepted ו-lines of code accepted from chat.

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