> ## Documentation Index
> Fetch the complete documentation index at: https://docs.windsurf.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Interogare personalizată în Analytics

> Interogare flexibilă în Analytics, cu selections personalizate, filtre și agregations pentru datele Autocomplete, Chat, Command și PCW.

<div id="overview">
  ## Prezentare generală
</div>

Analytics API personalizat oferă capabilități flexibile de interogare pentru datele Autocomplete, Chat și Command, cu selections, filtre, agregations și ordonări personalizabile.

<div id="request">
  ## Cerere
</div>

<ParamField body="service_key" type="string" required>
  Cheia dvs. de serviciu cu permisiuni „Analytics Read”
</ParamField>

<ParamField body="group_name" type="string">
  Restrânge rezultatele la utilizatorii dintr-un anumit grup (opțional)
</ParamField>

<ParamField body="query_requests" type="array" required>
  Tablou de obiecte de cerere de interogare care definesc datele de preluat

  <Expandable title="Obiect Query Request">
    <ParamField body="data_source" type="string" required>
      Sursa de date pentru interogare. Opțiuni:

      * `QUERY_DATA_SOURCE_USER_DATA` - date de Autocomplete
      * `QUERY_DATA_SOURCE_CHAT_DATA` - date de Chat
      * `QUERY_DATA_SOURCE_COMMAND_DATA` - date de Command
      * `QUERY_DATA_SOURCE_PCW_DATA` - date Percent Code Written
    </ParamField>

    <ParamField body="selections" type="array" required>
      Array de selecții de câmpuri de preluat

      <Expandable title="Obiect Selection">
        <ParamField body="field" type="string" required>
          Numele câmpului de selectat (vezi secțiunea Available Fields)
        </ParamField>

        <ParamField body="name" type="string">
          Alias pentru câmp. Dacă nu este specificat, valoarea implicită este `{aggregation_function}_{field_name}` (cu litere mici)
        </ParamField>

        <ParamField body="aggregation_function" type="string">
          Funcția de agregare de aplicat:

          * `QUERY_AGGREGATION_UNSPECIFIED` (implicit)
          * `QUERY_AGGREGATION_COUNT`
          * `QUERY_AGGREGATION_SUM`
          * `QUERY_AGGREGATION_AVG`
          * `QUERY_AGGREGATION_MAX`
          * `QUERY_AGGREGATION_MIN`
        </ParamField>
      </Expandable>
    </ParamField>

    <ParamField body="filters" type="array">
      Tablou de filtre care se aplică

      <Expandable title="Obiect Filter">
        <ParamField body="name" type="string" required>
          Numele câmpului după care se filtrează
        </ParamField>

        <ParamField body="filter" type="string" required>
          Operația de filtrare:

          * `QUERY_FILTER_EQUAL`
          * `QUERY_FILTER_NOT_EQUAL`
          * `QUERY_FILTER_GREATER_THAN`
          * `QUERY_FILTER_LESS_THAN`
          * `QUERY_FILTER_GE` (mai mare sau egal)
          * `QUERY_FILTER_LE` (mai mic sau egal)
        </ParamField>

        <ParamField body="value" type="string" required>
          Valoarea cu care se compară
        </ParamField>
      </Expandable>
    </ParamField>

    <ParamField body="aggregations" type="array">
      Tablou de agregări pentru grupare

      <Expandable title="Obiect Aggregation">
        <ParamField body="field" type="string" required>
          Numele câmpului după care se grupează
        </ParamField>

        <ParamField body="name" type="string" required>
          Alias pentru câmpul de agregare
        </ParamField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<div id="query-request-structure">
  ## Structura cererii de interogare
</div>

Fiecare obiect de cerere de interogare conține:

* **data\_source** (obligatoriu): Sursa de date pentru interogare
* **selections** (obligatoriu): Array de selecții de câmp de returnat
* **filters** (opțional): Array de filtre de aplicat
* **aggregations** (opțional): Array de agregări pentru grupare

<div id="selections">
  ## Selections
</div>

Selections definesc ce câmpuri să fie preluate și cum să fie agregate.

