{"id":694,"date":"2026-09-05T11:34:30","date_gmt":"2026-09-05T14:34:30","guid":{"rendered":"https:\/\/yellowkode.com\/blog\/funes-hugging-face-memoria-persistente-agentes-codigo\/"},"modified":"2026-09-05T11:34:30","modified_gmt":"2026-09-05T14:34:30","slug":"funes-hugging-face-memoria-persistente-agentes-codigo","status":"publish","type":"post","link":"https:\/\/yellowkode.com\/blog\/funes-hugging-face-memoria-persistente-agentes-codigo\/","title":{"rendered":"Funes: como a Hugging Face deu mem\u00f3ria persistente aos agentes de c\u00f3digo (Claude Code, Codex, Pi, Hermes)"},"content":{"rendered":"<h2>O fato<\/h2>\n<p>Em 3 de setembro de 2026, a Hugging Face publicou o an\u00fancio do funes, escrito por David Corvoysier (dacorvo), engenheiro do time da empresa. O texto descreve uma ferramenta de linha de comando que indexa as sess\u00f5es j\u00e1 produzidas por agentes de codifica\u00e7\u00e3o (Claude Code, Codex, pi e Hermes) e transforma esse hist\u00f3rico em mem\u00f3ria pesquis\u00e1vel, que pode ficar s\u00f3 na sua m\u00e1quina ou ser publicada como um dataset da Hugging Face que voc\u00ea mesmo controla.<\/p>\n<p>O projeto \u00e9 open source, est\u00e1 hospedado em <code>github.com\/huggingface\/funes<\/code> e, segundo o reposit\u00f3rio, \u00e9 implementado majoritariamente em Rust sob licen\u00e7a Apache 2.0. N\u00e3o \u00e9 um servi\u00e7o novo de IA: \u00e9 uma camada de indexa\u00e7\u00e3o e busca sobre algo que os agentes j\u00e1 geram sozinhos, os logs de sess\u00e3o.<\/p>\n<h2>Como funciona<\/h2>\n<h3>O problema que o funes ataca: traces n\u00e3o s\u00e3o mem\u00f3ria, s\u00e3o arquivo<\/h3>\n<p>O ponto de partida do an\u00fancio \u00e9 outro artigo da pr\u00f3pria Hugging Face, &#8220;Software Forgets: Agent Traces Are the Memory&#8221;, publicado meses antes. Aquele texto argumenta que o contexto que explicaria por que um c\u00f3digo \u00e9 do jeito que \u00e9 hoje acontece, cada vez mais, em conversas privadas entre um engenheiro e um agente, e que as ferramentas tradicionais de preservar contexto (coment\u00e1rios, docs, wikis, logs de decis\u00e3o) dependem de algu\u00e9m manter isso atualizado, o que \u00e9 trabalho de manuten\u00e7\u00e3o que costuma perder para trabalho de feature.<\/p>\n<p>O an\u00fancio do funes descreve os agentes assim: &#8220;como eles buscam num c\u00f3digo, tentam abordagens, batem em erros, leem documenta\u00e7\u00e3o e mudam de dire\u00e7\u00e3o, eles deixam para tr\u00e1s um registro denso n\u00e3o s\u00f3 do que mudou, mas do porqu\u00ea&#8221;. O diagn\u00f3stico est\u00e1 correto, mas o pr\u00f3prio autor \u00e9 honesto sobre o limite dele: &#8220;os traces s\u00e3o s\u00f3 mem\u00f3ria em potencial. Os logs de sess\u00e3o de um agente ainda s\u00e3o apenas um arquivo. Voc\u00ea n\u00e3o consegue dar grep para achar por que a equipe abandonou o parser de streaming em dez mil turnos&#8221;. Para um agente usar esse hist\u00f3rico enquanto trabalha, ele precisa de indexa\u00e7\u00e3o, recupera\u00e7\u00e3o, ranqueamento e proveni\u00eancia exata, e \u00e9 isso que o funes se prop\u00f5e a fazer.<\/p>\n<h3>O pipeline de indexa\u00e7\u00e3o, passo a passo<\/h3>\n<p>O funes \u00e9 distribu\u00eddo como um bin\u00e1rio \u00fanico. A instala\u00e7\u00e3o \u00e9 feita por um script que baixa o execut\u00e1vel correto para a plataforma:<\/p>\n<pre><code>curl -fsSL https:\/\/huggingface.co\/buckets\/huggingface\/funes\/resolve\/install.sh | sh<\/code><\/pre>\n<p>Depois, um \u00fanico comando conecta a ferramenta a um agente j\u00e1 instalado:<\/p>\n<pre><code>funes add claude\n# ou: codex, pi, hermes<\/code><\/pre>\n<p>Esse comando de add constr\u00f3i o primeiro \u00edndice, d\u00e1 ao agente as ferramentas recall e get, e instala a automa\u00e7\u00e3o que indexa cada turno conclu\u00eddo. A indexa\u00e7\u00e3o \u00e9 incremental: novas execu\u00e7\u00f5es adicionam novos turnos em vez de reembedar todo o hist\u00f3rico de novo, e o conte\u00fado mais antigo e profundo pode ser preenchido em etapas limitadas (o texto original usa a palavra backfill para esse preenchimento posterior).<\/p>\n<p>Por baixo, um pipeline determin\u00edstico analisa cada trace suportado no mesmo formato de turno e bloco, faz o chunking, embeda com um modelo local fixo (pinned) e escreve num dataset Lance local. Quando uma consulta chega, o mecanismo de busca combina duas t\u00e9cnicas: busca vetorial (por similaridade sem\u00e2ntica) e BM25 (busca por termos, o mesmo algoritmo cl\u00e1ssico usado em motores de busca de texto). Os dois ranqueamentos s\u00e3o fundidos, depois um cross-encoder (um modelo que compara par a par a pergunta com cada candidato) reordena os resultados, uma repondera\u00e7\u00e3o por rec\u00eancia favorece o que \u00e9 mais recente, e por fim o sistema anexa os chunks vizinhos para dar contexto.<\/p>\n<p>O formato de armazenamento escolhido, o Lance, n\u00e3o \u00e9 uma inven\u00e7\u00e3o do projeto. \u00c9 um formato colunar aberto, nativo do ecossistema Arrow, pensado para acesso aleat\u00f3rio r\u00e1pido sem perder desempenho de varredura. A documenta\u00e7\u00e3o da pr\u00f3pria Hugging Face sobre o formato explica que a indexa\u00e7\u00e3o \u00e9 cidad\u00e3 de primeira classe, nativa do pr\u00f3prio formato: o Lance vem com \u00edndices vetoriais e de busca por texto completo r\u00e1pidos, em disco e escal\u00e1veis, que ficam ao lado do dataset no Hub. Isso \u00e9 relevante para o funes porque permite escrita incremental barata: \u00e9 poss\u00edvel adicionar colunas derivadas, como embeddings, depois, sem reescrever a tabela inteira, e apenas dados novos s\u00e3o escritos, enquanto dados existentes ficam intocados.<\/p>\n<h3>Mem\u00f3ria local versus mem\u00f3ria compartilhada<\/h3>\n<p>Por padr\u00e3o, tudo roda na sua m\u00e1quina. Segundo o an\u00fancio, nenhuma conta ou reposit\u00f3rio do Hub \u00e9 necess\u00e1rio; um modelo hospedado n\u00e3o processa suas sess\u00f5es para indexa\u00e7\u00e3o, o embedding e o reranking rodam na sua m\u00e1quina, e quem faz o racioc\u00ednio \u00e9 o seu agente de c\u00f3digo. Isso importa porque separa duas coisas que costumam vir juntas em ferramentas de IA: usar um modelo para processar dados sens\u00edveis e depender de um servi\u00e7o externo para isso.<\/p>\n<p>Quando voc\u00ea quer que a mem\u00f3ria atravesse m\u00e1quinas, o comando muda:<\/p>\n<pre><code>funes add codex acme\/funes-memory<\/code><\/pre>\n<p>Isso vincula (bind) a mem\u00f3ria local a um dataset no Hugging Face Hub. O bind publica a mem\u00f3ria atual ali, e o funes mant\u00e9m isso atualizado, indexando localmente a cada turno e publicando nas fronteiras de sess\u00e3o. Antes de qualquer coisa subir para o Hub, h\u00e1 uma etapa de reda\u00e7\u00e3o de credenciais durante a indexa\u00e7\u00e3o, e a publica\u00e7\u00e3o varre cada chunk de novo, retendo o que ainda parecer um segredo; o comportamento exato desse scanner est\u00e1 documentado no arquivo SECURITY.md do reposit\u00f3rio, que o pr\u00f3prio an\u00fancio cita como refer\u00eancia para entender o que a checagem cobre e o que n\u00e3o cobre.<\/p>\n<p>O dataset publicado \u00e9, por padr\u00e3o, privado, e pertence \u00e0 sua conta, n\u00e3o a um servi\u00e7o de mem\u00f3ria terceirizado. Isso \u00e9 uma escolha de arquitetura expl\u00edcita: a mem\u00f3ria \u00e9 um dataset da Hugging Face; publicada no Hub, um colega, outra das suas m\u00e1quinas, ou qualquer pessoa, se voc\u00ea tornar p\u00fablico, consegue recuperar dela com uma flag.<\/p>\n<h2>O que isso significa na pr\u00e1tica<\/h2>\n<p>Depois do add, o fluxo de trabalho normal j\u00e1 basta. Quando uma tarefa toca uma decis\u00e3o, motivo ou descoberta antiga, o agente pode buscar na pr\u00f3pria mem\u00f3ria sem que voc\u00ea precise colar contexto de outra sess\u00e3o. Cada resultado retornado por recall vem com proveni\u00eancia: agente de origem, timestamp, sess\u00e3o e turno, e um comando get que abre o turno completo com o contexto ao redor.<\/p>\n<p>Para fazer uma pergunta pontual sem instalar nada, existe o comando ask, que funciona como um modo de leitura de uma pergunta s\u00f3:<\/p>\n<pre><code>funes ask claude \"o que decidimos sobre o parser de streaming\"<\/code><\/pre>\n<p>Ou apontando para uma mem\u00f3ria compartilhada publicada por outra pessoa. A pr\u00f3pria Hugging Face publicou o hist\u00f3rico de desenvolvimento do funes como um dataset p\u00fablico chamado huggingface\/funes-memory, dispon\u00edvel para qualquer pessoa consultar:<\/p>\n<pre><code>funes ask claude \"por que o funes e append-only\" --memory huggingface\/funes-memory<\/code><\/pre>\n<p>O comando recupera as sess\u00f5es relevantes, entrega para um agente de c\u00f3digo emprestado, e devolve uma resposta fundamentada que nomeia as sess\u00f5es de onde ela veio, sem instalar nada. Se as passagens recuperadas n\u00e3o sustentam uma resposta, o agente diz isso em vez de inventar; \u00e9 uma diferen\u00e7a importante frente a ferramentas de RAG que preenchem lacunas com alucina\u00e7\u00e3o.<\/p>\n<p>O an\u00fancio tamb\u00e9m traz um dado de custo comparando tr\u00eas formas de sobreviver a uma sess\u00e3o longa que estoura o contexto: deixar o agente compactar (o comportamento padr\u00e3o da maioria dos agentes), escrever um handoff manual, e usar recall. No benchmark publicado pela pr\u00f3pria equipe, com duas tarefas cuja resposta n\u00e3o pode ser reconstru\u00edda sem o conhecimento pr\u00e9vio da sess\u00e3o, a compacta\u00e7\u00e3o foi o \u00fanico dos tr\u00eas m\u00e9todos cujo resultado se dividiu: chegou numa tarefa e nunca chegou na outra, porque o resumo tinha achatado descobertas que importavam. J\u00e1 o recall foi o mais barato dos tr\u00eas nas duas tarefas, 8 vezes mais barato que um handoff escrito numa delas e 4 vezes na outra.<\/p>\n<h2>Onde quebra<\/h2>\n<p>Vale ser espec\u00edfico sobre os limites, porque o pr\u00f3prio material j\u00e1 sinaliza v\u00e1rios.<\/p>\n<ul>\n<li>Cobertura de agentes limitada. O suporte hoje \u00e9 para quatro agentes nomeados: Claude Code, Codex, pi e Hermes. Se o seu fluxo de trabalho usa outro agente ou uma automa\u00e7\u00e3o interna, n\u00e3o h\u00e1 indica\u00e7\u00e3o de que o funes leia esse formato de trace sem trabalho de adapta\u00e7\u00e3o.<\/li>\n<li>Lat\u00eancia fria em mem\u00f3ria remota. Quando o agente l\u00ea uma mem\u00f3ria publicada no Hub, o funes precisa baixar o dataset para cache local antes de responder r\u00e1pido; a primeira consulta paga esse custo, e s\u00f3 as consultas seguintes voltam \u00e0 velocidade local.<\/li>\n<li>Reda\u00e7\u00e3o de segredos \u00e9 best effort, n\u00e3o garantia. O pr\u00f3prio projeto documenta em SECURITY.md o que o scanner de segredos cobre e o que n\u00e3o cobre, o que \u00e9 uma forma honesta de dizer que a checagem autom\u00e1tica n\u00e3o substitui revis\u00e3o humana antes de publicar uma mem\u00f3ria que pode ter tocado em credenciais.<\/li>\n<li>O benchmark de custo \u00e9 pequeno e autopublicado. O comparativo entre compacta\u00e7\u00e3o, handoff e recall usa duas tarefas desenhadas pela pr\u00f3pria equipe do funes, n\u00e3o um conjunto independente e mais amplo. \u00c9 um ind\u00edcio, n\u00e3o uma prova de generaliza\u00e7\u00e3o para qualquer tipo de sess\u00e3o ou qualquer volume de contexto.<\/li>\n<li>Ferramenta muito nova. O reposit\u00f3rio mostra atividade de commits recente e concentrada, o que \u00e9 esperado para um lan\u00e7amento de poucos dias, mas tamb\u00e9m significa que ainda n\u00e3o existe um hist\u00f3rico longo de uso em produ\u00e7\u00e3o por terceiros para se apoiar.<\/li>\n<\/ul>\n<h2>O que n\u00e3o d\u00e1 para afirmar ainda<\/h2>\n<p>O material da Hugging Face n\u00e3o testa, nem discute, o comportamento do funes em bases de c\u00f3digo muito grandes, com milhares de sess\u00f5es acumuladas ao longo de anos; a compara\u00e7\u00e3o de custo publicada usa duas tarefas espec\u00edficas, e n\u00e3o sabemos se a vantagem de custo do recall sobre handoff e compacta\u00e7\u00e3o se mant\u00e9m em sess\u00f5es muito mais longas ou em investiga\u00e7\u00f5es que cruzam dezenas de reposit\u00f3rios. O texto tamb\u00e9m n\u00e3o detalha o desempenho do modelo de embedding local em c\u00f3digos e conversas fora do ingl\u00eas, nem como o reranking se comporta quando duas decis\u00f5es contradit\u00f3rias aparecem na mesma mem\u00f3ria, uma tomada e depois revertida. Por fim, n\u00e3o h\u00e1 dados independentes, de fora da Hugging Face, validando as alega\u00e7\u00f5es de custo ou a qualidade do retrieval; at\u00e9 o momento, a fonte prim\u00e1ria desses n\u00fameros \u00e9 a pr\u00f3pria equipe que construiu a ferramenta.<\/p>\n<h2>Como testar isso voc\u00ea mesmo<\/h2>\n<p>O caminho mais curto para experimentar \u00e9 local, sem publicar nada no Hub:<\/p>\n<pre><code># instala o binario\ncurl -fsSL https:\/\/huggingface.co\/buckets\/huggingface\/funes\/resolve\/install.sh | sh\n\n# conecta a um agente que voce ja usa\nfunes add claude\n\n# depois de uma sessao de trabalho normal, pergunte a memoria\nfunes ask claude \"por que mudamos de abordagem no modulo X\"<\/code><\/pre>\n<p>Para ver o lado da mem\u00f3ria compartilhada sem criar a sua, d\u00e1 para consultar o dataset p\u00fablico que a pr\u00f3pria Hugging Face publicou sobre o desenvolvimento do funes, sem instalar nada:<\/p>\n<pre><code>funes ask claude \"por que o funes e append-only\" --memory huggingface\/funes-memory<\/code><\/pre>\n<p>Vale prestar aten\u00e7\u00e3o em duas coisas ao testar: se o recall realmente cita a sess\u00e3o de origem quando responde (a proveni\u00eancia \u00e9 o ponto central da proposta), e o que acontece quando voc\u00ea pergunta algo que a mem\u00f3ria claramente n\u00e3o cobre, se o agente admite a lacuna ou tenta preencher com suposi\u00e7\u00e3o.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como o Funes, ferramenta open source da Hugging Face, transforma sess\u00f5es de Claude Code, Codex, Pi e Hermes em mem\u00f3ria pesquis\u00e1vel guardada em dataset Lance.<\/p>\n","protected":false},"author":2,"featured_media":693,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-694","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts\/694","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/comments?post=694"}],"version-history":[{"count":0,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts\/694\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/media\/693"}],"wp:attachment":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/media?parent=694"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/categories?post=694"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/tags?post=694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}