widemem.ai
Camada de memória de IA de código aberto com pontuação de importância, decaimento temporal, memória hierárquica e priorização YMYL
Documentação
widemem.ai
.__ .___ .__
__ _ _|__| __| _/____ _____ ____ _____ _____ |__|
\ \/ \/ / |/ __ |/ __ \ / \_/ __ \ / \ \__ \ | |
\ /| / /_/ \ ___/| Y Y \ ___/| Y Y \ / __ \| |
\/\_/ |__\____ |\___ >__|_| /\___ >__|_| / /\ (____ /__|
\/ \/ \/ \/ \/ \/ \/
Memória de peixinho? ¬_¬ Corrigido.
Leitura de apoio:
- Whitepaper: Como LLMs Lidam com Memória. Artigo técnico sobre arquiteturas de memória, riscos de segurança e personalização nos pesos.
- Por que Janelas de Contexto Não São Memória. O problema que o widemem resolve.
- Sua Memória de IA Não Sabe Diferenciar Margem de Rio de Conta Poupança. Como a classificação YMYL realmente funciona.
- Sua IA Deveria Saber Quando Não Sabe. Recuperação ciente de incerteza.
- Registro de correções. Afirmações publicadas que se revelaram erradas e suas correções.
Porque sua IA merece mais do que amnésia. ¬_¬
Uma camada de memória de IA open-source que realmente lembra do que importa. Local-first, completa, e opinativa em não esquecer o tipo sanguíneo do seu usuário.
Olha, a memória de IA evoluiu bastante. Janelas de contexto são maiores, pipelines de RAG estão em todo lugar, e a maioria dos frameworks tem alguma forma de "lembre disso para depois." Não é mais terrível. Mas também não é ótimo. A maioria dos sistemas de memória trata todos os fatos igualmente: o tipo sanguíneo do seu usuário fica ao lado do que ele comeu no almoço, decaindo na mesma taxa, com a mesma prioridade. Contradições se acumulam silenciosamente. Não há noção de "isso importa mais do que aquilo." E quando você precisa lembrar de algo de três meses atrás que realmente importa? Boa sorte.
widemem é para quando "bom o suficiente" não é bom o suficiente.
widemem dá à sua IA uma memória real: uma que pontua o que importa, esquece o que não importa, e se recusa terminantemente a perder o controle da medicação prescrita de alguém só porque 72 horas se passaram e a função de decaimento ficou entediada. Pense nisso como memória de longo prazo para LLMs, exceto que realmente funciona e não exige um doutorado para configurar.
- Memórias que sabem seu lugar. Pontuação de importância (1-10) mais decaimento temporal significa que "tem alergia a amendoim" sempre supera "comeu pizza na terça". Como deveria ser. Nem todas as memórias são criadas iguais, e seu sistema de recuperação deveria saber a diferença entre uma alergia que ameaça a vida e uma preferência de almoço.
- Um cérebro, três camadas. Fatos se consolidam em resumos, resumos em temas. Pergunte "onde a Alice mora" e obtenha o fato. Pergunte "me fale sobre a Alice" e obtenha o panorama geral. Sua IA pode dar zoom in e zoom out sem suar ou fazer uma segunda chamada de API.
- YMYL ou nada. Fatos de saúde, jurídicos e financeiros recebem tratamento VIP: pisos de importância mais altos, imunidade ao decaimento e detecção forçada de contradições. Classificação em dois estágios (regex para correspondências óbvias, LLM para conteúdo implícito) captura "meu peito dói" como saúde enquanto ignora "a margem do rio." Leia mais ↗
- Resolução de conflitos que não é burra. Adicione "Eu moro em Boston" depois de "Eu moro em São Francisco" e o sistema não apenas anexa ambos cegamente. Ele detecta a contradição, resolve em uma única chamada de LLM e atualiza a memória. Como um adulto razoável faria.
- Tratamento elegante de falha de memória. Cada recuperação retorna um nível de confiança (ALTO / MODERADO / BAIXO / NENHUM) para que seu agente saiba quando a memória não tem nada relevante e possa se abster em vez de adivinhar. Três modos:
strict(recusar em baixa confiança),helpful(amenizar com contexto relacionado),creative(oferecer palpite, com aviso). Para contextos de alto risco onde uma resposta errada é pior do que nenhuma resposta. - Local por padrão, nuvem se quiser. SQLite mais FAISS prontos para uso. Sem contas, sem chaves de API para armazenamento, sem "por favor, assine nosso plano empresarial para armazenar mais de 100 memórias". Conecte Qdrant ou qualquer provedor de nuvem quando estiver pronto. Ou não. Não vamos te fazer sentir culpa.
Arquitetura
Resumo
Sete recursos, uma biblioteca. Aqui está o que o widemem faz que a maioria dos sistemas de memória não faz:
| # | Recurso | O que faz | Por que importa |
|---|---|---|---|
| 1 | Resolução de conflitos em lote | Chamada única de LLM para todos os fatos vs. memórias existentes | N fatos equivale a 1 chamada de API, não N. Sua carteira agradece. |
| 2 | Importância + decaimento | Fatos avaliados de 1 a 10, com decaimento exponencial/linear/em etapas | Trivialidades antigas desaparecem. Fatos críticos não. |
| 3 | Memória hierárquica | Fatos para resumos para temas, roteamento automático | Perguntas amplas obtêm temas, específicas obtêm fatos. |
| 4 | Recuperação ativa | Detecção de contradição mais perguntas de esclarecimento | "Espera, você disse que mora em São Francisco E Boston?" |
| 5 | Priorização YMYL | Fatos de saúde/jurídicos/financeiros são intocáveis | Algumas coisas simplesmente não se esquecem. |
| 6 | Confiança e abstenção | Retorna nível de confiança para cada recuperação; abstém-se em falha de memória | Permite que o agente recorra a "não tenho essa informação" em vez de adivinhar |
| 7 | Modos de recuperação | rápido / equilibrado / profundo, escolha seu trade-off precisão-custo | Mesmo sistema, três faixas de preço. Você escolhe. |
Mais de 600 testes. Zero serviços externos necessários. SQLite mais FAISS por padrão. Conecte OpenAI, Anthropic, Ollama, Qdrant ou sentence-transformers conforme necessário.
Índice
- Instalação
- Início Rápido
- Configuração
- Pontuação e Decaimento
- Provedores
- YMYL (Seu Dinheiro ou Sua Vida)
- Memória Hierárquica
- Recuperação Ativa
- Busca Temporal
- Incerteza e Confiança
- Modos de Recuperação
- Histórico e Trilha de Auditoria
- Resolução de Conflitos em Lote
- Sanitizador de Injeção de Prompt
- Referência da API
- Habilidade Claude Code
- Servidor MCP
- Desenvolvimento
- Benchmarks
- Aviso legal e uso pretendido
- Contato
- Licença
Instalação
pip install widemem-ai[faiss]
O extra [faiss] instala o armazenamento vetorial local padrão. A instalação simples de pip install widemem-ai instala apenas o núcleo; você precisará de pelo menos um backend vetorial ([faiss] ou [qdrant]) antes que o WideMemory() funcione. Python 3.10+ necessário.
Provedores opcionais
pip install widemem-ai[anthropic] # Claude LLM provider
pip install widemem-ai[ollama] # Local LLM via Ollama
pip install widemem-ai[sentence-transformers] # Local embeddings (no API key needed)
pip install widemem-ai[qdrant] # Qdrant vector store
pip install widemem-ai[mcp] # Model Context Protocol server
pip install widemem-ai[all] # Everything. You want it all? You got it.
Início Rápido
Cinco linhas para um sistema de memória funcional. Seis se você contar o import.
from widemem import WideMemory, MemoryConfig
memory = WideMemory()
# Add memories
result = memory.add("I live in San Francisco and work as a software engineer", user_id="alice")
# Search
results = memory.search("where does alice live", user_id="alice")
for r in results:
print(f"{r.memory.content} (score: {r.final_score:.2f})")
# Update happens automatically. Add contradicting info and the resolver handles it.
memory.add("I just moved to Boston", user_id="alice")
# Delete
memory.delete(results[0].memory.id)
# History audit trail
history = memory.get_history(results[0].memory.id)
É isso. Sem guia de configuração de 47 etapas. Sem arquivos YAML. Sem pavor existencial. Sua IA acabou de passar de peixinho a elefante em seis linhas.
WideMemory também funciona como gerenciador de contexto se você for do tipo responsável:
with WideMemory() as memory:
memory.add("I live in San Francisco", user_id="alice")
results = memory.search("where does alice live", user_id="alice")
# Connection closed automatically. You're welcome.
Configuração
A maioria dos padrões é sensata, então uma configuração mínima geralmente é suficiente:
from widemem import WideMemory, MemoryConfig
from widemem.core.types import LLMConfig, ScoringConfig, YMYLConfig
config = MemoryConfig(
llm=LLMConfig(provider="openai", model="gpt-4o-mini"),
scoring=ScoringConfig(decay_rate=0.01),
ymyl=YMYLConfig(enabled=True),
history_db_path="~/.widemem/history.db",
)
memory = WideMemory(config)
Referência completa para cada campo, padrão e trade-off: docs/configuration.md.
Pontuação e Decaimento
A Fórmula
Cada resultado de busca recebe uma pontuação combinada. Não é ciência de foguetes, mas é quase:
final_score = (similarity_weight * similarity) + (importance_weight * importance) + (recency_weight * recency)
final_score *= topic_boost # if topic weights are set
similarity: similaridade de cosseno da busca vetorial (0-1)importance: normalizado da avaliação de 1-10 atribuída na extração (0-1)recency: pontuação de decaimento temporal (0-1), calculada pela função de decaimentotopic_boost: multiplicador dos pesos de tópico (padrão 1.0)
Funções de Decaimento
Controle como as memórias desaparecem ao longo do tempo. Como memórias reais, mas configurável. Ao contrário de um peixinho, você pode desligar o decaimento completamente.
| Função | Fórmula | Caso de uso |
|---|---|---|
exponential | e^(-rate * days) | Decaimento suave e natural (padrão) |
linear | max(1 - rate * days, 0) | Queda previsível e linear |
step | 1.0 / 0.7 / 0.4 / 0.1 em 7/30/90 dias | Níveis discretos |
none | Sempre 1.0 | Elefantes nunca esquecem |
# Fast decay: what happened last week? who cares
ScoringConfig(decay_function=DecayFunction.EXPONENTIAL, decay_rate=0.05)
# Slow decay: memories stay relevant longer
ScoringConfig(decay_function=DecayFunction.EXPONENTIAL, decay_rate=0.005)
# No decay: all memories equally fresh forever
ScoringConfig(decay_function=DecayFunction.NONE)
Provedores
| Tipo | Provedor | Instalação | Exemplo de uma linha |
|---|---|---|---|
| LLM | OpenAI (padrão) | pip install widemem-ai[faiss] | LLMConfig(provider="openai", model="gpt-4o-mini") |
| LLM | Anthropic | pip install widemem-ai[anthropic] | LLMConfig(provider="anthropic", model="claude-haiku-4-5-20251001") |
| LLM | Ollama (local) | pip install widemem-ai[ollama] | LLMConfig(provider="ollama", model="llama3") |
| Embedding | OpenAI (padrão) | pip install widemem-ai[faiss] | EmbeddingConfig(provider="openai", model="text-embedding-3-small", dimensions=1536) |
| Embedding | Sentence Transformers | pip install widemem-ai[sentence-transformers] | EmbeddingConfig(provider="sentence-transformers", model="all-MiniLM-L6-v2", dimensions=384) |
| Armazenamento vetorial | FAISS (padrão) | pip install widemem-ai[faiss] | VectorStoreConfig(provider="faiss") |
| Armazenamento vetorial | Qdrant | pip install widemem-ai[qdrant] | VectorStoreConfig(provider="qdrant", path="./qdrant_data") |
Para Ollama, combine com sentence-transformers se quiser totalmente local: EmbeddingConfig(provider="sentence-transformers", model="all-MiniLM-L6-v2", dimensions=384). Defina a variável de ambiente QDRANT_URL para Qdrant remoto.
YMYL (Seu Dinheiro ou Sua Vida)
Alguns fatos são mais iguais que outros. A priorização YMYL garante que fatos críticos sobre saúde, finanças, questões jurídicas e segurança nunca sejam perdidos, nunca sejam despriorizados e nunca sejam silenciosamente esquecidos porque a função de decaimento decidiu que terça-feira era um bom dia para esquecer a dosagem de insulina de alguém.
Para o mergulho profundo completo sobre como o YMYL funciona, casos extremos e limitações, veja YMYL.md.
config = MemoryConfig(
ymyl=YMYLConfig(
enabled=True,
categories=["health", "medical", "financial", "legal", "safety", "insurance", "tax", "pharmaceutical"],
min_importance=8.0, # Floor importance for strong YMYL facts
decay_immune=True, # Strong YMYL facts don't decay over time
force_active_retrieval=True, # Force contradiction detection for strong YMYL facts
),
)
Classificação Semântica em Dois Estágios
Nem toda menção a "banco" significa que alguém está falando de finanças. E "meu peito está doendo há três dias" é uma preocupação de saúde mesmo sem conter nenhuma palavra-chave médica. widemem usa um pipeline de dois estágios para lidar com ambos os casos:
| Estágio | Como funciona | Exemplo |
|---|---|---|
| 1. Regex (rápido) | Padrões fortes de múltiplas palavras disparam imediatamente | "pressão arterial" -> saúde, "401k" -> financeiro |
| 2. LLM (semântico) | LLM classifica durante a extração de fatos (zero chamadas extras de API) | "meu peito dói" -> saúde, "margem do rio" -> nulo |
Correspondências fortes de regex recebem proteção YMYL imediata. Para todo o resto, o LLM decide com base no contexto. Isso captura conteúdo YMYL implícito ("parei de tomar meus comprimidos" -> médico) e rejeita falsos positivos ("Doctor é um ótimo programa de TV" -> não médico).
Para o detalhamento completo com dados de precisão e exemplos, veja Sua Memória de IA Não Sabe Diferenciar Margem de Rio de Conta Poupança.
| Classificação | Importância | Imunidade ao decaimento | Recuperação ativa |
|---|---|---|---|
| YMYL (regex ou LLM) | Piso em 8.0 | Sim | Forçada |
| Não YMYL | Inalterada | Não | Não |
Categorias YMYL
8 categorias, cada uma com padrões fortes (inequívocos) e fracos (dependentes de contexto):
| Categoria | Padrões Fortes | Padrões Fracos |
|---|---|---|
health | pressão arterial, diagnóstico de diabetes, saúde mental | médico, hospital, medicação, ansiedade |
medical | resultados de exames, condição médica, plano de tratamento | clínica, vacina, ressonância magnética, tomografia |
financial | conta bancária, conta poupança, score de crédito, 401k | banco, empréstimo, dívida, salário |
legal | procuração, guarda de filhos, ordem judicial | advogado, contrato, divórcio |
safety | contato de emergência, tipo sanguíneo, epipen, ordem de não reanimação | evacuação, enchente |
insurance | apólice de seguro, prêmio de seguro | seguro, cobertura, sinistro |
tax | declaração de imposto, W-2, 1099, auditoria da receita | dedução, declaração |
pharmaceutical | efeito colateral, interação medicamentosa | droga, dosagem, prescrição |
Você pode habilitar um subconjunto se só se importar com algumas categorias:
YMYLConfig(enabled=True, categories=["health", "medical", "financial"])
Pesos de Tópico (relacionados)
Aumente ou suprima tópicos específicos durante a recuperação como um multiplicador em final_score:
config = MemoryConfig(
topics=TopicConfig(
weights={"python": 2.0, "cooking": 0.5},
custom_topics=["python", "machine learning"], # Extraction hints
),
)
A correspondência é substring sem diferenciar maiúsculas de minúsculas. Valores acima de 1.0 aumentam, abaixo de 1.0 suprimem. custom_topics são passados ao LLM durante a extração como uma dica.
Memória Hierárquica
Sistema de memória em três níveis. Fatos são ótimos, mas às vezes você precisa do panorama geral.
config = MemoryConfig(enable_hierarchy=True)
memory = WideMemory(config)
# Add many facts
for msg in conversation_history:
memory.add(msg, user_id="alice")
# Trigger summarization (groups related facts, creates summaries and themes)
memory.summarize(user_id="alice")
# Broad queries return themes, specific queries return facts
results = memory.search("tell me about alice") # Returns themes
results = memory.search("where does alice live") # Returns facts
# Filter by tier
from widemem.core.types import MemoryTier
results = memory.search("alice", tier=MemoryTier.SUMMARY)
Níveis
| Camada | Descrição | Tipo de Consulta |
|---|---|---|
fact | Fatos individuais extraídos | Perguntas específicas ("o que é X?") |
summary | Grupos de fatos relacionados resumidos | Escopo moderado ("o trabalho da Alice") |
theme | Temas de alto nível entre resumos | Perguntas amplas ("fale sobre a Alice") |
O roteamento de consultas usa heurísticas de palavras-chave (sem chamada extra de LLM) com uma cadeia de fallback. Se a camada preferida não tiver resultados, ela recai para a próxima camada. Nenhum resultado fica para trás.
Recuperação Ativa
Sua IA não deve sobrescrever silenciosamente "mora em São Francisco" com "mora em Boston" sem ao menos levantar uma sobrancelha. A recuperação ativa detecta contradições e ambiguidades e, em seguida, faz perguntas de esclarecimento por meio de callbacks. Leia mais ↗
config = MemoryConfig(
enable_active_retrieval=True,
active_retrieval_threshold=0.6, # Similarity threshold for conflict detection
)
memory = WideMemory(config)
def handle_clarification(clarifications):
for c in clarifications:
print(f"Conflict: {c.question}")
print(f" Old: {c.existing_memory}")
print(f" New: {c.new_fact}")
# Return None to abort the add, or a list of answers to proceed
return ["User moved to Boston"]
result = memory.add(
"I just moved to Boston",
user_id="alice",
on_clarification=handle_clarification,
)
if result.has_clarifications:
print(f"Resolved {len(result.clarifications)} conflicts")
Comportamento do callback
on_clarificationrecebe uma lista de objetosClarification- Retorne
Nonepara abortar a adição por completo (a opção nuclear) - Retorne uma lista de strings (respostas) para prosseguir com a adição
- Se nenhum callback for fornecido, a adição prossegue e os esclarecimentos são retornados em
AddResult.clarificationspara você lidar depois. Ou nunca. Não vamos julgar.
Busca Temporal
Filtre e classifique memórias por tempo. Porque às vezes você só se importa com o que aconteceu recentemente.
from datetime import datetime, timedelta
now = datetime.utcnow()
# Only memories from the last week
results = memory.search(
"what happened recently",
user_id="alice",
time_after=now - timedelta(days=7),
)
# Only memories before January 2026
results = memory.search(
"old preferences",
user_id="alice",
time_before=datetime(2026, 1, 1),
)
# Combined range
results = memory.search(
"december events",
user_id="alice",
time_after=datetime(2025, 12, 1),
time_before=datetime(2025, 12, 31),
)
Incerteza e Confiança
Cada recuperação retorna um nível de RetrievalConfidence (HIGH, MODERATE, LOW, NONE) com base na relevância dos principais resultados. Seu agente pode usar isso para se abster em consultas de baixa confiança em vez de adivinhar com base em memórias irrelevantes. Três modos de resposta (strict, helpful, creative) permitem ajustar o comportamento de abstenção ao caso de uso. Leia mais ↗
Cada busca retorna um nível de confiança:
response = mem.search("What's Alice's favorite movie?", user_id="alice")
response.confidence # RetrievalConfidence.NONE: nothing relevant found
response.has_relevant # False
# But it still works like a list (backward compatible):
for r in response:
print(r.memory.content)
Três modos de incerteza
# Strict: refuses to answer if unsure
mem = WideMemory(config=MemoryConfig(uncertainty_mode="strict"))
# Helpful (default): "I don't have that, but here's what I do know..."
mem = WideMemory(config=MemoryConfig(uncertainty_mode="helpful"))
# Creative: "I can guess if you want, fair warning, it might be wrong"
mem = WideMemory(config=MemoryConfig(uncertainty_mode="creative"))
Fixar memórias importantes
Quando um usuário diz explicitamente algo importante, fixe para que fique registrado:
# Normal add: importance decided by LLM (might be 3-6)
mem.add("I had pasta for lunch", user_id="alice")
# Pin: stored with importance 9, resistant to decay
mem.pin("My blood type is O negative", user_id="alice")
Recuperação de frustração
Quando os usuários dizem "eu já te falei isso!", o widemem detecta a frustração, extrai o fato e oferece para fixá-lo:
from widemem.retrieval.uncertainty import build_frustration_response
response = build_frustration_response(
"I told you my blood type is O negative!",
confidence=RetrievalConfidence.NONE,
mode=UncertaintyMode.HELPFUL,
)
# response = {
# "action": "recover_and_pin",
# "message": "Sorry about that. I'm saving this now with high importance.",
# "pin_fact": "my blood type is O negative",
# "pin_importance": 9.0,
# }
Modos de Recuperação
Nem toda consulta precisa da mesma profundidade. Um chatbot casual não precisa de 50 memórias recuperadas. Um assistente médico precisa. O widemem permite que você escolha:
from widemem import WideMemory, MemoryConfig, RetrievalMode
# Set at config level (default for all queries)
mem = WideMemory(config=MemoryConfig(retrieval_mode="balanced"))
# Override per query when needed
results = mem.search("critical question", mode=RetrievalMode.DEEP)
| Modo | Memórias recuperadas | ~Tokens | Melhor para |
|---|---|---|---|
fast | 10 | ~150 | Chatbots, assistentes casuais |
balanced (padrão) | 25 | ~500 | A maioria dos aplicativos de produção |
deep | 50 | ~1.500 | Saúde, jurídico, enterprise |
Cada modo também ajusta o tamanho interno do pool de candidatos e a força do reforço de similaridade. balanced é o ponto ideal para a maioria dos casos de uso. Contexto suficiente para boas respostas sem queimar tokens.
Histórico e Trilha de Auditoria
Toda escrita em uma memória armazenada é registrada no SQLite: adições, atualizações, exclusões, importações e a mudança de importância por trás de pin(). Cada entrada carrega a ação, um carimbo de data/hora UTC e o conteúdo em ambos os lados, para que um registro possa ser reconstruído a partir do log depois que a própria memória desaparecer.
history = memory.get_history(memory_id)
for entry in history:
print(f"{entry.timestamp}: {entry.action.value}")
if entry.old_content:
print(f" From: {entry.old_content}")
if entry.new_content:
print(f" To: {entry.new_content}")
O que o log cobre hoje é o que mudou e quando. As entradas não são atribuídas a um chamador, então respondem "o que aconteceu com esta memória" e não "quem fez isso". Leituras e buscas não são registradas, apenas escritas. A retenção é purge_expired(); ttl_days oculta memórias antigas da busca e as deixa no disco.
Resolução de Conflitos em Lote
Quando novos fatos são adicionados, o widemem encontra memórias existentes relacionadas e envia tudo ao LLM em uma única chamada. O LLM decide para cada fato se deve ADICIONAR (novo), ATUALIZAR (modificar existente), EXCLUIR (contradito) ou NENHUM (duplicado).
Esta é a principal melhoria arquitetural em relação às abordagens fato a fato. Uma chamada em vez de N. O LLM vê o contexto completo e pode tomar melhores decisões. Sua conta de API vê menos itens de linha.
Sanitizador de Injeção de Prompt
O conteúdo da memória é realimentado nos prompts do LLM na extração, resolução de conflitos, sumarização e no momento da resposta. Conteúdo hostil armazenado uma vez pode envenenar todas as chamadas posteriores. O widemem remove padrões conhecidos de injeção de prompt antes que o conteúdo chegue ao LLM:
- Substituições diretas de instrução (
ignore previous instructions,disregard the rules,forget what I said) - Tags de prompt de sistema (
<system>,<|im_start|>,[system]) - Marcadores de papel no início da linha (
system:,assistant:) - Vocabulário comum de jailbreak (
DAN mode,developer mode) - Ações destrutivas direcionadas à memória (
delete all memories)
Conservador por design: apenas os padrões de ataque mais bem estabelecidos são correspondidos, para que conteúdo clínico ou operacional legítimo como "ignore todos os medicamentos anteriores" ou "o paciente frequentemente esquece tudo pela manhã" passe intacto.
from widemem.security import detect_injection, sanitize
cats = detect_injection("Please ignore all previous instructions.")
# ["instruction-override"]
sanitized, found = sanitize("<system>do harmful stuff</system>")
# sanitized = "[REDACTED]do harmful stuff[REDACTED]"
# found = ["system-tag", "system-tag"]
O sanitizador é executado automaticamente dentro de LLMExtractor.extract(). Esta é uma defesa de base, não uma solução completa: defesa em profundidade ainda exige validação de saída, prompts estruturados que distinguem dados de instrução e proteções do lado do provedor.
Extração Autossupervisionada
O widemem pode coletar pares de treinamento de extração (collect_extractions=True em MemoryConfig) e permitir que você destile um pequeno modelo local a partir deles, recorrendo ao LLM quando a confiança do modelo pequeno for baixa. Código em widemem/extraction/collector.py. Scripts de treinamento em scripts/.
A coleta é desativada por padrão e opt-in, porque persiste texto de entrada bruto, pré-sanitização (um risco de PII). ExtractionCollector permanece desativado a menos que você passe enabled=True ou defina WIDEMEM_COLLECT_EXTRACTIONS=1; enquanto desativado, não abre banco de dados e toda operação é um no-op.
Referência da API
Assinaturas completas de métodos, parâmetros e tipos de retorno: docs/api.md.
A superfície mais usada:
| Método | Descrição |
|---|---|
add(text, user_id, ...) | Extrai e armazena memórias. Retorna AddResult. |
search(query, user_id, top_k, mode, ...) | Busca memórias. Retorna SearchResult (compatível com lista, com .confidence). |
pin(text, user_id, importance=9.0) | Armazena memória com importância elevada. |
get(memory_id) | Obtém uma única memória por ID. |
delete(memory_id) | Exclui uma memória por ID. |
summarize(user_id, force) | Aciona sumarização hierárquica. |
Habilidade para Claude Code
Experimente o widemem diretamente no Claude Code com a habilidade oficial de memória.
Instalação
pip install widemem-ai[mcp,sentence-transformers]
Comandos disponíveis
| Comando | Descrição |
|---|---|
/mem search <query> | Busca semântica em todas as memórias |
/mem add <text> | Armazena um fato (com portões de qualidade) |
/mem pin <text> | Fixa fato crítico com alta importância |
/mem stats | Contagem de memórias e verificação de saúde |
/mem export | Exporta todas as memórias como JSON |
/mem reflect | Auditoria completa de memória (duplicatas, contradições, obsolescência) |
Repositório da habilidade
Instruções completas de configuração e fonte: widemem-skill.
Servidor MCP
O widemem inclui um servidor MCP para Claude Desktop, Cursor ou qualquer cliente compatível com MCP.
pip install widemem-ai[mcp]
python -m widemem.mcp_server
Ferramentas expostas: widemem_add, widemem_search, widemem_delete, widemem_count, widemem_health. Configure provedores via WIDEMEM_LLM_PROVIDER, WIDEMEM_EMBEDDING_PROVIDER, etc.
Configuração completa, variáveis de ambiente e configuração do Claude Desktop: docs/mcp.md.
Desenvolvimento
git clone https://github.com/remete618/widemem-ai
cd widemem-ai
pip install -e ".[dev,faiss]"
pytest
Mais de 600 testes. Todos passam. Nós verificamos.
Benchmarks
Medido no benchmark completo LoCoMo de 1.540 perguntas, v1.5.0:
| Métrica | Resultado |
|---|---|
| Precisão geral | 55,15% (juiz independente GPT-4o; 56,32% autoavaliado) |
| Contexto por consulta | ~213 tokens (vs ~26k para preenchimento de contexto completo) |
Precisão de meio do pacote a uma fração do custo de tokens: sistemas de referência gastam de 1.700 a 26.000 tokens por consulta. Rótulos por categoria publicados antes de 2026-07-06 tinham salto único e salto múltiplo transpostos; a alegação de liderança em salto múltiplo é retirada e a correção está registrada em docs/HISTORY.md. Metodologia completa, detalhamentos por categoria e comparações com sistemas de referência: widemem.ai/benchmarks.
Para reexecutar: o harness (benchmark/run_ws1.py, val.py, honest_core.py) e a divisão de perguntas (benchmark/locomo_split.json) estão neste repositório. O conjunto de dados LoCoMo em si não é incluído aqui, então busque-o em snap-research/locomo em benchmark/locomo-data/ primeiro. Arquivos de resultados publicados não são commitados.
Roadmap
Rastreado publicamente como issues do GitHub. Vote com reações para priorizar. Issues marcadas com good first issue são pontos de entrada ideais para novos contribuidores. Cada uma carrega um escopo, um padrão de qualidade e um SLA de revisão de 48 horas no corpo.
Núcleo com qualidade de auditoria
- #21 Proveniência de mensagem de origem — vincula cada fato no log de histórico de volta à mensagem recebida que o produziu
Integrações de frameworks
- #22 Adaptador LangChain
BaseChatMessageHistory— backend de histórico de conversa plug-and-play para cadeias e agentes LangChain - #23 Adaptador LangChain
BaseRetriever— recuperação estilo RAG do widemem em qualquer cadeia LangChain - #24 Adaptador LangGraph
BaseStore— backend de memória para agentes LangGraph com estado
Em andamento
- #6 Busca de memória em streaming — iterador assíncrono sobre resultados conforme são classificados (reivindicado por @harishkotra)
O que explicitamente não estamos construindo: matriz de integração com 20 provedores, backends adicionais de armazenamento vetorial além de FAISS e Qdrant, serviço hospedado multi-tenant, interface web para gerenciamento de memória, API GraphQL, interface de linha de comando. O 80/20 é o núcleo com qualidade de auditoria para implantações regulamentadas. Todo o resto é código de aplicação.
Aviso legal e uso pretendido
O widemem é infraestrutura para desenvolvedores, fornecida sob a Licença Apache 2.0, como está e sem garantia de qualquer tipo. Não é aconselhamento médico, jurídico, fiscal ou financeiro, não é um dispositivo médico e não substitui um profissional qualificado. Seu tratamento YMYL (regex mais classificação por LLM) é uma rede de segurança de melhor esforço, não uma garantia. Mantenha um humano no circuito e verifique as saídas antes de confiar nelas em qualquer decisão de alto risco.
Você é responsável pela sua própria implantação, pelos dados que armazena e pelo cumprimento das obrigações regulatórias que se aplicam a você. Quando você auto-hospeda, seus dados permanecem no seu ambiente e não recebemos nada.
Nota de exportação: o software pode estar sujeito a leis de controle de exportação e sanções (incluindo as listas EAR e OFAC dos EUA). Não baixe, use ou reexporte em violação dessas leis.
A licença Apache 2.0 em LICENSE rege o uso do código. Os termos para o serviço hospedado e o site estão em widemem.ai/terms. Os termos do provedor de LLM se aplicam às chamadas de API do provedor.
Contato
- E-mail: hello@widemem.ai
- Projeto: widemem.ai
- Repositório: github.com/remete618/widemem-ai
Relatórios de bugs, solicitações de recursos e opiniões não solicitadas são todos bem-vindos na página de issues do GitHub.
Licença
Apache 2.0. Veja LICENSE para o texto completo que ninguém lê.