{"id":49912951,"url":"https://github.com/pedrofariasx/qwenproxy","last_synced_at":"2026-06-12T01:01:48.391Z","repository":{"id":357525406,"uuid":"1237345031","full_name":"pedrofariasx/qwenproxy","owner":"pedrofariasx","description":"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.","archived":false,"fork":false,"pushed_at":"2026-06-06T14:38:46.000Z","size":4207,"stargazers_count":110,"open_issues_count":0,"forks_count":52,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-06T16:22:44.171Z","etag":null,"topics":["docker","hono","llm","openai","playwright","proxy","qwen","typescript"],"latest_commit_sha":null,"homepage":"https://github.com/pedrofariasx/qwenproxy","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pedrofariasx.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-13T05:15:57.000Z","updated_at":"2026-06-06T14:38:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pedrofariasx/qwenproxy","commit_stats":null,"previous_names":["pedrofariasx/qwenproxy"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/pedrofariasx/qwenproxy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrofariasx%2Fqwenproxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrofariasx%2Fqwenproxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrofariasx%2Fqwenproxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrofariasx%2Fqwenproxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pedrofariasx","download_url":"https://codeload.github.com/pedrofariasx/qwenproxy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrofariasx%2Fqwenproxy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34224103,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","hono","llm","openai","playwright","proxy","qwen","typescript"],"created_at":"2026-05-16T13:38:47.111Z","updated_at":"2026-06-12T01:01:48.353Z","avatar_url":"https://github.com/pedrofariasx.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# QwenProxy\n\nProxy 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.\n\n[![CI](https://github.com/pedrofariasx/qwenproxy/actions/workflows/ci.yml/badge.svg)](https://github.com/pedrofariasx/qwenproxy/actions/workflows/ci.yml)\n[![TypeScript](https://img.shields.io/badge/TypeScript-6.0-blue)](https://www.typescriptlang.org/)\n[![Hono](https://img.shields.io/badge/Hono-4.12-green)](https://hono.dev/)\n[![Playwright](https://img.shields.io/badge/Playwright-1.60-blueviolet)](https://playwright.dev/)\n[![License: ISC](https://img.shields.io/badge/License-ISC-yellow.svg)](LICENSE)\n\n---\n\n## Features\n\n- **OpenAI API Compatible** — Interface compatível com `/v1/chat/completions` e `/v1/models`.\n- **Multi-Account** — Gerencie múltiplas contas Qwen com rotação round-robin e cooldown automático.\n- **SQLite Storage** — Contas salvas em banco de dados SQLite (WAL mode) para performance e confiabilidade.\n- **Reasoning Support** — Suporte completo ao modo de pensamento (thinking) dos modelos Qwen.\n- **Tool Execution** — Sistema de execução de ferramentas locais integrado ao fluxo do chat.\n- **Session Persistence** — Perfil de navegador persistente por conta em `qwen_profiles/`.\n- **Auto-Login** — Login automático via credenciais com recuperação de sessão.\n- **Browser Selection** — Escolha entre Chromium, Chrome, Firefox, Edge ou WebKit.\n- **Monitoring** — Health check, métricas Prometheus e watchdog integrados.\n- **Docker Ready** — Deploy para VPS com Docker, volumes persistentes e graceful shutdown.\n\n---\n\n## Arquitetura\n\n```mermaid\ngraph TD\n    Client[Cliente OpenAI/SDK] --\u003e|HTTP| Proxy[QwenProxy - Hono]\n    Proxy --\u003e|/v1/chat/completions| Handler[Chat Handler]\n    Proxy --\u003e|/v1/models| Models[Models API]\n    Handler --\u003e AccountMgr[Account Manager]\n    AccountMgr --\u003e|Round-Robin| Accounts[(SQLite)]\n    AccountMgr --\u003e Playwright[Playwright Service]\n    Playwright --\u003e Browser1[Browser - Conta 1]\n    Playwright --\u003e Browser2[Browser - Conta 2]\n    Playwright --\u003e BrowserN[Browser - Conta N]\n    Handler --\u003e QwenAPI[chat.qwen.ai]\n    Handler --\u003e Tools[Tool Parser]\n\n    subgraph \"Persistência\"\n        Accounts\n        Profiles[qwen_profiles/]\n    end\n```\n\n---\n\n## Pré-requisitos\n\n| Dependência | Versão Mínima | Instalação |\n|------------|--------------|-----------|\n| Node.js | v20.x | [nvm](https://github.com/nvm-sh/nvm) |\n| npm | v9.x | Incluído com Node.js |\n| Playwright | - | `npx playwright install` |\n| Docker (opcional) | v24.x | [Docker Docs](https://docs.docker.com/get-docker/) |\n\n---\n\n## Instalação\n\n### Via npm\n\n```bash\ngit clone https://github.com/pedrofariasx/qwenproxy.git\ncd qwenproxy\nnpm install\nnpx playwright install\n```\n\n### Via Docker\n\n```bash\ndocker-compose up -d\n```\n\n---\n\n## Configuração\n\nCrie o arquivo `.env` na raiz do projeto (veja `.env.example`):\n\n```env\n# Porta do servidor (default: 3000)\nPORT=3000\n\n# Chave de API para proteger os endpoints (opcional)\nAPI_KEY=sua-chave-secreta-aqui\n\n# Credenciais Qwen para login automático (modo single-account)\nQWEN_EMAIL=seu-email@exemplo.com\nQWEN_PASSWORD=sua-senha-aqui\n\n# Navegador (chromium, firefox, chrome, edge)\nBROWSER=chromium\n```\n\n---\n\n## Gerenciamento de Contas\n\nAs contas são armazenadas em SQLite (`data/qwenproxy.db`). Use o CLI interativo para gerenciar:\n\n```bash\n# Abrir o gerenciador de contas\nnpm run login\n\n# Com navegador específico\nnpm run login:firefox\nnpm run login:chrome\nnpm run login:edge\n```\n\nO menu interativo permite:\n- **[A]** Adicionar conta com credenciais (email + senha)\n- **[M]** Adicionar conta via login manual no navegador\n- **[R]** Remover uma conta\n- **[L]** Login em todas as contas (inicializar sessões)\n\n\u003e Na primeira execução, se existir um `accounts.json` antigo, as contas serão migradas automaticamente para SQLite.\n\n---\n\n## Uso\n\n### Iniciar o servidor\n\n```bash\nnpm start                  # Chromium (padrão)\nnpm run start:chrome       # Google Chrome\nnpm run start:firefox      # Firefox\nnpm run start:edge         # Microsoft Edge\n```\n\nO servidor inicia em `http://localhost:3000` com as seguintes rotas:\n\n| Rota | Método | Descrição |\n|------|--------|-----------|\n| `/v1/chat/completions` | POST | Chat completions (streaming + non-streaming) |\n| `/v1/chat/completions/stop` | POST | Abortar uma geração ativa |\n| `/v1/models` | GET | Listar modelos disponíveis |\n| `/v1/models/:model` | GET | Informações de um modelo específico |\n| `/health` | GET | Health check com status do sistema |\n| `/metrics` | GET | Métricas no formato Prometheus |\n\n---\n\n## Exemplos de Integração\n\n### OpenAI SDK (Node.js)\n\n```typescript\nimport OpenAI from 'openai';\n\nconst openai = new OpenAI({\n  baseURL: 'http://localhost:3000/v1',\n  apiKey: process.env.API_KEY || 'sk-no-key-required'\n});\n\nconst completion = await openai.chat.completions.create({\n  model: 'qwen-plus',\n  messages: [{ role: 'user', content: 'Explique como funciona o Playwright.' }]\n});\n\nconsole.log(completion.choices[0].message.content);\n```\n\n### cURL\n\n```bash\ncurl http://localhost:3000/v1/chat/completions \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer sua-chave\" \\\n  -d '{\n    \"model\": \"qwen-plus\",\n    \"messages\": [{\"role\": \"user\", \"content\": \"Hello!\"}],\n    \"stream\": true\n  }'\n```\n\n---\n\n## Deploy com Docker\n\n### docker-compose.yml\n\n```yaml\nservices:\n  qwenproxy:\n    build: .\n    container_name: qwenproxy\n    ports:\n      - \"${PORT:-3000}:3000\"\n    env_file:\n      - .env\n    volumes:\n      - ./data:/app/data               # Banco SQLite\n      - ./qwen_profiles:/app/qwen_profiles  # Sessões dos navegadores\n    restart: unless-stopped\n```\n\n### Volumes persistentes\n\n| Volume | Conteúdo |\n|--------|----------|\n| `./data` | Banco SQLite com as contas (`qwenproxy.db`) |\n| `./qwen_profiles` | Perfis de navegador por conta (cookies, sessões) |\n\n---\n\n## Estrutura do Projeto\n\n```\nqwenproxy/\n├── src/\n│   ├── index.ts                 # Entry point\n│   ├── login.ts                 # CLI de gerenciamento de contas\n│   ├── api/\n│   │   ├── models.ts            # Endpoints /v1/models\n│   │   └── server.ts            # Servidor Hono + startup\n│   ├── cache/\n│   │   └── memory-cache.ts      # Cache em memória com TTL\n│   ├── core/\n│   │   ├── account-manager.ts   # Rotação round-robin + cooldowns\n│   │   ├── accounts.ts          # CRUD de contas (SQLite)\n│   │   ├── config.ts            # Configuração com Zod\n│   │   ├── database.ts          # Conexão e migrations SQLite\n│   │   ├── logger.ts            # Logger estruturado\n│   │   ├── metrics.ts           # Coleta de métricas\n│   │   ├── model-registry.ts    # Registro de modelos e context windows\n│   │   ├── stream-registry.ts   # Tracking de streams ativos\n│   │   └── watchdog.ts          # Health monitoring\n│   ├── routes/\n│   │   ├── chat.ts              # Handler /v1/chat/completions\n│   │   └── upload.ts            # Handler /v1/upload (multimodal)\n│   ├── services/\n│   │   ├── playwright.ts        # Automação de navegador\n│   │   └── qwen.ts              # Integração com API do Qwen\n│   ├── tests/                   # Testes automatizados\n│   ├── tools/\n│   │   ├── parser.ts            # Parser de \u003ctool_call\u003e tags\n│   │   ├── registry.ts          # Registro de tools\n│   │   ├── schema.ts            # Validação JSON Schema\n│   │   └── types.ts             # Tipos do sistema de tools\n│   └── utils/\n│       ├── context-truncation.ts # Truncamento de contexto\n│       ├── json.ts              # Parser JSON robusto\n│       └── types.ts             # Re-exports de tipos\n├── data/                        # Banco SQLite (gitignored)\n├── qwen_profiles/               # Perfis de navegador por conta (gitignored)\n├── Dockerfile\n├── docker-compose.yml\n└── package.json\n```\n\n---\n\n## Troubleshooting\n\n| Problema | Solução |\n|----------|---------|\n| Porta em uso | Altere `PORT` no `.env` ou encerre o processo na porta 3000 |\n| Navegador não abre | Execute `npx playwright install` |\n| Sessão expirada | Execute `npm run login` para renovar cookies |\n| Rate limit em todas as contas | Adicione mais contas via `npm run login` |\n| Banco corrompido | Apague `data/qwenproxy.db` e re-adicione as contas |\n\n---\n\n## Disclaimer\n\n\u003e Este projeto é fornecido estritamente para fins educacionais e de pesquisa.\n\nOs autores não incentivam ou endossam:\n- Violação dos Termos de Serviço da plataforma Qwen.\n- Automação não autorizada em larga escala.\n- Uso para atividades maliciosas.\n\n**Use por sua conta e risco.**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedrofariasx%2Fqwenproxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpedrofariasx%2Fqwenproxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedrofariasx%2Fqwenproxy/lists"}