◦ Cookbook · receitas práticas

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ê.

Parte 1

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.

1.1

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 é worker

Quem precisa usar GPU. Aluga horas e paga por segundo.

Quem é miner

Quem tem placa de vídeo parada. Põe pra alugar e ganha enquanto a máquina trabalha.

Como pago

Crédito pré-pago no site. Cada 10 segundos a sessão tira o valor proporcional do seu saldo.

1.2

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.

  1. 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.
  2. Fazer login no programa. Mesma conta que você usa no site da HAON. Se ainda não tem, cria em 30 segundos.
  3. 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.
  4. Pedir pro ChatGPT escrever o chatbot pra você. Abre o ChatGPT, Claude ou Gemini, e cola o prompt:
Prompt para colar no ChatGPT/Claude/Gemini· texto
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.

1.3

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.

  1. Abre o HAON Worker, conecta num miner que ofereça ComfyUI.
  2. No seu computador, abre o ComfyUI normal (a interface que você já usa, ou baixa em comfyanonymous/ComfyUI no GitHub).
  3. Em vez de rodar o backend localmente, abre as configurações e troca o server address de http://127.0.0.1:8188 pra http://127.0.0.1:22434. Esse é o tunel HAON — o ComfyUI nem percebe que a placa está em outra máquina.
  4. 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.

1.4

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:

Pedir um chatbot web em Flask· texto
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.
Pedir um script de geração de imagem· texto
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).
Pedir uma planilha que usa IA· texto
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.
Parte 2

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.

2.0

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.

RuntimeRotas mais usadasNota
Ollama/api/generate · /api/chat · /v1/chat/completions · /v1/embeddingsAceita tanto a API nativa do Ollama quanto a OpenAI-compatible.
vLLM/v1/completions · /v1/chat/completions · /v1/models100% OpenAI-compatible. Suporta streaming via SSE.
ComfyUI/prompt · /history · /queue · /view · /wsWebSocket /ws atravessa o túnel; use ws://127.0.0.1:22434/ws.
TGI (HuggingFace)/generate · /generate_stream · /v1/chat/completionsRota OpenAI-compatible disponível desde TGI 1.4.
Custom HTTPqualquer rota que o miner expôsTúnel é cego — encaminha cada requisição como veio.

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.

Receita 1

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.

chat_ollama.py· python
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)
Receita 2

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).

raw_post.py· python
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"])
Receita 3

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.

chat.js· javascript
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?"));
Receita 4

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:

api.py — FastAPI + httpx assíncrono· python
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"]}
Receita 5

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:

comfy_client.ts — config· typescript
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;
}
Receita 6

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.

vllm_call.py· python
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)
Receita 7

LangChain / LiteLLM apontando base_url pro tunel

LangChain e LiteLLM aceitam base_url/ api_base directly. Sem patch, sem provider custom.

langchain_haon.py· python
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)
Receita 8

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.

app.py· python
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)
Parte 3

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.

3

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.

Chatbot CLI minimalista (Python)· prompt
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.
Backend FastAPI + frontend HTML· prompt
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.
Geração de imagens via ComfyUI· prompt
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.
Classificação em lote (CSV)· prompt
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.
Embeddings + busca semântica· prompt
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).