Veja os registos do Gemini para Google Cloud

Este documento descreve como pode ativar a recolha e o armazenamento da atividade do Gemini for Google Cloud , incluindo o seguinte:

  • Gemini para Google Cloud comandos e registos de respostas, como introdução do utilizador, informações contextuais e respostas.
  • Gemini para Google Cloud registos de metadados, como metadados de telemetria e linhas de código aceites pelo utilizador.

Se precisar de gerar métricas do Gemini Code Assist, consulte o artigo Monitorizar a utilização do Google Cloud Gemini.

O Gemini para Google Cloud não recolhe nem envia para o Cloud Logging quaisquer outras interações que o utilizador possa ter tido com o Gemini para Google Cloud, incluindo feedback escrito. Os dados recolhidos são enviados para o Cloud Logging para armazenamento. Pode rever estes dados pesquisando entradas de registo com o tipo de recurso cloudaicompanion.googleapis.com/Instance.

Esta funcionalidade não regista comandos nem respostas no Gemini no Vertex AI. Para ativar os registos do Gemini no Vertex AI, consulte o artigo Ative os registos de auditoria de acesso a dados.

As funções de gestão de identidade e de acesso (IAM) controlam a capacidade de um principal aceder aos registos. Pode conceder funções predefinidas a responsáveis ou criar funções personalizadas. Para mais informações sobre as autorizações necessárias, consulte o artigo Controlo de acesso.

Por predefinição, o Cloud Logging encripta o conteúdo do cliente armazenado em repouso. Os dados armazenados em contentores de registos pelo Logging são encriptados usando chaves de encriptação de chaves, um processo conhecido como encriptação de envelope. O acesso aos seus dados de registo requer acesso a essas chaves de encriptação de chaves, que a Google gere por si sem que tenha de realizar qualquer ação.

A sua organização pode ter requisitos regulamentares, relacionados com a conformidade ou de encriptação avançada que a nossa encriptação em repouso predefinida não oferece. Para cumprir os requisitos da sua organização, em vez de a Google gerir as chaves de encriptação que protegem os seus dados, pode gerir as suas chaves.

Para informações específicas sobre a utilização de chaves de encriptação geridas pelo cliente (CMEK), incluindo vantagens e limitações, consulte o artigo Chaves de encriptação geridas pelo cliente.

Limitações

  • A gravação de dados de registo do Gemini está limitada às interações do utilizador com o Gemini Code Assist num IDE. Google Cloud

  • O Gemini Code Assist no GitHub não suporta o registo com o Cloud Logging.

Antes de começar

Veja os Google Cloud registos de utilizadores e os registos de metadados do Gemini

Para ver os registos de utilizador e os registos de metadados do Gemini for Google Cloud Google Workspace: faça uma das seguintes ações:

Consola

  1. Na Google Cloud consola, aceda à página Explorador de registos:

    Aceda ao Explorador de registos

    Se usar a barra de pesquisa para encontrar esta página, selecione o resultado cuja legenda é Registo.

  2. Na barra de ferramentas, selecione um Google Cloud projeto da consola.
  3. Na barra de ferramentas, expanda o menu Todos os recursos e selecione o recurso Instância do Cloud AI Companion.

gcloud

Execute o seguinte comando:

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

Substitua PROJECT_ID pelo ID do projeto cujos registos do Gemini for Google Cloud quer ver.

API

  1. Crie um ficheiro JSON que contenha as seguintes informações:

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

    Substitua PROJECT_ID pelo ID do projeto cujos registos do Gemini for Google Cloud quer ver.

  2. Obtenha um token de autenticação:

    TOKEN=$(gcloud auth print-access-token)
    
  3. Use cURL para chamar o entries.list método:

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

    Substitua JSON_FILE_NAME pelo caminho do ficheiro JSON que criou no passo anterior.

    Para mais informações sobre a autenticação, consulte o artigo Autentique-se para usar REST.

    A resposta devolve um conjunto de entradas de registo.

Gemini para registos Google Cloud

Uma LogEntry é a unidade básica de dados no Cloud Logging. As secções seguintes fornecem listas de campos encontrados no LogEntry para um evento da plataforma do Gemini para Google Cloud , como pedidos do utilizador e respostas do Gemini para Google Cloud .