* **field** (obligatoriu): Numele câmpului care va fi selectat
* **name** (opțional): Alias pentru câmp
* **aggregation\_function** (opțional): Funcția de agregare care va fi aplicată

<div id="selection-example">
  ### Exemplu de selecție
</div>

```json theme={null}
{
  "field": "num_acceptances",
  "name": "total_acceptances",
  "aggregation_function": "QUERY_AGGREGATION_SUM"
}
```

<div id="filters">
  ## Filtre
</div>

Filtrele restrâng datele la elementele care îndeplinesc anumite criterii.

* **name** (obligatoriu): Numele câmpului după care se filtrează
* **filter** (obligatoriu): Operațiunea de filtrare
* **value** (obligatoriu): Valoarea cu care se compară

<div id="filter-example">
  ### Exemplu de filtrare
</div>

```json theme={null}
{
  "name": "language",
  "filter": "QUERY_FILTER_EQUAL",
  "value": "PYTHON"
}
```

<div id="aggregations">
  ## Aggregations
</div>

Aggregations grupează datele după criteriile specificate.

* **field** (obligatoriu): Numele câmpului după care se face gruparea
* **name** (obligatoriu): Alias pentru câmpul de agregare

<div id="aggregation-example">
  ### Exemplu de agregare
</div>

```json theme={null}
{
  "field": "ide",
  "name": "tip_ide"
}
```

<div id="available-fields">
  ## Câmpuri disponibile
</div>

<div id="user-data">
  ### Date despre utilizator
</div>

Toate datele despre utilizator sunt agregate per utilizator, pe oră.

| Nume câmp                  | Descriere                                                     | Agregări valide     |
| -------------------------- | ------------------------------------------------------------- | ------------------- |
| `api_key`                  | Hash-ul cheii API a utilizatorului                            | NESPECIFICAT, COUNT |
| `date`                     | Data UTC a completării automate                               | NESPECIFICAT, COUNT |
| `date UTC-x`               | Dată cu decalaj de fus orar (de ex., „date UTC-8” pentru PST) | NESPECIFICAT, COUNT |
| `hour`                     | Ora UTC a completării automate                                | NESPECIFICAT, COUNT |
| `language`                 | Limbaj de programare                                          | NESPECIFICAT, COUNT |
| `ide`                      | IDE utilizat                                                  | NESPECIFICAT, COUNT |
| `version`                  | Versiunea Windsurf                                            | NESPECIFICAT, COUNT |
| `num_acceptances`          | Număr de acceptări Autocomplete                               | SUM, MAX, MIN, AVG  |
| `num_lines_accepted`       | Linii de cod acceptate                                        | SUM, MAX, MIN, AVG  |
| `num_bytes_accepted`       | Octeți acceptați                                              | SUM, MAX, MIN, AVG  |
| `distinct_users`           | Utilizatori unici                                             | NESPECIFICAT, COUNT |
| `distinct_developer_days`  | Perechi distincte (utilizator, zi)                            | NESPECIFICAT, COUNT |
| `distinct_developer_hours` | Perechi distincte (utilizator, oră)                           | NESPECIFICAT, COUNT |

<div id="chat-data">
  ### Date Chat
</div>

<Info>Datele Chat sunt separate de datele Cascade și reflectă utilizarea pluginurilor noastre vechi, non‑agentice</Info>

Toate datele Chat reprezintă răspunsuri ale modelului AI din chat, nu întrebările utilizatorilor.

| Field Name                | Description                                                  | Valid Aggregations |
| ------------------------- | ------------------------------------------------------------ | ------------------ |
| `api_key`                 | Hash al cheii API a utilizatorului                           | UNSPECIFIED, COUNT |
| `model_id`                | ID-ul modelului Chat                                         | UNSPECIFIED, COUNT |
| `date`                    | Data UTC a răspunsului din chat                              | UNSPECIFIED, COUNT |
| `date UTC-x`              | Dată cu decalaj de fus orar                                  | UNSPECIFIED, COUNT |
| `ide`                     | IDE utilizat                                                 | UNSPECIFIED, COUNT |
| `version`                 | Versiunea Windsurf                                           | UNSPECIFIED, COUNT |
| `latest_intent_type`      | Tipul intenției din Chat (vedeți Tipuri de intenții mai jos) | UNSPECIFIED, COUNT |
| `num_chats_received`      | Numărul de mesaje de chat primite                            | SUM, MAX, MIN, AVG |
| `chat_accepted`           | Dacă chatul a fost acceptat (thumbs up)                      | SUM, COUNT         |
| `chat_inserted_at_cursor` | Dacă a fost apăsat butonul „Insert”                          | SUM, COUNT         |
| `chat_applied`            | Dacă a fost apăsat butonul „Apply Diff”                      | SUM, COUNT         |
| `chat_loc_used`           | Linii de cod utilizate din chat                              | SUM, MAX, MIN, AVG |

