Pular para o conteúdo
API HTTP local
API, CLI e MCP

API HTTP local

Gere EPS, SVG e PNG, converta LaTeX e MathML, reconheça imagens e acompanhe vínculos pela API HTTP do NeoMath, que só atende no próprio computador e exige token.

Nesta página

A API HTTP local é um servidor que só atende no próprio computador (127.0.0.1). É ela que o plugin do InDesign usa, e serve também para scripts e outros programas em qualquer linguagem. A referência de cada rota está em Referência da API HTTP.

Iniciar#

Há dois servidores com a mesma API:

Comando Para quem Rotas extras
NeoMath --servidor o aplicativo instalado; é o que o InDesign usa /v1/ocr, /v1/quimica, /v1/editar, /v1/vinculos
neomath servidor a linha de comando (sem as rotas do aplicativo) /v1/vinculos; as demais respondem 501
Terminal
NeoMath --servidor
neomath servidor --porta 8790

O instalador pode deixar o NeoMath --servidor iniciando com o sistema (ligado por padrão no Windows e no Linux). Ele não abre janela e usa a pasta do usuário como raiz.

Opção Padrão O que faz
--porta N 8790 porta
--token T gerado token fixo; sem a opção, um token aleatório de 64 caracteres a cada início
--sem-token desliga o token (só para testes)
--origem URL nenhuma origem de página web autorizada (repetível)
--raiz PASTA desligado (neomath), pasta do usuário (NeoMath) libera /v1/lote, /v1/editar e /v1/vinculos só dentro dessa pasta
--threads N 4 pedidos atendidos ao mesmo tempo (1 a 16)
--sessao ARQ pasta de dados onde gravar o servidor.json

Porta e token: servidor.json#

Ao iniciar, o servidor grava o servidor.json, com permissão só do usuário:

Sistema Caminho
Windows %LOCALAPPDATA%\NeoMath\servidor.json
macOS ~/Library/Application Support/NeoMath/servidor.json
Linux $XDG_STATE_HOME/neomath/servidor.json ou ~/.local/state/neomath/servidor.json
JSON
{ "porta": 8790, "token": "9f2c…", "url": "http://127.0.0.1:8790", "pid": 4242, "versao": "0.2.0" }

Os clientes leem a porta e o token desse arquivo.

Autenticação#

Todo pedido, menos GET /v1/saude, leva o token:

HTTP
Authorization: Bearer <token>

Também valem X-NeoMath-Token: <token> e ?token=<token> na URL, para quem não consegue mandar cabeçalhos.

Exemplos#

curl

Terminal
TOKEN=$(python3 -c "import json,os;print(json.load(open(os.path.expanduser('~/.local/state/neomath/servidor.json')))['token'])")
curl -s http://127.0.0.1:8790/v1/saude
curl -s -H "Authorization: Bearer $TOKEN" -X POST http://127.0.0.1:8790/v1/svg -d '{"mathml":"\\frac{a}{b}"}' -o eq.svg
curl -s -H "Authorization: Bearer $TOKEN" -X POST "http://127.0.0.1:8790/v1/eps?bruto=1" -d '{"mathml":"\\ce{2 H2 + O2 -> 2 H2O}","opcoes":{"cor":[0,100,100,0]}}' -o reacao.eps

JavaScript

JavaScript
const r = await fetch("http://127.0.0.1:8790/v1/eps", {
  method: "POST",
  headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` },
  body: JSON.stringify({ mathml: "x^2 + y^2 = r^2", opcoes: { cor: "#1F4E79" } }),
});
const g = await r.json();
console.log(g.largura_pt, g.altura_pt, g.linha_base_pt);

Python

Python
import json, os, urllib.request
s = json.load(open(os.path.expandvars(r"%LOCALAPPDATA%\NeoMath\servidor.json")))
pedido = urllib.request.Request(s["url"] + "/v1/png?dpi=600", data=json.dumps({"mathml": r"\sqrt{2}"}).encode(),
                                headers={"Authorization": "Bearer " + s["token"], "Content-Type": "application/json"})
open("raiz.png", "wb").write(urllib.request.urlopen(pedido).read())

O campo mathml aceita MathML ou LaTeX: o NeoMath reconhece sozinho.

Opções de saída#

Chave Exemplo Efeito
neqp texto do estilo estilo (fontes, tamanhos, espaçamentos)
cor "#1F4E79", "red", [0,100,100,0], [31,78,121] cor da equação (lista de 4 é CMYK)
cor_em_tudo true pinta também traços e frações
tamanho 18 tamanho do corpo em pt (1 a 1000)
fonte "Arial" fonte do texto, das variáveis e dos números

Respostas e erros#

Código Quando
200 sucesso
400 JSON ou opções inválidas
401 sem token ou token errado
403 origem de navegador não autorizada, ou pasta fora de --raiz
404 rota desconhecida
413 corpo maior que 16 MB (64 MB em /v1/lote-zip)
421 Host diferente de 127.0.0.1:<porta> ou localhost:<porta> (proteção contra DNS rebinding)
422 construção não suportada, ou imagem do OCR não reconhecida
501 rota que só existe no servidor do aplicativo
JSON
{ "status": "erro", "codigo": "token", "erro": "token ausente ou inválido …" }

Fluxo de edição#

É assim que o InDesign mantém as equações em dia:

  1. O cliente gera o EPS com "formato": "neof" e grava no documento.
  2. Chama POST /v1/editar com o caminho; o aplicativo abre o arquivo e devolve modificado_ms e tamanho.
  3. Consulta POST /v1/vinculos a cada 2 segundos.
  4. Quando a data ou o tamanho mudam, o arquivo foi salvo no NeoMath: o cliente atualiza o vínculo e recupera o código novo com /v1/abrir e /v1/para-latex.

Segurança#

  • Escuta só em 127.0.0.1 e recusa outro Host.
  • Pedidos de navegador só são aceitos das origens passadas em --origem.
  • Rotas que tocam o disco ficam presas à pasta --raiz (com links simbólicos resolvidos).
  • As rotas antigas sem /v1 continuam funcionando para clientes antigos, também com token.