Pedidos de utilizadores

A tabela seguinte mostra uma lista de campos encontrados numa entrada do registo de pedidos do utilizador:

Campo Valores e notas
LogEntry.resource.type Gemini para o Google Cloud tipo de recurso: cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container ID exclusivo do contentor de recursos onde o Gemini for Google Cloud foi usado.
LogEntry.resource.labels.location Localização onde o Gemini para Google Cloud foi usado.
LogEntry.resource.labels.instance_id ID exclusivo do recurso onde o Gemini for Google Cloud foi usado.
LogEntry.labels.method Pode ser uma das seguintes opções, consoante o que invocou logEntry:

CompleteTask: por exemplo, um pedido de chat do Gemini Code Assist ou outro serviço do Gemini for Google Cloud .

GenerateCode: por exemplo, um pedido para gerar código, como um pedido de transformação de código no Gemini Code Assist.

CompleteCode: por exemplo, um pedido para concluir código quando trabalha no IDE, como com sugestões inline no Gemini Code Assist.
LogEntry.labels.product Gemini para Google Cloud service name. Se o produto Gemini for o Gemini Code Assist, este valor é code_assist. Google Cloud Se o produto Gemini for o Gemini Cloud Assist, este valor é cloud_assist. Google Cloud Caso contrário, este valor é unknown.
LogEntry.labels.request_id Um identificador exclusivo para correlacionar um pedido com uma entrada do registo de resposta.
LogEntry.labels.user_id O identificador do utilizador que iniciou este pedido.
LogEntry.jsonPayload O payload da entrada do registo.
LogEntry.logName Identifica o registo.

O exemplo seguinte mostra uma entrada de registo de exemplo para um evento de comando de chat:

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

O exemplo seguinte mostra uma entrada RequestLog para sugestões de código inline automáticas e comandos para pedir ao Gemini Google Cloud num ficheiro de código.

Os dados de comandos para sugestões de código inline usam o objeto codeCompletionRequest (conforme mostrado no exemplo seguinte), enquanto a geração acionada manualmente usa 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"
}

Registos de interações do agente

Algumas interações com o Gemini podem gerar várias entradas de registo (pedido, resposta e metadados) para uma única ação do utilizador. Alguns exemplos de tais interações incluem o seguinte:

  • Um agente que executa uma tarefa que envolve a utilização de ferramentas (por exemplo, o modelo que invoca funções internas como read_file ou replace, conforme mostrado nos exemplos de registos).
  • Um agente a interagir com outros agentes.
Entrada do registo de pedidos

O exemplo seguinte mostra uma entrada de registo de exemplo para um pedido que inicia uma interação com um agente:

{
  "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"
}
Entrada do registo de respostas

A amostra seguinte mostra uma entrada de registo de resposta de exemplo de uma interação de agente que inclui várias mensagens:

{
  "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"
}
Entrada do registo de metadados

O exemplo seguinte mostra uma entrada de registo de metadados de exemplo de uma interação com um agente:

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

Os exemplos seguintes mostram outro exemplo de entradas de registo para uma interação com um agente, com o ID do pedido 4b66a582bad9cf2c:

Pedir entrada no registo

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

Entrada do registo de respostas

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

Entrada do registo de metadados

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

Respostas do Gemini para Google Cloud

A tabela seguinte mostra os campos de resposta e as descrições do Gemini for Google Cloud :

Campo Valores e notas
LogEntry.resource.type Gemini para o Google Cloud tipo de recurso: cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container ID exclusivo do contentor de recursos onde o Gemini for Google Cloud foi usado.
LogEntry.resource.labels.location Localização onde o Gemini para Google Cloud foi usado.
LogEntry.resource.labels.instance_id ID exclusivo do recurso onde o Gemini for Google Cloud foi usado.
LogEntry.labels.method Pode ser uma das seguintes opções, consoante o que invocou logEntry:

CompleteTask: por exemplo, um pedido de chat do Gemini Code Assist ou outro serviço do Gemini for Google Cloud .

GenerateCode: por exemplo, um pedido para gerar código, como um pedido de transformação de código no Gemini Code Assist.