<div id="chat-intent-types">
  #### Tipuri de intent Chat
</div>

* `CHAT_INTENT_GENERIC` - Chat obișnuit
* `CHAT_INTENT_FUNCTION_EXPLAIN` - Code Lens pentru explicarea funcției
* `CHAT_INTENT_FUNCTION_DOCSTRING` - Code Lens pentru docstringul funcției
* `CHAT_INTENT_FUNCTION_REFACTOR` - Code Lens pentru refactorizarea funcției
* `CHAT_INTENT_CODE_BLOCK_EXPLAIN` - Code Lens pentru explicarea blocului de cod
* `CHAT_INTENT_CODE_BLOCK_REFACTOR` - Code Lens pentru refactorizarea blocului de cod
* `CHAT_INTENT_PROBLEM_EXPLAIN` - Code Lens pentru explicarea problemei
* `CHAT_INTENT_FUNCTION_UNIT_TESTS` - Code Lens pentru testele unitare ale funcției

<div id="command-data">
  ### Date despre Command
</div>

Datele despre Command includ toate comenzile, inclusiv pe cele respinse. Folosiți câmpul `accepted` pentru a filtra doar comenzile acceptate.

| Numele câmpului   | Descriere                                                  | Agregări valide    |
| ----------------- | ---------------------------------------------------------- | ------------------ |
| `api_key`         | Hash-ul cheii API a utilizatorului                         | UNSPECIFIED, COUNT |
| `date`            | Data UTC a comenzii                                        | UNSPECIFIED, COUNT |
| `timestamp`       | Marcajul temporal (UTC) al comenzii                        | UNSPECIFIED, COUNT |
| `language`        | Limbaj de programare                                       | UNSPECIFIED, COUNT |
| `ide`             | IDE utilizat                                               | UNSPECIFIED, COUNT |
| `version`         | Versiunea Windsurf                                         | UNSPECIFIED, COUNT |
| `command_source`  | Sursa declanșării Command (vedeți Command Sources mai jos) | UNSPECIFIED, COUNT |
| `provider_source` | Mod de generare sau editare                                | UNSPECIFIED, COUNT |
| `lines_added`     | Linii de cod adăugate                                      | SUM, MAX, MIN, AVG |
| `lines_removed`   | Linii de cod eliminate                                     | SUM, MAX, MIN, AVG |
| `bytes_added`     | Octeți adăugați                                            | SUM, MAX, MIN, AVG |
| `bytes_removed`   | Octeți eliminați                                           | SUM, MAX, MIN, AVG |
| `selection_lines` | Linii selectate (zero pentru generări)                     | SUM, MAX, MIN, AVG |
| `selection_bytes` | Octeți selectați (zero pentru generări)                    | SUM, MAX, MIN, AVG |
| `accepted`        | Dacă a fost acceptată comanda                              | SUM, COUNT         |

<div id="command-sources">
  #### Surse Command
</div>

