https://github.com/pedrofariasx/qwenproxy
Proxy API OpenAI-compatible que usa automação com Playwright para rotear requisições para modelos do Qwen com suporte a múltiplas contas, tools e sessões persistentes.
https://github.com/pedrofariasx/qwenproxy
docker hono llm openai playwright proxy qwen typescript
Last synced: 13 days ago
JSON representation
Proxy API OpenAI-compatible que usa automação com Playwright para rotear requisições para modelos do Qwen com suporte a múltiplas contas, tools e sessões persistentes.
- Host: GitHub
- URL: https://github.com/pedrofariasx/qwenproxy
- Owner: pedrofariasx
- License: isc
- Created: 2026-05-13T05:15:57.000Z (about 1 month ago)
- Default Branch: main
- Last Pushed: 2026-06-06T14:38:46.000Z (19 days ago)
- Last Synced: 2026-06-06T16:22:44.171Z (18 days ago)
- Topics: docker, hono, llm, openai, playwright, proxy, qwen, typescript
- Language: TypeScript
- Homepage: https://github.com/pedrofariasx/qwenproxy
- Size: 4.01 MB
- Stars: 110
- Watchers: 0
- Forks: 52
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# QwenProxy
Proxy API local compatível com OpenAI que roteia requisições para os modelos do **Qwen (chat.qwen.ai)** via automação de navegador com Playwright. Suporte a múltiplas contas com rotação automática, execução de ferramentas, modo de pensamento (reasoning), persistência de sessão e armazenamento em SQLite.
[](https://github.com/pedrofariasx/qwenproxy/actions/workflows/ci.yml)
[](https://www.typescriptlang.org/)
[](https://hono.dev/)
[](https://playwright.dev/)
[](LICENSE)
---
## Features
- **OpenAI API Compatible** — Interface compatível com `/v1/chat/completions` e `/v1/models`.
- **Multi-Account** — Gerencie múltiplas contas Qwen com rotação round-robin e cooldown automático.
- **SQLite Storage** — Contas salvas em banco de dados SQLite (WAL mode) para performance e confiabilidade.
- **Reasoning Support** — Suporte completo ao modo de pensamento (thinking) dos modelos Qwen.
- **Tool Execution** — Sistema de execução de ferramentas locais integrado ao fluxo do chat.
- **Session Persistence** — Perfil de navegador persistente por conta em `qwen_profiles/`.
- **Auto-Login** — Login automático via credenciais com recuperação de sessão.
- **Browser Selection** — Escolha entre Chromium, Chrome, Firefox, Edge ou WebKit.
- **Monitoring** — Health check, métricas Prometheus e watchdog integrados.
- **Docker Ready** — Deploy para VPS com Docker, volumes persistentes e graceful shutdown.
---
## Arquitetura
```mermaid
graph TD
Client[Cliente OpenAI/SDK] -->|HTTP| Proxy[QwenProxy - Hono]
Proxy -->|/v1/chat/completions| Handler[Chat Handler]
Proxy -->|/v1/models| Models[Models API]
Handler --> AccountMgr[Account Manager]
AccountMgr -->|Round-Robin| Accounts[(SQLite)]
AccountMgr --> Playwright[Playwright Service]
Playwright --> Browser1[Browser - Conta 1]
Playwright --> Browser2[Browser - Conta 2]
Playwright --> BrowserN[Browser - Conta N]
Handler --> QwenAPI[chat.qwen.ai]
Handler --> Tools[Tool Parser]
subgraph "Persistência"
Accounts
Profiles[qwen_profiles/]
end
```
---
## Pré-requisitos
| Dependência | Versão Mínima | Instalação |
|------------|--------------|-----------|
| Node.js | v20.x | [nvm](https://github.com/nvm-sh/nvm) |
| npm | v9.x | Incluído com Node.js |
| Playwright | - | `npx playwright install` |
| Docker (opcional) | v24.x | [Docker Docs](https://docs.docker.com/get-docker/) |
---
## Instalação
### Via npm
```bash
git clone https://github.com/pedrofariasx/qwenproxy.git
cd qwenproxy
npm install
npx playwright install
```
### Via Docker
```bash
docker-compose up -d
```
---
## Configuração
Crie o arquivo `.env` na raiz do projeto (veja `.env.example`):
```env
# Porta do servidor (default: 3000)
PORT=3000
# Chave de API para proteger os endpoints (opcional)
API_KEY=sua-chave-secreta-aqui
# Credenciais Qwen para login automático (modo single-account)
QWEN_EMAIL=seu-email@exemplo.com
QWEN_PASSWORD=sua-senha-aqui
# Navegador (chromium, firefox, chrome, edge)
BROWSER=chromium
```
---
## Gerenciamento de Contas
As contas são armazenadas em SQLite (`data/qwenproxy.db`). Use o CLI interativo para gerenciar:
```bash
# Abrir o gerenciador de contas
npm run login
# Com navegador específico
npm run login:firefox
npm run login:chrome
npm run login:edge
```
O menu interativo permite:
- **[A]** Adicionar conta com credenciais (email + senha)
- **[M]** Adicionar conta via login manual no navegador
- **[R]** Remover uma conta
- **[L]** Login em todas as contas (inicializar sessões)
> Na primeira execução, se existir um `accounts.json` antigo, as contas serão migradas automaticamente para SQLite.
---
## Uso
### Iniciar o servidor
```bash
npm start # Chromium (padrão)
npm run start:chrome # Google Chrome
npm run start:firefox # Firefox
npm run start:edge # Microsoft Edge
```
O servidor inicia em `http://localhost:3000` com as seguintes rotas:
| Rota | Método | Descrição |
|------|--------|-----------|
| `/v1/chat/completions` | POST | Chat completions (streaming + non-streaming) |
| `/v1/chat/completions/stop` | POST | Abortar uma geração ativa |
| `/v1/models` | GET | Listar modelos disponíveis |
| `/v1/models/:model` | GET | Informações de um modelo específico |
| `/health` | GET | Health check com status do sistema |
| `/metrics` | GET | Métricas no formato Prometheus |
---
## Exemplos de Integração
### OpenAI SDK (Node.js)
```typescript
import OpenAI from 'openai';
const openai = new OpenAI({
baseURL: 'http://localhost:3000/v1',
apiKey: process.env.API_KEY || 'sk-no-key-required'
});
const completion = await openai.chat.completions.create({
model: 'qwen-plus',
messages: [{ role: 'user', content: 'Explique como funciona o Playwright.' }]
});
console.log(completion.choices[0].message.content);
```
### cURL
```bash
curl http://localhost:3000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sua-chave" \
-d '{
"model": "qwen-plus",
"messages": [{"role": "user", "content": "Hello!"}],
"stream": true
}'
```
---
## Deploy com Docker
### docker-compose.yml
```yaml
services:
qwenproxy:
build: .
container_name: qwenproxy
ports:
- "${PORT:-3000}:3000"
env_file:
- .env
volumes:
- ./data:/app/data # Banco SQLite
- ./qwen_profiles:/app/qwen_profiles # Sessões dos navegadores
restart: unless-stopped
```
### Volumes persistentes
| Volume | Conteúdo |
|--------|----------|
| `./data` | Banco SQLite com as contas (`qwenproxy.db`) |
| `./qwen_profiles` | Perfis de navegador por conta (cookies, sessões) |
---
## Estrutura do Projeto
```
qwenproxy/
├── src/
│ ├── index.ts # Entry point
│ ├── login.ts # CLI de gerenciamento de contas
│ ├── api/
│ │ ├── models.ts # Endpoints /v1/models
│ │ └── server.ts # Servidor Hono + startup
│ ├── cache/
│ │ └── memory-cache.ts # Cache em memória com TTL
│ ├── core/
│ │ ├── account-manager.ts # Rotação round-robin + cooldowns
│ │ ├── accounts.ts # CRUD de contas (SQLite)
│ │ ├── config.ts # Configuração com Zod
│ │ ├── database.ts # Conexão e migrations SQLite
│ │ ├── logger.ts # Logger estruturado
│ │ ├── metrics.ts # Coleta de métricas
│ │ ├── model-registry.ts # Registro de modelos e context windows
│ │ ├── stream-registry.ts # Tracking de streams ativos
│ │ └── watchdog.ts # Health monitoring
│ ├── routes/
│ │ ├── chat.ts # Handler /v1/chat/completions
│ │ └── upload.ts # Handler /v1/upload (multimodal)
│ ├── services/
│ │ ├── playwright.ts # Automação de navegador
│ │ └── qwen.ts # Integração com API do Qwen
│ ├── tests/ # Testes automatizados
│ ├── tools/
│ │ ├── parser.ts # Parser de tags
│ │ ├── registry.ts # Registro de tools
│ │ ├── schema.ts # Validação JSON Schema
│ │ └── types.ts # Tipos do sistema de tools
│ └── utils/
│ ├── context-truncation.ts # Truncamento de contexto
│ ├── json.ts # Parser JSON robusto
│ └── types.ts # Re-exports de tipos
├── data/ # Banco SQLite (gitignored)
├── qwen_profiles/ # Perfis de navegador por conta (gitignored)
├── Dockerfile
├── docker-compose.yml
└── package.json
```
---
## Troubleshooting
| Problema | Solução |
|----------|---------|
| Porta em uso | Altere `PORT` no `.env` ou encerre o processo na porta 3000 |
| Navegador não abre | Execute `npx playwright install` |
| Sessão expirada | Execute `npm run login` para renovar cookies |
| Rate limit em todas as contas | Adicione mais contas via `npm run login` |
| Banco corrompido | Apague `data/qwenproxy.db` e re-adicione as contas |
---
## Disclaimer
> Este projeto é fornecido estritamente para fins educacionais e de pesquisa.
Os autores não incentivam ou endossam:
- Violação dos Termos de Serviço da plataforma Qwen.
- Automação não autorizada em larga escala.
- Uso para atividades maliciosas.
**Use por sua conta e risco.**