Pular para o conteúdo principal
POST
/
api
/
v1
/
Analytics
Consulta personalizada de Custom Analytics
curl --request POST \
  --url https://server.codeium.com/api/v1/Analytics \
  --header 'Authorization: Bearer <token>' \
  --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 = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', '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 => [
"Authorization: Bearer <token>",
"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("Authorization", "Bearer <token>")
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("Authorization", "Bearer <token>")
.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["Authorization"] = 'Bearer <token>'
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": {}
        }
      ]
    }
  ]
}

Visão geral

A API Custom Analytics permite consultas flexíveis em dados de preenchimento automático, chat e comandos, com seleções, filtros, agregações e ordenações personalizáveis.

Requisição

service_key
string
obrigatório
Sua chave de serviço com permissão “Analytics Read”
group_name
string
Filtra os resultados para usuários em um grupo específico (opcional)
query_requests
array
obrigatório
Array de objetos de requisição de consulta que definem os dados a recuperar

Estrutura da requisição de consulta

Cada objeto de requisição de consulta contém:
  • data_source (obrigatório): Fonte de dados a consultar
  • selections (obrigatório): Array de campos selecionados para recuperar
  • filters (opcional): Array de filtros a aplicar
  • aggregations (opcional): Array de agregações para agrupamento

Seleções

As seleções definem quais campos recuperar e como agregá-los.
  • field (obrigatório): Nome do campo a ser selecionado
  • name (opcional): Alias do campo
  • aggregation_function (opcional): Função de agregação a ser aplicada

Exemplo de seleção

{
  "field": "num_acceptances",
  "name": "total_acceptances",
  "aggregation_function": "QUERY_AGGREGATION_SUM"
}

Filtros

Os filtros restringem os dados aos elementos que atendem a critérios específicos.
  • name (obrigatório): Nome do campo usado para filtrar
  • filter (obrigatório): Operação de filtro
  • value (obrigatório): Valor de comparação

Exemplo de filtro

{
  "name": "language",
  "filter": "QUERY_FILTER_EQUAL",
  "value": "PYTHON"
}

Agregações

As agregações agrupam os dados com base nos critérios especificados.
  • field (obrigatório): Nome do campo pelo qual agrupar
  • name (obrigatório): Alias do campo de agregação

Exemplo de agregação

{
  "field": "ide",
  "name": "ide_type"
}

Campos disponíveis

Dados do usuário

Todos os dados do usuário são agregados por usuário, por hora.
Nome do campoDescriçãoAgregações válidas
api_keyhash da Chave de API do usuárioUNSPECIFIED, COUNT
dateData UTC do preenchimento automáticoUNSPECIFIED, COUNT
date UTC-xData com deslocamento de fuso horário (e.g., “date UTC-8” para PST)UNSPECIFIED, COUNT
hourHora UTC do preenchimento automáticoUNSPECIFIED, COUNT
languageLinguagem de programaçãoUNSPECIFIED, COUNT
ideIDE em usoUNSPECIFIED, COUNT
versionVersão da extensão/plugin (language-server), e.g. 1.48.xUNSPECIFIED, COUNT
num_acceptancesNúmero de sugestões de preenchimento automático aceitasSUM, MAX, MIN, AVG
num_lines_acceptedLinhas de código aceitasSUM, MAX, MIN, AVG
num_bytes_acceptedBytes aceitosSUM, MAX, MIN, AVG
distinct_usersUsuários distintosUNSPECIFIED, COUNT
distinct_developer_daysTuplas distintas de (usuário, dia)UNSPECIFIED, COUNT
distinct_developer_hoursTuplas distintas de (usuário, hora)UNSPECIFIED, COUNT

Dados de chat

Os dados de chat são separados dos dados do Cascade e representam o uso dos nossos plugins legados, sem agentes
Todos os Dados de chat representam respostas do modelo de chat, não perguntas do usuário.
Nome do campoDescriçãoAgregações válidas
api_keyHash da Chave de API do usuárioUNSPECIFIED, COUNT
model_idID do modelo de chatUNSPECIFIED, COUNT
dateData em UTC da resposta do chatUNSPECIFIED, COUNT
date UTC-xData com deslocamento de fuso horárioUNSPECIFIED, COUNT
ideIDE em usoUNSPECIFIED, COUNT
versionVersão da extensão/plugin (language-server), e.g. 1.48.xUNSPECIFIED, COUNT
latest_intent_typeTipo de intenção do chat (consulte Tipos de intenção abaixo)UNSPECIFIED, COUNT
num_chats_receivedNúmero de mensagens de chat recebidasSUM, MAX, MIN, AVG
chat_acceptedSe o chat foi aceito (curtida)SUM, COUNT
chat_inserted_at_cursorSe o botão “Insert” foi clicadoSUM, COUNT
chat_appliedSe o botão “Apply Diff” foi clicadoSUM, COUNT
chat_loc_usedLinhas de código aproveitadas do chatSUM, MAX, MIN, AVG

Tipos de intenção de chat

  • CHAT_INTENT_GENERIC - Chat normal
  • CHAT_INTENT_FUNCTION_EXPLAIN - CodeLens de explicação da função
  • CHAT_INTENT_FUNCTION_DOCSTRING - CodeLens de docstring da função
  • CHAT_INTENT_FUNCTION_REFACTOR - CodeLens de refatoração da função
  • CHAT_INTENT_CODE_BLOCK_EXPLAIN - CodeLens de explicação do bloco de código
  • CHAT_INTENT_CODE_BLOCK_REFACTOR - CodeLens de refatoração do bloco de código
  • CHAT_INTENT_PROBLEM_EXPLAIN - CodeLens de explicação do problema
  • CHAT_INTENT_FUNCTION_UNIT_TESTS - CodeLens de testes unitários da função