CompleteCode: por exemplo, um pedido para concluir código quando trabalha no IDE, como com sugestões inline no Gemini Code Assist.
LogEntry.labels.product Gemini para Google Cloud service name. Se o produto Gemini for o Gemini Code Assist, este valor é code_assist. Google Cloud Se o produto Gemini for o Gemini Cloud Assist, este valor é cloud_assist. Google Cloud Caso contrário, este valor é unknown.
LogEntry.labels.request_id Um identificador exclusivo para correlacionar um pedido com uma entrada do registo de resposta.
LogEntry.labels.user_id O identificador do utilizador que iniciou este pedido.
LogEntry.jsonPayload O payload da entrada do registo. Todas as citações de fontes usadas para gerar a resposta estão incluídas neste objeto como attribution_context.
LogEntry.logName Identifica o registo.

Gemini para Google Cloud registos de metadados

Para que os registos de metadados sejam gerados, a definição de telemetria da extensão Gemini Code Assist tem de estar ativada para as extensões do VS Code e do IntelliJ.

Os registos de metadados do Gemini seguem a mesma estrutura que os registos do Gemini, mas especificam campos diferentes. Google Cloud Google Cloud A tabela seguinte mostra uma lista de campos encontrados numa entrada do registo de pedidos do utilizador:

Campo Valores e notas
LogEntry.@type Gemini para o Google Cloud tipo de recursode metadados: type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog.
LogEntry.labels.method Para registos de metadados, o valor desta etiqueta é Export.Metrics.
LogEntry.labels.product Gemini para Google Cloud service name. Se o produto Gemini for o Gemini Code Assist, este valor é code_assist. Google Cloud Se o produto Gemini for o Gemini Cloud Assist, este valor é cloud_assist. Google Cloud Caso contrário, este valor é unknown.
LogEntry.labels.user_id O identificador do utilizador que iniciou este pedido.
LogEntry.jsonPayload Indica um evento codeExposure ou um evento code.Acceptance. Um evento codeExposure indica uma exposição de uma sugestão de código a um utilizador. Um evento code.Acceptance indica que houve algum evento de aceitação por parte do utilizador, como a substituição de texto, a utilização da tecla Tab ou a aceitação total.
LogEntry.jsonPayload.clientName O nome do IDE, como CloudCodeVscode.
LogEntry.jsonPayload.clientVersion O número da versão do IDE.
LogEntry.jsonPayload.codeAcceptance Apenas para os IDEs VS Code e IntelliJ, indica que houve algum evento de aceitação por parte do utilizador, como substituição, tabulação ou aceitação total. Também inclui os seguintes campos:
  • linesCount: o número total de linhas de código aceites pelo utilizador.
  • commentLinesCount: o número de linhas de comentários no código aceite pelo utilizador. Esta propriedade só aparece se o Gemini Code Assist conseguir determinar quantas das linhas aceites são linhas de comentários.
  • originalRequestId: um identificador que associa um evento codeExposure a zero ou mais eventos codeAcceptance. Pode usar esta informação para calcular a taxa de aceitação e as medidas de linhas de código aceites.
  • programmingLanguage: linguagem de programação do código aceite, como python.
LogEntry.jsonPayload.codeExposure Apenas para os IDEs VS Code e IntelliJ, indica que houve exposição de uma sugestão de código a um utilizador. Também inclui os seguintes campos:
  • programmingLanguage: linguagem de programação da exposição, como python.
  • originalRequestId: um identificador que associa um evento codeExposure a zero ou mais eventos codeAcceptance. Pode usar esta informação para calcular a taxa de aceitação e as medidas de linhas de código aceites.
LogEntry.jsonPayload.chatExposure Indica que houve exposição de uma resposta de chat a um utilizador. Também inclui os seguintes campos:
  • originalRequestId: um identificador que associa um evento chatExposure a zero ou mais eventos chatAcceptance. Pode usar esta funcionalidade para calcular a taxa de aceitação de chat e as medidas de linhas de chat aceites.
  • is_agentic: um identificador que indica se chatExposure provém do modo de agente. Isto pode ser usado para distinguir a taxa de aceitação de chat do Modo Agente e do modo não agente, bem como as medidas de linhas de código aceites.
