A Analytics API personalizada oferece recursos flexíveis de consulta para dados de Autocomplete, Chat e Command, com selections, filtros, aggregations e ordenações personalizáveis.
Sua Service Key com permissões “Teams Read-only”
Filtre os resultados para usuários de um grupo específico (opcional)
Array de objetos de solicitação de consulta que definem os dados a serem recuperados
Estrutura da solicitação de consulta
Cada objeto de solicitação de consulta contém:
Fonte de dados a consultar. Opções:
QUERY_DATA_SOURCE_USER_DATA - dados de Autocomplete
QUERY_DATA_SOURCE_CHAT_DATA - dados de Chat
QUERY_DATA_SOURCE_COMMAND_DATA - dados de Command
QUERY_DATA_SOURCE_PCW_DATA - dados de Percent Code Written
Array de seleções de campos a recuperar (veja a seção Selections)
Array de filtros a aplicar (veja a seção Filters)
Array de aggregations para agrupar (veja a seção Aggregations)
Selections definem quais campos serão obtidos e como serão agregados.
Nome do campo a selecionar (consulte a seção Available Fields)
Alias do campo. Se não for especificado, o padrão será {aggregation_function}_{field_name} (em minúsculas)
Função de agregação a ser aplicada:
QUERY_AGGREGATION_UNSPECIFIED (padrão)
QUERY_AGGREGATION_COUNT
QUERY_AGGREGATION_SUM
QUERY_AGGREGATION_AVG
QUERY_AGGREGATION_MAX
QUERY_AGGREGATION_MIN
{
"field": "num_acceptances",
"name": "total_acceptances",
"aggregation_function": "QUERY_AGGREGATION_SUM"
}
Filtros reduzem os dados a elementos que atendem a critérios específicos.
Nome do campo a ser filtrado
Operação de filtro:
QUERY_FILTER_EQUAL
QUERY_FILTER_NOT_EQUAL
QUERY_FILTER_GREATER_THAN
QUERY_FILTER_LESS_THAN
QUERY_FILTER_GE (maior ou igual)
QUERY_FILTER_LE (menor ou igual)
{
"name": "language",
"filter": "QUERY_FILTER_EQUAL",
"value": "PYTHON"
}
Aggregations agrupam dados por critérios especificados.
Nome do campo pelo qual agrupar
Alias para o campo de aggregation
{
"field": "ide",
"name": "tipo_ide"
}
Todos os dados do usuário são agregados por usuário, por hora.
| Nome do campo | Descrição | Agregações válidas |
api_key | Hash da chave de API do usuário | UNSPECIFIED, COUNT |
date | Data em UTC do Autocomplete | UNSPECIFIED, COUNT |
date UTC-x | Data com deslocamento de fuso horário (por exemplo, “date UTC-8” para PST) | UNSPECIFIED, COUNT |
hour | Hora em UTC do Autocomplete | UNSPECIFIED, COUNT |
language | Linguagem de programação | UNSPECIFIED, COUNT |
ide | IDE em uso | UNSPECIFIED, COUNT |
version | Versão do Windsurf | UNSPECIFIED, COUNT |
num_acceptances | Número de aceitações do Autocomplete | SUM, MAX, MIN, AVG |
num_lines_accepted | Linhas de código aceitas | SUM, MAX, MIN, AVG |
num_bytes_accepted | Bytes aceitos | SUM, MAX, MIN, AVG |
distinct_users | Usuários distintos | UNSPECIFIED, COUNT |
distinct_developer_days | Tuplas distintas (usuário, dia) | UNSPECIFIED, COUNT |
distinct_developer_hours | Tuplas distintas (usuário, hora) | UNSPECIFIED, COUNT |
Os dados do Chat são separados dos dados do Cascade e representam o uso dos nossos plugins legados, não agentivos
Todos os Dados do Chat representam respostas do modelo de chat, não perguntas dos usuários.
| Field Name | Description | Valid Aggregations |
api_key | Hash da chave de API do usuário | UNSPECIFIED, COUNT |
model_id | ID do modelo de Chat | UNSPECIFIED, COUNT |
date | Data em UTC da resposta do chat | UNSPECIFIED, COUNT |
date UTC-x | Data com deslocamento de fuso horário | UNSPECIFIED, COUNT |
ide | IDE em uso | UNSPECIFIED, COUNT |
version | Versão do Windsurf | UNSPECIFIED, COUNT |
latest_intent_type | Tipo de intenção do Chat (veja Tipos de intenção abaixo) | UNSPECIFIED, COUNT |
num_chats_received | Número de mensagens de chat recebidas | SUM, MAX, MIN, AVG |
chat_accepted | Se o chat foi aceito (polegar para cima) | SUM, COUNT |
chat_inserted_at_cursor | Se o botão “Insert” foi clicado | SUM, COUNT |
chat_applied | Se o botão “Apply Diff” foi clicado | SUM, COUNT |
chat_loc_used | Linhas de código usadas pelo chat | SUM, MAX, MIN, AVG |
Tipos de intenção do Chat
CHAT_INTENT_GENERIC - Chat comum
CHAT_INTENT_FUNCTION_EXPLAIN - Code lens de explicação de função
CHAT_INTENT_FUNCTION_DOCSTRING - Code lens de docstring de função
CHAT_INTENT_FUNCTION_REFACTOR - Code lens de refatoração de função
CHAT_INTENT_CODE_BLOCK_EXPLAIN - Code lens de explicação de bloco de código
CHAT_INTENT_CODE_BLOCK_REFACTOR - Code lens de refatoração de bloco de código
CHAT_INTENT_PROBLEM_EXPLAIN - Code lens de explicação de problema
CHAT_INTENT_FUNCTION_UNIT_TESTS - Code lens de testes unitários de função
Os dados de Command incluem todos os comandos, inclusive os recusados. Use o campo accepted para filtrar apenas os comandos aceitos.
| Field Name | Description | Valid Aggregations |
api_key | Hash da chave de API do usuário | UNSPECIFIED, COUNT |
date | Data UTC do comando | UNSPECIFIED, COUNT |
timestamp | Carimbo de data/hora (UTC) do comando | UNSPECIFIED, COUNT |
language | Linguagem de programação | UNSPECIFIED, COUNT |
ide | IDE em uso | UNSPECIFIED, COUNT |
version | Versão do Windsurf | UNSPECIFIED, COUNT |
command_source | Origem do acionamento do Command (veja Command Sources abaixo) | UNSPECIFIED, COUNT |
provider_source | Modo de geração ou edição | UNSPECIFIED, COUNT |
lines_added | Linhas de código adicionadas | SUM, MAX, MIN, AVG |
lines_removed | Linhas de código removidas | SUM, MAX, MIN, AVG |
bytes_added | Bytes adicionados | SUM, MAX, MIN, AVG |
bytes_removed | Bytes removidos | SUM, MAX, MIN, AVG |
selection_lines | Linhas selecionadas (zero para gerações) | SUM, MAX, MIN, AVG |
selection_bytes | Bytes selecionados (zero para gerações) | SUM, MAX, MIN, AVG |
accepted | Indica se o comando foi aceito | SUM, COUNT |
COMMAND_REQUEST_SOURCE_LINE_HINT_CODE_LENS
COMMAND_REQUEST_SOURCE_DEFAULT - Uso típico do Command
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
PROVIDER_SOURCE_COMMAND_GENERATE - Modo de geração
PROVIDER_SOURCE_COMMAND_EDIT - Modo de edição
Dados de Percent Code Written com rastreamento separado para contribuições de Autocomplete e Command.
| Field Name | Description | Valid Aggregations |
percent_code_written | Calculado como codeium_bytes / (codeium_bytes + user_bytes) | UNSPECIFIED |
codeium_bytes | Total de bytes gerados pelo Codeium | UNSPECIFIED |
user_bytes | Total de bytes escritos pelo usuário | UNSPECIFIED |
total_bytes | codeium_bytes + user_bytes | UNSPECIFIED |
codeium_bytes_by_autocomplete | Bytes do Codeium provenientes de Autocomplete | UNSPECIFIED |
codeium_bytes_by_command | Bytes do Codeium provenientes de Command | UNSPECIFIED |
| Nome do campo | Descrição | Exemplos |
language | Linguagem de programação | KOTLIN, GO, JAVA |
ide | IDE em uso | jetbrains, vscode |
version | Versão do Windsurf | 1.28.0, 130.0 |
Para filtrar por data em consultas do PCW, use start_timestamp e end_timestamp no corpo principal da requisição.
Exemplo de dados do usuário
curl -X POST --header "Content-Type: application/json" \
--data '{
"service_key": "sua_chave_de_servico_aqui",
"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": "hour",
"filter": "QUERY_FILTER_GE",
"value": "2024-01-01"
},
{
"name": "hour",
"filter": "QUERY_FILTER_LE",
"value": "2024-02-01"
}
]
}
]
}' \
https://server.codeium.com/api/v1/Analytics
curl -X POST --header "Content-Type: application/json" \
--data '{
"service_key": "sua_chave_de_servico_aqui",
"query_requests": [
{
"data_source": "QUERY_DATA_SOURCE_CHAT_DATA",
"selections": [
{
"field": "chat_loc_used",
"name": "linhas_utilizadas",
"aggregation_function": "QUERY_AGGREGATION_SUM"
}
],
"filters": [
{
"name": "latest_intent_type",
"filter": "QUERY_FILTER_EQUAL",
"value": "CHAT_INTENT_FUNCTION_DOCSTRING"
}
],
"aggregations": [
{
"field": "ide",
"name": "tipo_ide"
}
]
}
]
}' \
https://server.codeium.com/api/v1/Analytics
Exemplo de dados do Command
curl -X POST --header "Content-Type: application/json" \
--data '{
"service_key": "sua_chave_de_servico_aqui",
"query_requests": [
{
"data_source": "QUERY_DATA_SOURCE_COMMAND_DATA",
"selections": [
{
"field": "lines_added",
"name": "total_linhas_adicionadas",
"aggregation_function": "QUERY_AGGREGATION_SUM"
},
{
"field": "lines_removed",
"name": "total_linhas_removidas",
"aggregation_function": "QUERY_AGGREGATION_SUM"
}
],
"filters": [
{
"name": "provider_source",
"filter": "QUERY_FILTER_EQUAL",
"value": "PROVIDER_SOURCE_COMMAND_EDIT"
},
{
"name": "aceito",
"filter": "QUERY_FILTER_EQUAL",
"value": "true"
}
],
"aggregations": [
{
"field": "language",
"name": "linguagem_programacao"
}
]
}
]
}' \
https://server.codeium.com/api/v1/Analytics
curl -X POST --header "Content-Type: application/json" \
--data '{
"service_key": "sua_chave_de_servico_aqui",
"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
Array de resultados de consulta, um para cada solicitação de consultaArray de itens de resultadoObjeto contendo os campos selecionados e seus valores
Resposta de dados do usuário
{
"queryResults": [
{
"responseItems": [
{
"item": {
"total_acceptances": "125",
"total_lines": "863"
}
}
]
}
]
}
Resposta de Dados do Chat
{
"queryResults": [
{
"responseItems": [
{
"item": {
"lines_used": "74",
"ide_type": "jetbrains"
}
},
{
"item": {
"lines_used": "41",
"ide_type": "vscode"
}
}
]
}
]
}
Resposta de dados do 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"
}
}
]
}
]
}
{
"queryResults": [
{
"responseItems": [
{
"item": {
"ai_bytes": "6018",
"autocomplete_bytes": "4593",
"command_bytes": "1425",
"pcw": "0.61",
"total": "9900"
}
}
]
}
]
}
- O PCW (Percent Code Written) apresenta alta variabilidade ao longo de um mesmo dia ou entre usuários — agregue por semanas para obter insights melhores
- Todos os campos de seleção devem ou ter funções de agregação, ou nenhum deve tê-las (não é possível misturar)
- Campos com o padrão “distinct_*” não podem ser usados em aggregations
- Os aliases de campos devem ser exclusivos em todas as selections e aggregations
- Se nenhuma função de agregação for especificada, o padrão será UNSPECIFIED