qwenproxy-cli 1.0.31 → 1.1.0

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.
package/README.es.md ADDED
@@ -0,0 +1,269 @@
1
+ <p align="center">
2
+ <img src="docs/banner.webp" alt="QwenProxy" width="100%">
3
+ </p>
4
+
5
+ <p align="center">
6
+ <a href="README.md">English</a> ·
7
+ <a href="README.pt-BR.md">Português</a> ·
8
+ <b>Español</b>
9
+ </p>
10
+
11
+ Gateway y API de alto rendimiento compatible con **OpenAI** y **Anthropic** que conecta clientes y agentes de programación (Claude Code CLI, OpenAI Codex, OpenCode, Cursor, OMP, Zed, Grok) con **Qwen (`chat.qwen.ai`)** con rotación multi-cuenta, failover inteligente, llamada de herramientas (tool calling) robusta, ejecución delta nativa, generación de imágenes y vídeos, **Responses API completa de OpenAI con memoria persistente** y sesiones duraderas. Desarrollado con Chromium headless stealth, reintentos ante errores transitorios, variantes públicas base/`-fast`/`-thinking`, caché comprimida, registro dinámico de capacidades por modelo y observabilidad completa.
12
+
13
+ [![CI](https://github.com/johngbl/QwenProxy/actions/workflows/ci.yml/badge.svg)](https://github.com/johngbl/QwenProxy/actions/workflows/ci.yml)
14
+ [![npm version](https://img.shields.io/npm/v/qwenproxy-cli.svg)](https://www.npmjs.com/package/qwenproxy-cli)
15
+ [![TypeScript](https://img.shields.io/badge/TypeScript-7.0-blue)](https://www.typescriptlang.org/)
16
+ [![Hono](https://img.shields.io/badge/Hono-4.13-green)](https://hono.dev/)
17
+ [![Patchright](https://img.shields.io/badge/Patchright-Stealth-blueviolet)](https://github.com/kaliiiiiiiiii/patchright)
18
+ [![License: ISC](https://img.shields.io/badge/License-ISC-yellow.svg)](LICENSE)
19
+ [![GitHub Sponsors](https://img.shields.io/badge/sponsor-GitHub%20Sponsors-ea4aaa?logo=githubsponsors&logoColor=white)](https://github.com/sponsors/johngbl)
20
+ [![Ko-fi](https://img.shields.io/badge/Donate-Ko--fi-ff5e5b?logo=kofi&logoColor=white)](https://ko-fi.com/johngbl)
21
+
22
+ ## ❤️ Apoya el Proyecto
23
+
24
+ Si **QwenProxy** te resulta útil a ti o a tu equipo y deseas apoyar el desarrollo continuo, nuevas integraciones, pruebas en vivo y actualizaciones rápidas, considera un patrocinio voluntario:
25
+
26
+ <a href="https://github.com/sponsors/johngbl" target="_blank"><img src="https://img.shields.io/badge/Patrocinar%20en%20GitHub-ea4aaa?style=for-the-badge&logo=githubsponsors&logoColor=white" alt="GitHub Sponsors"></a> <a href="https://ko-fi.com/johngbl" target="_blank"><img src="https://img.shields.io/badge/Donar%20v%C3%ADa%20Ko--fi-ff5e5b?style=for-the-badge&logo=kofi&logoColor=white" alt="Ko-fi"></a>
27
+
28
+ ¡Toda contribución ayuda a cubrir costes de infraestructura, ancho de banda y cuentas de prueba!
29
+
30
+ ---
31
+
32
+ ## 🚀 Características Principales
33
+
34
+ - **Compatibilidad Nativa con OpenAI y Anthropic** — `/v1/chat/completions`, `/v1/models`, `/v1/messages` (**Anthropic Messages API nativa** para **Claude Code CLI** y SDK oficial), `/v1/messages/count_tokens`, **OpenAI Responses API** (`/v1/responses`) y `/v1/completions` (adaptador heredado).
35
+ - **Matriz Completa de 4 Modos de Conversación** — `thread` (predeterminado persistente), `thread-temp` (delta ~1KB efímero, recomendado para agentes), `stateless-temp` (estándar oficial OpenAI, efímero) y `stateless` (estándar oficial OpenAI, guardado en la cuenta web).
36
+ - **Control Dinámico de Modos en Tiempo Real** — Cambia el modo global de la API al instante mediante la TUI (tecla `M` en estado o `F4` en Chat) o a través del endpoint `/v1/chat/mode`, sin reiniciar el proxy.
37
+ - **Dashboard TUI Completo en Terminal (`qpx`)** — Interfaz visual con soporte completo para ratón (hover, clic, arrastrar y scroll), selectores verticales de modelos y modos, y título de ventana nativo `QwenProxy`.
38
+ - **Importación de Cuentas por Lotes (`B`)** — Pega decenas de cuentas a la vez (`email:contraseña`, formato `.env`, tabulación o barra vertical). Cifrado en reposo en una única transacción SQLite (<10ms) con deduplicación y conteo en tiempo real.
39
+ - **Desplazamiento Dinámico de Viewport** — Navegación fluida en listas de más de 50 cuentas sin desbordar el terminal ni desalinear columnas.
40
+ - **Sincronizador Automático de Clientes (`qpx sync`)** — Configuración en 1 clic para Claude Code, OpenAI Codex, OpenCode, Cline, OMP, Zed, Kilo Code y Hermes con copia de seguridad y restauración.
41
+ - **Instancia Única de Chromium Ultra-Ligera** — 1 solo proceso de navegador con aceleración WebGL y contextos aislados (`BrowserContext`) con persistencia ligera de sesiones (~200MB de RAM para todas las cuentas, ahorro >65%).
42
+ - **Inicio Bajo Demanda y Pool Multi-Cuenta** — Arranca instantáneamente con la **primera cuenta lista**; las cuentas de reserva permanecen en *Standby* e inicializan solo cuando se necesitan (failover o rotación).
43
+ - **Sincronización de Personalización Limpia** — Las instrucciones del sistema y herramientas se sincronizan directamente en la personalización de la cuenta (`/settings/personalization`), imitando al cliente web real y evitando bloqueos de WAF/bots.
44
+ - **Parser de Tool Calling con Auto-Reparación** — Tolera streams fragmentados, repara JSON roto, etiquetas unificadas `<qpx_call>`, coincidencias difusas de nombres (`readFile` → `read_file`) y reintentos automáticos.
45
+ - **Generación de Imágenes y Vídeos** — Endpoints dedicados `/v1/images/generations` y `/v1/videos/generations` con modelos de vanguardia (`qwen-image-3.0-pro`, `wan3.0-video`, `wan2.7-image-pro`).
46
+ - **Observabilidad y Monitorización** — Estado en tiempo real en `/health`, `/metrics` (Prometheus), watchdog de memoria RSS y registros unificados por turno.
47
+
48
+ ---
49
+
50
+ ## 🏛️ Arquitectura
51
+
52
+ ```mermaid
53
+ flowchart TD
54
+ Client["Cliente: Claude Code / Codex / OpenCode / Cursor / OMP"] -->|HTTP / SSE| Proxy["QwenProxy - Hono"]
55
+ Proxy --> Chat["/v1/chat/completions"]
56
+ Proxy --> Anthropic["/v1/messages"]
57
+ Proxy --> Completions["/v1/completions (legacy)"]
58
+ Proxy --> Responses["/v1/responses"]
59
+ Proxy --> Media["/v1/images | /v1/videos"]
60
+ Proxy --> Models["/v1/models"]
61
+ Proxy --> Upload["/v1/upload"]
62
+ Anthropic --> Chat
63
+ Completions --> Chat
64
+ Responses --> Chat
65
+ Responses --> Effort["Effort normalization"]
66
+ Responses --> State[("SQLite responses_store")]
67
+ Chat --> Context["Thread-native context"]
68
+ Chat --> Accounts["Account manager"]
69
+ Accounts --> DB[("SQLite encrypted")]
70
+ Accounts --> Playwright["Playwright + Stealth"]
71
+ Playwright --> Fingerprint["Fingerprint / session keeper"]
72
+ Chat --> Parser["Tool-call parser"]
73
+ Chat --> Personalization["Settings + personalization sync"]
74
+ Chat --> BrowserTransport["Playwright page fetch + SSE bridge"]
75
+ BrowserTransport --> Qwen["chat.qwen.ai"]
76
+ Media --> BrowserTransport
77
+ Upload --> OSS["Qwen OSS"]
78
+ ```
79
+
80
+ ---
81
+
82
+ ## 🔄 Modos de Conversación
83
+
84
+ QwenProxy ofrece una matriz completa de **4 modos de operación**, permitiendo balancear el consumo de tokens, la latencia y la organización del historial:
85
+
86
+ | Modo | Estrategia de Envío | Modo Upstream Qwen | ¿Se Guarda en la Web? | Caso de Uso Recomendado |
87
+ | :--- | :--- | :--- | :---: | :--- |
88
+ | **`thread-temp`** ⭐ | **Delta (~1KB)** | `chat_mode: "local"` | ❌ No (Cero basura) | **El mejor para el trabajo diario.** Recomendado para Claude Code, Codex, OpenCode y Cursor. Máxima velocidad, TTFB ultrabajo y sin saturar tu historial en `chat.qwen.ai`. |
89
+ | **`stateless-temp`** | **Historial Completo** | `chat_mode: "local"` | ❌ No (Cero basura) | **Estándar Oficial de APIs (OpenAI/Anthropic).** Reenvía todo el historial en cada turno. Ideal si tu cliente edita, poda o reorganiza mensajes pasados durante la sesión. |
90
+ | **`thread`** *(Predeterminado)* | **Delta (~1KB)** | `chat_mode: "normal"` | ✅ Sí (Guardado en la web) | Perfecto si deseas revisar o continuar la conversación más tarde desde el móvil o navegador en la web oficial de Qwen. |
91
+ | **`stateless`** | **Historial Completo** | `chat_mode: "normal"` | ✅ Sí (Guardado en la web) | Reenvía el historial completo en cada turno y mantiene guardadas todas las conversaciones en tu cuenta de Qwen. |
92
+
93
+ ### Cómo cambiar de modo:
94
+
95
+ 1. **Desde la TUI Interativa (En Tiempo Real Global):**
96
+ - **En la pantalla `[1] Status`:** Pulsa la tecla **`M`** (o haz clic en `[ M ] Alternar Modo`) para rotar el modo global de la API al instante.
97
+ - **En la pantalla `[2] Chat`:** Pulsa **`F4`** (o haz clic en `[ Modo ]`) para abrir el selector vertical.
98
+ 2. **Mediante Endpoint HTTP Remoto:**
99
+ ```bash
100
+ # Consultar modo activo:
101
+ curl http://127.0.0.1:7936/v1/chat/mode
102
+
103
+ # Actualizar modo globalmente en tiempo real:
104
+ curl -X POST http://127.0.0.1:7936/v1/chat/mode \
105
+ -H "Content-Type: application/json" \
106
+ -d '{"mode":"thread-temp"}'
107
+ ```
108
+ 3. **Por Petición Individual (Header HTTP):**
109
+ Envía la cabecera `X-QwenProxy-Chat-Mode: thread-temp` (o `stateless-temp`, `thread`, `stateless`).
110
+ 4. **En el archivo `.env` (Valor de Arranque):**
111
+ ```env
112
+ QWEN_CHAT_MODE=thread
113
+ ```
114
+
115
+ ---
116
+
117
+ ## 📖 Paso a Paso: Cómo Empezar desde Cero
118
+
119
+ ### 1. Instalación
120
+
121
+ Instala el CLI de QwenProxy globalmente en tu sistema:
122
+
123
+ ```bash
124
+ # Vía npm:
125
+ npm install -g qwenproxy-cli
126
+
127
+ # O vía pnpm / bun:
128
+ pnpm add -g qwenproxy-cli
129
+ # bun add -g qwenproxy-cli
130
+ ```
131
+
132
+ ### 2. Iniciar el Dashboard Interactivo (TUI)
133
+
134
+ Abre tu terminal y ejecuta:
135
+
136
+ ```bash
137
+ qpx
138
+ ```
139
+
140
+ QwenProxy iniciará el servidor proxy en segundo plano y abrirá el panel interactivo. El título de la ventana del terminal se establecerá automáticamente como **`QwenProxy`**.
141
+
142
+ ### 3. Añadir Cuentas de Qwen
143
+
144
+ Dentro de la TUI, dirígete a la pestaña **`[5] Contas`** para gestionar credenciales:
145
+
146
+ - **Importación por Lotes (`B`):** Pulsa **`B`** (o haz clic en `[ B ] Em Lote`). Pega tus credenciales en masa (`email:contraseña` por línea, formato `.env` con comas o copiado de hojas de cálculo). El sistema calcula las cuentas válidas en tiempo real, respeta caracteres especiales en contraseñas, omite duplicadas y guarda todo cifrado en SQLite en una sola transacción (<10ms).
147
+ - **Cuenta Individual (`A`):** Pulsa **`A`** para escribir manualmente email y contraseña.
148
+ - **Login Visual en Navegador:** Si prefieres iniciar sesión visualmente con resolución manual de captcha: `qpx login`.
149
+
150
+ ### 4. Sincronizar Agentes de Programación
151
+
152
+ Para configurar automáticamente tus herramientas para que usen QwenProxy:
153
+
154
+ ```bash
155
+ # Sincroniza todos los agentes detectados en tu máquina:
156
+ qpx sync
157
+
158
+ # O sincroniza agentes específicos:
159
+ qpx sync claude codex opencode
160
+ ```
161
+
162
+ El sincronizador configura de forma transparente:
163
+ - **Claude Code CLI** (`~/.claude/settings.json`) — Protocolo nativo Anthropic (`/v1/messages`).
164
+ - **OpenAI Codex CLI** (`~/.codex/config.toml`) — Protocolo nativo Responses (`/v1/responses`).
165
+ - **OpenCode** (`~/.config/opencode/opencode.jsonc`) — Proveedor compatible con OpenAI.
166
+ - **Cline, OMP, Zed, Kilo Code y Hermes Agent**.
167
+
168
+ > **Consejo de Restauración:** Puedes restaurar las configuraciones originales en cualquier momento ejecutando `qpx sync -- --restore`.
169
+
170
+ ### 5. ¡Listo para Programar!
171
+
172
+ Ejecuta tu agente favorito con total normalidad:
173
+ ```bash
174
+ # Ejecutar Claude Code:
175
+ claude
176
+
177
+ # Ejecutar Codex CLI:
178
+ codex
179
+
180
+ # Ejecutar OpenCode:
181
+ opencode
182
+ ```
183
+ ¡Todas las consultas y llamadas a herramientas funcionarán a máxima velocidad, sin costes de APIs externas y con rotación automática de cuentas!
184
+
185
+ ---
186
+
187
+ ## 💡 Consejos de Producción y Buenas Prácticas
188
+
189
+ 1. **Usa `thread-temp` para Programar a Diario:**
190
+ Los agentes de código generan decenas de turnos y llamadas a herramientas por minuto. Trabajar en `thread-temp` evita que cientos de chats temporales saturen tu cuenta personal en `chat.qwen.ai`, manteniendo un TTFB constante de ~0.6s a 1.2s.
191
+ 2. **Múltiples Cuentas y Cuota Diaria (00:00 UTC):**
192
+ Configura 2 o más cuentas. Las cuotas diarias de Qwen Web se reinician puntualmente a las **00:00 UTC**. Cuando una cuenta alcanza el límite, el proxy la pone en cooldown y pasa de inmediato a la siguiente cuenta saludable.
193
+ 3. **Limpieza Periódica de Perfiles (`qpx clean`):**
194
+ Con el uso continuo, Chromium acumula cachés de V8 y GPU. Ejecuta `qpx clean` para purgar cachés prescindibles, reduciendo el tamaño de cada perfil de ~300MB a solo **~4.5MB por cuenta**, manteniendo intactas las cookies y sesiones.
195
+ 4. **Reinicio Inmediato de Cooldowns:**
196
+ Para desbloquear cuentas en cooldown inmediatamente, pulsa **`Z`** en la pantalla `[1] Status` o ejecuta `qpx reset`.
197
+
198
+ ---
199
+
200
+ ## 📦 Modelos y Capacidades
201
+
202
+ Los modelos y ventanas de contexto se sincronizan dinámicamente desde el catálogo oficial `/api/models` de Qwen para cada cuenta:
203
+
204
+ | Modelo | Ventana de Contexto | Salida Máxima | Thinking | Vision |
205
+ | :--- | :---: | :---: | :---: | :---: |
206
+ | `qwen3.8-max` | 1.000.000 | 131.072 | ✅ Sí | ✅ Sí |
207
+ | `qwen3.7-plus` | 1.000.000 | 65.536 | ✅ Sí | ✅ Sí |
208
+ | `qwen3.7-max` | 1.000.000 | 65.536 | ✅ Sí | ❌ No |
209
+ | **Fallback** | **1.048.576** | **65.536** | — | — |
210
+
211
+ ### Variantes Sintéticas
212
+
213
+ - Modelo Base — **Modo Auto** (Qwen decide cuándo razonar), ej.: `qwen3.8-max`
214
+ - `-fast` — Razonamiento desactivado para respuestas ultrarrápidas, ej.: `qwen3.8-max-fast`
215
+ - `-thinking` — Razonamiento forzado, ej.: `qwen3.8-max-thinking`
216
+
217
+ ---
218
+
219
+ ## 🛠️ Comandos del CLI y Scripts NPM
220
+
221
+ | Comando | Descripción |
222
+ | :--- | :--- |
223
+ | `qpx` *(o `npm run tui`)* | Abre el dashboard TUI con servidor integrado |
224
+ | `qpx start` *(o `npm start`)* | Inicia solo el servidor HTTP/SSE en modo headless (sin interfaz) |
225
+ | `qpx sync` *(o `npm run sync`)* | Sincroniza agentes (Claude Code, Codex, OpenCode, Cline, OMP) |
226
+ | `qpx clean` | Purga cachés temporales de Chromium (~4.5MB por cuenta) |
227
+ | `qpx clean:all` | Purga cachés y elimina navegadores obsoletos en disco (~4GB) |
228
+ | `qpx reset` | Restablece cooldowns y límites de tasa en la base de datos |
229
+ | `qpx login` | Autentica nuevas cuentas visualmente mediante navegador |
230
+ | `qpx purge` | Elimina el historial remoto de chats en las cuentas configuradas |
231
+ | `qpx update` | Actualiza QwenProxy automáticamente a la última versión |
232
+ | `npm test` | Ejecuta la suite completa de pruebas (mock y en vivo) |
233
+ | `npm run typecheck` | Verificación estricta de tipos de TypeScript (cero errores) |
234
+
235
+ ---
236
+
237
+ ## 🐳 Despliegue con Docker
238
+
239
+ ```yaml
240
+ services:
241
+ qwenproxy:
242
+ build: .
243
+ container_name: qwenproxy
244
+ ports:
245
+ - "${PORT:-7936}:7936"
246
+ env_file:
247
+ - .env
248
+ volumes:
249
+ - ./data:/app/data
250
+ restart: unless-stopped
251
+ shm_size: "2gb"
252
+ logging:
253
+ driver: "json-file"
254
+ options:
255
+ max-size: "10m"
256
+ max-file: "3"
257
+ ```
258
+
259
+ ---
260
+
261
+ ## ⚖️ Descargo de Responsabilidad (Disclaimer)
262
+
263
+ **Este software se proporciona "tal cual", sin garantía de ningún tipo, expresa o implícita.**
264
+
265
+ - **Sin Afiliación:** QwenProxy es un proyecto independiente de código abierto y no está afiliado, respaldado ni patrocinado por Alibaba, Qwen, OpenAI, Anthropic ni ningún proveedor mencionado.
266
+ - **Uso Educativo y Personal:** Diseñado para investigación técnica y desarrollo local. Los usuarios son los únicos responsables de cumplir con los Términos de Servicio del proveedor, gestionar sus propias credenciales y cumplir con las leyes aplicables.
267
+ - **Responsabilidad del Usuario:** El usuario asume toda la responsabilidad por límites de tasa, desafíos de seguridad y contenido generado.
268
+
269
+ Desarrollado y mantenido por **johngbl**, construido sobre las bases de código abierto desarrolladas originalmente por **Pedro Farias** bajo la [Licencia ISC](LICENSE).