Pensa. Planeja. Executa.
Sua assistente de IA que não só conversa — ela age.
Português (Brasil) • English
A Nullain Agent é uma assistente inteligente com personalidade própria:
ela entende o que você precisa, organiza o caminho e coloca a mão na massa.
Não é só mais um chat.
É um espaço onde ideias viram ações — com clareza, ritmo e controle.
Nullain Agent · Pensa, planeja e executa ☠️☕
você fala → ela entende → planeja o passo a passo → executa → responde
| 1. Escuta | 2. Organiza | 3. Age |
| Você pede em linguagem natural | Ela monta o plano sem enrolação | Conecta com o que você usa no dia a dia |
Respostas em tempo real (texto que aparece enquanto ela pensa).
Sem parede de texto: ideias em listas, tabelas e blocos claros.
|
Chat limpo, escuro e moderno. |
O texto nasce na hora. |
|
Ela se liga às ferramentas que você já usa |
Você define o que está ligado. |
| Momento | O que você sente |
|---|---|
| Abre | Tela limpa, identidade forte, zero ruído |
| Pede | Uma frase basta — sem formulários eternos |
| Acompanha | Status claros: pensando · conectando · escrevendo |
| Recebe | Resposta estruturada, útil, pronta para usar |
- Quem quer um assistente de verdade, não só um gerador de texto
- Quem vive entre várias ferramentas e quer um ponto único de comando
- Quem valoriza design escuro, minimal e profissional
- Quem prefere open-source e dono da própria stack
clareza > volume
ação > teoria
controle > automação cega
estilo > template genérico
A Nullain não implementa o próprio loop de agente. Ela é um produto construído sobre o Nullain Agent SDK (nullain-sdk no PyPI), consumido como dependência comum — o SDK cuida do raciocínio, ferramentas, permissões, memória e persistência; este repositório cuida do produto: interface, autenticação, integrações de domínio e deploy.
flowchart TB
subgraph PROD["🖥️ Nullain Agent — este repositório"]
direction LR
UI(["Web UI<br/>SSE streaming"]) --> API(["FastAPI<br/>web/server.py"]) --> Bridge(["AgentBridge<br/>agent/bridge.py"])
end
subgraph SDKL["⚙️ Nullain Agent SDK — nullain-sdk"]
direction LR
Agent(["Agent"]) --> Loop(["Plan · Act · Verify"]) --> Perm(["PermissionPolicy"]) --> Tools(["ToolRegistry"])
end
subgraph DOMAIN["🧰 Ferramentas de domínio — este repositório"]
direction LR
Pay(["ZuckPay<br/>PIX · SPEI"]) --- Img(["Wavespeed<br/>imagem"]) --- Rag(["RAG<br/>Qdrant"]) --- Box(["Sandbox<br/>e2b · docker · aio"]) --- Mcp(["Composio MCP"])
end
subgraph STATE["💾 Estado"]
direction LR
PG(["PostgresEventStore<br/>ou SQLite"]) --- QD(["Qdrant<br/>por tenant"]) --- RD(["Redis<br/>cache · métricas"])
end
Bridge --> Agent
Tools --> DOMAIN
Agent --> PG
Rag --> QD
API --> RD
classDef prod fill:#14b8a6,stroke:#0f766e,color:#fff
classDef sdk fill:#6366f1,stroke:#4338ca,color:#fff
classDef domain fill:#f59e0b,stroke:#b45309,color:#fff
classDef state fill:#64748b,stroke:#334155,color:#fff
class PROD prod
class SDKL sdk
class DOMAIN domain
class STATE state
| Camada | Quem resolve | Onde |
|---|---|---|
| Interface, autenticação, SSE | Este repositório | web/server.py, web/static/ |
| Construção e cache do agente | Este repositório | agent/bridge.py |
| Loop Plan/Act/Verify, contexto, memória | SDK | nullain-sdk |
| Permissões e sandbox de SO | SDK | nullain-sdk |
| Ferramentas de arquivo, shell, git, web | SDK | nullain-tools |
| Pagamentos, imagem, RAG, sandbox remoto | Este repositório | agent/bridge_tools.py, agent/rag_tools.py |
O AgentBridge (agent/bridge.py) constrói um Agent por (thread_id, usuário, modelo) e usa quatro pontos de extensão do SDK:
- Identidade própria. Escreve
SOUL.mdeAGENTS.mdno workspace do agente no boot. OPromptAssemblerdo SDK os lê e oSOUL.mdsubstitui a identidade padrão (que é a de um agente de programação) pela de uma assistente de uso geral — junto com regras explícitas de escolha de ferramenta. - Ferramentas de domínio. Registra pagamentos, geração de imagem, RAG, sandbox e MCP no mesmo
ToolRegistrydas ferramentas embutidas, comPermissionLevelpor ferramenta. - Permissão fail-closed. O
permission_callbackaprova automaticamente apenaswrite_fileebash— contidos no workspace isolado do agente. Qualquer outra ferramentaASK(pagamentos, ações Composio) é negada até existir um fluxo real de confirmação humana. - Estado compartilhado. Com
SUPABASE_DB_URLconfigurada, usa oPostgresEventStoredo SDK — um único pool no processo, compartilhado por todos os agentes em cache, o que permite múltiplas réplicas lendo a mesma história de sessão. Sem ela, o SDK cai no SQLite local.
| Runtime | Python 3.12 · FastAPI · uvicorn |
| Engine | nullain-sdk[rag,postgres] |
| Interface | HTML/CSS/JS sem framework, streaming por SSE |
| Eventos | Postgres/Supabase quando configurado, SQLite como padrão |
| Memória longa | Qdrant, uma coleção com isolamento por tenant_id |
| Sandbox | e2b · Docker local · AIO Sandbox (com browser e VNC ao vivo) |
| Cache/métricas | Redis (opcional) |
Três mecanismos, todos ancorados no e-mail do usuário autenticado:
- A chave de cache do agente inclui o usuário, então um
thread_idreaproveitado nunca serve oToolRegistryde outra pessoa - As credenciais de pagamento são capturadas por closure na construção da ferramenta — o modelo não consegue informá-las como argumento
- A memória RAG é filtrada por
tenant_idem toda escrita e busca
Todas as variáveis vivem em .env.example. As principais:
# Modelo
LLM_PROVIDER=ollama # ollama · openai · xai
LLM_MODEL=glm-5.2:cloud
OLLAMA_API_KEY=...
# Estado
SUPABASE_DB_URL=... # vazio = SQLite local
QDRANT_URL=... # memória longa (opcional)
REDIS_URL=... # cache/métricas (opcional)
# Sandbox
SANDBOX_PROVIDER=aio # e2b · docker · aio · vazio = desligado
SANDBOX_URL=http://localhost:8080
# Comportamento do SDK (consumidas pelo nullain-sdk)
NULLAIN_AGENT__PLAN_COMPLEXITY_THRESHOLD=high # planeja só trabalho complexo
NULLAIN_WEB_FETCH__SEARXNG_BASE_URL=http://searxng:8080As duas últimas são do próprio SDK, expostas pelo
NullainSettingsviapydantic-settings. Qualquer campo aninhado é configurável assim, com o prefixoNULLAIN_e__separando os níveis — sem precisar tocar no código.
Roda em qualquer plataforma que execute Docker. Em produção usamos Coolify (Docker Compose + Force deploy without cache quando o requirements.txt muda). O repositório também traz manifestos prontos para Railway, Render e Fly.io — veja DEPLOY.md.
docker compose up --build # local
python main.py --web # sem container, porta 8000
python main.py # CLI no terminalDistribuída sob a licença MIT.
Use, adapte e evolua — com o espírito Nullain.
Nullain Agent
Pensa · Planeja · Executa
movida pelo Nullain Agent SDK
feito com intenção · por netty-linux

