ogham-mcp
Memória compartilhada persistente para agentes de IA. Busca híbrida (pgvector + tsvector), grafo de conhecimento, pontuação cognitiva - 97,2% Recall@10 no LongMemEval
Documentação
Ogham MCP
Ogham (pronunciado "Ô-am") -- memória compartilhada persistente e pesquisável para agentes de codificação de IA. Funciona em vários clientes.
O que é
Agentes de codificação de IA esquecem tudo entre sessões. Mude do Claude Code para o Cursor, para o Kiro, para o OpenCode e o contexto desaparece -- decisões, pegadinhas, a forma do seu código -- então você se repete, reexplica e re-depura os mesmos problemas.
O Ogham dá aos seus agentes uma memória compartilhada que persiste entre sessões e clientes. É um mecanismo de recuperação: armazena o que importa e encontra novamente, e seu LLM lê os resultados.
A recuperação é estruturada -- busca híbrida mais um grafo de arestas tipadas, não apenas similaridade vetorial. É isso que permite responder a perguntas cuja resposta é um caminho entre dois fatos, o caso em que o RAG vetorial simples falha.
Início rápido
uvx --from ogham-mcp ogham init
ogham init executa um assistente de configuração: ele conecta seu banco de dados, escolhe um provedor de embeddings, migra o esquema e escreve a configuração do cliente MCP (Claude Code, Cursor, VS Code e outros). Para o Claude Code, ele executa claude mcp add para você; para outros clientes, imprime o trecho para copiar.
Você precisa de um banco de dados primeiro -- um projeto Supabase gratuito ou um banco Neon. No Neon ou Postgres auto-hospedado, instale o extra postgres para que o driver esteja disponível:
uvx --from 'ogham-mcp[postgres]' ogham init
Depois, diga ao seu agente para lembrar de algo e pergunte sobre isso mais tarde -- do mesmo cliente ou de um diferente. Eles compartilham o banco de dados, então a memória segue você.
Configuração manual, outros métodos de instalação (Docker, fonte), modo multi-agente HTTP
Configuração manual
Se você preferir configurar as coisas por conta própria em vez de usar o assistente:
# Supabase
export SUPABASE_URL=https://your-project.supabase.co
export SUPABASE_KEY=your-service-role-key
export EMBEDDING_PROVIDER=openai # or ollama, mistral, voyage
export OPENAI_API_KEY=sk-... # for your chosen provider
# Or Postgres (Neon, self-hosted)
export DATABASE_BACKEND=postgres
export DATABASE_URL=postgresql://user:pass@host/db
export EMBEDDING_PROVIDER=openai
export OPENAI_API_KEY=sk-...
Execute a migração do esquema (sql/schema.sql para Supabase, sql/schema_postgres.sql para Neon/auto-hospedado) e depois adicione o servidor MCP ao seu cliente.
Métodos de instalação
| Método | Comando | Quando usar |
|---|---|---|
| uvx (recomendado) | uvx ogham-mcp | Configuração rápida, atualizações automáticas |
| Docker | docker pull ghcr.io/ogham-mcp/ogham-mcp | Isolamento, auto-hospedado |
| Git clone | git clone + uv sync | Desenvolvimento, contribuições |
Claude Code
claude mcp add ogham -- uvx ogham-mcp
OpenCode -- adicione ao ~/.config/opencode/opencode.json:
{
"mcp": {
"ogham": {
"type": "local",
"command": ["uvx", "ogham-mcp"],
"environment": {
"SUPABASE_URL": "https://your-project.supabase.co",
"SUPABASE_KEY": "{env:SUPABASE_KEY}",
"EMBEDDING_PROVIDER": "openai",
"OPENAI_API_KEY": "{env:OPENAI_API_KEY}"
}
}
}
}
Docker
docker run --rm \
-e SUPABASE_URL=https://your-project.supabase.co \
-e SUPABASE_KEY=your-key \
-e EMBEDDING_PROVIDER=openai \
-e OPENAI_API_KEY=sk-... \
ghcr.io/ogham-mcp/ogham-mcp
A partir da fonte
git clone https://github.com/ogham-mcp/ogham-mcp.git
cd ogham-mcp
uv sync
uv run ogham --help
Transporte HTTP (multi-agente)
Por padrão, o Ogham roda em modo stdio -- cada cliente MCP inicia seu próprio processo de servidor. Para permitir que vários agentes compartilhem um servidor, execute-o via HTTP:
ogham serve --transport streamable-http --port 8742
O servidor roda como um processo de fundo persistente. Todos os clientes se conectam à mesma instância -- um pool de banco de dados, um cache de embeddings, memória compartilhada.
Configuração do cliente (qualquer cliente MCP):
{
"mcpServers": {
"ogham": {
"url": "http://127.0.0.1:8742/mcp"
}
}
}
Verificação de saúde em http://127.0.0.1:8742/health (em cache, abaixo de 10ms). Configure via variáveis de ambiente (OGHAM_TRANSPORT=streamable-http, OGHAM_HOST, OGHAM_PORT) ou flags de CLI. http é aceito como um alias para streamable-http.
No Docker, vincule a todas as interfaces. O host padrão é 127.0.0.1, que dentro de um contêiner significa o próprio contêiner -- publicar a porta não o alcançará:
docker run -p 8742:8742 ghcr.io/ogham-mcp/ogham-mcp:latest \
serve --transport streamable-http --host 0.0.0.0 --port 8742
SSE (legado)
O Ogham ainda aceita --transport sse e serve esse endpoint em /sse. Funciona e permanece para implantações existentes, mas novas configurações devem usar streamable-http.
A especificação MCP agora define dois transportes padrão, stdio e Streamable HTTP, e trata HTTP+SSE como obsoleto. A diferença que importa é o que acontece quando uma sessão é perdida. O Streamable HTTP atribui um Mcp-Session-Id e define o caminho de volta: o servidor responde a uma sessão morta com HTTP 404, e o cliente inicia uma nova. O SSE não define recuperação alguma, então uma sessão que perde seu estado inicializado rejeita toda solicitação posterior com -32602, e o cliente não consegue distinguir um problema de ciclo de vida de um argumento inválido. Uma conexão perdida pode deixar um agente falhando em todas as chamadas até que alguém o reinicie.
Pontos de entrada
ogham-- a CLI. Use paraogham init,ogham health,ogham searche outros comandos que você executa. Executaroghamsem argumentos inicia o servidor MCP.ogham-serve-- inicia o servidor MCP diretamente. É isso que os clientes MCP devem chamar. Quando você executauvx ogham-mcp, ele invocaogham-serve.
Qualidade de recuperação
O Ogham é um mecanismo de recuperação -- ele encontra as memórias, seu LLM as lê. Os números principais, e eles medem coisas diferentes:
- Recuperação: 97,2% R@10 no LongMemEval com uma consulta Postgres (busca híbrida CCF pgvector + tsvector). A linha de base do artigo é 78,4%. Outros sistemas que relatam R@10 semelhante normalmente empilham reordenação por cross-encoder, verificação NLI e enriquecimento de grafo de conhecimento.
- QA ponta a ponta: 85,8% no harness AMB (500 perguntas, abril de 2026, avaliador estrito de substring, leitor GPT-5-mini; R@10 99,5%), e 0,554 nugget no BEAM 100K (linha de base do artigo 0,358; sete de nove categorias superam o artigo).
A precisão de QA testa se o sistema completo (recuperação + LLM) produz a resposta correta. R@10 testa se apenas a recuperação encontrou as memórias certas. Tabelas completas, metodologia e a comparação com concorrentes estão em ogham-mcp.dev/features; os textos explicam por que os números AMB e internos diferem (LongMemEval, BEAM).
Tabelas completas de benchmarks (QA, R@10, por categoria, concorrentes)
85,8% de precisão de QA no harness de benchmark AMB (500 perguntas, abril de 2026) -- 429/500 perguntas respondidas corretamente usando GPT-5-mini com raciocínio, avaliado pelo Gemini 2.5 Flash Lite como avaliador estrito. R@10 de recuperação: 99,5%. AMB é o harness de avaliação padronizado construído pela equipe Vectorize (criadores do Hindsight). Agradecemos a Nicolo e à equipe Vectorize por tornar o harness aberto.
Anteriormente: 91,8% em nosso pipeline interno de benchmark LongMemEval (leitor gpt-5.4-mini, avaliador por rubrica). O número AMB é menor porque o AMB usa um avaliador mais estrito de correspondência de substring -- veja o texto completo para diferenças de metodologia.
0,554 de pontuação nugget no BEAM 100K (400 perguntas em 10 habilidades de memória, ICLR 2026), usando o prompt exato do avaliador do artigo do Apêndice G. A linha de base publicada é 0,358 (Llama-4-Maverick + LIGHT). R@10 de recuperação: 0,737. Sete de nove categorias superam o artigo. Texto completo.
Precisão de QA ponta a ponta no LongMemEval (recuperação + LLM lê e responde):
| Sistema | Precisão | Arquitetura |
|---|---|---|
| OMEGA | 95,4% | Pipeline de classificação + extração |
| Observational Memory (Mastra) | 94,9% | Extração de observação + GPT-5-mini |
| Ogham v0.9.2 | 85,8% | Verbatim + extração em tempo de leitura + gpt-5-mini (harness AMB, avaliador estrito) |
| Ogham v0.9.1 | 91,8% | Busca híbrida + engenharia de contexto + gpt-5.4-mini (benchmark interno) |
| Hindsight (Vectorize) | 91,4% | 4 tipos de memória + Gemini-3 |
| Zep (Graphiti) | 71,2% | Grafo de conhecimento temporal + GPT-4o |
| Mem0 | 49,0% | Baseado em RAG |
Somente recuperação (R@10 -- sem LLM no loop de busca):
| Sistema | R@10 | Arquitetura |
|---|---|---|
| Ogham | 97,2% | 1 consulta SQL (busca híbrida CCF pgvector + tsvector) |
| Linha de base do artigo LongMemEval | 78,4% | Decomposição de sessão + chaves aumentadas por fatos |
Outros sistemas de recuperação que relatam números R@10 semelhantes normalmente usam reordenação por cross-encoder, verificação NLI, enriquecimento de grafo de conhecimento e pipelines de LLM-como-avaliador. O Ogham atinge 97,2% com uma consulta Postgres. Reordenação FlashRank opcional está disponível para quem quer precisão extra de classificação em auto-hospedagem.
Essas tabelas medem coisas diferentes. A precisão de QA testa se o sistema completo (recuperação + LLM) produz a resposta correta. R@10 testa se apenas a recuperação encontra as memórias certas. O Ogham é um mecanismo de recuperação -- ele encontra as memórias, seu LLM as lê.
| Categoria | R@10 | Perguntas |
|---|---|---|
| single-session-assistant | 100% | 56 |
| knowledge-update | 100% | 78 |
| single-session-user | 98,6% | 70 |
| multi-session | 97,3% | 133 |
| single-session-preference | 96,7% | 30 |
| temporal-reasoning | 93,5% | 133 |
Divisão completa: ogham-mcp.dev/features
Como funciona
AI Client (Claude Code, Cursor, Kiro, OpenCode, ...)
|
| stdio or SSE (MCP protocol)
|
Ogham MCP Server
|
| HTTPS (Supabase REST API) or direct connection (Postgres)
|
PostgreSQL + pgvector
As memórias são armazenadas como linhas com embeddings vetoriais. A busca combina similaridade de cosseno pgvector com busca de texto completo do PostgreSQL usando Fusão de Classificação Recíproca (RRF) -- fusão baseada em posição, agnóstica de pontuação, que lida corretamente com diferentes escalas de pontuação. O grafo de conhecimento vive em uma tabela memory_relationships percorrida com CTEs recursivas; o grafo de arestas tipadas (v0.16) adiciona relacionamentos estruturais com predicados tipados para consultas de junção de dois fatos. Sem banco de dados de grafo separado. Reordenação opcional por cross-encoder FlashRank adiciona uma segunda passada para auto-hospedagem.
O que contém
- Operações de memória -- armazena memórias, decisões, preferências, fatos e eventos; atualiza, reforça e contradiz.
- Busca híbrida -- semântica + texto completo (RRF), filtros de tags, busca multi-perfil, extração de fatos em tempo de leitura.
- Grafo de arestas tipadas (v0.16) --
store_triple/query_joinpara consultas de junção de dois fatos contra um vocabulário controlado de predicados. docs - Grafo de conhecimento -- vinculação automática, recuperação por ativação de propagação e sugestões de conexão via entidades compartilhadas.
- Camada Wiki -- sintetiza as memórias de uma tag em uma página markdown em cache; percorre o grafo; verifica a saúde.
- Formato de Conhecimento Aberto -- pacotes portáteis de ida e volta (markdown + um visualizador de grafo autônomo), OKF v0.1.
- Enriquecimento de entidades -- tags de entidades por regex em 18 idiomas sem LLM no caminho de escrita; uma tabela de linha do tempo; reordenação Lost-in-the-Middle.
- Ciclo de vida da memória -- estágios FRESH / STABLE / EDITING, importância ACT-R, decaimento Hebbiano e condensação automática.
- Importadores -- auto-memória do Claude Code, exportação do Claude.ai, issues do Linear e JSON.
- Adaptadores de ingestão (v0.17) -- captura para memória a partir de um cofre Obsidian/markdown (
ingest-obsidian), Telegram (ingest-telegram) e Slack (ingest-slack). Somente saída, idempotentes e amigáveis a temporizadores; todos os três compartilham um caminho de enriquecimento e deduplicação no servidor. - Hooks de ciclo de vida -- recupera contexto no início da sessão, inscreve sinal (não ruído) após uso de ferramentas; segredos mascarados antes do armazenamento.
- Habilidades --
ogham-research,ogham-recall,ogham-maintain. - Opções para auto-hospedagem -- embeddings locais ONNX (BGE-M3), reordenação FlashRank opcional, cinco provedores de embeddings.
Referência completa para cada ferramenta, variável de ambiente e caminho de configuração está em Referência abaixo.
A história mais profunda
O pipeline de recuperação é construído sobre trabalho estabelecido de recuperação de informação e ciência cognitiva, não heurísticas ad-hoc:
- Pesquisa híbrida -- Fusão de Rank Recíproco (Cormack, Clarke & Butt, SIGIR 2009): similaridade vetorial densa fundida por rank com correspondência de palavras-chave estilo BM25, sem normalização de pontuação.
- Importância ACT-R + decaimento Hebbiano -- ponderação por recência, frequência e surpresa (Anderson & Lebiere, 1998; Hebb, 1949). Memórias não acessadas desaparecem; as acessadas com frequência são potencializadas e persistem.
- Extração de fatos em tempo de leitura -- armazenamento verbatim com extração ciente da consulta na recuperação, para que a verdade básica permaneça re-extraível com diferentes perguntas posteriormente (Anthropic, arXiv:2510.05179). Suporta modelos locais via Ollama para soberania total de dados.
- Detecção de contradição + superação -- memórias de polaridade oposta são vinculadas, não excluídas; a aresta registra que a memória mais nova superou a mais antiga.
- Trilha de auditoria somente anexação -- cada armazenamento, pesquisa, exclusão e atualização é registrado em uma tabela
audit_logna mesma instância Postgres, alinhado ao Artigo 15 do GDPR e às convenções OTEL GenAI.
Fundamentos de pesquisa (lista completa com citações)
O pipeline de recuperação do Ogham combina técnicas estabelecidas de recuperação de informação e ciência cognitiva:
-
Pesquisa híbrida -- Fusão de Rank Recíproco (Cormack, Clarke & Butt, SIGIR 2009) combinando similaridade vetorial densa (pgvector) com correspondência de palavras-chave estilo BM25 (tsvector do PostgreSQL). Dois sistemas de recuperação independentes, fundidos por rank sem normalização de pontuação.
-
Impulso de sobreposição de entidades -- memórias que compartilham entidades nomeadas com a consulta recebem um impulso de relevância limitado (até 1,4x), inspirado na literatura de vinculação de entidades (Kolitsas et al., CoNLL 2018). A extração de entidades cobre 18 idiomas via listas de palavras baseadas em YAML, sem LLM no caminho de escrita.
-
Embeddings Matryoshka -- dimensionalidade flexível via Aprendizado de Representação Matryoshka (Kusupati et al., NeurIPS 2022). Provedores de embeddings (OpenAI, Voyage, Gemini, Ollama) produzem vetores de dimensão nativa truncados para 512d, permitindo armazenamento portátil entre provedores sem re-embedding.
-
Reordenação por diversidade temporal -- penalidade suave controlada por densidade que previne agrupamento semântico em um único período de tempo, estendendo os princípios de Relevância Marginal Máxima (Carbonell & Goldstein, SIGIR 1998). Só é ativada quando os resultados top-k estão temporalmente concentrados, deixando resultados bem distribuídos intactos.
-
Pontuação de importância ACT-R -- ponderação de memória inspirada em arquitetura cognitiva baseada em recência, frequência de acesso e surpresa (Anderson & Lebiere, 1998). Memórias acessadas com frequência permanecem nítidas, as raramente acessadas desaparecem, as contestadas caem no ranking sem exclusão.
-
Decaimento e potencialização Hebbianos -- memórias não acessadas perdem importância ao longo do tempo (5% por período de 30 dias ocioso). Memórias acessadas 10+ vezes tornam-se "potencializadas" com uma taxa de decaimento mais lenta (1% por 30 dias), simulando potencialização de longo prazo. Baseado na regra de aprendizado de Hebb (Hebb, 1949) e em modelos computacionais de plasticidade sináptica (Bi & Poo, 2001). A importância serve como multiplicador na fórmula de relevância -- memórias em decaimento afundam nos rankings, mas permanecem recuperáveis (piso em 0,05). A importância original é preservada nos metadados para recuperação. Executado como trabalho em lote via
ogham decayou pg_cron. -
Ciclo de vida da memória (v0.11.0): FRESH / STABLE / EDITING. Cada memória agora tem um estágio explícito rastreado em uma tabela
memory_lifecyclededicada. Novas memórias chegam emfresh. O hook de início de sessão varre memórias frescas envelhecidas parastablequando elas ultrapassam um limite de importância-ou-surpresa e permaneceram tempo suficiente. A recuperação abre uma janela de 30 minutoseditingnas memórias retornadas para que chamadasupdate_memoryde acompanhamento refinem pensamentos recentes no lugar; as janelas fecham automaticamente na próxima varredura. Memórias recuperadas juntas também fortalecem suas arestas de grafo pareadas (eta=0,01 por co-recuperação, limitado a 1,0). O design se baseia em três linhas de trabalho anterior: co-ativação Hebbiana (Hebb, 1949), a curva de esquecimento híbrida exponencial-depois-lei-de-potência caracterizada por Wixted (2004) com base em Ebbinghaus (1885), e a janela de reconsolidação de memória da neurociência (Nader, Schafe & LeDoux, 2000) para o mecanismo de edição-na-recuperação. O estado do estágio vive em sua própria tabela para que as transições não toquem o índice vetorial HNSW. -
Ativação em propagação -- quando uma pesquisa atinge uma memória, a ativação se propaga ao longo das arestas de relacionamento para puxar memórias conectadas que não teriam correspondido por conta própria. Integrada em consultas de referência cruzada, ordenação e resumo. A ponderação adaptativa por densidade significa que grafos esparsos dependem mais do sinal do grafo, grafos densos dependem mais da pontuação de recuperação. Inspirado na teoria de redes semânticas de Collins & Loftus (1975).
-
Detecção de contradição -- quando uma nova memória tem polaridade oposta a uma memória existente de alta similaridade, o Ogham cria automaticamente uma aresta de relacionamento
contradicts. A detecção de polaridade usa marcadores de negação em 18 idiomas carregados de listas de palavras YAML. Memórias contraditas não são excluídas -- a aresta registra que a memória mais nova superou a mais antiga. -
Extração de fatos em tempo de leitura -- extração ciente da consulta no momento da recuperação preserva o armazenamento verbatim para auditabilidade, contrastando com abordagens de compressão no momento da escrita. O armazenamento verbatim garante que a verdade básica esteja sempre disponível para re-extração com diferentes perguntas posteriormente -- uma escolha de design informada por considerações de alinhamento em memória de agente persistente (Anthropic, arXiv:2510.05179). Suporta modelos locais via Ollama para soberania total de dados.
-
Trilhas de auditoria somente anexação -- cada operação de armazenamento, pesquisa, exclusão e atualização é registrada em uma tabela
audit_logna mesma instância Postgres. Projetado para solicitações de acesso do titular de dados do Artigo 15 do GDPR e governança de custos. Os campos estão alinhados com as Convenções Semânticas OTEL GenAI. Consulte via CLIogham audit. Sem infraestrutura extra -- executa no mesmo banco de dados que as memórias.
Referência
Comandos CLI
ogham init # Interactive setup wizard
ogham health # Check database + embedding provider
ogham config # Show runtime configuration (secrets masked)
ogham store "some fact" # Store a memory
ogham search "query" # Search memories (hybrid: semantic + keyword)
ogham search "q" --json # JSON output for scripting
ogham search "q" --tags "a,b" # Filter by comma-separated tags
ogham list # List recent memories
ogham list --json # JSON output
ogham delete <id> # Delete a memory by ID
ogham use <profile> # Switch default profile
ogham profiles # List profiles and counts
ogham stats # Profile statistics
ogham export -o backup.json # Export memories (JSON)
ogham export --format markdown # Export as Obsidian-compatible markdown
ogham export --format okf # Export as Open Knowledge Format v0.1 bundle
ogham import backup.json # Import a JSON export
ogham import <okf-bundle-dir> # Import an OKF bundle directory (auto-detected)
ogham cleanup # Remove expired memories
ogham hooks install # Auto-detect client + configure hooks
ogham hooks recall # Read from the stone (load project context)
ogham hooks inscribe # Carve into the stone (capture activity)
ogham hooks inscribe --dry-run # Preview hook memory without storing
ogham serve # Start MCP server (stdio, default)
ogham serve --transport http # Start HTTP server on port 8742
ogham openapi # Generate OpenAPI spec
Pesquisa multi-perfil -- pesquisa em vários perfis em uma única consulta (v0.8.5+):
# MCP tool
hybrid_search(query="architecture decisions", profiles=["work", "shared"])
# Python library
from ogham.service import search_memories_enriched
results = search_memories_enriched(
query="architecture decisions",
profile="work",
profiles=["work", "shared", "project-alpha"],
)
Quando profiles está definido, os resultados incluem memórias de todos os perfis listados com um campo profile mostrando de qual perfil cada resultado veio.
Configuração (variáveis de ambiente, provedores de embeddings, pesquisa temporal)
| Variável | Obrigatória | Padrão | Descrição |
|---|---|---|---|
DATABASE_BACKEND | Não | supabase | supabase ou postgres |
SUPABASE_URL | Se supabase | -- | URL do seu projeto Supabase |
SUPABASE_KEY | Se supabase | -- | Chave secreta do Supabase (service_role) |
DATABASE_URL | Se postgres | -- | String de conexão PostgreSQL |
EMBEDDING_PROVIDER | Não | ollama | ollama, openai, mistral, voyage, gemini ou onnx |
EMBEDDING_DIM | Não | 512 | Dimensões do vetor -- deve corresponder ao seu esquema (veja abaixo) |
OPENAI_API_KEY | Se openai | -- | Chave da API OpenAI |
MISTRAL_API_KEY | Se mistral | -- | Chave da API Mistral |
VOYAGE_API_KEY | Se voyage | -- | Chave da API Voyage AI |
GEMINI_API_KEY | Se gemini | -- | Chave da API Google Gemini |
OLLAMA_URL | Não | http://localhost:11434 | URL do servidor Ollama |
OLLAMA_EMBED_MODEL | Não | embeddinggemma | Modelo de embedding Ollama |
MISTRAL_EMBED_MODEL | Não | mistral-embed | Modelo de embedding Mistral |
VOYAGE_EMBED_MODEL | Não | voyage-4-lite | Modelo de embedding Voyage |
GEMINI_EMBED_MODEL | Não | gemini-embedding-2-preview | Modelo de embedding Gemini |
RERANK_ENABLED | Não | false | Ativar reordenação com cross-encoder FlashRank |
RERANK_ALPHA | Não | 0.55 | Peso da pontuação do cross-encoder (0-1) |
DEFAULT_MATCH_THRESHOLD | Não | 0.7 | Limite de similaridade (veja abaixo) |
DEFAULT_MATCH_COUNT | Não | 10 | Máximo de resultados por pesquisa |
DEFAULT_PROFILE | Não | default | Nome do perfil de memória |
OGHAM_RECALL_ENABLED | Não | true | Ativar recuperação de memória/contexto |
OGHAM_INSCRIBE_ENABLED | Não | true | Ativar captura de memória/escritas de conteúdo |
Provedores de embeddings
| Provedor | Dimensões padrão | Limite recomendado | Notas |
|---|---|---|---|
| OpenAI | 512 (padrão do esquema) | 0.35 | Defina EMBEDDING_DIM=512 explicitamente -- OpenAI usa 1024 por padrão |
| Ollama | 512 | 0.70 | Agrupamento apertado, pontuações variam de 0.8-0.9 |
| Mistral | 1024 | 0.60 | 1024 dims fixos, não pode truncar. O esquema deve ser vector(1024) |
| Voyage | 512 (padrão do esquema) | 0.45 | Dispersão moderada |
| Gemini | 512 | 0.35 | gemini-embedding-2-preview, suporta truncamento MRL |
| ONNX | 1024 | 0.35 | Inferência local BGE-M3, vetores densos + esparsos. Veja a seção ONNX |
EMBEDDING_DIM deve corresponder à coluna vector(N) no esquema do seu banco de dados. O esquema padrão usa vector(512). Se você usar Mistral, precisa alterar a coluna para vector(1024) antes de armazenar qualquer coisa.
Cada provedor agrupa vetores de forma diferente, então o limite de similaridade importa. Comece com o valor recomendado e ajuste com base nos seus resultados.
Pesquisa temporal -- consultas com expressões de tempo como "semana passada" ou "três meses atrás" são resolvidas automaticamente usando parsedatetime, sem necessidade de configuração. Isso cobre aproximadamente 80% das consultas temporais a custo zero. Para expressões que parsedatetime não consegue analisar ("o trimestre anterior", "perto do Dia de Ação de Graças"), defina TEMPORAL_LLM_MODEL para chamar um LLM como fallback:
# Self-hosted with Ollama (free, local)
TEMPORAL_LLM_MODEL=ollama/llama3.2
# Cloud API
TEMPORAL_LLM_MODEL=gpt-4o-mini
Qualquer string de modelo compatível com litellm funciona -- deepseek/deepseek-chat, moonshot/moonshot-v1-8k, etc. O LLM só é chamado quando parsedatetime falha e a consulta tem intenção temporal, então os custos permanecem próximos de zero. Se TEMPORAL_LLM_MODEL estiver vazio (o padrão), parsedatetime lida com tudo sozinho. Requer o pacote litellm.
Hooks de ciclo de vida (recall / inscribe, filtragem inteligente, mascaramento de segredos)
Os hooks do Ogham injetam contexto de memória no início da sessão e o preservam através da compactação. Instale para seu cliente:
ogham hooks install
| Cliente | O que é instalado |
|---|---|
| Claude Code | Hooks em ~/.claude/settings.json (recall em SessionStart/PostCompact, inscribe em PostToolUse/PreCompact) |
| Kiro | Instruções para a UI de Hooks (recall em Prompt Submit, inscribe em Agent Stop) |
| Codex, Cursor, outros | Arquivo de instruções do projeto (CLAUDE.md, AGENTS.md ou .cursorrules) |
Dois comandos, nomeados após as pedras Ogham:
- recall -- ler da pedra. Pesquisa no Ogham por memórias relevantes ao seu projeto e as injeta como contexto. Dispara no início da sessão e após a compactação.
- inscribe -- esculpir na pedra. Captura atividade significativa de ferramentas como memórias. Ignora ruído (
ls,cat,git status) e armazena apenas sinal (commits, deploys, erros, mudanças de configuração). Dispara após o uso de ferramentas e antes da compactação. Segredos são mascarados antes do armazenamento.
Desative qualquer um dos fluxos quando quiser um agente conectado ao Ogham sem permitir que ele puxe memória para o contexto ou escreva nova memória:
OGHAM_RECALL_ENABLED=false ogham serve # no context injection / memory search
OGHAM_INSCRIBE_ENABLED=false ogham serve # no memory capture / content writes
ogham hooks recall --no-recall # one-off hook recall skip
ogham hooks inscribe --no-inscribe # one-off hook capture skip
ogham search "query" --no-recall # one-off CLI search skip
ogham store "some fact" --no-inscribe # one-off CLI store skip
Para clientes MCP, coloque as variáveis de ambiente na configuração do servidor Ogham desse cliente:
{
"mcpServers": {
"ogham": {
"command": "ogham-serve",
"env": {
"OGHAM_RECALL_ENABLED": "false",
"OGHAM_INSCRIBE_ENABLED": "false"
}
}
}
}
Operações administrativas como config, health, stats, audit, export, delete e cleanup permanecem disponíveis para que você possa inspecionar ou limpar a memória mesmo quando recall ou inscribe estiverem desabilitados.
Filtragem inteligente: Os hooks não capturam tudo. Comandos rotineiros (ls, pwd, git add) são ignorados. Apenas eventos de sinal (erros, deploys, commits, mudanças de configuração) são armazenados — normalmente 20 a 30 memórias por sessão, em vez de centenas.
Mascaramento de segredos: Chaves de API, tokens, senhas e JWTs são automaticamente substituídos por ***MASKED*** antes do armazenamento. O evento é capturado ("chave da API Stripe configurada"), mas o segredo real nunca toca o banco de dados.
Ferramentas MCP (memória, busca, grafo, arestas tipadas, importadores, perfis, importação/exportação, manutenção)
Operações de memória
| Ferramenta | Descrição | Parâmetros principais |
|---|---|---|
store_memory | Armazena uma nova memória com embedding | content (obrigatório), source, tags[], auto_link |
store_decision | Armazena uma decisão arquitetural | decision, reasoning, alternatives[], tags[] |
store_preference | Armazena uma preferência do usuário com metadados de força | preference, subject, alternatives[], strength |
store_fact | Armazena uma afirmação factual com confiança e citação | fact, subject, confidence, source_citation |
store_event | Armazena um evento com metadados temporais e de participantes | event, when, participants[], location |
update_memory | Atualiza o conteúdo de uma memória existente | memory_id, content, tags[] |
delete_memory | Exclui uma memória por ID | memory_id |
reinforce_memory | Aumenta a pontuação de confiança | memory_id |
contradict_memory | Diminui a pontuação de confiança | memory_id |
Busca
| Ferramenta | Descrição | Parâmetros principais |
|---|---|---|
hybrid_search | Busca combinada semântica + texto completo (RRF) | query, limit, tags[], graph_depth, profiles[], extract_facts |
list_recent | Lista memórias recentes | limit, profile |
find_related | Encontra memórias relacionadas a uma determinada | memory_id, limit |
Grafo de conhecimento
| Ferramenta | Descrição | Parâmetros principais |
|---|---|---|
link_unlinked | Vincula automaticamente memórias por similaridade de embedding | threshold, limit |
explore_knowledge | Percorre o grafo de conhecimento | memory_id, depth, direction |
suggest_connections | Encontra conexões ocultas via entidades compartilhadas | memory_id, min_shared_entities, limit |
Grafo de arestas tipadas (v0.16) — relacionamentos estruturais e tipados para consultas de junção de dois fatos. Detalhes completos em /docs/typed-edges/.
| Ferramenta | Descrição | Parâmetros principais |
|---|---|---|
store_triple | Escreve uma aresta tipada contra um vocabulário controlado de predicados; substitui a aresta atual anterior para o mesmo sujeito + predicado + objeto | subject, predicate, object, profile, source_memory_id |
query_join | Percorre um caminho de predicado tipado a partir de uma entidade inicial; retorna as entidades (ordem BFS), arestas e citações ao longo do caminho — sem classificação difusa | start_entity, predicate_path[], hop_limit (obrigatório), direction |
Importadores
| Ferramenta | Descrição | Parâmetros principais |
|---|---|---|
import_linear | Importa issues do Linear como memórias, somente leitura, deduplicadas por ID do rastreador (v0.16) | veja /docs/import-linear/ |
Perfis
| Ferramenta | Descrição | Parâmetros principais |
|---|---|---|
switch_profile | Alterna o perfil de memória ativo | profile |
current_profile | Mostra o perfil ativo | -- |
list_profiles | Lista todos os perfis com contagens | -- |
set_profile_ttl | Define a expiração automática para um perfil | profile, ttl_days |
Importação / exportação
| Ferramenta | Descrição | Parâmetros principais |
|---|---|---|
export_profile | Exporta todas as memórias no perfil ativo | format (json, markdown ou okf), include_viewer (padrão true para OKF) |
import_memories_tool | Importa uma string de exportação JSON OU detecta automaticamente um diretório de bundle OKF pelo caminho | data, dedup_threshold |
--format okf escreve um bundle compatível com Open Knowledge Format v0.1: um diretório com um arquivo markdown por memória com frontmatter YAML, um index.md na raiz do bundle declarando okf_version: "0.1", e um viewer.html autocontido (grafo Cytoscape.js, abre com file://, sem servidor ou CDN). O round-trip preserva UUID, conteúdo, tags, fonte e metadados; o embedding é regenerado na importação. Passe include_viewer=false para pular o grafo HTML. Veja o relatório de round-trip OKF para o contexto.
Manutenção
| Ferramenta | Descrição | Parâmetros principais |
|---|---|---|
re_embed_all | Re-embedda todas as memórias (após trocar de provedores) | -- |
compress_old_memories | Condensa memórias antigas inativas (texto completo para resumo para tags) | -- |
cleanup_expired | Remove memórias expiradas (TTL) | -- |
health_check | Verifica a conectividade do banco de dados e do embedding | -- |
get_config | Mostra a configuração em tempo de execução com segredos mascarados | -- |
get_stats | Contagens de memória, fontes, tags e saúde do perfil (órfãos, decaimento, marcação) | -- |
get_cache_stats | Taxas de acerto do cache de embedding | -- |
Camada Wiki
A camada wiki transforma uma tag cheia de memórias relacionadas em uma página markdown sintetizada. Execute compile_wiki em uma tag e receba um tópico resumido; o cache é invalidado automaticamente quando as memórias subjacentes mudam. Quatro ferramentas MCP cobrem o ciclo de vida:
| Ferramenta | Descrição | Parâmetros principais |
|---|---|---|
compile_wiki | Compila as memórias de uma tag em uma página markdown sintetizada (chamada LLM, em cache) | topic, provider, model, force |
query_topic_summary | Lê a página em cache para um tópico sem recomputar | topic |
walk_knowledge | Caminhada no grafo com consciência de direção a partir de uma memória conhecida ao longo das arestas de relacionamento | start_id, depth, direction (outgoing, incoming, both), min_strength, relationship_types |
lint_wiki | Relatório de saúde: contradições, órfãos, ciclo de vida obsoleto, resumos obsoletos, deriva de resumos | stable_days, sample_size, include_drift |
A camada wiki precisa de um LLM. A síntese é a etapa do LLM que transforma uma lista de memórias em uma página coerente; apenas embeddings não são suficientes. Você pode executar esse LLM localmente (Ollama com llama3.2, vLLM ou qualquer servidor local compatível com OpenAI) ou na nuvem (Gemini, OpenAI, Anthropic, Mistral, Groq, OpenRouter). Local mantém tudo privado e gratuito; a nuvem geralmente escreve prosa mais polida ao custo de alguns centavos por compilação.
Defina o padrão com LLM_PROVIDER e LLM_MODEL no seu ambiente (por exemplo, LLM_PROVIDER=gemini + LLM_MODEL=gemini-2.5-flash, ou LLM_PROVIDER=ollama + LLM_MODEL=llama3.2). Substitua por chamada com compile_wiki(topic=..., provider=..., model=...). O provedor/modelo é gravado no frontmatter da página resultante, para que você possa recompilar o mesmo tópico com um LLM diferente e ver como a síntese muda.
compile_wiki faz curto-circuito quando as memórias de origem não mudaram desde a última compilação — a chamada é efetivamente gratuita se nada mudou. Passe force=True para ignorar essa verificação (útil para recompilar com um modelo diferente no mesmo conjunto de origem).
A camada wiki requer as migrações 028, 030 e 031 aplicadas ao seu banco de dados. Veja Configuração do banco de dados para detalhes.
Exportação Obsidian
Faça um snapshot da sua camada wiki em uma pasta de arquivos markdown compatíveis com Obsidian. Um .md por tópico com frontmatter YAML completo, além de um índice README.md. Wikilinks entre tópicos são detectados automaticamente e envolvidos em [[brackets]] para a visualização de grafo do Obsidian.
ogham export-obsidian /path/to/vault
ogham export-obsidian /path/to/vault --profile work --force
A exportação é somente leitura — ela escreve arquivos, mas nunca os lê de volta. Edições no Obsidian permanecem no Obsidian; execute a exportação novamente para atualizar o snapshot. Por design, o exportador se recusa a escrever em um diretório que já contém arquivos que ele não criou; passe --force para ignorar essa proteção.
Guia completo com referência de frontmatter, solução de problemas e capturas de tela: documentação de exportação Obsidian.
Open Knowledge Format (bundles portáteis de round-trip)
Portabilidade round-trip para suas memórias. Ogham lê e escreve Open Knowledge Format (OKF) v0.1, o formato de intercâmbio baseado em markdown que o Google Cloud publicou em junho de 2026. O mesmo bundle é portável para qualquer outra ferramenta que fale OKF — o Knowledge Catalog do Google, um leitor caseiro de um colega ou seu próprio sistema futuro.
# Export your profile as an OKF v0.1 bundle directory
ogham export --format okf
# Round-trip it back (auto-detected as an OKF bundle)
ogham import ogham-okf-<profile>-<timestamp>
O bundle é uma árvore de diretórios:
ogham-okf-<profile>-<timestamp>/
├── index.md # declares okf_version: "0.1"
├── viewer.html # self-contained Cytoscape.js graph (opens with file://)
└── memories/
├── <slug>-<uuid8>.md # one markdown file per memory
└── ...
Cada arquivo de memória tem frontmatter YAML (type, id, tags, timestamp, source, title opcional) e o corpo da memória como markdown. type: é derivado da primeira tag type:X em ordem alfabética (com fallback para Memory). O round-trip preserva UUID, conteúdo, tags, fonte e quaisquer metadados de extensão; o embedding é regenerado na importação.
O viewer.html é um arquivo autocontido de 425 KB com Cytoscape.js (MIT) embutido inline — sem servidor, sem internet, sem CDN. Abra-o em qualquer navegador via file:// para ver suas memórias como um grafo colorido por tipo, com arestas seguindo links markdown intra-bundle. Passe include_viewer=false para ignorá-lo.
Comportamento de importação:
- Memórias com a extensão
id:fazem upsert por UUID (reimportações idempotentes). - Memórias sem
id:são inseridas como novas; a contagem aparece comomissing_id_countno resultado. - O importador exige um
index.mdna raiz do bundle comokf_versiondeclarado, para que apontá-lo para um diretório aleatório falhe rapidamente.
Relatório voltado ao usuário: Ogham v0.15 fala Open Knowledge Format.
Importando memória existente (Claude Code, Claude.ai, JSON)
Do Claude Code (arquivos MD de auto-memória)
O sistema de auto-memória do Claude Code escreve notas por projeto em ~/.claude/projects/<encoded-cwd>/memory/. Cada nota é um arquivo markdown com frontmatter YAML (name, description, type, originSessionId opcional). Traga-os para o Ogham:
ogham import-claude-code ~/.claude/projects/<encoded-cwd>/memory \
--project ogham --dedup 0.8
Cada arquivo analisável se torna uma memória Ogham marcada com source:claude-code-memory + type:<frontmatter type> + project:<inferred or explicit>. MEMORY.md (o índice) e dotfiles são ignorados. Arquivos sem frontmatter reconhecível registram um aviso e são ignorados.
A nomeação de diretórios com cwd codificado é perda de informação em nomes de repositório com hífen: openbrain-sharedmemory decodifica para sharedmemory porque cada / e - se torna o mesmo separador. Passe --project NAME para substituir a tag inferida e manter suas tags de projeto consistentes.
O importador respeita inscribe_enabled() -- --no-inscribe e OGHAM_INSCRIBE_ENABLED=false pulam a importação. Re-execuções são seguras contra duplicação via o limite de cosseno --dedup (padrão 0.8). Ferramenta MCP: import_claude_code_memories(directory, project_tag=...).
Do Claude.ai (exportação de dados de conversas)
A Anthropic oferece uma exportação de dados de primeira parte em Configurações → Privacidade → Solicitar seus dados. Após ~24-48h você recebe um ZIP contendo conversations.json. Importe-o no Ogham:
ogham import-claude-ai ~/Downloads/data-<id>-batch-0000 --profile claude-ai
Aceita o próprio ZIP, o diretório descompactado ou conversations.json diretamente. Cada par de turnos (human, assistant) vira uma memória com o turno do assistente como conteúdo (o sinal que você buscará) e o prompt humano em metadata.user_prompt (recuperável para contexto). Marcação: source:claude-ai, claude-conversation:<title-slug>, project:<tag> opcional.
Um filtro inteligente conservador descarta trocas de cortesia; passe --no-smart-filter para mantê-las. Use --since 2026-01-01 para importar apenas conversas recentes, ou --mode raw para uma memória por mensagem individual em vez de por par de turnos.
Para obter um resumo destilado por LLM de uma conversa importada, chame compile_wiki(topic="claude-conversation:<slug>") via MCP. A ingestão verbatim mais a síntese sob demanda significa que você mantém os turnos brutos e obtém um resumo, sem que o importador faça chamadas LLM antecipadamente. O resumo é regenerado sempre que as memórias de origem mudam.
UUIDs da exportação vão para os metadados, então reimportar a mesma exportação depois apenas adiciona novos turnos. Ferramenta MCP: import_claude_ai_export(path, profile, mode=...).
Importações em massa pulam o enriquecimento por memória -- os importadores Claude Code, Claude.ai e JSON todos gravam via import_memories, que incorpora + deduplica + insere em lotes, mas pula a extração de entidades por memória e o auto-link (uma importação de 600 memórias executaria milhares de RPCs secundários). Memórias importadas ficam imediatamente pesquisáveis via embedding + palavra-chave. Para popular o grafo de entidades após uma importação em massa, execute ogham backfill-entities --profile <name> (veja Grafo de entidades abaixo).
De uma exportação JSON
ogham export --profile work > backup.json
ogham import backup.json --profile work-restored
Faz round-trip do esquema completo de memória (conteúdo, embeddings, tags, metadados, estado do ciclo de vida). Útil para migrar entre implantações ou semear um novo perfil a partir de outro.
Grafo de entidades + backfill
O Ogham extrai tags de entidades de cada memória armazenada na ingestão (pessoas, arquivos, erros, locais, projetos -- regex puro, sem LLM). A v0.14 adicionou a conexão ao vivo para que essas tags também populam um grafo de entidades separado usado para recuperação por ativação de propagação e sugestões de conexão entre memórias.
Após aplicar a migração 036 em uma implantação existente, execute um backfill único para popular memórias históricas:
ogham backfill-entities --profile work
O backfill percorre a tabela de memórias, executa o extrator de entidades e vincula cada memória às suas entidades via link_memory_entities. ON CONFLICT DO NOTHING torna re-execuções gratuitas. Novas gravações após a v0.14 são vinculadas automaticamente; o backfill só importa para memórias criadas antes da atualização.
Uma vez que o grafo esteja populado:
suggest_connectionsretorna memórias que compartilham entidades com uma memória âncora (antes sempre vazio).entity_graph_densityretorna números reais (contagem de entidades e arestas distintas por perfil).- O RPC
spread_entity_activation_memoriespercorre o grafo bipartido memória/entidade para recuperação rica em contexto.
Ferramenta MCP: backfill_entities(profile=None, batch_size=200).
Pontuação, condensação e enriquecimento de entidades
Pontuação e condensação -- três recursos do lado do servidor são executados automaticamente, sem necessidade de configuração:
- Detecção de novidade. Quando você armazena uma memória, o Ogham verifica o quão semelhante ela é ao que você já tem. Conteúdo redundante recebe uma pontuação de novidade menor e fica mais discreto nos resultados de busca. Você ainda pode encontrá-lo, mas ele não vai empurrar memórias mais úteis para fora.
- Pontuação de sinal de conteúdo. Memórias que mencionam decisões, erros, arquitetura ou contêm blocos de código recebem uma pontuação de sinal maior. Uma sessão de debug onde você corrigiu um bug real fica acima de uma nota casual sobre uma reunião. A pontuação é regex puro, sem LLM envolvido.
- Condensação automática. Memórias antigas que ninguém acessa encolhem gradualmente. O texto completo vira um resumo das frases-chave, depois uma descrição de uma linha com tags. O original é sempre preservado e pode ser restaurado se a memória se tornar relevante novamente. Execute
compress_old_memoriesmanualmente ou em um agendamento. Memórias de alta importância e acessadas com frequência resistem à condensação.
Enriquecimento de entidades -- toda memória é automaticamente enriquecida na ingestão com tags de entidades estruturadas, sem chamadas LLM, regex puro e correspondência de dicionário em 18 idiomas:
- Seis categorias de entidades. Eventos (casamento, show, reunião), atividades (trilha, programação, cozinhar), emoções (frustrado, feliz, aliviado), relacionamentos (irmã, chefe, colega), quantidades (3 livros, 5 milhas) e locais (Berlim, Tóquio -- via banco de dados GeoNames).
- 18 idiomas. Inglês, alemão, francês, espanhol, italiano, português, português brasileiro, holandês, polonês, russo, ucraniano, turco, árabe, hindi, japonês, coreano, chinês e irlandês. Cada idioma inclui formas flexionadas comuns (terminações de caso, tempos verbais, lenição), então "svadʹbu" corresponde a "svadʹba" em russo e "bhainis" corresponde a "bainis" em irlandês.
- Tabela de linha do tempo. Os resultados de busca incluem uma linha do tempo cronológica com "dias atrás" pré-computados e referências cruzadas de IDs de memória. Ajuda leitores LLM a responder perguntas temporais sem fazer aritmética de datas.
- Reordenação Lost in the Middle. Os resultados de busca são reordenados para que as memórias de maior relevância apareçam no início e no fim do contexto, onde os LLMs prestam mais atenção (Liu et al., 2023).
Reordenação por cross-encoder (FlashRank) + embeddings locais ONNX
Reordenação por cross-encoder -- reordenação opcional por cross-encoder FlashRank para quem faz self-hosting e quer melhor precisão de ranqueamento. Adiciona ~300ms por busca na CPU. Após a busca híbrida do Ogham retornar candidatos, o FlashRank (ms-marco-MiniLM-L-12-v2, 21MB) reavalia cada resultado contra a consulta usando atenção mais profunda em nível de token. A pontuação final combina o ranqueamento de recuperação com o ranqueamento do cross-encoder.
Impacto no benchmark BEAM: R@10 0.69 → 0.70, MRR +8pp. Maior ganho: raciocínio temporal 0.84 → 0.98. Resultados completos.
pip install ogham-mcp[rerank]
# or: uv add ogham-mcp[rerank]
export RERANK_ENABLED=true
export RERANK_ALPHA=0.55 # 55% cross-encoder, 45% retrieval score
O modelo é baixado no primeiro uso (~21MB). Quem faz self-hosting e prefere velocidade em vez de precisão o deixa desativado (o padrão).
Embeddings locais ONNX -- execute BGE-M3 localmente com ONNX Runtime, vetores densos e esparsos em uma única passada do modelo, sem chamadas de API, sem GPU necessária. Contribuição de @ninthhousestudios. O provedor ONNX produz vetores densos de 1024 dimensões além de vetores esparsos neurais. Quando vetores esparsos estão disponíveis, o Ogham usa automaticamente a Fusão de Ranqueamento Recíproco de três sinais (denso + FTS + esparso) em vez do caminho padrão de dois sinais.
pip install ogham-mcp[onnx]
# Download the model (~2.2GB)
ogham download-model bge-m3
export EMBEDDING_PROVIDER=onnx
export EMBEDDING_DIM=1024
Seu esquema de banco de dados deve usar vector(1024) para a coluna de embeddings. Desempenho na CPU: ~0,3s por texto curto, ~10s para documentos longos (5K+ caracteres). RSS: ~4,3GB de pico. O provedor ONNX é projetado para quem faz self-hosting e quer custo zero de API. Usuários de nuvem devem usar Gemini ou Voyage para menor latência.
Configuração do banco de dados, arquivos de esquema e atualização
O Ogham funciona com Supabase ou PostgreSQL puro. Execute o arquivo de esquema que corresponde à sua configuração:
| Arquivo | Caso de uso |
|---|---|
sql/schema.sql | Supabase Cloud |
sql/schema_selfhost_supabase.sql | Supabase self-hosted com RLS |
sql/schema_postgres.sql | PostgreSQL puro / Neon (sem RLS) |
Supabase e Neon incluem pgvector de fábrica -- sem configuração extra necessária. Se você está fazendo self-hosting de Postgres, precisa de PostgreSQL 15+ com a extensão pgvector instalada. Desenvolvemos e testamos contra PostgreSQL 17. Para Postgres, defina DATABASE_BACKEND=postgres e DATABASE_URL=postgresql://... no seu ambiente.
Banco de dados de teste local pgvector -- os testes de integração Postgres são intencionalmente apenas de rascunho. Eles executam linhas reais de memória através de PostgreSQL + pgvector, mas são pulados a menos que DATABASE_URL contenha scratch ou OGHAM_TEST_ALLOW_DESTRUCTIVE=1 esteja definido. Isso impede que execuções comuns de pytest toquem um banco de dados Ogham pessoal ou de produção.
make test-postgres-db
export DATABASE_BACKEND=postgres
export DATABASE_URL=postgresql://ogham:ogham@localhost:5433/ogham_scratch
uv run pytest -m postgres_integration
# or:
make test-postgres
O harness de teste aplica o sql/schema_postgres.sql canônico a um banco de dados de rascunho vazio e reaplica as migrações de linha de base idempotentes necessárias pelos testes atuais em bancos de dados de rascunho mais antigos. Testes de integração externos Supabase + Ollama são opcionais:
OGHAM_RUN_EXTERNAL_INTEGRATION=1 uv run pytest -m integration -v
# or:
make test-external
Atualizando um banco de dados Ogham existente
Para v0.10.x → v0.11.0 (lançamento do ciclo de vida de memória), veja UPGRADING.md. A versão resumida:
./sql/upgrade.sh $DATABASE_URL # applies 025 + 026 + 027 idempotently
Instaladores novos NÃO precisam disso -- sql/schema.sql já reflete o estado pós-v0.11.0.
Para versões mais antigas (v0.4.x até v0.10.x), o mesmo script upgrade.sh percorre cada migração em ordem -- colunas temporais, compressão halfvec, embeddings esparsos, busca RRF/BM25, depois as adições do ciclo de vida da v0.11.0. Cada uma é idempotente.
# Postgres / Neon (psql required)
./sql/upgrade.sh $DATABASE_URL
# Supabase: paste migration files into the SQL Editor in order
# (025_memory_lifecycle.sql → 026_memory_lifecycle_split.sql → 027_audit_log_backfill.sql
# are the v0.11.0 set)
Destaques selecionados de migração:
- 016 adiciona a coluna
sparse_embeddingpara vetores esparsos ONNX BGE-M3. - 017 atualiza a função de busca para Fusão de Ranqueamento Recíproco verdadeira com pontuação de palavras-chave normalizada por comprimento (Cormack et al., 2009).
- 025 / 026 adicionam a tabela de ciclo de vida de memória + triggers (veja UPGRADING.md).
- 027 faz backfill da tabela
audit_logpara instalações anteriores a ela.
Scripts de rollback ficam em sql/migrations/rollback/ com um prefixo DANGER_ e exigem aceitação explícita de variável de sessão antes de fazerem qualquer coisa. Veja sql/migrations/rollback/README.md.
Todas as migrações são idempotentes -- seguras para reexecutar. O script de atualização verifica sua versão do pgvector e pula halfvec se pgvector estiver abaixo de 0.7.0. Instalações novas não precisam de migrações -- os arquivos de esquema já incluem tudo.
Atualizando a CLI (ferramenta uv) -- o uv faz cache agressivamente. Um uv tool install ogham-mcp simples após um novo lançamento pode instalar a versão antiga. Use --refresh para forçar uma resolução nova do PyPI:
uv tool uninstall ogham-mcp
uv cache clean
uv tool install --refresh "ogham-mcp[gemini,postgres]"
Verifique com ogham config (mostra versão e provedor no topo). Se você ainda vir a versão antiga, apague o diretório do ambiente da ferramenta e tente novamente:
rm -rf ~/.local/share/uv/tools/ogham-mcp
uv tool install --refresh "ogham-mcp[gemini,postgres]"
Este é um comportamento de cache conhecido do uv -- o cache do resolvedor é separado do cache de pacotes e sobrevive a uv cache clean sem --refresh.
Skills (ogham-research, ogham-recall, ogham-maintain)
O Ogham vem com três skills de fluxo de trabalho em skills/ que conectam cadeias de ferramentas MCP comuns. Instale-os no Claude Code, Cursor ou qualquer cliente que suporte skills.
| Skill | Dispara com | O que faz |
|---|---|---|
ogham-research | "lembre disso", "guarde essa descoberta", "salve o que aprendemos" | Verifica duplicatas via hybrid_search antes de armazenar. Auto-marca com um esquema consistente (type:decision, type:gotcha, etc.). Usa store_decision para escolhas arquiteturais. |
ogham-recall | "o que eu sei sobre X", "encontre relacionados", "contexto para este projeto" | Encadeia hybrid_search, find_related e explore_knowledge para revelar conexões. Inicializa o contexto da sessão no início do projeto. |
ogham-maintain | "estatísticas de memória", "limpe minha memória", "exporte meu cérebro" | Executa health_check, get_stats, cleanup_expired, re_embed_all, link_unlinked. Avisa antes de operações irreversíveis. |
As skills chamam ferramentas MCP existentes -- elas não as substituem. O servidor MCP deve estar conectado para que as skills funcionem.
npx skills add ogham-mcp/ogham-mcp # all three
npx skills add ogham-mcp/ogham-mcp --skill ogham-recall # one
cp -r skills/ogham-research skills/ogham-recall skills/ogham-maintain ~/.claude/skills/ # manual
Documentação
Documentação completa e guias de integração em ogham-mcp.dev.
Créditos
Inspirado por Nate B Jones e seu trabalho sobre memória persistente de IA.
Nomeado em homenagem a Ogham, o antigo alfabeto irlandês esculpido em pedra -- a memória persistente original.
Licença
MIT