Proxy API local compatível com OpenAI que roteia requisições para modelos DeepSeek, com integração de automação de navegador via Playwright para execução de ferramentas e interações web.
- OpenAI API Compatible: Interface compatível com
/v1/chat/completionse/v1/models - Tool Execution: Sistema de ferramentas executáveis via Playwright
- Session Persistence: Login persistente com armazenamento de perfil do navegador
- Authentication: Suporte opcional a API Key via header
AuthorizationouX-API-Key - Type-Safe: Código 100% TypeScript com strict mode
- Docker Ready: Deploy simplificado com Docker Compose
graph TD
Client[Cliente OpenAI/SDK] -->|HTTPS| Proxy[DeepsProxy]
Proxy -->|/v1/chat/completions| Handler[Chat Handler]
Handler --> DeepSeek[DeepSeek API]
Handler --> Playwright[Playwright Service]
Playwright --> Browser[Navegador Headless]
Handler --> Tools[Tools Executor]
Tools --> Registry[Tool Registry]
subgraph "Configuração"
Env[.env] --> Proxy
Profile[deepseek_profile/] --> Playwright
end
| Dependência | Versão Mínima | Instalação |
|---|---|---|
| Node.js | v20.x | nvm |
| npm | v9.x | Incluído com Node.js |
| Playwright | - | npx playwright install |
| Docker (opcional) | v24.x | Docker Docs |
# Clonar repositório
git clone https://github.com/pedrofariasx/deepsproxy.git
cd deepsproxy
# Instalar dependências
npm install
# Instalar browsers do Playwright
npx playwright install# Build da imagem
docker-compose build
# Iniciar containers
docker-compose up -dCrie o arquivo .env na raiz do projeto:
# Porta do servidor (default: 3000)
PORT=3000
# Chave de API para proteger endpoints (opcional)
API_KEY=sua-chave-secreta-aqui
# Configurações Playwright
PLAYWRIGHT_HEADLESS=true
PLAYWRIGHT_TIMEOUT=30000
# Logging
LOG_LEVEL=info| Variável | Descrição | Default | Obrigatória |
|---|---|---|---|
PORT |
Porta HTTP do servidor | 3000 |
Não |
API_KEY |
Chave para autenticação de requests | - | Não |
PLAYWRIGHT_HEADLESS |
Executar browser em modo headless | true |
Não |
PLAYWRIGHT_TIMEOUT |
Timeout para operações do Playwright (ms) | 30000 |
Não |
* Necessária para funcionalidades que requerem acesso à API DeepSeek
Se API_KEY estiver configurada, todas as requisições devem incluir uma das opções:
# Via Bearer Token
curl -H "Authorization: Bearer sua-chave" http://localhost:3000/v1/chat/completions
# Via X-API-Key header
curl -H "X-API-Key: sua-chave" http://localhost:3000/v1/chat/completionsResposta para autenticação falha:
{ "error": "Unauthorized" }Status: 401
GET /healthResponse 200 OK:
{ "status": "ok" }GET /v1/modelsResponse 200 OK:
{
"object": "list",
"data": [
{
"id": "deepseek-v4-flash",
"object": "model",
"created": 1715616000,
"owned_by": "deepseek"
},
{
"id": "deepseek-v4-flash-thinking",
"object": "model",
"created": 1715616000,
"owned_by": "deepseek"
},
{
"id": "deepseek-v4-pro",
"object": "model",
"created": 1715616000,
"owned_by": "deepseek"
},
{
"id": "deepseek-v4-pro-thinking",
"object": "model",
"created": 1715616000,
"owned_by": "deepseek"
}
]
}POST /v1/chat/completions
Content-Type: application/jsonRequest Body:
{
"model": "deepseek-flash-thinking",
"messages": [
{ "role": "user", "content": "Qual é a previsão do tempo?" }
],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Obter previsão do tempo",
"parameters": {
"type": "object",
"properties": {
"location": { "type": "string" }
},
"required": ["location"]
}
}
}
],
"tool_choice": "auto",
"stream": false
}Response 200 OK:
{
"id": "chatcmpl-xxx",
"object": "chat.completion",
"created": 1715616000,
"model": "deepseek-flash-thinking",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "A previsão para São Paulo é de 24°C com sol.",
"tool_calls": []
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 45,
"completion_tokens": 23,
"total_tokens": 68
}
}curl http://localhost:3000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-flash-thinking",
"messages": [{"role": "user", "content": "Olá!"}]
}'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: 'deepseek-thinking',
messages: [{ role: 'user', content: 'Explique TypeScript' }]
});
console.log(completion.choices[0].message.content);from openai import OpenAI
client = OpenAI(
base_url="http://localhost:3000/v1",
api_key="sk-no-key-required"
)
response = client.chat.completions.create(
model="deepseek-thinking",
messages=[{"role": "user", "content": "Hello!"}]
)
print(response.choices[0].message.content)| Comando | Descrição |
|---|---|
npm start |
Inicia o servidor em produção |
npm run dev |
Inicia com hot-reload para desenvolvimento |
npm run login |
Executa fluxo de login e salva sessão do navegador |
npm test |
Executa suite de testes |
npm run build |
Compila TypeScript para dist/ |
npx playwright install |
Instala browsers para automação |
deepsproxy/
├── src/
│ ├── index.ts # Entry point: servidor Hono + middleware
│ ├── routes/
│ │ └── chat.ts # Handler POST /v1/chat/completions
│ ├── services/
│ │ ├── deepseek.ts # Cliente API DeepSeek
│ │ └── playwright.ts # Gerenciamento de browser/session
│ ├── tools/
│ │ ├── executor.ts # Execução dinâmica de ferramentas
│ │ ├── registry.ts # Registro e descoberta de tools
│ │ ├── schema.ts # Validação de schemas JSON
│ │ └── types.ts # Tipos do sistema de tools
│ ├── runtime/
│ │ ├── engine.ts # Motor principal de execução
│ │ └── types.ts # Tipos do runtime
│ ├── types/
│ │ └── openai.ts # Tipos compatíveis com OpenAI API
│ ├── utils/
│ │ └── types.ts # Utilitários de tipo
│ ├── login.ts # Script de autenticação inicial
│ ├── index.test.ts # Testes unitários básicos
│ └── advanced.test.ts # Testes de integração avançados
├── docker-compose.yml # Orquestração multi-container
├── Dockerfile # Imagem Docker otimizada
├── tsconfig.json # Configuração TypeScript strict
├── package.json # Dependências e scripts
├── .env.example # Template de variáveis de ambiente
└── deepseek_profile/ # Armazenamento de sessão (gitignored)
services:
deepsproxy:
build: .
ports:
- "3000:3000"
environment:
- PORT=3000
- PLAYWRIGHT_HEADLESS=true
volumes:
- ./deepseek_profile:/app/deepseek_profile
restart: unless-stopped# Build
docker-compose build
# Executar em background
docker-compose up -d
# Ver logs
docker-compose logs -f
# Parar
docker-compose down# Executar todos os testes
npm test
# Executar com watch mode
npm run test:watch
# Executar testes específicos
npm test -- src/index.test.ts
# Coverage report
npm run test:coverage# Reinstalar browsers
npx playwright install --with-deps
# Verificar dependências do sistema
npx playwright install-deps- Verifique se
API_KEYno.envcorresponde ao header enviado - Teste sem
API_KEYconfigurada para isolar o problema
- Aumente
PLAYWRIGHT_TIMEOUTno.env - Verifique conectividade com a API DeepSeek
- Considere executar com
PLAYWRIGHT_HEADLESS=falsepara debug visual
- Certifique-se que
deepseek_profile/tem permissões de escrita - Execute
npm run loginpara renovar a sessão
- Fork o repositório
- Crie uma branch para sua feature:
git checkout -b feature/minha-feature - Commit suas mudanças:
git commit -m 'feat: adiciona minha feature' - Push para a branch:
git push origin feature/minha-feature - Abra um Pull Request
- Siga o padrão TypeScript strict
- Adicione testes para novas funcionalidades
- Mantenha compatibilidade com OpenAI API spec
Distribuído sob licença ISC. Veja LICENSE para mais informações.
Este projeto é fornecido estritamente para fins educacionais e de pesquisa.
Os autores não incentivam ou endossam:
- Uso indevido ou malicioso
- Automação não autorizada de serviços terceiros
- Violação de Termos de Serviço de plataformas
- Atividades que violem leis ou regulamentações aplicáveis
Usuários são integralmente responsáveis pelo uso deste software, incluindo conformidade com leis, regulamentos e contratos de serviço aplicáveis.
Este repositório demonstra conceitos relacionados a:
- Automação de navegadores com Playwright
- Gerenciamento de sessões e autenticação
- Arquiteturas de runtime compatíveis com OpenAI
- Padrões de proxy e roteamento de API
Use por sua conta e risco.