dados de comando

Os dados de comando incluem todos os comandos, inclusive os recusados. Use o campo accepted para filtrar apenas os comandos aceitos.
Nome do campoDescriçãoAgregações válidas
api_keyHash da Chave de API do usuárioUNSPECIFIED, COUNT
dateData UTC do comandoUNSPECIFIED, COUNT
timestampCarimbo de data/hora UTC do comandoUNSPECIFIED, COUNT
languageLinguagem de programaçãoUNSPECIFIED, COUNT
ideIDE em usoUNSPECIFIED, COUNT
versionVersão da extensão/plugin (language-server), por exemplo 1.48.xUNSPECIFIED, COUNT
command_sourceOrigem do acionamento do comando (consulte origem do comando abaixo)UNSPECIFIED, COUNT
provider_sourceModo de geração ou ediçãoUNSPECIFIED, COUNT
lines_addedLinhas de código adicionadasSUM, MAX, MIN, AVG
lines_removedLinhas de código removidasSUM, MAX, MIN, AVG
bytes_addedBytes adicionadosSUM, MAX, MIN, AVG
bytes_removedBytes removidosSUM, MAX, MIN, AVG
selection_linesLinhas selecionadas (zero para gerações)SUM, MAX, MIN, AVG
selection_bytesBytes selecionados (zero para gerações)SUM, MAX, MIN, AVG
acceptedIndica se o comando foi aceitoSUM, COUNT

Origens do comando

  • COMMAND_REQUEST_SOURCE_LINE_HINT_CODE_LENS
  • COMMAND_REQUEST_SOURCE_DEFAULT - Uso comum do comando
  • COMMAND_REQUEST_SOURCE_RIGHT_CLICK_REFACTOR
  • COMMAND_REQUEST_SOURCE_FUNCTION_CODE_LENS
  • COMMAND_REQUEST_SOURCE_FOLLOWUP
  • COMMAND_REQUEST_SOURCE_CLASS_CODE_LENS
  • COMMAND_REQUEST_SOURCE_PLAN
  • COMMAND_REQUEST_SOURCE_SELECTION_HINT_CODE_LENS

Origens do provedor

  • PROVIDER_SOURCE_COMMAND_GENERATE - Modo de geração
  • PROVIDER_SOURCE_COMMAND_EDIT - Modo de edição

Dados de PCW

Dados de Percentual de Código Escrito com rastreamento separado para contribuições de preenchimento automático e de comando.
Nome do campoDescriçãoAgregações válidas
percent_code_writtenCalculado como codeium_bytes / (codeium_bytes + user_bytes)UNSPECIFIED
codeium_bytesTotal de bytes gerados pelo CodeiumUNSPECIFIED
user_bytesTotal de bytes escritos pelo usuárioUNSPECIFIED
total_bytescodeium_bytes + user_bytesUNSPECIFIED
codeium_bytes_by_autocompleteBytes do Codeium provenientes do preenchimento automáticoUNSPECIFIED
codeium_bytes_by_commandBytes do Codeium provenientes de comandosUNSPECIFIED

Filtros de PCW

Nome do campoDescriçãoExemplos
languageLinguagem de programaçãoKOTLIN, GO, JAVA
ideIDE em usojetbrains, vscode
versionVersão da extensão/plugin (language-server), por exemplo 1.48.x1.28.0, 130.0
Para filtrar por data em consultas de PCW, use start_timestamp e end_timestamp no corpo principal da requisição.

Exemplos de requisições

Exemplo de dados do usuário

curl -X POST --header "Content-Type: application/json" \
--data '{
  "service_key": "your_service_key_here",
  "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

Exemplo de dados de 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

Exemplo de dados de comando

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

Exemplo de dados de 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

Resposta

queryResults
array
Array de resultados da consulta, um para cada requisição de consulta
responseItems
array
Array de itens de resultado
item
object
Objeto que contém os campos selecionados e seus valores

Exemplos de resposta

Resposta de dados do usuário

{
  "queryResults": [
    {
      "responseItems": [
        {
          "item": {
            "total_acceptances": "125",
            "total_lines": "863"
          }
        }
      ]
    }
  ]
}

Resposta de dados de chat

{
  "queryResults": [
    {
      "responseItems": [
        {
          "item": {
            "lines_used": "74",
            "ide_type": "jetbrains"
          }
        },
        {
          "item": {
            "lines_used": "41",
            "ide_type": "vscode"
          }
        }
      ]
    }
  ]
}

Resposta de dados de comando

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

Resposta de dados de PCW

{
  "queryResults": [
    {
      "responseItems": [
        {
          "item": {
            "ai_bytes": "6018",
            "autocomplete_bytes": "4593",
            "command_bytes": "1425",
            "pcw": "0.61",
            "total": "9900"
          }
        }
      ]
    }
  ]
}

Notas importantes

  • O PCW (Percent Code Written) apresenta alta variabilidade em um mesmo dia ou entre usuários — agregue ao longo de semanas para obter melhores insights
  • Todos os campos de seleção devem ter funções de agregação, ou nenhum deve ter (não é possível misturar)
  • Campos com o padrão “distinct_*” não podem ser usados em agregações
  • Os aliases dos campos devem ser exclusivos em todas as seleções e agregações
  • Se nenhuma função de agregação for especificada, o padrão será UNSPECIFIED