Skip to main content

Professional multi-agent AI framework with ReAct reasoning, RAG, memory, and function calling

Project description

🥭 Mangaba AI

PyPI version Python License Build Status

Framework profissional de orquestração multi-agente com ReAct reasoning, function calling nativo, RAG, memória persistente e suporte resiliente a múltiplos provedores LLM.

Alternativa leve e completa a CrewAI + LangChain em um único pacote, agora com interoperabilidade real entre provedores e arquitetura resiliente.

✨ Destaques v3.2.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
  • 🤖 5 Provedores LLM — Google Gemini, OpenAI GPT, Anthropic Claude, HuggingFace e OpenRouter
  • 👥 4 Processos de Crew — Sequential, Hierarchical, Parallel (asyncio), Consensual
  • 🔧 Tool System@tool decorator, Pydantic schemas, 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 22+ tipos de evento, callbacks console/arquivo
  • 🔄 Workflow Engine — Pipelines com stages sequenciais, paralelos e condicionais
  • Cache & 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 (NOVO v3.2.0)

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

# Carregar e dividir documentos
docs = TextLoader("data.txt").load()
chunks = RecursiveTextSplitter(chunk_size=500).split_documents(docs)

# Criar retriever
embedding = OpenAIEmbedding(api_key="YOUR_KEY")
store = InMemoryVectorStore(embedding)
store.add(chunks)
retriever = Retriever(embedding=embedding, vector_store=store)

# RAG chain
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

# Curto prazo (últimas N interações)
short = ShortTermMemory(max_items=50)
short.add("User asked about Python")

# Longo prazo (SQLite)
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(),
)

Observabilidade com EventBus

from mangaba import EventBus
from mangaba.callbacks import ConsoleCallback, FileCallback

# Ativar logging de eventos
EventBus.register(ConsoleCallback())
EventBus.register(FileCallback("events.jsonl"))

# Todos os eventos (agent, task, tool, LLM, crew) são capturados automaticamente
result = crew.kickoff()

🏛️ 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() — instancia o provider correto por nome
Abstract Factory BaseLLMProvider — interface comum; cada provider é uma família concreta
Facade LLMClient — esconde a complexidade dos 4 providers atrás de uma API uniforme
Decorator @tool — converte funções Python em BaseTool com schema automático
Composite Crew — agrega múltiplos Agent + Task e os executa 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 & Filters Pipeline → Stage[] → ParallelStage / ConditionalStage

🏗️ Arquitetura

mangaba/
├── core/               # Cérebro 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)
│   ├── guardrails.py       # Validação de outputs
│   ├── output_parsers.py   # JSON, Pydantic, List, Markdown
│   ├── planner.py          # Decomposição automática de tarefas
│   ├── types.py            # Tipos Pydantic v2
│   ├── exceptions.py       # Hierarquia de exceções
│   ├── events.py           # EventBus (22+ event types)
│   └── llm/                # Engine LLM multi-provider
│       ├── client.py           # 5 providers + OpenRouter + fallback + function calling + streaming
│       ├── retry.py            # Retry com backoff exponencial
│       ├── cache.py            # LRU (memória) + SQLite (disco)
│       ├── token_counter.py    # Contagem de tokens
│       └── prompt_templates.py # Templates de prompt
├── tools/              # Sistema de ferramentas
│   ├── base.py             # BaseTool + JSON schema automático
│   ├── decorator.py        # @tool decorator
│   ├── toolkit.py          # Agrupamento de ferramentas
│   ├── 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
│   ├── short_term.py       # Sliding window (deque)
│   ├── long_term.py        # SQLite + embeddings opcionais
│   └── entity.py           # Memória de entidades
├── embeddings/         # Provedores de embedding
│   ├── openai_embed.py     # text-embedding-3-small
│   └── google_embed.py     # text-embedding-004
├── vectorstores/       # Armazenamento vetorial
│   └── in_memory.py        # Cosine similarity
├── rag/                # Pipeline RAG
│   ├── document.py         # Modelo de documento
│   ├── loaders.py          # Text, CSV, WebPage
│   ├── splitters.py        # RecursiveTextSplitter
│   ├── retriever.py        # Embedding + vector store
│   └── chain.py            # RAGChain com fontes
└── callbacks/          # Observabilidade
    ├── console.py          # Print formatado de eventos
    └── file.py             # Log JSONL

🔄 Processos de Crew

Processo Descrição Uso
SEQUENTIAL Tarefas executadas em ordem, uma após a outra Workflows lineares
HIERARCHICAL Primeiro agente é manager, delega e revisa 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 Multi-model routing
Google Gemini ✅ Nativo gemini-2.5-flash
OpenAI ✅ Nativo gpt-4o-mini
Anthropic ✅ Nativo (tool_use) claude-3-haiku-20240307
HuggingFace ✅ Nativo (11 modelos) / ⚠️ Prompt (14 modelos) ✅ via chat_completion mistralai/Mistral-7B-Instruct-v0.3

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 que suportam 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

Cada modelo expõe: id, name, category, context (tokens), tool_calling, streaming, notes.

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

🧪 Testes

# Testes v3 (32 testes)
python -m pytest tests/test_v3.py -v

# Todos os testes
python -m pytest tests/ -v

# Com cobertura
python -m pytest tests/ --cov=mangaba --cov-report=term-missing

📦 Dependências

Core:

  • pydantic>=2.0.0 — Validação de tipos
  • google-generativeai>=0.3.0 — Google Gemini
  • openai>=1.6.0 — OpenAI GPT
  • anthropic>=0.20.0 — Anthropic Claude
  • huggingface-hub>=0.20.0 — HuggingFace
  • tiktoken>=0.5.0 — Contagem de tokens
  • requests>=2.25.0 — HTTP client
  • loguru>=0.6.0 — Logging

Opcionais:

  • numpy>=1.24.0 — RAG e embeddings (pip install mangaba[rag])
  • duckduckgo-search>=3.9.0 — Busca web (pip install mangaba[tools])

🤝 Contribuição

  1. Fork o projeto
  2. Crie sua branch (git checkout -b feature/nova-feature)
  3. Commit (git commit -m 'Add nova feature')
  4. Push (git push origin feature/nova-feature)
  5. Abra um Pull Request

📄 Licença

MIT License


Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mangaba-3.2.0.tar.gz (340.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mangaba-3.2.0-py3-none-any.whl (76.4 kB view details)

Uploaded Python 3

File details

Details for the file mangaba-3.2.0.tar.gz.

File metadata

  • Download URL: mangaba-3.2.0.tar.gz
  • Upload date:
  • Size: 340.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for mangaba-3.2.0.tar.gz
Algorithm Hash digest
SHA256 2b322b61ac7cc4345f9614dfde03f440e34142b29890cc863f6568f9733527a1
MD5 5119d9e34893e4bc1031d3893bc94380
BLAKE2b-256 ddfa015f7a57841827423fd2757f3505cec1d1b2ff303f5f480450083434035b

See more details on using hashes here.

File details

Details for the file mangaba-3.2.0-py3-none-any.whl.

File metadata

  • Download URL: mangaba-3.2.0-py3-none-any.whl
  • Upload date:
  • Size: 76.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for mangaba-3.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d8c948703d13af2b9075acd43bb5df02ac8c69e78053f00fc29faf623ca86801
MD5 3f3d1e549ec763d4e453a76fd3e3de9a
BLAKE2b-256 48e6d5785e5a3ea1a787832b0af12e660971212ff739d01ed1e8fc75ac19d5fd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page