Requête Analytics personnalisée
curl --request POST \
--url https://server.codeium.com/api/v1/Analytics \
--header 'Content-Type: application/json' \
--data '
{
"service_key": "<string>",
"group_name": "<string>",
"query_requests": [
{
"data_source": "<string>",
"selections": [
{
"field": "<string>",
"name": "<string>",
"aggregation_function": "<string>"
}
],
"filters": [
{
"name": "<string>",
"filter": "<string>",
"value": "<string>"
}
],
"aggregations": [
{
"field": "<string>",
"name": "<string>"
}
]
}
]
}
'import requests
url = "https://server.codeium.com/api/v1/Analytics"
payload = {
"service_key": "<string>",
"group_name": "<string>",
"query_requests": [
{
"data_source": "<string>",
"selections": [
{
"field": "<string>",
"name": "<string>",
"aggregation_function": "<string>"
}
],
"filters": [
{
"name": "<string>",
"filter": "<string>",
"value": "<string>"
}
],
"aggregations": [
{
"field": "<string>",
"name": "<string>"
}
]
}
]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
service_key: '<string>',
group_name: '<string>',
query_requests: [
{
data_source: '<string>',
selections: [{field: '<string>', name: '<string>', aggregation_function: '<string>'}],
filters: [{name: '<string>', filter: '<string>', value: '<string>'}],
aggregations: [{field: '<string>', name: '<string>'}]
}
]
})
};
fetch('https://server.codeium.com/api/v1/Analytics', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://server.codeium.com/api/v1/Analytics",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'service_key' => '<string>',
'group_name' => '<string>',
'query_requests' => [
[
'data_source' => '<string>',
'selections' => [
[
'field' => '<string>',
'name' => '<string>',
'aggregation_function' => '<string>'
]
],
'filters' => [
[
'name' => '<string>',
'filter' => '<string>',
'value' => '<string>'
]
],
'aggregations' => [
[
'field' => '<string>',
'name' => '<string>'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://server.codeium.com/api/v1/Analytics"
payload := strings.NewReader("{\n \"service_key\": \"<string>\",\n \"group_name\": \"<string>\",\n \"query_requests\": [\n {\n \"data_source\": \"<string>\",\n \"selections\": [\n {\n \"field\": \"<string>\",\n \"name\": \"<string>\",\n \"aggregation_function\": \"<string>\"\n }\n ],\n \"filters\": [\n {\n \"name\": \"<string>\",\n \"filter\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"aggregations\": [\n {\n \"field\": \"<string>\",\n \"name\": \"<string>\"\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://server.codeium.com/api/v1/Analytics")
.header("Content-Type", "application/json")
.body("{\n \"service_key\": \"<string>\",\n \"group_name\": \"<string>\",\n \"query_requests\": [\n {\n \"data_source\": \"<string>\",\n \"selections\": [\n {\n \"field\": \"<string>\",\n \"name\": \"<string>\",\n \"aggregation_function\": \"<string>\"\n }\n ],\n \"filters\": [\n {\n \"name\": \"<string>\",\n \"filter\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"aggregations\": [\n {\n \"field\": \"<string>\",\n \"name\": \"<string>\"\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.codeium.com/api/v1/Analytics")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"service_key\": \"<string>\",\n \"group_name\": \"<string>\",\n \"query_requests\": [\n {\n \"data_source\": \"<string>\",\n \"selections\": [\n {\n \"field\": \"<string>\",\n \"name\": \"<string>\",\n \"aggregation_function\": \"<string>\"\n }\n ],\n \"filters\": [\n {\n \"name\": \"<string>\",\n \"filter\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"aggregations\": [\n {\n \"field\": \"<string>\",\n \"name\": \"<string>\"\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"queryResults": [
{
"responseItems": [
{
"item": {}
}
]
}
]
}Analytics API
Requête Analytics personnalisée
Interrogation Analytics flexible avec selections, filtres et aggregations personnalisés pour les données Autocomplete, Chat, Command et PCW.
POST
/
api
/
v1
/
Analytics
Requête Analytics personnalisée
curl --request POST \
--url https://server.codeium.com/api/v1/Analytics \
--header 'Content-Type: application/json' \
--data '
{
"service_key": "<string>",
"group_name": "<string>",
"query_requests": [
{
"data_source": "<string>",
"selections": [
{
"field": "<string>",
"name": "<string>",
"aggregation_function": "<string>"
}
],
"filters": [
{
"name": "<string>",
"filter": "<string>",
"value": "<string>"
}
],
"aggregations": [
{
"field": "<string>",
"name": "<string>"
}
]
}
]
}
'import requests
url = "https://server.codeium.com/api/v1/Analytics"
payload = {
"service_key": "<string>",
"group_name": "<string>",
"query_requests": [
{
"data_source": "<string>",
"selections": [
{
"field": "<string>",
"name": "<string>",
"aggregation_function": "<string>"
}
],
"filters": [
{
"name": "<string>",
"filter": "<string>",
"value": "<string>"
}
],
"aggregations": [
{
"field": "<string>",
"name": "<string>"
}
]
}
]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
service_key: '<string>',
group_name: '<string>',
query_requests: [
{
data_source: '<string>',
selections: [{field: '<string>', name: '<string>', aggregation_function: '<string>'}],
filters: [{name: '<string>', filter: '<string>', value: '<string>'}],
aggregations: [{field: '<string>', name: '<string>'}]
}
]
})
};
fetch('https://server.codeium.com/api/v1/Analytics', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://server.codeium.com/api/v1/Analytics",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'service_key' => '<string>',
'group_name' => '<string>',
'query_requests' => [
[
'data_source' => '<string>',
'selections' => [
[
'field' => '<string>',
'name' => '<string>',
'aggregation_function' => '<string>'
]
],
'filters' => [
[
'name' => '<string>',
'filter' => '<string>',
'value' => '<string>'
]
],
'aggregations' => [
[
'field' => '<string>',
'name' => '<string>'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://server.codeium.com/api/v1/Analytics"
payload := strings.NewReader("{\n \"service_key\": \"<string>\",\n \"group_name\": \"<string>\",\n \"query_requests\": [\n {\n \"data_source\": \"<string>\",\n \"selections\": [\n {\n \"field\": \"<string>\",\n \"name\": \"<string>\",\n \"aggregation_function\": \"<string>\"\n }\n ],\n \"filters\": [\n {\n \"name\": \"<string>\",\n \"filter\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"aggregations\": [\n {\n \"field\": \"<string>\",\n \"name\": \"<string>\"\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://server.codeium.com/api/v1/Analytics")
.header("Content-Type", "application/json")
.body("{\n \"service_key\": \"<string>\",\n \"group_name\": \"<string>\",\n \"query_requests\": [\n {\n \"data_source\": \"<string>\",\n \"selections\": [\n {\n \"field\": \"<string>\",\n \"name\": \"<string>\",\n \"aggregation_function\": \"<string>\"\n }\n ],\n \"filters\": [\n {\n \"name\": \"<string>\",\n \"filter\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"aggregations\": [\n {\n \"field\": \"<string>\",\n \"name\": \"<string>\"\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.codeium.com/api/v1/Analytics")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"service_key\": \"<string>\",\n \"group_name\": \"<string>\",\n \"query_requests\": [\n {\n \"data_source\": \"<string>\",\n \"selections\": [\n {\n \"field\": \"<string>\",\n \"name\": \"<string>\",\n \"aggregation_function\": \"<string>\"\n }\n ],\n \"filters\": [\n {\n \"name\": \"<string>\",\n \"filter\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"aggregations\": [\n {\n \"field\": \"<string>\",\n \"name\": \"<string>\"\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"queryResults": [
{
"responseItems": [
{
"item": {}
}
]
}
]
}Vue d’ensemble
Requête
string
requis
Votre clé de service disposant des autorisations “Analytics Read”
string
Limiter les résultats aux utilisateurs d’un groupe spécifique (facultatif)
array
requis
Tableau d’objets de requête définissant les données à récupérer
Afficher Query Request Object
Afficher Query Request Object
string
requis
Source de données à interroger. Options :
QUERY_DATA_SOURCE_USER_DATA- Données AutocompleteQUERY_DATA_SOURCE_CHAT_DATA- Données ChatQUERY_DATA_SOURCE_COMMAND_DATA- Données CommandQUERY_DATA_SOURCE_PCW_DATA- Données Percent Code Written
array
requis
Tableau de sélections de champs à récupérer
Afficher Selection Object
Afficher Selection Object
string
requis
Nom du champ à sélectionner (voir la section Available Fields)
string
Alias du champ. S’il n’est pas spécifié, la valeur par défaut est
{aggregation_function}_{field_name} (en minuscules)string
Fonction d’agrégation à appliquer :
QUERY_AGGREGATION_UNSPECIFIED(par défaut)QUERY_AGGREGATION_COUNTQUERY_AGGREGATION_SUMQUERY_AGGREGATION_AVGQUERY_AGGREGATION_MAXQUERY_AGGREGATION_MIN
array
Tableau de filtres à appliquer
Afficher Filter Object
Afficher Filter Object
Structure de la requête
- data_source (obligatoire) : Source de données à interroger
- selections (obligatoire) : Tableau de sélections de champs à récupérer
- filters (facultatif) : Tableau de filtres à appliquer
- aggregations (facultatif) : Tableau d’aggregations pour le regroupement
Selections
- field (obligatoire) : nom du champ à sélectionner
- name (facultatif) : alias du champ
- aggregation_function (facultatif) : fonction d’agrégation à appliquer
Exemple de sélection
{
"field": "num_acceptances",
"name": "acceptances_totales",
"aggregation_function": "QUERY_AGGREGATION_SUM"
}
Filtres
- name (obligatoire) : Nom du champ sur lequel appliquer le filtre
- filter (obligatoire) : Opération de filtrage
- value (obligatoire) : Valeur à comparer
Exemple de filtre
{
"name": "language",
"filter": "QUERY_FILTER_EQUAL",
"value": "PYTHON"
}
Agrégations
- field (obligatoire) : Nom du champ à utiliser pour le regroupement
- name (obligatoire) : Alias du champ d’agrégation
Exemple d’agrégation
{
"field": "ide",
"name": "type_ide"
}
Champs disponibles
Données utilisateur
| Nom du champ | Description | Agrégations valides |
|---|---|---|
api_key | Hachage de la clé API de l’utilisateur | UNSPECIFIED, COUNT |
date | Date UTC de l’Autocompletion | UNSPECIFIED, COUNT |
date UTC-x | Date avec décalage de fuseau horaire (p. ex. « date UTC-8 » pour PST) | UNSPECIFIED, COUNT |
hour | Heure UTC de l’Autocompletion | UNSPECIFIED, COUNT |
language | Langage de programmation | UNSPECIFIED, COUNT |
ide | IDE utilisé | UNSPECIFIED, COUNT |
version | Version de Windsurf | UNSPECIFIED, COUNT |
num_acceptances | Nombre d’acceptations d’Autocomplete | SUM, MAX, MIN, AVG |
num_lines_accepted | Lignes de code acceptées | SUM, MAX, MIN, AVG |
num_bytes_accepted | Octets acceptés | SUM, MAX, MIN, AVG |
distinct_users | Utilisateurs distincts | UNSPECIFIED, COUNT |
distinct_developer_days | Paires distinctes (utilisateur, jour) | UNSPECIFIED, COUNT |
distinct_developer_hours | Paires distinctes (utilisateur, heure) | UNSPECIFIED, COUNT |
Données de Chat
| Field Name | Description | Valid Aggregations |
|---|---|---|
api_key | Hachage de la clé API de l’utilisateur | UNSPECIFIED, COUNT |
model_id | ID du modèle de Chat | UNSPECIFIED, COUNT |
date | Date UTC de la réponse du chat | UNSPECIFIED, COUNT |
date UTC-x | Date avec décalage de fuseau horaire | UNSPECIFIED, COUNT |
ide | IDE utilisé | UNSPECIFIED, COUNT |
version | Version de Windsurf | UNSPECIFIED, COUNT |
latest_intent_type | Type d’intention du Chat (voir Types d’intention ci‑dessous) | UNSPECIFIED, COUNT |
num_chats_received | Nombre de messages de chat reçus | SUM, MAX, MIN, AVG |
chat_accepted | Indique si le chat a été accepté (pouce levé) | SUM, COUNT |
chat_inserted_at_cursor | Indique si le bouton « Insert » a été cliqué | SUM, COUNT |
chat_applied | Indique si le bouton « Apply Diff » a été cliqué | SUM, COUNT |
chat_loc_used | Lignes de code utilisées à partir du chat | SUM, MAX, MIN, AVG |
Types d’intentions de Chat
CHAT_INTENT_GENERIC- Chat classiqueCHAT_INTENT_FUNCTION_EXPLAIN- CodeLens d’explication de fonctionCHAT_INTENT_FUNCTION_DOCSTRING- CodeLens de docstring de fonctionCHAT_INTENT_FUNCTION_REFACTOR- CodeLens de refactorisation de fonctionCHAT_INTENT_CODE_BLOCK_EXPLAIN- CodeLens d’explication de bloc de codeCHAT_INTENT_CODE_BLOCK_REFACTOR- CodeLens de refactorisation de bloc de codeCHAT_INTENT_PROBLEM_EXPLAIN- CodeLens d’explication de problèmeCHAT_INTENT_FUNCTION_UNIT_TESTS- CodeLens de tests unitaires de fonction
Données de Command
accepted pour filtrer uniquement les commandes acceptées.
| Nom du champ | Description | Agrégations valides |
|---|---|---|
api_key | Hachage de la clé API de l’utilisateur | UNSPECIFIED, COUNT |
date | Date UTC de la commande | UNSPECIFIED, COUNT |
timestamp | Horodatage UTC de la commande | UNSPECIFIED, COUNT |
language | Langage de programmation | UNSPECIFIED, COUNT |
ide | IDE utilisé | UNSPECIFIED, COUNT |
version | Version de Windsurf | UNSPECIFIED, COUNT |
command_source | Source de déclenchement de Command (voir Command Sources ci-dessous) | UNSPECIFIED, COUNT |
provider_source | Mode de génération ou d’édition | UNSPECIFIED, COUNT |
lines_added | Lignes de code ajoutées | SUM, MAX, MIN, AVG |
lines_removed | Lignes de code supprimées | SUM, MAX, MIN, AVG |
bytes_added | Octets ajoutés | SUM, MAX, MIN, AVG |
bytes_removed | Octets supprimés | SUM, MAX, MIN, AVG |
selection_lines | Lignes sélectionnées (zéro pour les générations) | SUM, MAX, MIN, AVG |
selection_bytes | Octets sélectionnés (zéro pour les générations) | SUM, MAX, MIN, AVG |
accepted | Indique si la commande a été acceptée | SUM, COUNT |
Sources de Command
COMMAND_REQUEST_SOURCE_LINE_HINT_CODE_LENSCOMMAND_REQUEST_SOURCE_DEFAULT- Utilisation typique de CommandCOMMAND_REQUEST_SOURCE_RIGHT_CLICK_REFACTORCOMMAND_REQUEST_SOURCE_FUNCTION_CODE_LENSCOMMAND_REQUEST_SOURCE_FOLLOWUPCOMMAND_REQUEST_SOURCE_CLASS_CODE_LENSCOMMAND_REQUEST_SOURCE_PLANCOMMAND_REQUEST_SOURCE_SELECTION_HINT_CODE_LENS
Sources du fournisseur
PROVIDER_SOURCE_COMMAND_GENERATE- Mode générationPROVIDER_SOURCE_COMMAND_EDIT- Mode édition
Données PCW
| Nom du champ | Description | Agrégations valides |
|---|---|---|
percent_code_written | Calculé comme codeium_bytes / (codeium_bytes + user_bytes) | UNSPECIFIED |
codeium_bytes | Nombre total d’octets générés par Codeium | UNSPECIFIED |
user_bytes | Nombre total d’octets écrits par l’utilisateur | UNSPECIFIED |
total_bytes | codeium_bytes + user_bytes | UNSPECIFIED |
codeium_bytes_by_autocomplete | Octets Codeium issus d’Autocomplete | UNSPECIFIED |
codeium_bytes_by_command | Octets Codeium issus de Command | UNSPECIFIED |
Filtres PCW
| Nom du champ | Description | Exemples |
|---|---|---|
language | Langage de programmation | KOTLIN, GO, JAVA |
ide | IDE utilisé | jetbrains, vscode |
version | Version de Windsurf | 1.28.0, 130.0 |
start_timestamp et end_timestamp dans le corps principal de la requête.
Exemples de demandes
Exemple de données utilisateur
curl -X POST --header "Content-Type: application/json" \
--data '{
"service_key": "votre_cle_de_service_ici",
"query_requests": [
{
"data_source": "QUERY_DATA_SOURCE_USER_DATA",
"selections": [
{
"field": "num_acceptances",
"name": "total_acceptances",
"aggregation_function": "QUERY_AGGREGATION_SUM"
},
{
"field": "num_lines_accepted",
"name": "total_lines",
"aggregation_function": "QUERY_AGGREGATION_SUM"
}
],
"filters": [
{
"name": "date",
"filter": "QUERY_FILTER_GE",
"value": "2024-01-01"
},
{
"name": "date",
"filter": "QUERY_FILTER_LE",
"value": "2024-02-01"
}
]
}
]
}' \
https://server.codeium.com/api/v1/Analytics
Exemple de données pour Chat
curl -X POST --header "Content-Type: application/json" \
--data '{
"service_key": "your_service_key_here",
"query_requests": [
{
"data_source": "QUERY_DATA_SOURCE_CHAT_DATA",
"selections": [
{
"field": "chat_loc_used",
"name": "lines_used",
"aggregation_function": "QUERY_AGGREGATION_SUM"
}
],
"filters": [
{
"name": "latest_intent_type",
"filter": "QUERY_FILTER_EQUAL",
"value": "CHAT_INTENT_FUNCTION_DOCSTRING"
}
],
"aggregations": [
{
"field": "ide",
"name": "ide_type"
}
]
}
]
}' \
https://server.codeium.com/api/v1/Analytics
Exemple de données de Command
curl -X POST --header "Content-Type: application/json" \
--data '{
"service_key": "your_service_key_here",
"query_requests": [
{
"data_source": "QUERY_DATA_SOURCE_COMMAND_DATA",
"selections": [
{
"field": "lines_added",
"name": "total_lines_added",
"aggregation_function": "QUERY_AGGREGATION_SUM"
},
{
"field": "lines_removed",
"name": "total_lines_removed",
"aggregation_function": "QUERY_AGGREGATION_SUM"
}
],
"filters": [
{
"name": "provider_source",
"filter": "QUERY_FILTER_EQUAL",
"value": "PROVIDER_SOURCE_COMMAND_EDIT"
},
{
"name": "accepted",
"filter": "QUERY_FILTER_EQUAL",
"value": "true"
}
],
"aggregations": [
{
"field": "language",
"name": "programming_language"
}
]
}
]
}' \
https://server.codeium.com/api/v1/Analytics
Exemple de données PCW
curl -X POST --header "Content-Type: application/json" \
--data '{
"service_key": "your_service_key_here",
"start_timestamp": "2024-01-01T00:00:00Z",
"end_timestamp": "2024-12-22T00:00:00Z",
"query_requests": [
{
"data_source": "QUERY_DATA_SOURCE_PCW_DATA",
"selections": [
{
"field": "percent_code_written",
"name": "pcw"
},
{
"field": "codeium_bytes",
"name": "ai_bytes"
},
{
"field": "total_bytes",
"name": "total"
},
{
"field": "codeium_bytes_by_autocomplete",
"name": "autocomplete_bytes"
},
{
"field": "codeium_bytes_by_command",
"name": "command_bytes"
}
],
"filters": [
{
"filter": "QUERY_FILTER_EQUAL",
"name": "language",
"value": "GO"
}
]
}
]
}' \
https://server.codeium.com/api/v1/Analytics
Réponse
array
Exemples de réponses
Réponse de données de l’utilisateur
{
"queryResults": [
{
"responseItems": [
{
"item": {
"total_acceptances": "125",
"total_lines": "863"
}
}
]
}
]
}
Réponse de données du Chat
{
"queryResults": [
{
"responseItems": [
{
"item": {
"lines_used": "74",
"ide_type": "jetbrains"
}
},
{
"item": {
"lines_used": "41",
"ide_type": "vscode"
}
}
]
}
]
}
Réponse de données de Command
{
"queryResults": [
{
"responseItems": [
{
"item": {
"programming_language": "PYTHON",
"total_lines_added": "21",
"total_lines_removed": "5"
}
},
{
"item": {
"programming_language": "GO",
"total_lines_added": "31",
"total_lines_removed": "27"
}
}
]
}
]
}
Réponse de PCW concernant les données
{
"queryResults": [
{
"responseItems": [
{
"item": {
"ai_bytes": "6018",
"autocomplete_bytes": "4593",
"command_bytes": "1425",
"pcw": "0.61",
"total": "9900"
}
}
]
}
]
}
Notes importantes
- Le PCW (Percent Code Written) présente une forte variance au cours d’une même journée ou pour un même utilisateur : agrégerez les données sur plusieurs semaines pour obtenir de meilleures informations
- Tous les champs de selections doivent soit avoir des fonctions d’agrégation, soit n’en avoir aucune (on ne peut pas mélanger)
- Les champs avec le motif “distinct_*” ne peuvent pas être utilisés dans des agrégations
- Les alias de champ doivent être uniques sur l’ensemble des selections et des aggregations
- Si aucune fonction d’agrégation n’est spécifiée, la valeur par défaut est UNSPECIFIED