@vidiemme/copilot-proxy 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +86 -20
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -45,7 +45,7 @@ il pacchetto contiene i default aziendali Vidiemme, ma puo' usare un altro endpo
45
45
  | JetBrains / Android Studio, Eclipse, Xcode, Visual Studio | Non supportati: nessuna intercettazione TLS / `CONNECT` implementata. |
46
46
  | macOS | Avvio automatico tramite LaunchAgent `launchd` dell'utente. |
47
47
  | Linux | Avvio automatico tramite servizio utente `systemd`. |
48
- | Windows | Percorsi e impostazioni editor previsti; `--autostart` non implementato. Rilevamento dei path coperto dai test, da verificare su una postazione reale. |
48
+ | Windows | Percorsi, impostazioni editor e `COPILOT_API_URL` gestiti. `--autostart` non registra un servizio: stampa il comando da aggiungere a Esecuzione automatica. Rilevamento dei path coperto dai test, da verificare su una postazione reale. |
49
49
 
50
50
  > Le impostazioni di override di Copilot sono opzioni di **debug non supportate**:
51
51
  > possono cambiare con gli aggiornamenti dell'estensione. Verifica periodicamente
@@ -93,7 +93,8 @@ npx @vidiemme/copilot-proxy@latest start
93
93
 
94
94
  `start` resta in primo piano: lascia il terminale aperto e usa `Ctrl+C` per fermarlo.
95
95
  Con questa modalita' il proxy va avviato prima di usare gli editor configurati.
96
- Su Windows usa questa modalita' o configura autonomamente l'avvio del processo.
96
+ Su Windows usa questa modalita', oppure aggiungi a Esecuzione automatica il comando
97
+ che `setup --autostart` stampa.
97
98
 
98
99
  ### Un collector diverso da quello aziendale
99
100
 
@@ -130,6 +131,17 @@ Il token Copilot e la conversazione vanno all'upstream, **non al collector**.
130
131
  Il proxy non effettua login o rinnovo delle credenziali Copilot: se ne occupa
131
132
  il client o il proxy intermedio gia' utilizzato.
132
133
 
