Ligue o Ollama local do seu portátil ao Entity Enricher com um único comando. Use os modelos que já tem, mantenha determinados inputs na sua máquina e revogue o acesso instantaneamente — tudo através de uma única ligação HTTPS de saída.
Production (Hetzner) Your Laptop / your server
┌─────────────────────────┐ ┌────────────────────┐
│ Org enrichment │ │ ee-tunnel CLI │
│ │ │ │ │ │
│ ▼ │ │ ▼ │
│ Ollama provider URL: │ │ Ollama :11434 │
│ http://ollama.<org> │ │ ┌──────────────┐ │
│ .tunnel/v1/chat │ │ │ qwen3:36b │ │
│ │ │ │ │ llama3:70b │ │
│ ▼ │ │ │ ... │ │
│ WebSocket bridge │◀───────▶│ └──────────────┘ │
└─────────────────────────┘ └────────────────────┘
one outbound :443/wss connectionO nome de anfitrião sintético ollama.<org-slug>.tunnel nunca é resolvido por DNS. Um transporte personalizado no processo do Entity Enricher interceta pedidos para *.tunnel e encaminha-os através do WebSocket ativo correspondente.
Execute enriquecimentos contra modelos de pesos abertos já descarregados no seu portátil (Llama 3, Qwen, DeepSeek, Mistral, …) sem os voltar a descarregar no servidor.
Para prompts sensíveis, encaminhe enriquecimentos específicos através da sua própria GPU. A plataforma continua a registar o custo, os tokens e os metadados — apenas a inferência em si permanece local.
Descarregue um modelo com `ollama pull` no seu portátil, clique em Descobrir Modelos e ele aparece no seletor do Entity Enricher com o comprimento de contexto e as capacidades reais.
Quando um provider alojado o limita por taxa, faça failover para um modelo local em túnel durante o resto de um batch.
Dois comandos no seu portátil, um clique no navegador. Todo o fluxo demora cerca de um minuto.
Abra Chaves de API → Túneis Ollama e clique em Novo Túnel Ollama. Escreva uma etiqueta para reconhecer este dispositivo mais tarde (por exemplo, "MacBook do Anthony").
Cole isto num terminal. O script verifica uma assinatura cosign antes de instalar.
curl -fsSL https://entityenricher.ai/install.sh | sh
O instalador imprime o que está prestes a fazer (URL de download, assinatura, caminho de instalação) e faz uma pausa de 5 segundos para lhe dar uma janela de Ctrl+C. O código-fonte encontra-se em TOT-Concept/ee-tunnel (MIT). Os utilizadores de Windows usam install.ps1 em alternativa.
Execute ee-tunnel pair. Abre-se um separador do navegador em /tunnel/connect com um código de 6 caracteres. Confirme a etiqueta do dispositivo e clique em Ligar.
ee-tunnel pair --server https://entityenricher.ai Open this URL in your browser to confirm pairing: https://entityenricher.ai/tunnel/connect?code=9KV-DU6 Code: 9KV-DU6 Waiting for confirmation...
Nunca copia nem cola um token. O navegador vê apenas os metadados do túnel; a CLI recebe as suas credenciais através do seu próprio canal de polling.
Execute ee-tunnel. O indicador de estado no separador Túneis muda para Ligado em segundos. Depois clique em Descobrir modelos no fornecedor Ollama em Modelos e preços para importar automaticamente todos os modelos de chat instalados localmente.
O emparelhamento usa um fluxo de código de dispositivo ao estilo OAuth (formato RFC 8628). O utilizador escreve um código curto num navegador em vez de copiar e colar um token. O navegador só vê os metadados do túnel; a CLI recebe o seu token de atualização diretamente pelo seu próprio canal de polling — resgate único.
laptop entity-enricher browser
│ │ │
│── ee-tunnel pair ──────▶ │ │
│ --server URL │ │
│ │ │
│ POST /api/tunnel/ │ │
│ device-code │ │
│ ───────────────────────▶ │ │
│ ◀── { device_code, │ │
│ user_code='9KV-DU6', │ │
│ verification_uri } │ │
│ │ │
│ prints URL, opens │ │
│ browser at /tunnel/ │ │
│ connect?code=… ──────────────────────────────────────▶│
│ │ │
│ │ POST /api/tunnel/confirm/ │
│ │ {user_code} │
│ │ body: { label } │
│ │ Authorization: Bearer │
│ │ <user JWT, role=owner> │
│ │ ◀──────────────────────────── │
│ │ • create tunnel_credentials │
│ │ • mark device_code complete │
│ │ with refresh_token │
│ │ ────────────────────────────▶│
│ │ 200 { tunnel metadata } │
│ │ │
│ POST /api/tunnel/poll │ │
│ ───────────────────────▶ │ │
│ ◀── { status:'ok', │ │
│ refresh_token, │ │
│ server_url, │ │
│ tunnel_id } │ │
│ │ │
│ persist token mode 0600 │ │
│ ✓ Paired │ │Depois de ligado, o seu Ollama em túnel é apenas mais um provedor de LLM no que diz respeito ao resto da plataforma. Multiexpertise, fusão, lote — tudo funciona sem alterações.
enrichment job
│
▼
agent_factory → Ollama provider, base_url=http://ollama.acme.tunnel
│
▼
custom httpx transport ← intercepts *.tunnel hosts
│
▼
TunnelSession (one per laptop)
│ frames request: { id, method, path, headers, body_b64 }
▼
WebSocket ──────────────────────▶ ee-tunnel CLI
│
▼
localhost:11434
(your local Ollama)
│
response_start, response_chunk, ...
◀──────────────────────────────────┘
│
▼
pydantic_ai consumes streaming body → enrichment recordVários enriquecimentos em curso partilham um único WebSocket de túnel. Cada pedido recebe um UUID; as frames são desmultiplexadas por id em ambas as extremidades, para que as chamadas concorrentes (por exemplo, multi-especialização) funcionem naturalmente.
As respostas em streaming (stream=true do Ollama) transitam como uma sequência de frames response_chunk, para que as atualizações da interface, token a token, permaneçam incrementais mesmo através do túnel.
Um proprietário da organização clica em "Novo Túnel Ollama", introduz um rótulo e confirma. A plataforma atribui as credenciais.
No seu portátil, execute o instalador de uma linha e `ee-tunnel pair`. Abre-se um separador do navegador — confirme com a mesma conta Entity Enricher.
Execute `ee-tunnel`. A CLI abre um único WebSocket HTTPS de saída. O novo fornecedor aparece na sua lista de modelos em segundos.
Clique em Descobrir Modelos — todos os modelos no seu Ollama local são importados automaticamente com o comprimento de contexto e as capacidades reais. Enriqueça como habitualmente.
Um clique na interface encerra o WebSocket e invalida as credenciais de imediato.
O túnel foi concebido para adicionar a menor superfície de ataque possível. O rascunho anterior da funcionalidade utilizava um servidor SSH público numa nova porta; substituímo-lo pelo multiplexador WebSocket em processo para eliminar totalmente a superfície de ataque do SSH.
Tudo passa pelo ingress :443 existente — o mesmo endpoint TLS da aplicação web. Sem servidor SSH, sem porta Ollama exposta.
A CLI inicia o WebSocket. O seu portátil nunca aceita ligações de entrada — a firewall da sua rede doméstica não precisa de mudar.
Um túnel está associado a uma única organização. Outros inquilinos na plataforma não o podem ver, selecionar nem invocar. Os administradores de sistema têm visibilidade entre organizações por conceção.
A revogação remove as credenciais da base de dados. O pedido seguinte falha com 401. O WebSocket ativo é removido em ~1 segundo.
O fluxo browser-OAuth gere as credenciais de ponta a ponta. O browser nunca vê o seu refresh token; a CLI recebe-o diretamente através do seu canal de polling.
5 túneis ativos por organização por predefinição; limite de 16 MB por frame WebSocket de entrada; erros 402 estruturados quando a quota é excedida.
Proteção contra SSRF. A funcionalidade de túnel também colmata uma lacuna pré-existente: o campo specific_endpoint nos fornecedores Ollama é agora validado contra uma regex de lista de permissões, para que IPs privados, loopback e nomes de serviços do Docker compose nunca possam ser usados como URL de fornecedor.
| Comando | O que faz |
|---|---|
| ee-tunnel pair --server URL | Emparelhamento Browser-OAuth. Abre automaticamente o URL de verificação. |
| ee-tunnel pair --server URL <token> | Emparelhamento manual com um refresh token copiado da interface (alternativa para ambientes headless). |
| ee-tunnel | Ligue e sirva. Reconecta com recuo exponencial (1s → 30s) em quedas transitórias. |
| ee-tunnel status | Mostrar o estado de emparelhamento, o URL do servidor, o URL do Ollama configurado e a etiqueta. |
| ee-tunnel disconnect | Esquecer as credenciais locais. Não revoga do lado do servidor; utilize a interface para isso. |
| ee-tunnel version | Versão para impressão. |
Se o seu Ollama estiver à escuta numa porta diferente, defina EE_TUNNEL_OLLAMA_URL ou passe --ollama URL no momento do emparelhamento.
macOS · ~/Library/Application Support/ee-tunnel/
Linux · ~/.config/ee-tunnel/
Windows · %APPDATA%\ee-tunnel\
| Tunnels ativos por organização | 5 (predefinição) |
| TTL do refresh-token | 365 dias |
| TTL do token de acesso | 15 minutos |
| TTL de emparelhamento | 10 minutos |
| Máximo de frame WebSocket de entrada | 16 MB |
| Tamanho do bloco de saída (CLI) | 16 KB |
| Intervalo de heartbeat | 30 segundos |
Não. A CLI inicia um WebSocket de saída. O seu portátil nunca aceita ligações de entrada e a sua porta Ollama permanece associada a localhost.
A CLI termina de forma controlada quando há desconexão. Retomar o portátil e voltar a executar o ee-tunnel religa com as credenciais existentes. Os enriquecimentos em execução enquanto o túnel está inativo falham com um ConnectError limpo.
Não. Cada túnel está associado a uma organização. Outros inquilinos na plataforma não o podem ver, selecionar ou invocar. Os administradores de sistema podem ver todos os túneis intencionalmente (tal como as chaves de API globais).
Quase sempre — apenas é necessária a porta de saída :443. O mesmo caminho que a aplicação web utiliza.
Clique em "Rodar token" no separador Túneis. O token antigo é invalidado imediatamente; a janela mostra um novo comando de emparelhamento para o seu portátil.
Sim — a CLI reencaminha HTTP arbitrário. Defina EE_TUNNEL_OLLAMA_URL para qualquer endpoint local compatível com OpenAI. Tudo o que fale o /v1/chat/completions ou /api/tags do Ollama irá funcionar.
A CLI e o instalador têm licença MIT e residem num repositório público para que qualquer pessoa possa auditar o que corre na sua máquina.
Fonte: github.com/TOT-Concept/ee-tunnel
Versões: github.com/TOT-Concept/ee-tunnel/releases — cada binário é assinado com cosign antes da publicação.
Audite o instalador: curl -fsSL https://entityenricher.ai/install.sh | less