La Analytics API personalizada ofrece capacidades de consulta flexibles para datos de Autocomplete, Chat y Command, con selections, filtros, aggregations y criterios de ordenación personalizables.
Tu clave de servicio con permisos “Teams Read-only”
Filtra los resultados a los usuarios de un grupo específico (opcional)
Matriz de objetos de solicitud de consulta que definen los datos que se deben recuperar
Estructura de la solicitud de consulta
Cada objeto de solicitud de consulta contiene:
Fuente de datos a consultar. Opciones:
QUERY_DATA_SOURCE_USER_DATA - Datos de Autocomplete
QUERY_DATA_SOURCE_CHAT_DATA - Datos de Chat
QUERY_DATA_SOURCE_COMMAND_DATA - Datos de Command
QUERY_DATA_SOURCE_PCW_DATA - Datos de Percent Code Written
Arreglo de selecciones de campos para recuperar (consulta la sección Selections)
Arreglo de filtros a aplicar (consulta la sección Filters)
Arreglo de aggregations para agrupar (consulta la sección Aggregations)
Las selections definen qué campos recuperar y cómo agregarlos.
Nombre del campo a seleccionar (consulta la sección Available Fields)
Alias del campo. Si no se especifica, el valor predeterminado es {aggregation_function}_{field_name} (en minúsculas)
Función de agregación a aplicar:
QUERY_AGGREGATION_UNSPECIFIED (valor predeterminado)
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"
}
Los filtros limitan los datos a los elementos que cumplen criterios específicos.
Nombre del campo por el que se va a filtrar
Valor contra el que se comparará
Operación de filtro:
QUERY_FILTER_EQUAL
QUERY_FILTER_NOT_EQUAL
QUERY_FILTER_GREATER_THAN
QUERY_FILTER_LESS_THAN
QUERY_FILTER_GE (mayor o igual que)
QUERY_FILTER_LE (menor o igual que)
{
"name": "language",
"filter": "QUERY_FILTER_EQUAL",
"value": "PYTHON"
}
Las aggregations agrupan datos según los criterios especificados.
Nombre del campo por el que agrupar
Alias para el campo de aggregation
{
"field": "ide",
"name": "tipo_ide"
}
Todos los datos de usuario se agregan por usuario y por hora.
| Nombre del campo | Descripción | Agregaciones válidas |
api_key | Hash de la clave de API del usuario | UNSPECIFIED, COUNT |
date | Fecha UTC de autocompletado | UNSPECIFIED, COUNT |
date UTC-x | Fecha con desfase de zona horaria (p. ej., “date UTC-8” para PST) | UNSPECIFIED, COUNT |
hour | Hora UTC de autocompletado | UNSPECIFIED, COUNT |
language | Lenguaje de programación | UNSPECIFIED, COUNT |
ide | IDE utilizado | UNSPECIFIED, COUNT |
version | Versión de Windsurf | UNSPECIFIED, COUNT |
num_acceptances | Número de aceptaciones de Autocomplete | SUM, MAX, MIN, AVG |
num_lines_accepted | Líneas de código aceptadas | SUM, MAX, MIN, AVG |
num_bytes_accepted | Bytes aceptados | SUM, MAX, MIN, AVG |
distinct_users | Usuarios únicos | UNSPECIFIED, COUNT |
distinct_developer_days | Tuplas únicas (usuario, día) | UNSPECIFIED, COUNT |
distinct_developer_hours | Tuplas únicas (usuario, hora) | UNSPECIFIED, COUNT |
Los datos de Chat están separados de los datos de Cascade y representan el uso de nuestros plugins heredados, no agentivos
Todos los datos de Chat corresponden a respuestas del modelo de IA de chat, no a preguntas del usuario.
| Field Name | Description | Valid Aggregations |
api_key | Hash de la clave de API del usuario | UNSPECIFIED, COUNT |
model_id | ID del modelo de Chat | UNSPECIFIED, COUNT |
date | Fecha en UTC de la respuesta de chat | UNSPECIFIED, COUNT |
date UTC-x | Fecha con desplazamiento de zona horaria | UNSPECIFIED, COUNT |
ide | IDE en uso | UNSPECIFIED, COUNT |
version | Versión de Windsurf | UNSPECIFIED, COUNT |
latest_intent_type | Tipo de intención de Chat (ver Tipos de intención más abajo) | UNSPECIFIED, COUNT |
num_chats_received | Número de mensajes de chat recibidos | SUM, MAX, MIN, AVG |
chat_accepted | Si el chat fue aceptado (pulgar arriba) | SUM, COUNT |
chat_inserted_at_cursor | Si se hizo clic en el botón “Insert” | SUM, COUNT |
chat_applied | Si se hizo clic en el botón “Apply Diff” | SUM, COUNT |
chat_loc_used | Líneas de código usadas desde el chat | SUM, MAX, MIN, AVG |
Tipos de intención de Chat
CHAT_INTENT_GENERIC - Chat normal
CHAT_INTENT_FUNCTION_EXPLAIN - Indicador Code Lens de explicación de función
CHAT_INTENT_FUNCTION_DOCSTRING - Indicador Code Lens de docstring de función
CHAT_INTENT_FUNCTION_REFACTOR - Indicador Code Lens de refactorización de función
CHAT_INTENT_CODE_BLOCK_EXPLAIN - Indicador Code Lens de explicación de bloque de código
CHAT_INTENT_CODE_BLOCK_REFACTOR - Indicador Code Lens de refactorización de bloque de código
CHAT_INTENT_PROBLEM_EXPLAIN - Indicador Code Lens de explicación de problema
CHAT_INTENT_FUNCTION_UNIT_TESTS - Indicador Code Lens de pruebas unitarias de función
Los datos de Command incluyen todos los comandos, incluidos los rechazados. Usa el campo accepted para filtrar únicamente los comandos aceptados.
| Nombre del campo | Descripción | Agregaciones válidas |
api_key | Hash de la clave de API del usuario | UNSPECIFIED, COUNT |
date | Fecha UTC del comando | UNSPECIFIED, COUNT |
timestamp | Marca de tiempo UTC del comando | UNSPECIFIED, COUNT |
language | Lenguaje de programación | UNSPECIFIED, COUNT |
ide | IDE en uso | UNSPECIFIED, COUNT |
version | Versión de Windsurf | UNSPECIFIED, COUNT |
command_source | Origen del disparador de Command (ver Command Sources más abajo) | UNSPECIFIED, COUNT |
provider_source | Modo de generación o edición | UNSPECIFIED, COUNT |
lines_added | Líneas de código agregadas | SUM, MAX, MIN, AVG |
lines_removed | Líneas de código eliminadas | SUM, MAX, MIN, AVG |
bytes_added | Bytes agregados | SUM, MAX, MIN, AVG |
bytes_removed | Bytes eliminados | SUM, MAX, MIN, AVG |
selection_lines | Líneas seleccionadas (cero en generaciones) | SUM, MAX, MIN, AVG |
selection_bytes | Bytes seleccionados (cero en generaciones) | SUM, MAX, MIN, AVG |
accepted | Si el comando fue aceptado | SUM, COUNT |
COMMAND_REQUEST_SOURCE_LINE_HINT_CODE_LENS
COMMAND_REQUEST_SOURCE_DEFAULT - Uso típico de 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 generación
PROVIDER_SOURCE_COMMAND_EDIT - Modo edición
Datos del porcentaje de código escrito con seguimiento separado de las contribuciones de Autocomplete y Command.
| Field Name | Description | Valid Aggregations |
percent_code_written | Calculado como codeium_bytes / (codeium_bytes + user_bytes) | UNSPECIFIED |
codeium_bytes | Total de bytes generados por Codeium | UNSPECIFIED |
user_bytes | Total de bytes escritos por el usuario | UNSPECIFIED |
total_bytes | codeium_bytes + user_bytes | UNSPECIFIED |
codeium_bytes_by_autocomplete | Bytes de Codeium provenientes de Autocomplete | UNSPECIFIED |
codeium_bytes_by_command | Bytes de Codeium provenientes de Command | UNSPECIFIED |
| Nombre del campo | Descripción | Ejemplos |
language | Lenguaje de programación | KOTLIN, GO, JAVA |
ide | IDE en uso | jetbrains, vscode |
version | Versión de Windsurf | 1.28.0, 130.0 |
Para filtrar por fecha en las consultas de PCW, utiliza start_timestamp y end_timestamp en el cuerpo principal de la solicitud.
Ejemplo de datos del usuario
curl -X POST --header "Content-Type: application/json" \
--data '{
"service_key": "tu_service_key_aquí",
"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": "tu_clave_de_servicio_aquí",
"query_requests": [
{
"data_source": "QUERY_DATA_SOURCE_CHAT_DATA",
"selections": [
{
"field": "chat_loc_used",
"name": "líneas_utilizadas",
"aggregation_function": "QUERY_AGGREGATION_SUM"
}
],
"filters": [
{
"name": "tipo_de_intención_más_reciente",
"filter": "QUERY_FILTER_EQUAL",
"value": "CHAT_INTENT_FUNCTION_DOCSTRING"
}
],
"aggregations": [
{
"field": "ide",
"name": "tipo_de_ide"
}
]
}
]
}' \
https://server.codeium.com/api/v1/Analytics
Ejemplo de datos de Command
curl -X POST --header "Content-Type: application/json" \
--data '{
"service_key": "tu_clave_de_servicio_aquí",
"query_requests": [
{
"data_source": "QUERY_DATA_SOURCE_COMMAND_DATA",
"selections": [
{
"field": "lines_added",
"name": "total_líneas_agregadas",
"aggregation_function": "QUERY_AGGREGATION_SUM"
},
{
"field": "lines_removed",
"name": "total_líneas_eliminadas",
"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": "lenguaje_de_programación"
}
]
}
]
}' \
https://server.codeium.com/api/v1/Analytics
curl -X POST --header "Content-Type: application/json" \
--data '{
"service_key": "tu_service_key_aquí",
"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
Matriz de resultados de consulta, uno por cada solicitud de consultaMatriz de elementos de resultadosObjeto que contiene los campos seleccionados y sus valores
Respuesta de datos del usuario
{
"queryResults": [
{
"responseItems": [
{
"item": {
"total_acceptances": "125",
"total_lines": "863"
}
}
]
}
]
}
Respuesta de datos de Chat
{
"queryResults": [
{
"responseItems": [
{
"item": {
"lines_used": "74",
"ide_type": "jetbrains"
}
},
{
"item": {
"lines_used": "41",
"ide_type": "vscode"
}
}
]
}
]
}
Respuesta de datos 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"
}
}
]
}
]
}
Respuesta de datos de PCW
{
"queryResults": [
{
"responseItems": [
{
"item": {
"ai_bytes": "6018",
"autocomplete_bytes": "4593",
"command_bytes": "1425",
"pcw": "0.61",
"total": "9900"
}
}
]
}
]
}
- PCW (Percent Code Written) puede variar mucho en un mismo día o entre usuarios; agrupa por semanas para obtener mejores conclusiones
- Todos los campos de selección deben tener funciones de agregación o ninguno debe tenerlas (no se pueden mezclar)
- Los campos con el patrón “distinct_*” no se pueden usar en aggregations
- Los alias de campos deben ser únicos en todas las selections y aggregations
- Si no se especifica una función de agregación, el valor predeterminado es UNSPECIFIED