* `COMMAND_REQUEST_SOURCE_LINE_HINT_CODE_LENS`
* `COMMAND_REQUEST_SOURCE_DEFAULT` - Utilizare tipică a 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`

<div id="provider-sources">
  #### Surse ale furnizorului
</div>

* `PROVIDER_SOURCE_COMMAND_GENERATE` - Modul de generare
* `PROVIDER_SOURCE_COMMAND_EDIT` - Modul de editare

<div id="pcw-data">
  ### Date PCW
</div>

Date despre Percent Code Written, cu urmărire separată pentru contribuțiile din Autocomplete și Command.

| Numele câmpului                 | Descriere                                                   | Agregări valide |
| ------------------------------- | ----------------------------------------------------------- | --------------- |
| `percent_code_written`          | Calculat ca codeium\_bytes / (codeium\_bytes + user\_bytes) | UNSPECIFIED     |
| `codeium_bytes`                 | Totalul de bytes generați de Codeium                        | UNSPECIFIED     |
| `user_bytes`                    | Totalul de bytes scriși de utilizator                       | UNSPECIFIED     |
| `total_bytes`                   | codeium\_bytes + user\_bytes                                | UNSPECIFIED     |
| `codeium_bytes_by_autocomplete` | Bytes Codeium din Autocomplete                              | UNSPECIFIED     |
| `codeium_bytes_by_command`      | Bytes Codeium din Command                                   | UNSPECIFIED     |

<div id="pcw-filters">
  #### Filtre PCW
</div>

| Numele câmpului | Descriere            | Exemple           |
| --------------- | -------------------- | ----------------- |
| `language`      | Limbaj de programare | KOTLIN, GO, JAVA  |
| `ide`           | IDE utilizat         | jetbrains, vscode |
| `version`       | Versiunea Windsurf   | 1.28.0, 130.0     |

Pentru filtrarea după timp în interogările PCW, folosiți `start_timestamp` și `end_timestamp` în corpul principal al solicitării.

<div id="example-requests">
  ## Exemple de solicitări
</div>

<div id="user-data-example">
  ### Exemplu de date de utilizator
</div>

```bash theme={null}
curl -X POST --header "Content-Type: application/json" \
--data '{
  "service_key": "cheia_serviciului_dvs_aici",
  "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
```

<div id="chat-data-example">
  ### Exemplu de date Chat
</div>

```bash theme={null}
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
```

<div id="command-data-example">
  ### Exemplu de date pentru Command
</div>

```bash theme={null}
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
```

<div id="pcw-data-example">
  ### Exemplu de date PCW
</div>

```bash theme={null}
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
```

<div id="response">
  ## Răspuns
</div>

<ResponseField name="queryResults" type="array">
  Tablou de rezultate de interogare, câte unul pentru fiecare cerere de interogare

  <ResponseField name="responseItems" type="array">
    Tablou de elemente de rezultat

    <ResponseField name="item" type="object">
      Obiect care conține câmpurile selectate și valorile acestora
    </ResponseField>
  </ResponseField>
</ResponseField>

<div id="example-responses">
  ### Exemple de răspuns
</div>

<div id="user-data-response">
  #### Răspuns privind datele utilizatorului
</div>

```json theme={null}
{
  "queryResults": [
    {
      "responseItems": [
        {
          "item": {
            "total_acceptances": "125",
            "total_lines": "863"
          }
        }
      ]
    }
  ]
}
```

<div id="chat-data-response">
  #### Răspuns de date pentru Chat
</div>

```json theme={null}
{
  "queryResults": [
    {
      "responseItems": [
        {
          "item": {
            "lines_used": "74",
            "ide_type": "jetbrains"
          }
        },
        {
          "item": {
            "lines_used": "41",
            "ide_type": "vscode"
          }
        }
      ]
    }
  ]
}
```

<div id="command-data-response">
  #### Răspuns de date pentru Command
</div>

```json theme={null}
{
  "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"
          }
        }
      ]
    }
  ]
}
```

<div id="pcw-data-response">
  #### Răspuns de date pentru PCW
</div>

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

<div id="important-notes">
  ## Note importante
</div>

* PCW (Percent Code Written) are o variabilitate mare în cadrul aceleiași zile sau pentru același utilizator – agregați pe perioade săptămânale pentru informații mai relevante
* Toate câmpurile selection trebuie să aibă fie funcții de agregare, fie niciunul (nu se pot combina)
* Câmpurile cu modelul „distinct\_\*” nu pot fi utilizate în aggregations
* Aliasurile câmpurilor trebuie să fie unice în toate selections și aggregations
* Dacă nu este specificată nicio funcție de agregare, valoarea implicită este UNSPECIFIED
