Sobre o projeto

Liapi é um serviço HTTP autohospedado que expõe externamente uma API compatível com OpenAI e agrega internamente múltiplos serviços de modelos upstream (OpenAI, Claude, OpenRouter, SiliconFlow, Ollama, etc.). O projeto é implementado em Go 1.22+ usando apenas a biblioteca padrão, sem dependências de terceiros, gerando um binário com um único go build. Funcionalidades principais: - Autenticação unificada: tokens de cliente e chaves de API upstream são completamente separados, com suporte a três origens: Bearer / x-api-key / ?token=, usando resumo SHA-256 + comparação em tempo constante para prevenir ataques de temporização, com tokens mascarados nos logs. - Roteamento de modelos: ordenação por priority crescente, com seleção aleatória ponderada por weight dentro do mesmo grupo de prioridade; suporte a cadeias explícitas de fallback (fallbacks), aliases exatos de modelos e regras de alias por regex (incluindo sobrescrita de parâmetros). - Failover: decisão de troca concluída antes do primeiro WriteHeader, troca automática de upstream em 429/5xx, falha rápida sem retry em 4xx (exceto 429); suporte a retry interno dentro de um único upstream. - Encaminhamento em streaming: detecção de text/event-stream com cópia linha a linha e Flush, streaming sem timeout rígido dependendo da desconexão do cliente, interrompendo a leitura do upstream e liberando a conexão quando o cliente desconecta. - Limitação de taxa: limitação por janela deslizante, com suporte a número de requisições por minuto por token e cota diária em UTC, com possibilidade de sobrescrita individual por dispositivo. - Logs e estatísticas: arquivos de log JSONL + buffer circular em memória, registrando caminho, modelo, upstream, status, latência, uso de tokens e estimativa de custo; suporte a agregação por upstream/modelo/token/período, fornecendo latência P50/P90/P99 e distribuição de códigos de erro. - Verificação de saúde: goroutine em segundo plano que sonda periodicamente os upstreams em paralelo, marcando como não saudável após N falhas consecutivas, evitando-os automaticamente no roteamento (configurável), com fallback para todos quando todos falham. - Painel de gerenciamento web: SPA estática construída com Nuxt 4, embutida no binário via go:embed, com suporte a gerenciamento de upstreams/tokens/dispositivos, recarga a quente de configuração, consulta de logs, exportação de estatísticas e testes de depuração. A API de gerenciamento oferece CRUD completo: gerenciamento de upstreams, gerenciamento de tokens de dispositivos (armazenando apenas hash SHA-256, com texto claro emitido apenas uma vez), importação/exportação de configuração (com suporte a importação no formato OneAPI channels), agregação de estatísticas e exportação CSV/JSON, métricas Prometheus. O login do painel de gerenciamento usa nome de usuário + senha (hash com sal PBKDF2-HMAC-SHA256), emitindo tokens de sessão de curta duração, estritamente separados dos tokens de chamada de negócio. O arquivo de configuração exige permissão 0600 e é validado na inicialização. A API de negócio é compatível com o formato OpenAI, cobrindo /v1/chat/completions, /v1/completions, /v1/embeddings, /v1/models, /v1/messages (formato nativo do Claude); o cliente só precisa alterar a base_url para usar.