fraise
Armazenamento de conhecimento em memória para agentes de IA
Documentação
Fraise
Docs · Discord · Linguagem de consulta · Issues
Fraise é um banco de dados de memória para agentes de IA. Um banco que eles consultam diretamente, em uma linguagem feita para tokens, não para humanos.
remember 'acme moved to annual billing' topic:billing entity:acme
recall billing entity:acme since:30d top:5
Dois verbos. Um binário. Nenhuma infraestrutura para executar.
Instalação
brew install fraisehq/tap/fraise
brew services start fraise
curl -X POST localhost:9876/api/v1/q -H 'content-type: application/json' \
-d "{\"query\": \"remember 'the parrot is turquoise' topic:color\"}"
Pacotes Linux, Docker, go install e binários de lançamento assinados estão todos em Comece por aqui abaixo.
Leia Durabilidade antes de implantar. Persistência é a issue #171 e a próxima grande parte do trabalho.
Como se compara
Medido em LoCoMo — 10 conversas de múltiplas sessões, 1.986 perguntas — com cada sistema ingerindo as mesmas conversas, usando o mesmo modelo de extração e o mesmo modelo de incorporação, e respondendo às mesmas perguntas. k=10, dados completos, execução mais recente por sistema em 2026-10-11.
| sistema | recall de recuperação | p50 de busca | tokens de memória |
|---|---|---|---|
| fraise 0.3.3 | 0.910 | 0.185 s | 7.453.109 |
| hindsight 0.9.2 | 0.913 | 5.836 s | 1.688.873 |
| everos 1.2.3 | 0.897 | 0.376 s | 10.030.966 |
| letta 0.16.8 | 0.897 | 0.349 s | 226.854 |
| mem0 2.0.18 | 0.886 | 0.576 s | 4.120.078 |
| memos 2.0.33 | 0.865 | 0.307 s | 4.000.552 |
| graphiti 0.30.2 | 0.828 | 0.290 s | 9.861.973 |
| cognee 1.5.3 | 0.790 | 6.273 s | 8.526.019 |
| langmem 0.0.30 | 0.783 | 0.227 s | 1.078.110 |
Fraise fica a 0.003 do melhor recall, 31× mais rápido que o único sistema que o alcança. Quase a mesma evidência, em uma fração do tempo. A coluna de tokens é o preço desse recall: o extrator (fraise-sdk 0.2.0) lê cada mensagem ao lado do que o grafo já contém, e esse contexto é de onde veio o recall.
Estes dados vêm de agent-memory-benchmarks, um harness aberto — precisão, recall e F1 em k ∈ {1, 3, 5, 10}, por categoria, cada execução marcada e reproduzível a partir da tag. As tabelas completas estão em seu RESULTS.md.
Por que Fraise
- Uma linguagem de consulta que agentes realmente conseguem escrever. FQL tem dois verbos —
remembererecall— e uma única forma de dizer cada coisa. Menos graus de liberdade significa menos maneiras de um modelo errar, e menos tokens gastos para dizer algo. - Recuperação híbrida. Fatos são indexados para busca de texto completo, grafo e (opcionalmente) vetorial. Uma consulta, classificada nas três.
- Temporal por padrão. Memórias recentes superam as mais antigas, então o recall é sensível à recência sem precisar pedir.
- O sistema mais rápido medido. 0.185 s p50 no LoCoMo, à frente de todos os outros sistemas e 31× mais rápido que o único com recall equivalente. Lembre e recupere no meio do passo, enquanto o usuário espera.
- Sem infraestrutura. Um único binário. Sem banco de dados para provisionar, sem serviço para levantar ao lado.
- Código aberto, MIT.
Status
v0.3.3. O loop principal funciona de ponta a ponta e os caminhos de instalação são verificados em máquinas limpas. A linha do benchmark acima foi produzida a partir deste lançamento. 0.4.0 (final de outubro) muda o scorer e adiciona explain e describe; 0.5.0 (novembro) é persistência e forget.
Bom para construir memória de agente hoje. Ainda não para uso de produção de longo prazo.
Como funciona
Fraise armazena conhecimento como um grafo de memória temporal construído a partir de três tipos de nós:
- fatos — as coisas que você lembra, uma declaração cada
- entidades — quem ou o que um fato menciona
- tópicos — sobre o que um fato é
Arestas conectam fatos às entidades que mencionam e aos tópicos sobre os quais são, então uma consulta pode começar de qualquer lado. Um recall encontra fatos-semente por texto e, opcionalmente, por similaridade vetorial; um recall que nomeia apenas tópicos ou entidades começa pelos fatos arquivados sob eles. Com depth:1 ou depth:2, um tópico ou entidade nomeado cujos fatos corresponderam melhor do que seu tamanho prevê repassa essa evidência para o restante de seus fatos. Resultados são classificados por relevância e recência, e os melhores top voltam.
A classificação não é uma caixa-preta: a pontuação de um fato é sua própria força de correspondência mais o que recebe através de âncoras que carregam mais massa do que seu tamanho preveria. A taxa de base contra a qual esse "mais" é medido é estimada por consulta, a partir da parte do grafo que a consulta tocou, então não há constante de relevância para ajustar. Recuperação híbrida tem o modelo completo.
Uma única instância do Fraise contém vários grafos de memória independentes (8 por padrão), endereçados com @N — um por usuário, por sessão, por agente, como você preferir.
Comece por aqui
Fraise é um único binário — sem banco de dados para provisionar, nada para configurar. Cada rota abaixo deixa você com um servidor ouvindo na porta 9876, em localhost:9876.
Com Homebrew
brew install fraisehq/tap/fraise
brew services start fraise
O serviço sobrevive a falhas e reinicia no login (keep_alive), registra logs em $(brew --prefix)/var/log/fraise.log e lê sua configuração de $(brew --prefix)/etc/fraise/fraise.config.toml — instalado com cada configuração comentada em seu padrão, e nunca sobrescrito em atualizações.
Com Docker
docker run -p 127.0.0.1:9876:9876 ghcr.io/fraisehq/fraise:latest
Tags publicadas: uma por lançamento, latest para o estável mais recente, edge para a ponta de main, e uma tag imutável de SHA completo do commit para cada merge que toca o servidor.
Imagens são construídas com proveniência SLSA, verificável sem puxar:
gh attestation verify oci://ghcr.io/fraisehq/fraise:latest --repo FraiseHQ/fraise
Com Go
go install github.com/FraiseHQ/fraise/cmd/server@latest
"$(go env GOPATH)/bin/server"
O binário instala como server, após seu caminho de pacote — renomeie para fraise se isso ler melhor.
Nada mais é necessário para confiar nisso: a toolchain Go verifica cada download de módulo contra o log público de transparência de checksums, e sua própria máquina compila o resultado.
Pacotes Linux
Pacotes .deb e .rpm acompanham cada lançamento, com uma unit de usuário systemd:
VERSION=0.3.0
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
curl -sSfLO "https://github.com/FraiseHQ/fraise/releases/download/v${VERSION}/fraise_${VERSION}_linux_${ARCH}.deb"
sudo dpkg -i "fraise_${VERSION}_linux_${ARCH}.deb"
systemctl --user enable --now fraise
Logs vão para o journal (journalctl --user -u fraise -f), e a unit lê ~/.config/fraise/fraise.config.toml quando presente — um padrão enviado com cada configuração comentada vive em /etc/fraise/fraise.config.toml para copiar. Para agentes que sobrevivem à sua sessão de login, deixe o gerenciador de usuário rodando: loginctl enable-linger $USER. Uma variante de nível de sistema (servidor compartilhado) da unit é descrita em Executando como um serviço gerenciado.
De um binário de lançamento
VERSION=0.3.0
OS=$(uname -s | tr '[:upper:]' '[:lower:]') # linux | darwin
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/') # amd64 | arm64
ASSET="fraise_${VERSION}_${OS}_${ARCH}.tar.gz"
BASE="https://github.com/FraiseHQ/fraise/releases/download/v${VERSION}"
curl -sSfLO "${BASE}/${ASSET}"
tar xzf "$ASSET"
./fraise
Builds Windows são enviados como .zip sob o mesmo esquema de nomenclatura.
Verifique um lançamento
Lançamentos carregam uma assinatura cosign sobre checksums.txt, usando o mesmo VERSION e BASE de acima:
curl -sSfLO "${BASE}/checksums.txt"
curl -sSfLO "${BASE}/checksums.txt.sigstore.json"
# 1. the bundle proves checksums.txt came from this repo's release workflow
cosign verify-blob \
--bundle checksums.txt.sigstore.json \
--certificate-identity-regexp 'https://github.com/FraiseHQ/fraise/.github/workflows/go.yaml@refs/tags/v.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
checksums.txt
# 2. checksums.txt proves your archive is the one it covers
sha256sum --ignore-missing -c checksums.txt # macOS: shasum -a 256 --ignore-missing -c
Execute a partir do código-fonte
git clone https://github.com/FraiseHQ/fraise
cd fraise
make dev
Sua primeira memória
curl -X POST localhost:9876/api/v1/q \
-H 'content-type: application/json' \
-d "{\"query\": \"remember 'the parrot is turquoise' topic:color\"}"
curl -X POST localhost:9876/api/v1/q \
-H 'content-type: application/json' \
-d '{"query":"recall parrot"}'
{
"results": {
"count": 1,
"hits": [
{ "value": "the parrot is turquoise", "timestamp": "...", "score": 0.2867 }
]
}
}
Use a partir de um agente
MCP
fraise mcp é um servidor MCP stdio — uma ponte fina para um daemon em execução, então qualquer cliente MCP pode lembrar e recuperar. Ele expõe duas ferramentas, recall e remember, e não precisa de flags quando o daemon está em seu endereço padrão.
Inicie o daemon primeiro (brew services start fraise, ou systemctl --user start fraise no Linux), então registre a ponte com o agente de codificação que você usa.
Claude Code
claude mcp add fraise -- fraise mcp
Isso o registra para o projeto atual; adicione --scope user para torná-lo disponível em todos os projetos.
Codex
codex mcp add fraise -- fraise mcp
Ou escreva diretamente em ~/.codex/config.toml:
[mcp_servers.fraise]
command = "fraise"
args = ["mcp"]
OpenCode
Adicione a opencode.json na raiz do seu projeto:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"fraise": {
"type": "local",
"command": ["fraise", "mcp"]
}
}
}
Qualquer outro cliente
{
"mcpServers": {
"fraise": { "command": "fraise", "args": ["mcp"] }
}
}
A ponte se descreve via MCP: cada ferramenta chega com uma descrição e um schema JSON completo para seus argumentos e resultados — as formas FQL, um exemplo trabalhado, o que uma pontuação significa — então um cliente sabe o que recall e remember fazem e como chamá-los sem ser informado. O que uma descrição de ferramenta não pode carregar é a política: o hábito de buscar memória sem ser solicitado, e o julgamento sobre o que vale a pena manter. Isso pertence ao arquivo que seu agente já lê — CLAUDE.md para Claude Code, AGENTS.md para Codex e OpenCode — e dois hábitos são suficientes: recuperar antes de responder qualquer coisa que dependa de decisões ou preferências anteriores, e lembrar apenas fatos que ainda importarão em uma sessão posterior, um fato autocontido por chamada com os tópicos e entidades que o tornarão encontrável.
SDKs
Python (sdk/python) — o único SDK hoje:
pip install --pre fraise-sdk
from fraise_sdk import FraiseClient
with FraiseClient("http://localhost:9876") as fraise:
fraise.remember("the parrot is turquoise", topics=["color"])
for hit in fraise.recall("parrot", top=5):
print(hit.value, hit.score)
O SDK Python é leve em dependências e suporta busca vetorial quando você fornece um embedder. Veja seu README para embeddings e a API completa.
TypeScript — ainda não disponível (#179). Até chegar, chamadas TypeScript usam fraise mcp ou falam diretamente com o endpoint HTTP; são dois verbos sobre uma rota, então um cliente é um wrapper curto em torno de fetch. Veja a API HTTP.
Claude Agent SDK
O SDK Python envia ferramentas de memória para o Claude Agent SDK, expostas como um servidor MCP em processo para que o agente decida o que armazenar e recuperar:
from claude_agent_sdk import ClaudeAgentOptions
from fraise_sdk import FraiseClient
from fraise_sdk.integrations.claude_agents import memory_server, allowed_tools
fraise = FraiseClient("http://localhost:9876")
options = ClaudeAgentOptions(
system_prompt="Remember durable facts the user shares, and recall them when relevant.",
mcp_servers={"fraise_memory": memory_server(fraise)},
allowed_tools=allowed_tools(),
)
Um agente completo, executável via Docker, vive em examples/claude-agent-sdk.
OpenAI Agents SDK
memory_tools(client) retorna ferramentas recall e remember vinculadas:
from agents import Agent, Runner
from fraise_sdk import FraiseClient
from fraise_sdk.integrations.openai_agents import memory_tools
fraise = FraiseClient("http://localhost:9876")
agent = Agent(
name="Assistant",
instructions="Remember durable facts the user shares, and recall them when relevant.",
tools=memory_tools(fraise),
)
result = Runner.run_sync(agent, "My favourite colour is orange.")
print(result.final_output)
Um agente completo, executável via Docker, vive em examples/openai-agents.
Referências
Contribuindo
Contribuições são bem-vindas — veja CONTRIBUTING.md para como construir, testar e enviar mudanças.
Código de Conduta
Este projeto segue o Contributor Covenant.
Comunidade
Perguntas, ideias ou construindo algo com Fraise? Junte-se ao Discord. Bugs e pedidos de recursos pertencem às issues para não se perderem.
Licença
MIT — veja LICENSE.