mangaba_ai
Health Pass
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Community trust — 207 GitHub stars
Code Pass
- Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
Framework profissional de orquestracao multi-agente em Python: crews, flows orientados a eventos, ReAct, RAG, memoria, MCP/A2A e multi-provider LLM
Mangaba AI
Framework profissional de orquestração multi-agente com ReAct reasoning, function calling nativo, RAG, memória persistente, protocolos A2A/MCP, vector stores e suporte resiliente a múltiplos provedores LLM.
Execute o exemplo abaixo em 1 comando (veja examples/quickstart.py):
pip install mangaba
export GOOGLE_API_KEY="sua-chave"
python examples/quickstart.py
Alternativa leve e completa a CrewAI + LangChain em um único pacote, com interoperabilidade real entre provedores, arquitetura resiliente e comunicação entre agentes via protocolos padrão.
Destaques da v4.0.0
- Flows — Orquestração orientada a eventos com
@start,@listen,@router, combinadoresand_/or_, estado tipado em Pydantic, persistência em SQLite (@persist, com resume e fork) e gráfico de execução em HTML viaflow.plot() - Knowledge — Base de conhecimento separada da memória: PDF, DOCX, Excel, JSON, CSV, URL e diretórios inteiros, com
score_thresholde escopo por agente ou por crew - Memória unificada — Classe
Memorycom recall semântico composto (similaridade + recência + importância), extração automática de fatos, consolidação de duplicatas e gravação assíncrona - CLI —
mangaba create/run/test/train/chat/config/reset-memories/replay/install, com projetos declarados emagents.yaml/tasks.yaml - Treino e avaliação —
mangaba train(loop de feedback humano) emangaba test(nota de qualidade 1–10 por tarefa e por agente) - Modelos locais — Ollama e qualquer servidor OpenAI-compatible (vLLM, LM Studio, llama.cpp, LocalAI), com tool calling nativo e fallback automático
- MCP (Model Context Protocol) — Consuma ferramentas de servidores MCP externos como
BaseToolnativas, via stdio ou HTTP - Human-in-the-loop —
human_input=Truepausa e devolve o trabalho ao agente com as notas do revisor; revisores plugáveis para rodar fora do terminal - Reasoning e Planning —
Agent(reasoning=True)planeja e critica o próprio plano antes de agir;Crew(planning=True)planeja todas as tarefas antes de começar - Manager dedicado —
manager_agent/manager_llmdelega dinamicamente ao especialista certo e devolve o trabalho quando reprova - Guardrails com juiz LLM — Critérios em linguagem natural; a rejeição volta como feedback para o agente corrigir, em vez de repetir o mesmo prompt
- Multimodal —
Agent(multimodal=True)aceita imagens junto do texto - Observabilidade — OpenTelemetry, Langfuse, MLflow e Arize Phoenix; um
trace_idúnico costura a execução inteira, inclusive entre threads
Compatibilidade com CrewAI
O Mangaba implementa as principais primitivas do CrewAI OSS, com a mesma nomenclatura quando aplicável:
- Crew —
akickoff(),kickoff_for_each(),replay(task_id),train()/test(),before/after_kickoff_callbacks,output_log_file,usage_metrics/token_usage,CrewOutput(raw, pydantic, json_dict),function_calling_llm - Task —
output_pydantic/output_json,guardrail(singular),max_retries,depends_on,condition - Agent —
max_iter,max_retry_limit,kickoff()direto,step_callbackpor etapa - Tools —
arun()assíncrono,cache_function,max_retries,max_usage_count - Memória multiusuário —
Memory(user_id=..., namespace=...)com isolamento por usuário,remember/recall/forget/remember_many, recall profundo (depth="deep") e provedor externoMem0Memory - Enterprise leve — Redação de PII (
redact_pii), auditoria em JSONL com RBAC (AuditLogger,Role) e estimativa de custo/métricas Prometheus (estimate_cost,CrewOutput.cost())
Funcionalidades consolidadas (desde v3.0)
- OpenRouter Native Support — Roteamento dinâmico com fallback automático entre modelos
- Multi-Provider Interoperability — Misture agentes de diferentes provedores (ex: Gemini + Llama) na mesma Crew
- ReAct Reasoning — Loop Thought, Action, Observation com function calling nativo
- 7 Provedores LLM — Google Gemini, OpenAI GPT, Anthropic Claude, HuggingFace, OpenRouter, Ollama e servidores OpenAI-compatible
- 4 Processos de Crew — Sequential, Hierarchical, Parallel (asyncio), Consensual
- Tool System — Decorator
@tool, schemas Pydantic, JSON schema automático para LLM - RAG Pipeline — Document loaders, text splitters, embeddings, vector store, retriever
- Memória — Curto prazo (sliding window), longo prazo (SQLite), entidades
- Guardrails — Validação de tamanho, filtro de conteúdo, schema validation
- Observabilidade — EventBus com mais de 20 tipos de evento, callbacks console/arquivo
- Workflow Engine — Pipelines com stages sequenciais, paralelos e condicionais
- Cache e Retry — Cache LRU + disco (SQLite), retry com backoff exponencial + fallback automático
Instalação
pip install mangaba
# Com RAG e embeddings
pip install mangaba[all]
# Desenvolvimento
pip install mangaba[dev]
Quick Start
Agente simples com ferramenta
from mangaba.core import Agent, Task, Crew, Process, tool
from mangaba.core.types import LLMConfig
@tool
def search(query: str) -> str:
"""Search the web for information."""
return f"Results for: {query}"
researcher = Agent(
role="Research Analyst",
goal="Find accurate information",
backstory="Expert researcher with 10 years of experience",
tools=[search],
llm_config=LLMConfig(provider="google", model="gemini-2.5-flash", api_key="sua-chave"),
)
task = Task(
description="Research the latest AI trends in 2026",
expected_output="A list of the top 5 trends with explanations",
agent=researcher,
)
crew = Crew(
agents=[researcher],
tasks=[task],
process=Process.SEQUENTIAL,
)
result = crew.kickoff()
print(result.final_output)
Multi-Provider Crew com fallback
from mangaba.core import Agent, Task, Crew
from mangaba.core.crew import Process
from mangaba.core.types import OpenRouterConfig, LLMConfig
pesquisador = Agent(
role="Pesquisador",
goal="Analisar vulnerabilidades",
llm_config=OpenRouterConfig(
provider="openrouter",
model=[
"google/gemini-2.5-flash",
"anthropic/claude-3.5-sonnet"
],
api_key="SUA_KEY"
)
)
revisor = Agent(
role="Revisor",
goal="Revisar análise técnica",
llm_config=LLMConfig(
provider="hf",
model="meta-llama/Meta-Llama-3-8B-Instruct",
api_key="SUA_KEY"
)
)
task = Task(
description="Explique buffer overflow",
expected_output="Análise técnica detalhada",
agent=pesquisador,
)
review = Task(
description="Revise a análise",
expected_output="Pontos fortes e fracos",
agent=revisor,
)
crew = Crew(
agents=[pesquisador, revisor],
tasks=[task, review],
process=Process.SEQUENTIAL,
)
result = crew.kickoff()
print(result.final_output)
Pipeline com stages
from mangaba import Pipeline, Stage, ParallelStage
pipeline = Pipeline(stages=[
Stage("research", [research_task]),
ParallelStage("analysis", [task_a, task_b]),
Stage("report", [write_task]),
])
result = pipeline.run({"topic": "AI"})
RAG (Retrieval-Augmented Generation)
from mangaba.rag import TextLoader, RecursiveTextSplitter, RAGChain, Retriever
from mangaba.embeddings import OpenAIEmbedding
from mangaba.vectorstores import InMemoryVectorStore
docs = TextLoader("data.txt").load()
chunks = RecursiveTextSplitter(chunk_size=500).split_documents(docs)
embedding = OpenAIEmbedding(api_key="YOUR_KEY")
store = InMemoryVectorStore(embedding)
store.add(chunks)
retriever = Retriever(embedding=embedding, vector_store=store)
from mangaba.core.llm import create_llm_client
llm = create_llm_client(provider="google", api_key="YOUR_KEY")
chain = RAGChain(llm=llm, retriever=retriever)
answer = chain.query("What are the main topics?")
Memória persistente
from mangaba.memory import ShortTermMemory, LongTermMemory
short = ShortTermMemory(max_items=50)
short.add("User asked about Python")
long_mem = LongTermMemory(storage_path="memory.db")
long_mem.add("User prefers concise answers")
results = long_mem.search("preferences")
Guardrails e Output Parsers
from mangaba import Agent, Task
from mangaba.core.guardrails import LengthGuardrail, GuardrailChain
from mangaba.core.output_parsers import JSONOutputParser
task = Task(
description="List the top 3 programming languages",
expected_output="JSON with name and reason",
agent=agent,
guardrails=[LengthGuardrail(max_length=2000)],
output_parser=JSONOutputParser(),
)
Comunicação entre agentes (protocolo A2A interno)
from protocols.a2a import A2AProtocol, A2AMessage
protocolo = A2AProtocol()
# Enviar mensagem de um agente para outro
msg = A2AMessage(
sender="pesquisador",
recipient="revisor",
content="Análise de vulnerabilidade concluída",
msg_type="request"
)
protocolo.send(msg)
# Broadcast para todos os agentes
protocolo.broadcast(A2AMessage(
sender="manager",
recipient="*",
content="Iniciando nova tarefa",
msg_type="broadcast"
))
Vector store com ChromaDB
from mangaba.vectorstores import ChromaVectorStore, create_vectorstore
from mangaba.embeddings import OpenAIEmbedding
embedding = OpenAIEmbedding(api_key="KEY")
# Via factory
store = create_vectorstore("chroma", embedding=embedding, persist_directory="./chroma_db")
# Adicionar e buscar
store.add(chunks)
results = store.similarity_search("machine learning", k=5)
Flows — orquestração orientada a eventos
Crews coordenam agentes; Flows coordenam tudo o mais. Cada método reage ao
resultado de outro, o estado é tipado, e o progresso pode ser persistido para
retomar de onde parou.
from pydantic import BaseModel
from mangaba import Flow, start, listen, router, persist, and_
class Estado(BaseModel):
texto: str = ""
risco: str = ""
@persist # checkpoint a cada passo
class Triagem(Flow):
state_model = Estado
@start()
def coletar(self):
self.state.texto = "contrato para revisar"
return self.state.texto
@listen(coletar)
def analisar(self, texto):
return "alto" if "contrato" in texto else "baixo"
@router(analisar)
def rotear(self, risco):
self.state.risco = risco
return "juridico" if risco == "alto" else "arquivo"
@listen("juridico")
def escalar(self):
return "enviado ao jurídico"
@listen("arquivo")
def arquivar(self):
return "arquivado"
flow = Triagem()
print(flow.kickoff()) # "enviado ao jurídico"
print(flow.usage_metrics) # tokens somados de tudo que rodou dentro
flow.plot("triagem.html") # gráfico de execução, HTML autocontido
and_(a, b) dispara só quando ambos terminam, or_(a, b) quando qualquer um
terminar. Métodos podem ser async def. Para retomar após uma queda:
resultado = Triagem().resume("6f1c...") # pula os passos já concluídos
ramo = Triagem().fork("6f1c...") # ramifica a partir do checkpoint
Knowledge — fundamentar respostas em documentos
Diferente da memória (o que o agente viveu), a Knowledge é o que ele pode
consultar. Aceita PDF, DOCX, Excel, JSON, CSV, URL e diretórios inteiros.
from mangaba import Agent, Knowledge, PDFKnowledgeSource, DirectoryKnowledgeSource
from mangaba.embeddings import OpenAIEmbedding
conhecimento = Knowledge(
embedding=OpenAIEmbedding(api_key="..."),
sources=[
PDFKnowledgeSource(file_path="normas/nr12.pdf"),
DirectoryKnowledgeSource(path="politicas/", recursive=True),
],
results_limit=3,
score_threshold=0.35,
)
agente = Agent(role="Auditor", goal="Verificar conformidade",
backstory="Especialista em segurança do trabalho",
knowledge=conhecimento)
Passe knowledge= para a Crew e todos os agentes que não têm base própria
recebem a mesma.
Memória com recall semântico
A classe Memory pontua cada lembrança por similaridade, recência e
importância — não só por parecido.
from mangaba import Memory, MemoryScope
memoria = Memory(embedding=embedding, db_path=".mangaba/memoria.db")
memoria.add("O cliente prefere respostas curtas", metadata={"importance": 0.9})
memoria.add_interaction("Qual meu plano?", "Você está no plano Pro anual.")
memoria.consolidate() # funde duplicatas
memoria.search("preferências", scope=MemoryScope.AGENT)
agente = Agent(role="Suporte", goal="Atender bem", backstory="...", memory=memoria)
As classes antigas (ShortTermMemory, LongTermMemory, EntityMemory)
continuam funcionando sem mudanças.
Para produção multiusuário, isole por usuário e use recall profundo:
from mangaba.memory import Memory
from mangaba.memory.external import Mem0Memory
memoria = Memory(embedding=embedding, user_id="cliente-123", namespace="suporte")
memoria.remember("O cliente prefere respostas curtas")
memoria.recall("preferências do cliente", depth="deep")
# Memória externa (requer: pip install mem0ai)
externa = Mem0Memory(config={"user_id": "cliente-123"})
crew = Crew(agents=[...], tasks=[...], memory=externa)
Human-in-the-loop
human_input=True pausa de verdade: o revisor aprova, reescreve, ou devolve
com notas — e as notas voltam para o agente corrigir.
from mangaba import Task, CallbackHumanInput, HumanFeedback
def revisar_no_slack(descricao, saida, papel):
resposta = slack.perguntar(f"{papel} respondeu:\n{saida}")
return HumanFeedback(approved=resposta == "ok", feedback=resposta)
task = Task(
description="Redigir a resposta ao cliente",
expected_output="Um e-mail pronto para enviar",
agent=redator,
human_input=True,
human_input_handler=CallbackHumanInput(revisar_no_slack),
max_human_iterations=3,
)
Sem handler, usa o terminal — e aprova sozinho quando não há terminal, para
não travar execuções automatizadas.
Reasoning, Planning e manager dedicado
# O agente planeja e critica o próprio plano antes de agir
agente = Agent(role="Analista", goal="...", backstory="...",
reasoning=True, max_reasoning_attempts=3)
# A crew planeja todas as tarefas antes de começar, e um manager
# dedicado escolhe quem faz o quê — e reprova o que não serve
crew = Crew(
agents=[pesquisador, analista, redator],
tasks=[t1, t2, t3],
process=Process.HIERARCHICAL,
planning=True,
manager_llm=create_llm_client(provider="openai", api_key="..."),
)
Guardrails com juiz LLM
from mangaba import LLMGuardrail, FunctionGuardrail
task = Task(
description="Resumir o relatório",
expected_output="Um resumo com fontes",
agent=agente,
guardrails=[LLMGuardrail("Deve citar ao menos duas fontes com URL", llm=llm)],
guardrail_max_retries=3, # a rejeição volta como feedback, não como repetição
)
CLI
mangaba create crew pesquisa # esqueleto com agents.yaml e tasks.yaml
cd pesquisa && cp .env.example .env
mangaba run --input topic="energia solar em Alagoas"
mangaba test -n 3 # nota de qualidade por tarefa e por agente
mangaba train -n 5 # loop de feedback humano, salvo em pickle
mangaba chat # REPL contra um agente
mangaba config # mostra provedor/modelo (nunca a chave)
mangaba reset-memories --all
mangaba replay -t <task_id> # re-executa a partir de uma tarefa
mangaba install # instala as dependências do projeto
MCP — ferramentas de servidores externos
from mangaba import Agent, MCPClient
with MCPClient(command=["npx", "-y", "@modelcontextprotocol/server-filesystem", "/dados"]) as mcp:
agente = Agent(role="Analista", goal="...", backstory="...",
tools=mcp.get_tools())
Funciona por stdio ou HTTP, com o SDK oficial mcp quando disponível e um
transporte próprio sem dependências como fallback.
A2A — interoperar com agentes de outros frameworks
O protocolo aberto Agent2Agent. Não confundir com protocols/a2a.py, que é o
barramento interno de mensagens entre agentes do próprio processo.
from mangaba import A2AServer, A2AClient, agent_card_for
# Expor um agente (ou uma Crew) para o mundo
servidor = A2AServer(agente, host="127.0.0.1", port=0)
servidor.start()
print(agent_card_for(agente).model_dump_json(by_alias=True, indent=2))
# Consumir um agente remoto — de qualquer framework — como ferramenta local
cliente = A2AClient("https://parceiro.exemplo/agent")
meu_agente = Agent(role="Coordenador", goal="...", backstory="...",
tools=[cliente.as_tool()])
O card é servido em /.well-known/agent.json; as tarefas transitam porsubmitted, working, completed ou failed.
Ferramentas incluídas
| Ferramenta | O que faz |
|---|---|
ScrapeWebsiteTool |
Baixa uma página e extrai o texto legível |
HTTPRequestTool |
Chamada REST genérica |
DocumentSearchTool |
Busca semântica dentro de um arquivo (PDF, DOCX, Excel) |
FileSearchTool |
Busca literal ou regex numa árvore de diretórios |
SQLQueryTool |
SQL somente leitura em SQLite ou PostgreSQL |
CodeInterpreterTool |
Executa Python — desligado por padrão |
MCPClient.get_tools() |
Ferramentas vindas de servidores MCP externos |
A2AClient.as_tool() |
Um agente remoto como ferramenta local |
Resolva qualquer uma pelo nome curto no YAML (http_request, sql_query, …)
ou via ToolRegistry.
Antes de usar em produção
CodeInterpreterToolexecuta código escrito pelo modelo. Exigeenabled=True; usa Docker isolado quando disponível.unsafe_mode=True
roda direto no host, com todos os privilégios do processo — inclusive acesso
a arquivos e variáveis de ambiente com credenciais.A2AServernão tem TLS nem autenticação. O padrão é escutar em127.0.0.1. Quem alcançar a porta faz seu agente trabalhar e gasta seu
orçamento de LLM. Coloque atrás de um proxy autenticado antes de expor.A2AClient.as_tool()traz a resposta de um agente de terceiros para
dentro do seu contexto — é um canal de prompt injection. Aponte só para
agentes em que você confia.HTTPRequestTool/ScrapeWebsiteToolrecusam esquemas que não sejamhttp(s), mas não bloqueiam endereços privados por padrão. Useblock_private_hosts=Truecontra SSRF eallowed_domains=[...]para fixar
os destinos.SQLQueryToolvalida a instrução, abre a conexão em modo somente
leitura e sempre usa parâmetros — ainda assim, dê a ele um usuário de banco
com privilégio mínimo.FileSearchToolsemroot_dirlê qualquer coisa que o processo possa
ler. Sempre passeroot_dirquando o caminho puder vir do modelo.
Observabilidade
from mangaba import auto_configure_from_env, OpenTelemetryCallback, configure_observability
auto_configure_from_env() # liga o que estiver no ambiente
configure_observability(OpenTelemetryCallback()) # ou explicitamente
Integra com OpenTelemetry (OTLP), Langfuse, MLflow e Arize Phoenix. Cada
execução recebe um trace_id que sobrevive inclusive às threads de tarefas
paralelas, então a crew inteira aparece como um trace só.
Recursos adicionais para produção:
from mangaba import redact_pii, AuditLogger, AuditCallback, estimate_cost
limpo = redact_pii("contato [email protected], CPF 123.456.789-00")
logger = AuditLogger(path=".mangaba/audit.jsonl", actor="api")
configure_observability(AuditCallback(logger))
custo_usd = estimate_cost(result.token_usage, model="gpt-4o-mini")
print(result.cost("gpt-4o-mini")) # estimativa direto no CrewOutput
print(result.prometheus()) # métricas em formato Prometheus
Vector Stores
| Store | Persistência | Ideal para |
|---|---|---|
InMemoryVectorStore |
Volátil (RAM) | Testes e protótipos |
ChromaVectorStore |
Disco (ChromaDB) | Aplicações standalone |
PostgresVectorStore |
PostgreSQL + pgvector | Produção, dados relacionais |
RedisVectorStore |
Redis + RediSearch | Alta performance, caching |
SQLiteVectorStore |
SQLite local | Embeddings simples, sem infra |
Todas implementam BaseVectorStore e são intercambiáveis via create_vectorstore().
Protocolos de Comunicação
A2A (Agent-to-Agent)
Mensageria direta entre agentes com suporte a request/response e broadcast:
from protocols.a2a import A2AProtocol, A2AMessage
protocol = A2AProtocol()
protocol.send(A2AMessage(sender="agent_a", recipient="agent_b", content="..."))
MCP (Multi-Context Protocol)
Compartilhamento de contexto hierárquico entre agentes com prioridade, tags e busca por relevância:
from protocols.mcp import MCPProtocol, MCPContext
mcp = MCPProtocol()
ctx = MCPContext(content="Dados da análise", priority=8, tags=["analise", "vulnerabilidade"])
mcp.share_context("sessao_1", ctx)
resultados = mcp.query_context("sessao_1", "vulnerabilidade")
Prompt Templates
from mangaba.core.llm.prompt_templates import PromptTemplate, ChatPromptTemplate, SystemPromptBuilder
# Template simples
template = PromptTemplate("Responda em {idioma}: {pergunta}")
result = template.format(idioma="português", pergunta="o que é IA?")
# Template de chat
chat = ChatPromptTemplate([
("system", "Você é um especialista em {topico}"),
("user", "{pergunta}"),
])
messages = chat.format_messages(topico="segurança", pergunta="O que é XSS?")
# Builder pattern
builder = SystemPromptBuilder()
builder.add_role("Analista de Segurança")
builder.add_context("Você trabalha com pentest há 10 anos")
builder.add_instruction("Responda em markdown")
prompt = builder.build()
Padrões de Projeto
O Mangaba aplica padrões GoF de forma consistente em toda a base de código:
| Padrão | Onde é usado |
|---|---|
| Factory | create_llm_client() / create_vectorstore() — instancia provedores por nome |
| Abstract Factory | BaseLLMProvider / BaseVectorStore — interface comum; cada provider é uma família concreta |
| Facade | LLMClient — esconde a complexidade dos provedores atrás de uma API uniforme |
| Decorator | @tool — converte funções Python em BaseTool com schema automático |
| Composite | Crew / Toolkit — agrega múltiplos agentes/tarefas/ferramentas como unidade |
| Strategy | Process (sequential/hierarchical/parallel/consensual); providers como strategies |
| Observer | EventBus + callbacks (ConsoleCallback, FileCallback) |
| Template Method | BaseLLMProvider.generate/stream/generate_with_tools — subclasses implementam os passos |
| Chain of Responsibility | GuardrailChain — passa o output por validadores em sequência |
| Command | Task — encapsula instrução, agente e ferramentas |
| Iterator | stream() — retorna Iterator[str] token a token |
| Pipes e Filters | Pipeline com Stage, ParallelStage e ConditionalStage |
| Builder | SystemPromptBuilder — constrói system prompts passo a passo |
| Singleton | EventBus — instância única de barramento de eventos |
Arquitetura
mangaba/
├── core/ # Núcleo do framework
│ ├── agent.py # Agent com ReAct reasoning
│ ├── task.py # Tasks com guardrails e retry
│ ├── crew.py # Orquestração (4 processos)
│ ├── workflow.py # Pipeline engine
│ ├── reasoning.py # ReAct loop (Think, Act, Observe)
│ ├── planner.py # Decomposição automática de tarefas
│ ├── guardrails.py # LengthGuardrail, ContentFilter, Schema
│ ├── output_parsers.py # JSON, Pydantic, List, Markdown
│ ├── types.py # Tipos Pydantic v2 (LLMConfig, AgentState...)
│ ├── exceptions.py # Hierarquia de exceções
│ ├── events.py # EventBus (tipos de evento)
│ └── llm/ # Engine LLM multi-provider
│ ├── client.py # Providers + OpenRouter + fallback
│ ├── retry.py # Retry com backoff exponencial
│ ├── cache.py # LRU (memória) + SQLite (disco)
│ ├── token_counter.py # TokenCounter + UsageTracker
│ └── prompt_templates.py # PromptTemplate, ChatPromptTemplate, SystemPromptBuilder
├── tools/ # Sistema de ferramentas
│ ├── base.py # BaseTool + JSON schema automático
│ ├── decorator.py # @tool decorator
│ ├── toolkit.py # BaseToolkit, FileToolkit, WebToolkit
│ ├── file_tools.py # FileReader, FileWriter, DirectoryList
│ ├── web_search.py # Serper, DuckDuckGo
│ ├── math_tools.py # Calculadora segura (AST)
│ └── text_tools.py # TextSplitter, WordCounter
├── memory/ # Sistema de memória
│ ├── base.py # BaseMemory ABC
│ ├── short_term.py # Sliding window (deque)
│ ├── long_term.py # SQLite + embeddings opcionais
│ ├── entity.py # Memória de entidades
│ ├── unified.py # Memory: recall composto + consolidação
│ └── external.py # Mem0Memory: provedor externo de memória
├── embeddings/ # Provedores de embedding
│ ├── base.py # BaseEmbedding ABC
│ ├── openai_embed.py # text-embedding-3-small
│ ├── google_embed.py # text-embedding-004
│ └── huggingface_embed.py # Sentence-transformers
├── vectorstores/ # Armazenamento vetorial
│ ├── base.py # BaseVectorStore ABC
│ ├── factory.py # create_vectorstore() + register_store()
│ ├── in_memory.py # Cosine similarity (numpy)
│ ├── chroma_db.py # ChromaDB
│ ├── postgres.py # PostgreSQL + pgvector
│ ├── redis.py # Redis + RediSearch
│ └── sqlite.py # SQLite vector store
├── rag/ # Pipeline RAG
│ ├── document.py # Modelo de documento
│ ├── loaders.py # Text, CSV
│ ├── splitters.py # RecursiveTextSplitter
│ ├── retriever.py # Embedding + vector store
│ └── chain.py # RAGChain com fontes
├── flows/ # Orquestração orientada a eventos
│ ├── flow.py # Flow, @start/@listen/@router/@persist, and_/or_
│ ├── state.py # Estado livre (dict) ou tipado (Pydantic)
│ ├── persistence.py # Checkpoints em SQLite, resume e fork
│ └── visualization.py # plot(): grafo de execução em HTML
├── knowledge/ # Base de conhecimento (RAG de documentos)
│ ├── knowledge.py # Knowledge: ingestão, query, threshold
│ └── sources.py # PDF, DOCX, Excel, JSON, CSV, URL, diretório
├── observability/ # Tracing externo e governança
│ ├── otel.py # OpenTelemetry (OTLP)
│ ├── langfuse.py # Langfuse
│ ├── mlflow.py # MLflow
│ ├── phoenix.py # Arize Phoenix
│ ├── pii.py # Redação de PII
│ ├── audit.py # Auditoria JSONL + RBAC
│ └── metrics.py # Custo estimado + Prometheus
├── training/ # Treino e avaliação
│ ├── trainer.py # mangaba train — feedback humano iterativo
│ └── evaluator.py # mangaba test — nota 1–10 por tarefa
├── cli/ # Interface de linha de comando
│ ├── main.py # create/run/test/train/chat/config/reset/replay/install
│ └── templates/ # Esqueletos de projeto gerados
├── callbacks/ # Observabilidade local
│ ├── console.py # Print formatado de eventos
│ └── file.py # Log JSONL
├── __init__.py # API pública do pacote
├── config.py # Config system (leitura .env)
├── config_loader.py # agents.yaml / tasks.yaml → Agent/Task/Crew
└── exceptions.py # (legado)
protocols/ # Protocolos de comunicação entre agentes
├── a2a.py # Agent-to-Agent protocol
└── mcp.py # Multi-Context Protocol
utils/ # Utilitários
└── logger.py # Logger colorido (Loguru)
docs/ # Documentação completa
├── API-Reference.md
├── CHANGELOG.md
├── Core-Components.md
├── Events.md
├── Guardrails.md
├── LLM-Providers.md
├── Memory.md
├── RAG.md
├── Tools.md
├── Vector-Stores.md
├── Workflows.md
├── Getting-Started.md
├── CURSO_BASICO.md
├── Examples.md
├── FAQ.md
└── ...
examples/ # Exemplos práticos
├── basic_example.py
├── crew_example.py
├── finance_example.py
├── legal_example.py
├── medical_example.py
├── marketing_example.py
├── text_analysis_example.py
├── translation_example.py
├── document_analysis_example.py
├── vectorstores_example.py
└── ...
Processos de Crew
| Processo | Descrição | Uso |
|---|---|---|
SEQUENTIAL |
Tarefas executadas em ordem, uma após a outra | Workflows lineares |
HIERARCHICAL |
Manager delega e revisa cada entrega | Equipes com líder |
PARALLEL |
Tarefas executadas concorrentemente (asyncio) | Tarefas independentes |
CONSENSUAL |
Todos os agentes executam cada tarefa, resultado sintetizado | Decisões críticas |
Provedores LLM
| Provedor | Function Calling | Streaming | Modelo padrão |
|---|---|---|---|
| OpenRouter | Nativo + fallback | Sim | Roteamento multi-modelo |
| Google Gemini | Nativo | Sim | gemini-2.5-flash |
| OpenAI | Nativo | Sim | gpt-4o-mini |
| Anthropic | Nativo (tool_use) | Sim | claude-3-haiku-20240307 |
| HuggingFace | Nativo (11 modelos) / via prompt (14 modelos) | Sim, via chat_completion |
mistralai/Mistral-7B-Instruct-v0.3 |
| Ollama | Nativo + fallback por prompt | Sim | Roda 100% local, sem API key |
| OpenAI-compatible | Nativo | Sim | vLLM, LM Studio, llama.cpp, LocalAI |
Modelos locais
Nem Ollama nem os servidores OpenAI-compatible exigem API key:
from mangaba import create_llm_client, list_ollama_models
print(list_ollama_models()) # o que já está instalado localmente
llm = create_llm_client(provider="ollama", model="qwen2.5:7b")
llm = create_llm_client(provider="vllm", model="meta-llama/Llama-3.1-8B-Instruct",
base_url="http://localhost:8000/v1")
Configure via variáveis de ambiente:
LLM_PROVIDER=google
GOOGLE_API_KEY=sua_chave
# ou OPENAI_API_KEY, ANTHROPIC_API_KEY, HUGGINGFACE_API_KEY, OPENROUTER_API_KEY
Modelos open-source (HuggingFace)
O provider HuggingFace usa chat_completion (OpenAI-compatible) com detecção automática de tool calling: modelos com function calling nativo recebem tools=[...] direto na API; os demais usam prompt injection como fallback. Use hf_model_supports_tools(model_id) para verificar.
O Mangaba inclui um catálogo de 28 modelos open-source disponíveis via HuggingFace Inference API, organizados por categoria:
from mangaba import list_huggingface_models, HF_OPEN_MODELS
# Listar todos os modelos
todos = list_huggingface_models()
# Filtrar por categoria: general, code, reasoning, embedding
modelos_codigo = list_huggingface_models(category="code")
modelos_reason = list_huggingface_models(category="reasoning")
modelos_embed = list_huggingface_models(category="embedding")
# Via classe do provider
from mangaba.core.llm.client import HuggingFaceLLMProvider
HuggingFaceLLMProvider.list_models(category="general")
| Categoria | Modelos incluídos |
|---|---|
| general (19) | Mistral 7B/Mixtral 8x7B/8x22B, Llama 3/3.1/3.2, Qwen 2.5, Phi-3/3.5, Gemma 2 |
| code (4) | StarCoder2 15B, Qwen 2.5 Coder 7B/32B, DeepSeek Coder 33B |
| reasoning (2) | DeepSeek R1 Distill Qwen 7B, DeepSeek R1 Distill Llama 70B |
| embedding (3) | BGE-M3, all-MiniLM-L6-v2, Multilingual E5 Large |
from mangaba import hf_model_supports_tools
hf_model_supports_tools("mistralai/Mistral-7B-Instruct-v0.3") # True — nativo
hf_model_supports_tools("google/gemma-2-9b-it") # False — prompt injection
Dependências
Núcleo:
pydantic>=2.0.0— Validação de tiposgoogle-generativeai>=0.3.0— Google Geminiopenai>=1.6.0— OpenAI GPTanthropic>=0.20.0— Anthropic Claudehuggingface-hub>=0.20.0— HuggingFacetiktoken>=0.5.0— Contagem de tokensrequests>=2.25.0— HTTP clientloguru>=0.6.0— Logging
Opcionais:
numpy>=1.24.0— RAG e embeddings (pip install mangaba[rag])sentence-transformers>=2.2.0— Embeddings HF (pip install mangaba[embeddings])duckduckgo-search>=3.9.0— Busca web (pip install mangaba[tools])redis>=5.0.0— Redis vector store (pip install mangaba[redis])psycopg[binary]>=3.1.0— Postgres vector store (pip install mangaba[postgres])chromadb>=0.4.0— ChromaDB vector store (pip install mangaba[chroma])pypdf,python-docx,openpyxl,beautifulsoup4— Loaders de documentos (pip install mangaba[documents])pyyaml>=6.0— Projetos declarativos da CLI (pip install mangaba[yaml])mcp>=1.0.0— SDK oficial do MCP; há fallback sem dependência (pip install mangaba[mcp])- OpenTelemetry / Langfuse / MLflow / Phoenix — Tracing (
pip install mangaba[otel],[langfuse],[mlflow],[phoenix], ou[observability]) - Tudo:
pip install mangaba[all]
Modelos locais (Ollama, vLLM, LM Studio, llama.cpp, LocalAI) não precisam de
nenhum extra — usam o cliente openai, que já é dependência do núcleo.
Testes
# Todos os testes
python -m pytest tests/ -v
# Só os que não tocam a rede
python -m pytest -m "not network"
# Com cobertura (opt-in)
python -m pytest tests/ --cov=mangaba --cov-report=term-missing
Testes contra modelo real
tests/test_gateway_integration.py aponta o framework para o
Mangaba Gateway — modelos GGUF locais de verdade — em vez de stubs. Cobre
agente, crew, knowledge com embeddings reais, memória, guardrail com juiz LLM,
revisão humana e propagação de trace.
python -m pytest tests/test_gateway_integration.py -v
O arquivo inteiro é pulado automaticamente quando o gateway está fora do ar,
então rodar offline continua verde.
Contribuição
- Fork o projeto
- Crie sua branch (
git checkout -b feature/nova-feature) - Commit (
git commit -m 'Add nova feature') - Push (
git push origin feature/nova-feature) - Abra um Pull Request
Licença
MIT License
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found