134
+ ### Ciclo di vita di una richiesta
135
+
136
+ ![Sequenza: il proxy attribuisce la richiesta, rileva il progetto dai path solo se serve, inoltra a Copilot, duplica lo stream verso il parser e accoda un evento che il forwarder consegna in batch.](https://raw.githubusercontent.com/vidiemme/copilot-usage/main/packages/client/docs/diagrams/lifecycle.png)
137
+
138
+ [Sorgente HTML del diagramma](https://github.com/vidiemme/copilot-usage/blob/main/packages/client/docs/diagrams/lifecycle.html)
139
+
140
+ La risposta arriva al client **mentre** passa: il parser legge una copia dello stream e non
141
+ lo rallenta. L'evento nasce solo a fine stream, e solo se la risposta conteneva contatori.
142
+ Il formato dell'evento e le risposte del collector sono specificati nel
143
+ [contratto](https://github.com/vidiemme/copilot-usage/tree/main/packages/shared#readme).
144
+
133
145
  ### Protocolli e contatori
134
146
 
135
147
  | Formato di risposta | Origine dei contatori |
@@ -155,7 +167,10 @@ puo' essere parziale.
155
167
 
156
168
  [Sorgente HTML del diagramma](https://github.com/vidiemme/copilot-usage/blob/main/packages/client/docs/diagrams/attribution.html)
157
169
 
158
- Il progetto viene risolto con questa precedenza:
170
+ ### Progetto
171
+
172
+ Il progetto viene risolto con questa precedenza. I segnali 1-4 sono espliciti e vincono
173
+ sempre; il rilevamento dai path parte solo se nessuno di loro e' presente.
159
174
 
160
175
  | Priorita' | Segnale | `projectSource` |
161
176
  | --- | --- | --- |
@@ -189,15 +204,42 @@ In loro assenza la chiave e' il developer: in quel caso progetti paralleli
189
204
  possono condividere il fallback. Il rilevamento ispeziona al massimo i primi
190
205
  4 MiB del corpo della richiesta.
191
206
 
192
- Il developer viene risolto da `/u/<developer>`, `X-Developer-Id`, credenziali
193
- mappate oppure da un hash SHA-256 con salt, troncato a 16 caratteri esadecimali,
194
- dell'identita' stabile estratta dal token upstream (o del token intero per altri
195
- formati). Senza un segnale utilizzabile risulta `unknown`.
196
- Il salt deve rimanere uguale sulle postazioni per mantenere coerenti gli pseudonimi;
197
- cambiarlo interrompe la continuita' degli ID.
207
+ ### Developer
208
+
209
+ ![Identita' del developer: prefisso /u/, header X-Developer-Id, mappa ATTRIBUTION_TOKENS, pseudonimo dal token Copilot, unknown.](https://raw.githubusercontent.com/vidiemme/copilot-usage/main/packages/client/docs/diagrams/identity.png)
210
+
211
+ [Sorgente HTML del diagramma](https://github.com/vidiemme/copilot-usage/blob/main/packages/client/docs/diagrams/identity.html)
212
+
213
+ | Priorita' | Segnale | `developerSource` |
214
+ | --- | --- | --- |
215
+ | 1 | Prefisso URL `/u/<developer>` | `path` |
216
+ | 2 | Header `X-Developer-Id` | `header` |
217
+ | 3 | Mappa statica `ATTRIBUTION_TOKENS` | `token` |
218
+ | 4 | Pseudonimo del token upstream | `pseudonym` |
219
+ | 5 | Nessun segnale: `unknown` | `fallback` |
220
+
221
+ Lo pseudonimo e' un hash SHA-256 con salt, troncato a 16 caratteri esadecimali, del
222
+ **campo stabile** del token Copilot: il primo presente fra `u`, `tid`, `oid` e `sid`. Il
223
+ token ruota ogni pochi minuti e l'hash dell'intero token creerebbe una persona nuova a ogni
224
+ rotazione. Un token che non e' nel formato `chiave=valore;...` viene usato per intero.
225
+
226
+ Il salt e' una costante del pacchetto e deve restare uguale su tutte le postazioni: e' cio'
227
+ che rende confrontabile la stessa persona fra macchine. Cambiarlo interrompe la continuita'
228
+ degli ID.
229
+
230
+ Nome ed email confermati al setup non entrano nell'evento: viaggiano negli header
231
+ `X-Developer-Name` e `X-Developer-Email` di ogni batch, e il collector non li usa se un
232
+ amministratore ha gia' assegnato un nome dalla dashboard.
198
233
 
199
234
  ## Configurare editor, CLI e harness
200
235
 
236
+ ![Instradamento: Copilot Chat con overrideCapiUrl, Copilot CLI con COPILOT_API_URL, CLI con base URL, harness tramite il proxy intermedio; i client JetBrains, Eclipse, Xcode e Visual Studio vanno diretti e non sono misurati.](https://raw.githubusercontent.com/vidiemme/copilot-usage/main/packages/client/docs/diagrams/routing.png)
237
+
238
+ [Sorgente HTML del diagramma](https://github.com/vidiemme/copilot-usage/blob/main/packages/client/docs/diagrams/routing.html)
239
+
240
+ Ogni famiglia di client ha un meccanismo diverso per cambiare l'URL di Copilot, e ignora
241
+ quello degli altri. `setup --vscode` copre le prime due righe; le altre si configurano a mano.
242
+
201
243
  ### VS Code e derivati
202
244
 
203
245
  `setup --vscode` imposta queste due chiavi nelle **impostazioni utente**:
@@ -259,18 +301,38 @@ un client Anthropic richiede un upstream che esponga Messages, o un traduttore.
259
301
 
260
302
  ### Harness con proxy intermedio
261
303
 
262
- Se usi Claude Code, Codex o altri harness tramite un traduttore/provider Copilot,
263
- la disposizione consigliata e':
304
+ Se usi Claude Code, Codex o altri harness tramite un traduttore/provider Copilot
305
+ (`copilot-api`, LiteLLM, ...), metti `copilot-proxy` **per ultimo**, subito prima di Copilot:
264
306
 
265
- ```text
266
- harness -> proxy intermedio -> copilot-proxy -> api.githubcopilot.com
267
- ```
307
+ ![Disposizione consigliata con un'unica istanza come ultimo anello, e ripiego con una seconda istanza prima del proxy intermedio.](https://raw.githubusercontent.com/vidiemme/copilot-usage/main/packages/client/docs/diagrams/harness.png)
308
+
309
+ [Sorgente HTML del diagramma](https://github.com/vidiemme/copilot-usage/blob/main/packages/client/docs/diagrams/harness.html)
268
310
 
269
- Nel proxy intermedio cambia l'URL del provider Copilot in `http://127.0.0.1:8787`.
270
- Lascia `UPSTREAM_BASE_URL` del proxy di misura al suo default Copilot.
271
- Il proxy intermedio continua a gestire login, rinnovo token e traduzione;
272
- deve conservare path di contesto o segnali espliciti per attribuire il progetto.
273
- Questa disposizione permette alla stessa istanza di misurare anche VS Code.
311
+ 1. Nel proxy intermedio cambia l'URL del provider Copilot in `http://127.0.0.1:8787`,
312
+ senza path aggiuntivi. Il nome dell'opzione dipende dallo strumento (`baseURL`,
313
+ `api_base`, ...).
314
+ 2. Lascia `UPSTREAM_BASE_URL` del proxy di misura al suo default Copilot. Se il proxy
315
+ intermedio usava un host del piano (per esempio `api.business.githubcopilot.com`),
316
+ metti quello in `UPSTREAM_BASE_URL`.
317
+ 3. Il proxy intermedio continua a gestire login, rinnovo token e traduzione;
318
+ `copilot-proxy` inoltra `Authorization` senza toccarlo.
319
+
320
+ In questa posizione il proxy vede richieste gia' in formato Copilot con il token vero: lo
321
+ pseudonimo coincide con quello del traffico VS Code della stessa persona e il modello
322
+ registrato e' quello fatturato. Il progetto si ricava dai path citati nei messaggi, finche'
323
+ il proxy intermedio ne conserva il contenuto; altrimenti dichiaralo con
324
+ `http://127.0.0.1:8787/p/<progetto>`. Nel reporting il traffico si distingue per
325
+ `clientName`, che e' lo user-agent del proxy intermedio.
326
+
327
+ **Ripiego**, se il proxy intermedio non permette di cambiare l'URL di Copilot: una seconda
328
+ istanza di `copilot-proxy` prima di lui, con `UPSTREAM_BASE_URL` puntato al proxy
329
+ intermedio, una porta (`--port`) e una cartella (`COPILOT_PROXY_HOME`) proprie, avviata con
330
+ `start` perche' l'avvio automatico gestisce una sola istanza. L'harness manda una chiave
331
+ fittizia, quindi il developer va dichiarato nell'URL (`http://127.0.0.1:8788/u/mario.rossi`);
332
+ se il proxy intermedio rimappa i modelli, controlla `/_usage/unknown-models` sul collector.
333
+
334
+ Se `copilot-proxy` non e' nella catena, quel consumo non viene misurato e si vede solo come
335
+ differenza fra la fattura GitHub e il costo misurato.
274
336
 
275
337
  `copilot-proxy` e' un **reverse proxy HTTP**, non un forward proxy generico:
276
338
  impostare soltanto `HTTP_PROXY` / `HTTPS_PROXY` non garantisce il funzionamento.
@@ -376,6 +438,10 @@ interna, non un sistema di attribuzione non ripudiabile o una fattura ufficiale.
376
438
 
377
439
  ### Collector non disponibile
378
440
 
441
+ ![Consegna: coda in memoria, invio in batch, spool su disco per errori di rete, 5xx, 401, 403, 408 e 429; scarto per gli altri 4xx e per coda piena.](https://raw.githubusercontent.com/vidiemme/copilot-usage/main/packages/client/docs/diagrams/delivery.png)
442
+
443
+ [Sorgente HTML del diagramma](https://github.com/vidiemme/copilot-usage/blob/main/packages/client/docs/diagrams/delivery.html)
444
+
379
445
  La disponibilita' del collector non blocca le richieste Copilot. Errori di rete,
380
446
  timeout, errori server e HTTP `401`, `403`, `408`, `429` fanno conservare gli eventi
381
447
  in uno spool JSONL locale, ritentato ai flush successivi e al riavvio.
@@ -489,7 +555,7 @@ il proxy lasciando gli editor configurati: Copilot non raggiungerebbe l'upstream
489
555
 
490
556
  - [Codice sorgente e documentazione del progetto](https://github.com/vidiemme/copilot-usage)
491
557
  - [Segnalazioni e richieste](https://github.com/vidiemme/copilot-usage/issues)
492
- - [Contratto degli eventi](https://github.com/vidiemme/copilot-usage/tree/main/packages/shared)
558
+ - [Contratto degli eventi: protocollo, campi e risposte](https://github.com/vidiemme/copilot-usage/tree/main/packages/shared#readme)
493
559
  - [Licenza MIT](https://github.com/vidiemme/copilot-usage/blob/main/packages/client/LICENSE)
494
560
 
495
561
  I diagrammi sono creati con `diagram-design`, con palette ispirata a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vidiemme/copilot-proxy",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "type": "module",
5
5
  "description": "Proxy locale: misura il consumo di token di GitHub Copilot e lo attribuisce al progetto",
6
6
  "license": "MIT",