LogEntry.jsonPayload.chatAcceptance Indica que o utilizador aceitou algum evento nos blocos de código na resposta do chat. Também inclui os seguintes campos:
  • interactionType: o tipo de interação que o utilizador teve com o bloco de código, como ACCEPT_CODE_BLOCK.
  • programmingLanguage: linguagem de programação do código aceite, como python.
  • linesCount: o número total de linhas de código aceites pelo utilizador.
  • originalRequestId: um identificador que associa um evento chatExposure a zero ou mais eventos chatAcceptance.
  • is_agentic: um identificador que indica se o chatAcceptance é proveniente do modo de agente. Isto pode ser usado para distinguir a taxa de aceitação de chat do Modo Agente e do modo não agente, bem como as medidas de linhas de código aceites.

O exemplo seguinte mostra uma entrada de registo codeExposure de exemplo:

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

O exemplo seguinte mostra uma entrada de registo codeAcceptance de exemplo:

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

O exemplo seguinte mostra uma entrada de registo chatAcceptance de exemplo:

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

O exemplo seguinte mostra uma entrada de registo chatExposure de exemplo:

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

Calcule a taxa de aceitação

As secções seguintes descrevem como calcular a taxa de aceitação de sugestões de código, a taxa de aceitação de respostas do chat e a taxa de aceitação combinada total através dos registos de metadados do Gemini Code Assist.

Calcule a taxa de aceitação de códigos

Para calcular a taxa de aceitação de código através dos registos de metadados do Gemini Code Assist, encontre o número total de IDs únicos de eventos com codeAcceptance.originalRequestId e divida-o pelo número total de IDs únicos de eventos com codeExposure.originalRequestId.

Pode refinar ainda mais este cálculo por linguagem de programação e por utilizador através dos respetivos campos de eventos de registo de metadados.

Calcule a taxa de aceitação de chats

Para calcular a taxa de aceitação de chat com os registos de metadados do Gemini Code Assist, encontre o número total de IDs únicos de eventos com chatAcceptance.originalRequestId e divida-o pelo número total de IDs únicos de eventos com chatExposure.originalRequestId.

Pode refinar ainda mais este cálculo por linguagem de programação e por utilizador através dos respetivos campos de eventos de registo de metadados.

Calcule a taxa de aceitação total

Para calcular a taxa de aceitação total através dos registos de metadados do Gemini Code Assist, encontre o número total de eventos aceites e divida-o pelo número total de eventos de exposição:

Taxa de aceitação total = Total de eventos aceites ÷ Total de eventos de exposição

  • Total de eventos aceites: o número total de IDs únicos de eventos com codeAcceptance.originalRequestId, mais o número total de IDs únicos de eventos com chatAcceptance.originalRequestId.
  • Total de eventos de exposição: o número total de IDs únicos de eventos com codeExposure.originalRequestId, mais o número total de IDs únicos de eventos com chatExposure.originalRequestId.

Esta fórmula oferece uma taxa de aceitação que reflete a probabilidade geral de qualquer sugestão ser aceite em todas as funcionalidades do Gemini Code Assist.

Calcule as linhas de código aceites

As secções seguintes descrevem como calcular o número de linhas de código aceites a partir de sugestões de código, o número de linhas de código aceites a partir do chat e o total de linhas de código aceites através dos registos de metadados do Gemini Code Assist.

Calcule as linhas de código aceites

Para calcular as linhas de código aceites, encontre o valor máximo para codeAcceptance.linesCount para cada codeAcceptance.originalRequestId único. Em seguida, some estes valores máximos para calcular o total de linhas de código aceites.

Pode refinar ainda mais este cálculo por linguagem de programação e por utilizador através dos respetivos campos de eventos de registo de metadados.

Calcule as linhas de código aceites a partir do chat

Para calcular as linhas de código aceites do chat, encontre o valor do campo chatAcceptance.linesCount para cada chatAcceptance.originalRequestId único. Em seguida, some estes valores máximos para calcular o total de linhas de chat aceites.

Calcular o total de linhas de código aceites

Para calcular o total de linhas aceites através dos registos de metadados do Gemini Code Assist, adicione as linhas de código aceites e as linhas de código aceites do chat.

O que se segue?