Conecte qualquer app
ao GPU alugado.
Quando o worker.exe está conectado, ele expõe um endpoint local em http://127.0.0.1:22434 que faz proxy direto pra GPU do miner. Tudo que fala HTTP — Python, JavaScript, ChatGPT, Ollama, ComfyUI, vLLM, LangChain, n8n, seu chatbot caseiro — funciona sem mudar uma linha além da URL base.
Esse cookbook tem três trilhas: a primeira é pra quem nunca abriu terminal na vida, a segunda traz snippets prontos pra dev, e a terceira são prompts que você cola no ChatGPT/Claude pra ele escrever o código pra você.
Para quem nunca
abriu terminal
na vida.
A ideia é simples: você baixa o programa, ele aparece como um endereço local na sua máquina, e qualquer chatbot, gerador de imagem ou app você aponta pra esse endereço.
O que é HAON em 2 minutos
Pensa numa uber pra GPU. Em vez de comprar uma placa de R$ 15 mil pra rodar inteligência artificial 30 minutos por dia, você aluga as horas de quem já comprou — paga centavos por minuto, só enquanto está usando.
Quem aluga (o worker) baixa um programinha chamado HAON Worker. Quem oferece a placa (o miner) baixa o HAON Agent. Os dois se encontram pelo nosso site, fecham uma sessão e abrem um túnel direto entre as duas máquinas.
Pra você, do lado do worker, o resultado é um endereço local: http://127.0.0.1:22434. Tudo que mandar pra esse endereço sai do túnel direto na GPU alugada — modelo de IA, gerador de imagem, o que for. Você nem percebe que a placa está do outro lado do mundo.
Quem precisa usar GPU. Aluga horas e paga por segundo.
Quem tem placa de vídeo parada. Põe pra alugar e ganha enquanto a máquina trabalha.
Crédito pré-pago no site. Cada 10 segundos a sessão tira o valor proporcional do seu saldo.
Como rodar um chatbot meu (Ollama)
Vamos do zero ao chatbot funcionando em 4 passos. Você não vai escrever código — vai pedir pro ChatGPT escrever pra você no passo 4.
- Baixar o HAON Worker. Vai na página inicial, clica em Download HAON Worker.exe, abre o arquivo. Não precisa ser administrador, não tem terminal.
- Fazer login no programa. Mesma conta que você usa no site da HAON. Se ainda não tem, cria em 30 segundos.
- Conectar num miner que ofereça Ollama. O programa abre uma janelinha listando os miners disponíveis, cada um diz qual runtime tem (Ollama / ComfyUI / vLLM). Pega um Ollama, clica Connect. Em 5 segundos aparece Conectado · http://127.0.0.1:22434.
- Pedir pro ChatGPT escrever o chatbot pra você. Abre o ChatGPT, Claude ou Gemini, e cola o prompt:
Crie um script Python simples que use a biblioteca OpenAI SDK
para abrir um chatbot no terminal. O chatbot deve enviar mensagens
para o endpoint http://127.0.0.1:22434/v1/chat/completions, modelo
"llama3.2". O endpoint é OpenAI-compatible. Use api_key="haon-tunnel"
(qualquer string serve, não é validado). Mantenha o histórico da
conversa entre as mensagens.A IA vai te devolver um arquivo .py de uns 20 linhas. Pede pra ela explicar como rodar, ela vai te mandar algo como pip install openai e depois python chatbot.py. Pronto. Está conversando com a GPU alugada.
Gerar imagens com ComfyUI rodando na máquina alugada
O ComfyUI é o programa mais popular pra gerar imagens com IA (Stable Diffusion, SDXL, Flux). Funciona com uma interface de fluxograma no navegador. Normalmente ele precisa de uma placa potente rodando na sua máquina; com HAON, a placa pode estar na casa do miner.
- Abre o HAON Worker, conecta num miner que ofereça ComfyUI.
- No seu computador, abre o ComfyUI normal (a interface que você já usa, ou baixa em
comfyanonymous/ComfyUIno GitHub). - Em vez de rodar o backend localmente, abre as configurações e troca o server address de
http://127.0.0.1:8188prahttp://127.0.0.1:22434. Esse é o tunel HAON — o ComfyUI nem percebe que a placa está em outra máquina. - Roda seu workflow normal. As imagens são geradas na GPU alugada e descem pelo túnel direto na sua tela.
Pode ser que algum miner exponha o ComfyUI numa porta diferente (8188, 8189). O painel do worker mostra a URL exata que você deve copiar pra cada sessão.
Como pedir pro ChatGPT/Claude/Gemini fazer pra você
A regra de ouro: conta o que você quer, diz que o endpoint é OpenAI-compatible em http://127.0.0.1:22434, e peça o código completo. As IAs modernas conhecem o protocolo OpenAI muito bem — quando você diz "OpenAI-compatible", elas escrevem o código direito de primeira.
Cola um desses três modelos no ChatGPT/Claude/Gemini conforme o que você precisa:
Crie um app Flask em Python com uma página HTML simples que tenha
uma caixinha de chat. Quando o usuário envia uma mensagem, o backend
deve chamar http://127.0.0.1:22434/v1/chat/completions (modelo
"llama3.2", endpoint OpenAI-compatible, api_key="haon-tunnel") e
retornar a resposta. Mostra o histórico da conversa na página.
Quero rodar com python app.py.Crie um script Python que conecte no ComfyUI rodando em
http://127.0.0.1:22434, envie o prompt "uma raposa de origami
laranja em fundo preto, 4k, cinematic" e baixe a imagem gerada
no arquivo saida.png. Use a API de fila do ComfyUI
(/prompt e /history).Crie um script Python que leia um arquivo CSV (clientes.csv com
colunas nome, email, mensagem) e, para cada linha, peça pro modelo
em http://127.0.0.1:22434/v1/chat/completions (modelo "llama3.2",
api_key="haon-tunnel") classificar a mensagem como "elogio",
"reclamação" ou "dúvida". Salva o resultado em saida.csv com uma
coluna nova chamada categoria.Para devs:
snippets prontos
copia, cola, roda.
Endpoint local OpenAI-compatible em http://127.0.0.1:22434. As receitas abaixo cobrem Python, JS, Flask, FastAPI, ComfyUI, vLLM, LangChain e um chatbot 24/7 completo. Todas as 8 receitas têm copy-to-clipboard.
Endpoint base & rotas
O worker.exe escuta em http://127.0.0.1:22434 por padrão (passa --port pra mudar). Tudo que chega ali entra no DataChannel WebRTC, sai do outro lado no haon-agent e bate no runtime que o miner anunciou. As rotas dependem do runtime — o túnel é transparente, não traduz HTTP.
Auth: o endpoint local não valida API key (o broker já autenticou a sessão WebRTC). Bibliotecas que exigem o campo aceitam qualquer string — usamos haon-tunnel por convenção. CORS: o worker injeta Access-Control-Allow-Origin: * nas respostas para permitir uso direto de SPAs locais.
Python + OpenAI SDK contra Ollama
OpenAI Python SDK funciona sem mudança nenhuma, basta sobrescrever base_url. api_key é obrigatório no SDK mas ignorado pelo túnel.
from openai import OpenAI
client = OpenAI(
base_url="http://127.0.0.1:22434/v1",
api_key="haon-tunnel",
)
resp = client.chat.completions.create(
model="llama3.2",
messages=[{"role": "user", "content": "Resuma o tunelamento WebRTC em 2 frases."}],
)
print(resp.choices[0].message.content)Python requests — chamada genérica
Sem dependências exóticas, útil pra runtimes que não falam o dialeto OpenAI (ex. ComfyUI, custom HTTP, alguns endpoints internos).
import requests
r = requests.post(
"http://127.0.0.1:22434/api/generate",
json={"model": "llama3.2", "prompt": "ping", "stream": False},
timeout=60,
)
r.raise_for_status()
print(r.json()["response"])JavaScript fetch num app web
O worker injeta Access-Control-Allow-Origin: *, então uma SPA servida em localhost:5173 ou localhost:3000 chama o túnel direto sem proxy. Em produção (HTTPS) precisa de um proxy reverso por causa de mixed content — mas pra dev local funciona puro.
async function ask(message) {
const r = await fetch("http://127.0.0.1:22434/v1/chat/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer haon-tunnel",
},
body: JSON.stringify({
model: "llama3.2",
messages: [{ role: "user", content: message }],
}),
});
const data = await r.json();
return data.choices[0].message.content;
}
console.log(await ask("Quanto é 2 + 2?"));Backend Flask/FastAPI delegando GPU pro tunel
Padrão comum: seu backend recebe a request do cliente, faz autenticação, e delega o trabalho pesado (LLM/embedding) pro túnel. Aqui em FastAPI:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import httpx
app = FastAPI()
TUNNEL = "http://127.0.0.1:22434/v1/chat/completions"
class Q(BaseModel):
pergunta: str
@app.post("/responder")
async def responder(q: Q):
async with httpx.AsyncClient(timeout=60) as c:
r = await c.post(TUNNEL, json={
"model": "llama3.2",
"messages": [{"role": "user", "content": q.pergunta}],
})
if r.status_code >= 400:
raise HTTPException(r.status_code, r.text)
return {"resposta": r.json()["choices"][0]["message"]["content"]}ComfyUI frontend custom apontando pro miner
Se você está embutindo o ComfyUI num app próprio (Electron, web, plugin de Photoshop), troca a base URL do client e o WebSocket:
export const COMFY_HOST = "127.0.0.1:22434";
export const COMFY_HTTP = `http://${COMFY_HOST}`;
export const COMFY_WS = `ws://${COMFY_HOST}/ws`;
// Submete um workflow.json (formato exportado pelo ComfyUI Web)
export async function submit(workflow: object, clientId: string) {
const r = await fetch(`${COMFY_HTTP}/prompt`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ prompt: workflow, client_id: clientId }),
});
return (await r.json()).prompt_id as string;
}HuggingFace transformers/diffusers via vLLM
Quando o miner roda vLLM (servidor HF de alta performance), você atinge qualquer modelo do HuggingFace Hub que ele tenha carregado. Mesmo dialeto OpenAI; model= é o repo-id que o miner anunciou.
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:22434/v1", api_key="haon-tunnel")
resp = client.chat.completions.create(
model="meta-llama/Meta-Llama-3.1-8B-Instruct",
messages=[
{"role": "system", "content": "Você é um assistente conciso."},
{"role": "user", "content": "Liste 3 vantagens do P2P GPU sharing."},
],
temperature=0.4,
max_tokens=300,
)
print(resp.choices[0].message.content)LangChain / LiteLLM apontando base_url pro tunel
LangChain e LiteLLM aceitam base_url/ api_base directly. Sem patch, sem provider custom.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="llama3.2",
base_url="http://127.0.0.1:22434/v1",
api_key="haon-tunnel",
temperature=0.2,
)
print(llm.invoke("Em uma frase: o que é HAON?").content)Chatbot 24/7 — Flask + Ollama + frontend HTML
Receita completa: backend Flask, frontend HTML/JS sem build, e chamada ao tunel. Roda com python app.py, abre em http://127.0.0.1:5000. Mantenha o worker.exe conectado e o chatbot atende clientes a noite toda usando GPU alugada.
from flask import Flask, request, jsonify, render_template_string
import requests
app = Flask(__name__)
TUNNEL = "http://127.0.0.1:22434/v1/chat/completions"
SYSTEM = "Você é o atendente da loja. Seja simpático, conciso, sempre responda em português."
PAGE = """<!doctype html>
<title>Atendimento 24/7</title>
<style>body{font-family:sans-serif;max-width:640px;margin:2rem auto}
#log{border:1px solid #ddd;padding:1rem;height:60vh;overflow:auto}
.u{color:#06c}.b{color:#080}</style>
<h1>Atendimento da loja</h1>
<div id="log"></div>
<form id="f"><input id="i" autofocus style="width:80%"><button>Enviar</button></form>
<script>
const log=document.getElementById('log'),i=document.getElementById('i'),f=document.getElementById('f');
const hist=[];
f.onsubmit=async e=>{e.preventDefault();const t=i.value.trim();if(!t)return;i.value='';
hist.push({role:'user',content:t});
log.innerHTML+='<p class=u><b>Você:</b> '+t+'</p>';
const r=await fetch('/chat',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({hist})});
const d=await r.json();hist.push({role:'assistant',content:d.reply});
log.innerHTML+='<p class=b><b>Loja:</b> '+d.reply+'</p>';log.scrollTop=log.scrollHeight};
</script>"""
@app.get("/")
def index():
return render_template_string(PAGE)
@app.post("/chat")
def chat():
hist = request.json.get("hist", [])
msgs = [{"role": "system", "content": SYSTEM}, *hist]
r = requests.post(TUNNEL, json={"model": "llama3.2", "messages": msgs}, timeout=60)
r.raise_for_status()
return jsonify(reply=r.json()["choices"][0]["message"]["content"])
if __name__ == "__main__":
app.run(port=5000)Não quer escrever código?
Cola no ChatGPT.
Esses prompts foram afinados pra que ChatGPT, Claude ou Gemini gerem código que já funciona contra o endpoint do worker. Pega, troca o que está em <colchete> pelo que você quer, e cola na IA da sua escolha.
Prompts prontos para colar em LLMs
Cada bloco abaixo é um prompt completo. Clica em Copiar, cola no ChatGPT/Claude/Gemini, ajusta o que está em <colchete>, e a IA gera o código pra você. Se o resultado não funcionar de primeira, manda a mensagem de erro de volta pra IA — ela conserta.
Crie um script Python que rode um chatbot no terminal usando a
biblioteca OpenAI SDK contra http://127.0.0.1:22434/v1/chat/completions,
modelo "llama3.2", api_key="haon-tunnel" (qualquer string serve,
não é validado). Mantém histórico em uma lista, usa input() em
loop. Print da resposta com prefixo "Bot:". Sai com Ctrl-C.Crie um app FastAPI em Python com um endpoint POST /chat que
recebe {pergunta:string} e devolve {resposta:string}. Use httpx
async para chamar http://127.0.0.1:22434/v1/chat/completions
(modelo "llama3.2", api_key="haon-tunnel"). Sirva também uma
página HTML estática em / com formulário e fetch para /chat.
Quero rodar com uvicorn app:app --reload.Crie um script Python que use a API REST do ComfyUI rodando
em http://127.0.0.1:22434 para gerar uma imagem. Submeta um
workflow básico de SDXL com prompt "<seu prompt aqui>" via POST
/prompt, faça polling em GET /history/<prompt_id> até completar,
e baixe a imagem final via GET /view. Salve em saida.png.Crie um script Python que leia um arquivo entrada.csv (colunas:
id, texto), e para cada linha chame o modelo em
http://127.0.0.1:22434/v1/chat/completions (modelo "llama3.2",
api_key="haon-tunnel") pedindo pra classificar o texto em uma
das categorias <suas_categorias>. Salve em saida.csv com a
coluna nova "categoria". Use barra de progresso (tqdm) e trate
erros HTTP sem parar o processamento.Crie um script Python que leia um arquivo texto.txt, divida em
parágrafos, gere embeddings pra cada parágrafo chamando
http://127.0.0.1:22434/v1/embeddings (modelo "nomic-embed-text",
api_key="haon-tunnel"), salve em embeddings.json. Depois aceite
uma query do usuário, gere o embedding dela e devolva os 3
parágrafos mais similares (cosine similarity). Tudo num arquivo
só, dependências mínimas (numpy + requests).